From 09304d7a4a3175a864a4687f8c59a0c66b931caf Mon Sep 17 00:00:00 2001 From: piertoni Date: Wed, 21 Feb 2018 16:59:43 +0100 Subject: [PATCH 001/252] futurize stage1 + minor changes --- .gitignore | 2 + doc/auto_rst4api.py | 39 +- doc/buildmock.py | 7 +- doc/source/conf.py | 1 + doc/source/devel/examples/TaurusTest.py | 21 +- .../devel/examples/parentmodel_issue_demo.py | 5 +- doc/source/devel/examples/pyqwt_issue_test.py | 11 +- doc/source/sphinxext/taurusextension.py | 19 +- futurize.log | 4878 +++++++++++++++++ lib/taurus/console/list.py | 3 +- lib/taurus/console/table.py | 5 +- lib/taurus/core/__init__.py | 5 +- lib/taurus/core/epics/__init__.py | 3 +- lib/taurus/core/epics/epicsattribute.py | 12 +- lib/taurus/core/epics/epicsfactory.py | 13 +- .../core/epics/test/test_epicsattribute.py | 2 +- .../core/epics/test/test_epicsvalidator.py | 6 +- lib/taurus/core/evaluation/__init__.py | 9 +- lib/taurus/core/evaluation/evalattribute.py | 4 +- lib/taurus/core/evaluation/evalfactory.py | 15 +- lib/taurus/core/evaluation/evalvalidator.py | 9 +- .../core/evaluation/test/res/dev_example.py | 3 +- .../core/evaluation/test/res/ipap_example.py | 3 +- lib/taurus/core/evaluation/test/res/mymod.py | 11 +- lib/taurus/core/init_bkcomp.py | 3 +- lib/taurus/core/resource/__init__.py | 3 +- lib/taurus/core/resource/resfactory.py | 11 +- .../core/resource/test/test_resfactory.py | 3 +- lib/taurus/core/tango/__init__.py | 13 +- lib/taurus/core/tango/img/__init__.py | 3 +- lib/taurus/core/tango/starter.py | 9 +- lib/taurus/core/tango/tangoattribute.py | 14 +- lib/taurus/core/tango/tangodatabase.py | 19 +- lib/taurus/core/tango/tangodevice.py | 2 +- lib/taurus/core/tango/tangofactory.py | 19 +- lib/taurus/core/tango/test/__init__.py | 3 +- lib/taurus/core/tango/util/__init__.py | 3 +- lib/taurus/core/taurusauthority.py | 3 +- lib/taurus/core/taurusfactory.py | 15 +- lib/taurus/core/taurushelper.py | 27 +- lib/taurus/core/tauruslistener.py | 3 +- lib/taurus/core/taurusmanager.py | 7 +- lib/taurus/core/tauruspollingtimer.py | 2 +- lib/taurus/core/taurusvalidator.py | 5 +- lib/taurus/core/util/__init__.py | 5 +- .../core/util/argparse/taurusargparse.py | 2 +- lib/taurus/core/util/codecs.py | 13 +- lib/taurus/core/util/colors.py | 17 +- lib/taurus/core/util/constant.py | 4 +- lib/taurus/core/util/containers.py | 11 +- lib/taurus/core/util/decorator/typecheck.py | 25 +- lib/taurus/core/util/enumeration.py | 2 +- lib/taurus/core/util/event.py | 26 +- lib/taurus/core/util/fandango_search.py | 4 +- lib/taurus/core/util/init_bkcomp.py | 3 +- lib/taurus/core/util/log.py | 28 +- lib/taurus/core/util/parse_args.py | 7 +- lib/taurus/core/util/prop.py | 10 +- lib/taurus/core/util/property_parser.py | 11 +- lib/taurus/core/util/propertyfile.py | 16 +- lib/taurus/core/util/safeeval.py | 17 +- lib/taurus/core/util/tablepprint.py | 10 +- lib/taurus/core/util/threadpool.py | 42 +- .../qt/qtcore/communication/communication.py | 3 +- .../qt/qtcore/configuration/configuration.py | 5 +- lib/taurus/qt/qtcore/model/__init__.py | 5 +- lib/taurus/qt/qtcore/util/__init__.py | 3 +- lib/taurus/qt/qtcore/util/emitter.py | 12 +- lib/taurus/qt/qtcore/util/signal.py | 1 + lib/taurus/qt/qtdesigner/containerplugin.py | 4 +- .../qtdesigner/taurusplugin/taurusplugin.py | 9 +- .../qt/qtdesigner/tauruspluginplugin.py | 8 +- lib/taurus/qt/qtgui/__init__.py | 3 +- lib/taurus/qt/qtgui/base/taurusbase.py | 6 +- lib/taurus/qt/qtgui/base/tauruscontroller.py | 2 +- lib/taurus/qt/qtgui/button/qbuttonbox.py | 1 + lib/taurus/qt/qtgui/button/taurusbutton.py | 9 +- .../qt/qtgui/compact/abstractswitcher.py | 4 +- lib/taurus/qt/qtgui/compact/basicswitcher.py | 3 +- lib/taurus/qt/qtgui/console/__init__.py | 2 +- lib/taurus/qt/qtgui/container/taurusframe.py | 3 +- .../qt/qtgui/container/taurusgroupbox.py | 3 +- .../qt/qtgui/container/taurusgroupwidget.py | 5 +- .../qt/qtgui/container/taurusmainwindow.py | 5 +- .../qt/qtgui/container/taurusscrollarea.py | 3 +- lib/taurus/qt/qtgui/container/tauruswidget.py | 3 +- .../qt/qtgui/dialog/taurusinputdialog.py | 3 +- .../qt/qtgui/dialog/taurusmessagebox.py | 2 +- lib/taurus/qt/qtgui/display/qled.py | 2 +- lib/taurus/qt/qtgui/display/qpixmapwidget.py | 6 +- lib/taurus/qt/qtgui/display/qsevensegment.py | 3 +- lib/taurus/qt/qtgui/display/tauruslabel.py | 3 +- lib/taurus/qt/qtgui/display/tauruslcd.py | 5 +- lib/taurus/qt/qtgui/display/taurusled.py | 5 +- lib/taurus/qt/qtgui/extra_guiqwt/builder.py | 5 +- lib/taurus/qt/qtgui/extra_guiqwt/curve.py | 5 +- .../qt/qtgui/extra_guiqwt/curvesmodel.py | 5 +- lib/taurus/qt/qtgui/extra_guiqwt/image.py | 4 +- lib/taurus/qt/qtgui/extra_guiqwt/plot.py | 4 +- lib/taurus/qt/qtgui/extra_guiqwt/scales.py | 5 +- lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py | 7 +- .../qt/qtgui/graphic/jdraw/jdraw_parser.py | 2 +- .../qt/qtgui/graphic/jdraw/jdraw_view.py | 5 +- lib/taurus/qt/qtgui/graphic/taurusgraphic.py | 9 +- lib/taurus/qt/qtgui/icon/__init__.py | 5 +- lib/taurus/qt/qtgui/icon/catalog.py | 3 +- lib/taurus/qt/qtgui/icon/icon.py | 2 +- lib/taurus/qt/qtgui/input/choicedlg.py | 3 +- lib/taurus/qt/qtgui/input/taurusspinbox.py | 3 +- lib/taurus/qt/qtgui/input/tauruswheel.py | 3 +- .../qt/qtgui/panel/qdataexportdialog.py | 5 +- lib/taurus/qt/qtgui/panel/qdoublelist.py | 7 +- .../qt/qtgui/panel/report/albareport.py | 3 +- .../qt/qtgui/panel/taurusconfigeditor.py | 6 +- lib/taurus/qt/qtgui/panel/taurusdemo.py | 13 +- lib/taurus/qt/qtgui/panel/taurusform.py | 6 +- lib/taurus/qt/qtgui/panel/taurusinputpanel.py | 3 +- .../qt/qtgui/panel/taurusmessagepanel.py | 2 +- .../qt/qtgui/panel/taurusmodelchooser.py | 6 +- lib/taurus/qt/qtgui/panel/taurusvalue.py | 4 +- lib/taurus/qt/qtgui/plot/arrayedit.py | 3 +- lib/taurus/qt/qtgui/plot/curveprops.py | 3 +- .../qtgui/plot/curvesAppearanceChooserDlg.py | 7 +- lib/taurus/qt/qtgui/plot/monitor.py | 3 +- lib/taurus/qt/qtgui/plot/qwtdialog.py | 16 +- lib/taurus/qt/qtgui/plot/qwtplot.py | 10 +- lib/taurus/qt/qtgui/plot/scales.py | 5 +- lib/taurus/qt/qtgui/plot/taurusarrayedit.py | 7 +- lib/taurus/qt/qtgui/plot/taurusplot.py | 36 +- lib/taurus/qt/qtgui/plot/taurusplotconf.py | 14 +- lib/taurus/qt/qtgui/plot/taurustrend.py | 13 +- lib/taurus/qt/qtgui/resource/__init__.py | 3 +- lib/taurus/qt/qtgui/table/qdictionary.py | 1 + lib/taurus/qt/qtgui/table/qlogtable.py | 3 +- lib/taurus/qt/qtgui/table/taurusdbtable.py | 3 +- .../qtgui/table/taurusdevicepropertytable.py | 3 +- lib/taurus/qt/qtgui/table/taurusgrid.py | 23 +- lib/taurus/qt/qtgui/table/taurustable.py | 3 +- .../qt/qtgui/table/taurusvaluestable.py | 14 +- lib/taurus/qt/qtgui/taurusgui/__init__.py | 11 +- .../qt/qtgui/taurusgui/appsettingswizard.py | 17 +- .../conf/tgconf_example01/__init__.py | 3 +- .../conf/tgconf_macrogui/__init__.py | 3 +- .../qt/qtgui/taurusgui/macrolistener.py | 3 +- .../qtgui/taurusgui/paneldescriptionwizard.py | 19 +- lib/taurus/qt/qtgui/taurusgui/taurusgui.py | 22 +- lib/taurus/qt/qtgui/taurusgui/utils.py | 2 +- lib/taurus/qt/qtgui/tree/taurusdbtree.py | 3 +- lib/taurus/qt/qtgui/tree/taurusdevicetree.py | 17 +- lib/taurus/qt/qtgui/tree/taurustree.py | 3 +- lib/taurus/qt/qtgui/util/taurusaction.py | 3 +- .../qt/qtgui/util/taurusactionfactory.py | 3 +- lib/taurus/qt/qtgui/util/tauruscolor.py | 10 +- lib/taurus/qt/qtgui/util/taurusropepatch.py | 2 +- .../qt/qtgui/util/tauruswidgetfactory.py | 10 +- .../qt/qtgui/util/test/test_ui/test_ui.py | 3 +- lib/taurus/test/fuzzytest.py | 13 +- lib/taurus/test/moduleexplorer.py | 17 +- lib/taurus/test/resource.py | 5 +- lib/taurus/test/test_import.py | 3 +- lib/taurus/test/testsuite.py | 5 +- 161 files changed, 5565 insertions(+), 544 deletions(-) create mode 100644 futurize.log diff --git a/.gitignore b/.gitignore index c120963b4..a561cc564 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ MANIFEST /setup.cfg doc/~thumbnails.zip /lib/taurus.egg-info +*.bak +*.swp diff --git a/doc/auto_rst4api.py b/doc/auto_rst4api.py index ce31ddf26..2c79e6609 100644 --- a/doc/auto_rst4api.py +++ b/doc/auto_rst4api.py @@ -26,6 +26,7 @@ ''' Creates a tree of dirs and restructured text stub files for documenting the API of a python module with sphinx''' +from __future__ import print_function import sys import os @@ -93,10 +94,10 @@ def cleanAutogenerated(self, apipath): fullname = os.path.join(dirpath, f) try: if self._isautogeneratedfile(fullname): - print "Removing %s" % fullname + print("Removing %s" % fullname) os.remove(fullname) - except Exception, e: - print 'Error accessing %s:%s' % (fullname, repr(e)) + except Exception as e: + print('Error accessing %s:%s' % (fullname, repr(e))) def createClassIndex(self, info, ofname): ''' @@ -114,17 +115,17 @@ def createClassIndex(self, info, ofname): classes = ['.'.join((m, c)) for m, c in classes] # make a full classname if self.verbose: - print 'creating "%s" ...' % ofname, + print('creating "%s" ...' % ofname, end=' ') if not os.path.exists(ofname) or (self.overwrite_old and self._isautogeneratedfile(ofname)): text = self.classindextemplate.render(info=info, classes=classes) f = open(ofname, "w") f.write('\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text))) f.close() if self.verbose: - print ' ok.' + print(' ok.') else: if self.verbose: - print ' skipping (file already exists)' + print(' skipping (file already exists)') def createStubs(self, info, docparentpath): '''creates rst stub files for modules and classes according to the @@ -139,26 +140,26 @@ def createStubs(self, info, docparentpath): # create the module doc dir if it didn't exist absdocpath = os.path.join(docparentpath, info['basemodulename']) if not os.path.exists(absdocpath): - os.makedirs(absdocpath, mode=0755) + os.makedirs(absdocpath, mode=0o755) # create module index stub in doc parent dir ofname = os.path.join(docparentpath, "%s.rst" % info['basemodulename']) if self.verbose: - print 'creating "%s" ...' % ofname, + print('creating "%s" ...' % ofname, end=' ') if not os.path.exists(ofname) or (self.overwrite_old and self._isautogeneratedfile(ofname)): text = self.moduletemplate.render(info=info) f = open(ofname, "w") f.write('\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text))) f.close() if self.verbose: - print ' ok.' + print(' ok.') else: if self.verbose: - print ' skipping (file already exists)' + print(' skipping (file already exists)') # create class stubs for name in info['localclassnames']: ofname = os.path.join(absdocpath, "_%s.rst" % name) if self.verbose: - print 'creating "%s" ...' % ofname, + print('creating "%s" ...' % ofname, end=' ') if not os.path.exists(ofname) or (self.overwrite_old and self._isautogeneratedfile(ofname)): text = self.classtemplate.render(info=info, classname=name) f = open(ofname, "w") @@ -166,10 +167,10 @@ def createStubs(self, info, docparentpath): '\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text))) f.close() if self.verbose: - print ' ok.' + print(' ok.') else: if self.verbose: - print ' skipping (file already exists)' + print(' skipping (file already exists)') # recurse for submodules for sminfo in info['submodules'].itervalues(): self.createStubs(sminfo, absdocpath) @@ -191,7 +192,7 @@ def documentModule(self, modulename, docparentpath, exclude_patterns=None): :return: (list) list of warning messages ''' if self.verbose: - print "\nDocumenting %s..." % modulename + print("\nDocumenting %s..." % modulename) if exclude_patterns is None: exclude_patterns = self.exclude_patterns moduleinfo, w = ModuleExplorer.explore(modulename, @@ -209,16 +210,16 @@ def documentModule(self, modulename, docparentpath, exclude_patterns=None): def main(): import sys if len(sys.argv) != 3: - print 'Usage:\n\t%s modulename docpreffix\n\n' % sys.argv[0] + print('Usage:\n\t%s modulename docpreffix\n\n' % sys.argv[0]) sys.exit(1) modulename, docparentpath = sys.argv[1:] creator = Auto_rst4API_Creator(verbose=True) r = creator.documentModule( modulename, docparentpath, exclude_patterns=['.*\.test']) - print '\n\n' + '*' * 50 - print "Auto Creation of API docs for %s Finished with %i warnings:" % (modulename, len(r)) - print '\n'.join(r) - print '*' * 50 + '\n' + print('\n\n' + '*' * 50) + print("Auto Creation of API docs for %s Finished with %i warnings:" % (modulename, len(r))) + print('\n'.join(r)) + print('*' * 50 + '\n') if __name__ == "__main__": main() diff --git a/doc/buildmock.py b/doc/buildmock.py index 7047c0009..cd08e75a9 100644 --- a/doc/buildmock.py +++ b/doc/buildmock.py @@ -36,6 +36,7 @@ the API of a python module with sphinx''' from __future__ import with_statement +from __future__ import print_function import os import sys @@ -268,11 +269,11 @@ def guess_submodules_from_package(module_name, exclude=(), include=()): continue # check if the module is indeed importable try: - print name + print(name) _import(name) full_module_names.append(name) except: - print '!' + print('!') pass return full_module_names @@ -338,7 +339,7 @@ def build_mocks_for_taurus(output='mock.zip'): if zfile: _zipdir(outdir, zfile) # compress the dir into the zip file shutil.rmtree(outdir) # delete the dir - print '\nMocks written in %s' % output + print('\nMocks written in %s' % output) if __name__ == "__main__": diff --git a/doc/source/conf.py b/doc/source/conf.py index 213a0396f..82bcc764a 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -23,6 +23,7 @@ # along with Taurus. If not, see . ## ############################################################################## +from __future__ import print_function import sys import os diff --git a/doc/source/devel/examples/TaurusTest.py b/doc/source/devel/examples/TaurusTest.py index 9e5b523be..44149d31b 100644 --- a/doc/source/devel/examples/TaurusTest.py +++ b/doc/source/devel/examples/TaurusTest.py @@ -1,3 +1,4 @@ +from __future__ import print_function import PyTango import sys import math @@ -10,10 +11,10 @@ def __init__(self, cl, name): TaurusTest.init_device(self) def delete_device(self): - print "[Device delete_device method] for device", self.get_name() + print("[Device delete_device method] for device", self.get_name()) def init_device(self): - print "In ", self.get_name(), "::init_device()" + print("In ", self.get_name(), "::init_device()") self.set_state(PyTango.DevState.ON) self.get_device_properties(self.get_device_class()) self._position = 50.0 @@ -24,10 +25,10 @@ def init_device(self): self._curve = [math.sin(x) for x in self._abscissas] def always_executed_hook(self): - print "In ", self.get_name(), "::always_excuted_hook()" + print("In ", self.get_name(), "::always_excuted_hook()") def read_attr_hardware(self, data): - print "In ", self.get_name(), "::read_attr_hardware()" + print("In ", self.get_name(), "::read_attr_hardware()") def read_Position(self, attr): attr.set_value(self._position) @@ -68,7 +69,7 @@ def write_Curve(self, attr): self._curve = attr.get_write_value() def create_device_cb(self, device_name): - print "About to create device", device_name + print("About to create device", device_name) def CreateTaurusTestDevice(self, device_name): klass = self.get_device_class() @@ -173,7 +174,7 @@ class TaurusTestClass(PyTango.DeviceClass): def __init__(self, name): PyTango.DeviceClass.__init__(self, name) self.set_type(name) - print "In TaurusTestClass constructor" + print("In TaurusTestClass constructor") if __name__ == '__main__': @@ -185,7 +186,7 @@ def __init__(self, name): U.server_init() U.server_run() - except PyTango.DevFailed, e: - print '-------> Received a DevFailed exception:', e - except Exception, e: - print '-------> An unforeseen exception occured....', e + except PyTango.DevFailed as e: + print('-------> Received a DevFailed exception:', e) + except Exception as e: + print('-------> An unforeseen exception occured....', e) diff --git a/doc/source/devel/examples/parentmodel_issue_demo.py b/doc/source/devel/examples/parentmodel_issue_demo.py index ced093365..5075a3aeb 100644 --- a/doc/source/devel/examples/parentmodel_issue_demo.py +++ b/doc/source/devel/examples/parentmodel_issue_demo.py @@ -8,6 +8,7 @@ call recheckTaurusParent for all designer created widgets that use TaurusParentModel. You can do it right after calling the setupUi method. ''' +from __future__ import print_function from taurus.external.qt import Qt from taurus.qt.qtgui.container import TaurusWidget @@ -60,8 +61,8 @@ # c.recheckTaurusParent() p.setModel('sys/tg_test/1/state') -print 'p model:', p.getModelName() -print 'c model:', c.getModelName() +print('p model:', p.getModelName()) +print('c model:', c.getModelName()) p.show() diff --git a/doc/source/devel/examples/pyqwt_issue_test.py b/doc/source/devel/examples/pyqwt_issue_test.py index cc2e7906b..dfc4add44 100644 --- a/doc/source/devel/examples/pyqwt_issue_test.py +++ b/doc/source/devel/examples/pyqwt_issue_test.py @@ -15,6 +15,7 @@ https://bugs.launchpad.net/ubuntu/+source/pyqwt5/+bug/672509 http://www.esrf.eu/mail_archives/tango/archive/msg04025.html ''' +from __future__ import print_function from PyQt4 import Qt, Qwt5 @@ -39,14 +40,14 @@ class MyPlot(Qwt5.QwtPlot): def __init__(self, parent=None): Qwt5.QwtPlot.__init__(self, parent) self.setAxisScaleDraw(Qwt5.QwtPlot.xBottom, MyScaleDrawSafe()) - print "Replotting with MyScaleDrawSafe:..." + print("Replotting with MyScaleDrawSafe:...") self.replot() - print "ok" + print("ok") self.setAxisScaleDraw(Qwt5.QwtPlot.xBottom, MyScaleDrawDanger()) - print "Replotting with MyScaleDrawDanger (if it crashes now you are affected by the bug) :..." + print("Replotting with MyScaleDrawDanger (if it crashes now you are affected by the bug) :...") self.replot() - print "SAFE!!!" - print "if this is printed, the sip/PyQwt bug does not affect you" + print("SAFE!!!") + print("if this is printed, the sip/PyQwt bug does not affect you") app = Qt.QApplication([]) p = MyPlot() diff --git a/doc/source/sphinxext/taurusextension.py b/doc/source/sphinxext/taurusextension.py index 760dcba5d..16e021db2 100644 --- a/doc/source/sphinxext/taurusextension.py +++ b/doc/source/sphinxext/taurusextension.py @@ -24,6 +24,7 @@ ############################################################################## """helper methods for taurus sphinx documentation""" +from __future__ import print_function __expr = ('or',) @@ -65,9 +66,9 @@ def process_param(line): new_lines.append('%s:type %s: %s' % (prefix, param_name, klass)) new_lines.append('%s:param %s: %s' % (prefix, param_name, desc)) - except Exception, e: - print "Taurus sphinx extension: Not able to process param: '%s'" % line - print " Reason:", str(e) + except Exception as e: + print("Taurus sphinx extension: Not able to process param: '%s'" % line) + print(" Reason:", str(e)) new_lines.append(line) return new_lines @@ -85,9 +86,9 @@ def process_return(line): desc = desc[pos + 1:] new_lines.append('%s:rtype: %s' % (prefix, klass)) new_lines.append('%s:return: %s' % (prefix, desc)) - except Exception, e: - print "TaurusExtension: Not able to process 'return': '%s'" % line - print " Reason:", str(e) + except Exception as e: + print("TaurusExtension: Not able to process 'return': '%s'" % line) + print(" Reason:", str(e)) new_lines.append(line) return new_lines @@ -105,9 +106,9 @@ def process_raise(line): klass = "(" + process_type(elem_type, obj_type='exc') + ")" desc = desc[pos + 1:] new_lines.append('%s:raise: %s %s' % (prefix, klass, desc)) - except Exception, e: - print "TaurusExtension: Not able to process 'raise': '%s'" % line - print " Reason:", str(e) + except Exception as e: + print("TaurusExtension: Not able to process 'raise': '%s'" % line) + print(" Reason:", str(e)) new_lines.append(line) return new_lines diff --git a/futurize.log b/futurize.log new file mode 100644 index 000000000..4f2613efb --- /dev/null +++ b/futurize.log @@ -0,0 +1,4878 @@ +--- doc/auto_rst4api.py (original) ++++ doc/auto_rst4api.py (refactored) +@@ -26,6 +26,7 @@ + + ''' Creates a tree of dirs and restructured text stub files for documenting + the API of a python module with sphinx''' ++from __future__ import print_function + + import sys + import os +@@ -93,10 +94,10 @@ + fullname = os.path.join(dirpath, f) + try: + if self._isautogeneratedfile(fullname): +- print "Removing %s" % fullname ++ print("Removing %s" % fullname) + os.remove(fullname) +- except Exception, e: +- print 'Error accessing %s:%s' % (fullname, repr(e)) ++ except Exception as e: ++ print('Error accessing %s:%s' % (fullname, repr(e))) + + def createClassIndex(self, info, ofname): + ''' +@@ -114,17 +115,17 @@ + classes = ['.'.join((m, c)) + for m, c in classes] # make a full classname + if self.verbose: +- print 'creating "%s" ...' % ofname, ++ print('creating "%s" ...' % ofname, end=' ') + if not os.path.exists(ofname) or (self.overwrite_old and self._isautogeneratedfile(ofname)): + text = self.classindextemplate.render(info=info, classes=classes) + f = open(ofname, "w") + f.write('\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text))) + f.close() + if self.verbose: +- print ' ok.' ++ print(' ok.') + else: + if self.verbose: +- print ' skipping (file already exists)' ++ print(' skipping (file already exists)') + + def createStubs(self, info, docparentpath): + '''creates rst stub files for modules and classes according to the +@@ -139,26 +140,26 @@ + # create the module doc dir if it didn't exist + absdocpath = os.path.join(docparentpath, info['basemodulename']) + if not os.path.exists(absdocpath): +- os.makedirs(absdocpath, mode=0755) ++ os.makedirs(absdocpath, mode=0o755) + # create module index stub in doc parent dir + ofname = os.path.join(docparentpath, "%s.rst" % info['basemodulename']) + if self.verbose: +- print 'creating "%s" ...' % ofname, ++ print('creating "%s" ...' % ofname, end=' ') + if not os.path.exists(ofname) or (self.overwrite_old and self._isautogeneratedfile(ofname)): + text = self.moduletemplate.render(info=info) + f = open(ofname, "w") + f.write('\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text))) + f.close() + if self.verbose: +- print ' ok.' ++ print(' ok.') + else: + if self.verbose: +- print ' skipping (file already exists)' ++ print(' skipping (file already exists)') + # create class stubs + for name in info['localclassnames']: + ofname = os.path.join(absdocpath, "_%s.rst" % name) + if self.verbose: +- print 'creating "%s" ...' % ofname, ++ print('creating "%s" ...' % ofname, end=' ') + if not os.path.exists(ofname) or (self.overwrite_old and self._isautogeneratedfile(ofname)): + text = self.classtemplate.render(info=info, classname=name) + f = open(ofname, "w") +@@ -166,10 +167,10 @@ + '\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text))) + f.close() + if self.verbose: +- print ' ok.' ++ print(' ok.') + else: + if self.verbose: +- print ' skipping (file already exists)' ++ print(' skipping (file already exists)') + # recurse for submodules + for sminfo in info['submodules'].itervalues(): + self.createStubs(sminfo, absdocpath) +@@ -191,7 +192,7 @@ + :return: (list) list of warning messages + ''' + if self.verbose: +- print "\nDocumenting %s..." % modulename ++ print("\nDocumenting %s..." % modulename) + if exclude_patterns is None: + exclude_patterns = self.exclude_patterns + moduleinfo, w = ModuleExplorer.explore(modulename, +@@ -209,16 +210,16 @@ + def main(): + import sys + if len(sys.argv) != 3: +- print 'Usage:\n\t%s modulename docpreffix\n\n' % sys.argv[0] ++ print('Usage:\n\t%s modulename docpreffix\n\n' % sys.argv[0]) + sys.exit(1) + modulename, docparentpath = sys.argv[1:] + creator = Auto_rst4API_Creator(verbose=True) + r = creator.documentModule( + modulename, docparentpath, exclude_patterns=['.*\.test']) +- print '\n\n' + '*' * 50 +- print "Auto Creation of API docs for %s Finished with %i warnings:" % (modulename, len(r)) +- print '\n'.join(r) +- print '*' * 50 + '\n' ++ print('\n\n' + '*' * 50) ++ print("Auto Creation of API docs for %s Finished with %i warnings:" % (modulename, len(r))) ++ print('\n'.join(r)) ++ print('*' * 50 + '\n') + + if __name__ == "__main__": + main() +--- doc/buildmock.py (original) ++++ doc/buildmock.py (refactored) +@@ -36,6 +36,7 @@ + the API of a python module with sphinx''' + + from __future__ import with_statement ++from __future__ import print_function + + import os + import sys +@@ -268,11 +269,11 @@ + continue + # check if the module is indeed importable + try: +- print name ++ print(name) + _import(name) + full_module_names.append(name) + except: +- print '!' ++ print('!') + pass + return full_module_names + +@@ -338,7 +339,7 @@ + if zfile: + _zipdir(outdir, zfile) # compress the dir into the zip file + shutil.rmtree(outdir) # delete the dir +- print '\nMocks written in %s' % output ++ print('\nMocks written in %s' % output) + + + if __name__ == "__main__": +--- doc/source/conf.py (original) ++++ doc/source/conf.py (refactored) +@@ -23,6 +23,7 @@ + # along with Taurus. If not, see . + ## + ############################################################################## ++from __future__ import print_function + import sys + import os + +--- doc/source/devel/examples/parentmodel_issue_demo.py (original) ++++ doc/source/devel/examples/parentmodel_issue_demo.py (refactored) +@@ -8,6 +8,7 @@ + call recheckTaurusParent for all designer created widgets that use TaurusParentModel. + You can do it right after calling the setupUi method. + ''' ++from __future__ import print_function + + from taurus.external.qt import Qt + from taurus.qt.qtgui.container import TaurusWidget +@@ -60,8 +61,8 @@ + # c.recheckTaurusParent() + + p.setModel('sys/tg_test/1/state') +-print 'p model:', p.getModelName() +-print 'c model:', c.getModelName() ++print('p model:', p.getModelName()) ++print('c model:', c.getModelName()) + + + p.show() +--- doc/source/devel/examples/pyqwt_issue_test.py (original) ++++ doc/source/devel/examples/pyqwt_issue_test.py (refactored) +@@ -15,6 +15,7 @@ + https://bugs.launchpad.net/ubuntu/+source/pyqwt5/+bug/672509 + http://www.esrf.eu/mail_archives/tango/archive/msg04025.html + ''' ++from __future__ import print_function + + from PyQt4 import Qt, Qwt5 + +@@ -39,14 +40,14 @@ + def __init__(self, parent=None): + Qwt5.QwtPlot.__init__(self, parent) + self.setAxisScaleDraw(Qwt5.QwtPlot.xBottom, MyScaleDrawSafe()) +- print "Replotting with MyScaleDrawSafe:..." ++ print("Replotting with MyScaleDrawSafe:...") + self.replot() +- print "ok" ++ print("ok") + self.setAxisScaleDraw(Qwt5.QwtPlot.xBottom, MyScaleDrawDanger()) +- print "Replotting with MyScaleDrawDanger (if it crashes now you are affected by the bug) :..." ++ print("Replotting with MyScaleDrawDanger (if it crashes now you are affected by the bug) :...") + self.replot() +- print "SAFE!!!" +- print "if this is printed, the sip/PyQwt bug does not affect you" ++ print("SAFE!!!") ++ print("if this is printed, the sip/PyQwt bug does not affect you") + + app = Qt.QApplication([]) + p = MyPlot() +--- doc/source/devel/examples/TaurusTest.py (original) ++++ doc/source/devel/examples/TaurusTest.py (refactored) +@@ -1,3 +1,4 @@ ++from __future__ import print_function + import PyTango + import sys + import math +@@ -10,10 +11,10 @@ + TaurusTest.init_device(self) + + def delete_device(self): +- print "[Device delete_device method] for device", self.get_name() ++ print("[Device delete_device method] for device", self.get_name()) + + def init_device(self): +- print "In ", self.get_name(), "::init_device()" ++ print("In ", self.get_name(), "::init_device()") + self.set_state(PyTango.DevState.ON) + self.get_device_properties(self.get_device_class()) + self._position = 50.0 +@@ -24,10 +25,10 @@ + self._curve = [math.sin(x) for x in self._abscissas] + + def always_executed_hook(self): +- print "In ", self.get_name(), "::always_excuted_hook()" ++ print("In ", self.get_name(), "::always_excuted_hook()") + + def read_attr_hardware(self, data): +- print "In ", self.get_name(), "::read_attr_hardware()" ++ print("In ", self.get_name(), "::read_attr_hardware()") + + def read_Position(self, attr): + attr.set_value(self._position) +@@ -68,7 +69,7 @@ + self._curve = attr.get_write_value() + + def create_device_cb(self, device_name): +- print "About to create device", device_name ++ print("About to create device", device_name) + + def CreateTaurusTestDevice(self, device_name): + klass = self.get_device_class() +@@ -173,7 +174,7 @@ + def __init__(self, name): + PyTango.DeviceClass.__init__(self, name) + self.set_type(name) +- print "In TaurusTestClass constructor" ++ print("In TaurusTestClass constructor") + + + if __name__ == '__main__': +@@ -185,7 +186,7 @@ + U.server_init() + U.server_run() + +- except PyTango.DevFailed, e: +- print '-------> Received a DevFailed exception:', e +- except Exception, e: +- print '-------> An unforeseen exception occured....', e ++ except PyTango.DevFailed as e: ++ print('-------> Received a DevFailed exception:', e) ++ except Exception as e: ++ print('-------> An unforeseen exception occured....', e) +--- doc/source/sphinxext/taurusextension.py (original) ++++ doc/source/sphinxext/taurusextension.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################## + + """helper methods for taurus sphinx documentation""" ++from __future__ import print_function + + __expr = ('or',) + +@@ -65,9 +66,9 @@ + new_lines.append('%s:type %s: %s' % + (prefix, param_name, klass)) + new_lines.append('%s:param %s: %s' % (prefix, param_name, desc)) +- except Exception, e: +- print "Taurus sphinx extension: Not able to process param: '%s'" % line +- print " Reason:", str(e) ++ except Exception as e: ++ print("Taurus sphinx extension: Not able to process param: '%s'" % line) ++ print(" Reason:", str(e)) + new_lines.append(line) + return new_lines + +@@ -85,9 +86,9 @@ + desc = desc[pos + 1:] + new_lines.append('%s:rtype: %s' % (prefix, klass)) + new_lines.append('%s:return: %s' % (prefix, desc)) +- except Exception, e: +- print "TaurusExtension: Not able to process 'return': '%s'" % line +- print " Reason:", str(e) ++ except Exception as e: ++ print("TaurusExtension: Not able to process 'return': '%s'" % line) ++ print(" Reason:", str(e)) + new_lines.append(line) + return new_lines + +@@ -105,9 +106,9 @@ + klass = "(" + process_type(elem_type, obj_type='exc') + ")" + desc = desc[pos + 1:] + new_lines.append('%s:raise: %s %s' % (prefix, klass, desc)) +- except Exception, e: +- print "TaurusExtension: Not able to process 'raise': '%s'" % line +- print " Reason:", str(e) ++ except Exception as e: ++ print("TaurusExtension: Not able to process 'raise': '%s'" % line) ++ print(" Reason:", str(e)) + new_lines.append(line) + return new_lines + +--- lib/taurus/console/list.py (original) ++++ lib/taurus/console/list.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """ """ ++from __future__ import absolute_import + + __all__ = ["List"] + +@@ -32,7 +33,7 @@ + import textwrap + import operator + +-from enums import Alignment ++from .enums import Alignment + + + class List(list): +--- lib/taurus/console/table.py (original) ++++ lib/taurus/console/table.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """ """ ++from functools import reduce + + __all__ = ["Table"] + +@@ -64,7 +65,7 @@ + if row_head_str is not None and len(row_head_str) != self.nr_row: + msg = 'RowHeadStr nr (%d) and RowNr (%d) mistmatch' % \ + (len(row_head_str), self.nr_row) +- raise ValueError, msg ++ raise ValueError(msg) + if row_head_width is None: + if row_head_str is not None: + row_head_width = max_len_fn(row_head_str) +@@ -77,7 +78,7 @@ + if col_head_str is not None and len(col_head_str) != self.nr_col: + msg = 'ColHeadStr nr (%d) and ColNr (%d) mistmatch' % \ + len(col_head_str), self.nr_col +- raise ValueError, msg ++ raise ValueError(msg) + if col_head_width is None: + if col_head_str is not None: + col_head_width = reduce(max, map(max_len_fn, col_head_str)) +--- lib/taurus/core/epics/epicsattribute.py (original) ++++ lib/taurus/core/epics/epicsattribute.py (refactored) +@@ -25,6 +25,8 @@ + ''' + Epics module. See __init__.py for more detailed documentation + ''' ++from __future__ import print_function ++from __future__ import absolute_import + __all__ = ['EpicsAttribute'] + + +@@ -233,12 +235,12 @@ + # ------------------------------------------------------------------------------ + + def factory(self): +- from epicsfactory import EpicsFactory ++ from .epicsfactory import EpicsFactory + return EpicsFactory() + + @classmethod + def getNameValidator(cls): +- from epicsvalidator import EpicsAttributeNameValidator ++ from .epicsvalidator import EpicsAttributeNameValidator + return EpicsAttributeNameValidator() + + +@@ -251,6 +253,6 @@ + b.write(4.) + s.read() + +- print "!$!", s.read(cache=False) +- print "a,b,s", a.read().rvalue, b.read().rvalue, s.read().rvalue +- print "DF=", a.getDataFormat(), DataFormat.whatis(a.getDataFormat()) ++ print("!$!", s.read(cache=False)) ++ print("a,b,s", a.read().rvalue, b.read().rvalue, s.read().rvalue) ++ print("DF=", a.getDataFormat(), DataFormat.whatis(a.getDataFormat())) +--- lib/taurus/core/epics/epicsfactory.py (original) ++++ lib/taurus/core/epics/epicsfactory.py (refactored) +@@ -25,6 +25,7 @@ + ''' + Epics module. See __init__.py for more detailed documentation + ''' ++from __future__ import absolute_import + __all__ = ['EpicsFactory'] + + +@@ -44,9 +45,9 @@ + from taurus.core.taurusbasetypes import TaurusElementType + from taurus.core.taurusfactory import TaurusFactory + +-from epicsattribute import EpicsAttribute +-from epicsdevice import EpicsDevice +-from epicsauthority import EpicsAuthority ++from .epicsattribute import EpicsAttribute ++from .epicsdevice import EpicsDevice ++from .epicsauthority import EpicsAuthority + + + class EpicsFactory(Singleton, TaurusFactory, Logger): +@@ -145,17 +146,17 @@ + + def getAuthorityNameValidator(self): + """Return EpicsAuthorityNameValidator""" +- import epicsvalidator ++ from . import epicsvalidator + return epicsvalidator.EpicsAuthorityNameValidator() + + def getDeviceNameValidator(self): + """Return EpicsDeviceNameValidator""" +- import epicsvalidator ++ from . import epicsvalidator + return epicsvalidator.EpicsDeviceNameValidator() + + def getAttributeNameValidator(self): + """Return EpicsAttributeNameValidator""" +- import epicsvalidator ++ from . import epicsvalidator + return epicsvalidator.EpicsAttributeNameValidator() + + if __name__ == "__main__": +--- lib/taurus/core/epics/__init__.py (original) ++++ lib/taurus/core/epics/__init__.py (refactored) +@@ -66,5 +66,6 @@ + are just convenience dummy objects in the epics scheme at this point. + Epics records may eventually be mapped as Devices. + """ ++from __future__ import absolute_import + +-from epicsfactory import * ++from .epicsfactory import * +--- lib/taurus/core/epics/test/test_epicsattribute.py (original) ++++ lib/taurus/core/epics/test/test_epicsattribute.py (refactored) +@@ -56,7 +56,7 @@ + error=None, + ) + ) +-@unittest.skipIf(sys.modules.has_key('epics') is False, ++@unittest.skipIf(('epics' in sys.modules) is False, + "epics module is not available") + class AttributeTestCase(unittest.TestCase): + """TestCase for the taurus.Attribute helper""" +--- lib/taurus/core/epics/test/test_epicsvalidator.py (original) ++++ lib/taurus/core/epics/test/test_epicsvalidator.py (refactored) +@@ -47,7 +47,7 @@ + @invalid(name='ca:/') + @invalid(name='ca:///') + @invalid(name='ca://a') +-@unittest.skipIf(sys.modules.has_key('epics') is False, ++@unittest.skipIf(('epics' in sys.modules) is False, + "epics module is not available") + class EpicsAuthValidatorTestCase(AbstractNameValidatorTestCase, + unittest.TestCase): +@@ -66,7 +66,7 @@ + @invalid(name='ca:foo') # device requires absolute path + @invalid(name='ca:/foo') # devname must be empty (for now) + @invalid(name='ca:@foo') +-@unittest.skipIf(sys.modules.has_key('epics') is False, ++@unittest.skipIf(('epics' in sys.modules) is False, + "epics module is not available") + class EpicsDevValidatorTestCase(AbstractNameValidatorTestCase, + unittest.TestCase): +@@ -129,7 +129,7 @@ + @valid(name='ca:1#units', groups={'fragment': 'units'}) + @valid(name='ca:a') + @names(name='ca:XXX:sum', out=('ca:XXX:sum', 'XXX:sum', 'XXX:sum')) +-@unittest.skipIf(sys.modules.has_key('epics') is False, ++@unittest.skipIf(('epics' in sys.modules) is False, + "epics module is not available") + class EpicsAttrValidatorTestCase(AbstractNameValidatorTestCase, + unittest.TestCase): +--- lib/taurus/core/evaluation/evalattribute.py (original) ++++ lib/taurus/core/evaluation/evalattribute.py (refactored) +@@ -200,7 +200,7 @@ + for n in names[1:-1]: + obj = getattr(obj, n) + obj = getattr(obj.__class__, names[-1]) +- except Exception, e: ++ except Exception as e: + # self.info("%r", e) + return + ###################################################################### +@@ -359,7 +359,7 @@ +#TODO: da qua + self._value.rvalue = rvalue + self._value.time = TaurusTimeVal.now() + self._value.quality = AttrQuality.ATTR_VALID +- except Exception, e: ++ except Exception as e: + self._value.quality = AttrQuality.ATTR_INVALID + msg = " the function '%s' could not be evaluated. Reason: %s" \ + % (self._transformation, repr(e)) +--- lib/taurus/core/evaluation/evalfactory.py (original) ++++ lib/taurus/core/evaluation/evalfactory.py (refactored) +@@ -25,15 +25,16 @@ + ''' + evaluation module. See __init__.py for more detailed documentation + ''' ++from __future__ import absolute_import + __all__ = ['EvaluationFactory'] + + + import weakref + + from taurus.core.taurusbasetypes import TaurusElementType +-from evalattribute import EvaluationAttribute +-from evalauthority import EvaluationAuthority +-from evaldevice import EvaluationDevice ++from .evalattribute import EvaluationAttribute ++from .evalauthority import EvaluationAuthority ++from .evaldevice import EvaluationDevice + from taurus.core.taurusexception import TaurusException, DoubleRegistration + from taurus.core.util.log import Logger + from taurus.core.util.singleton import Singleton +@@ -195,7 +196,7 @@ + if a is None: # if the full name is not there, create one + dev = self.getDevice(validator.getDeviceName(attr_name)) + kwargs['storeCallback'] = self._storeAttr +- if not kwargs.has_key('pollingPeriod'): ++ if 'pollingPeriod' not in kwargs: + kwargs['pollingPeriod'] = self.getDefaultPollingPeriod() + a = EvaluationAttribute(fullname, parent=dev, **kwargs) + return a +@@ -242,15 +243,15 @@ + + def getAuthorityNameValidator(self): + """Return EvaluationAuthorityNameValidator""" +- import evalvalidator ++ from . import evalvalidator + return evalvalidator.EvaluationAuthorityNameValidator() + + def getDeviceNameValidator(self): + """Return EvaluationDeviceNameValidator""" +- import evalvalidator ++ from . import evalvalidator + return evalvalidator.EvaluationDeviceNameValidator() + + def getAttributeNameValidator(self): + """Return EvaluationAttributeNameValidator""" +- import evalvalidator ++ from . import evalvalidator + return evalvalidator.EvaluationAttributeNameValidator() +--- lib/taurus/core/evaluation/evalvalidator.py (original) ++++ lib/taurus/core/evaluation/evalvalidator.py (refactored) +@@ -22,6 +22,7 @@ + ## + ############################################################################# + ++from __future__ import absolute_import + __all__ = ['EvaluationDeviceNameValidator', + 'EvaluationAttributeNameValidator'] + +@@ -180,7 +181,7 @@ + + def getNames(self, fullname, factory=None): + '''reimplemented from :class:`TaurusDeviceNameValidator`''' +- from evalfactory import EvaluationFactory ++ from .evalfactory import EvaluationFactory + # TODO: add mechanism to select strict mode instead of hardcoding here + groups = self.getUriGroups(fullname) + if groups is None: +@@ -424,7 +425,7 @@ + + def getNames(self, fullname, factory=None, fragment=False): + '''reimplemented from :class:`TaurusDeviceNameValidator`''' +- from evalfactory import EvaluationFactory ++ from .evalfactory import EvaluationFactory + groups = self.getUriGroups(fullname) + if groups is None: + return None +@@ -497,7 +498,7 @@ + def getDeviceName(self, name): + #@TODO: Maybe this belongs to the factory, not the validator + '''Obtain the fullname of the device from the attribute name''' +- from evalfactory import EvaluationFactory ++ from .evalfactory import EvaluationFactory + groups = self.getUriGroups(name) + if groups is None: + return None +@@ -512,7 +513,7 @@ + def getDBName(self, s): + #@TODO: Maybe this belongs to the factory, not the validator + '''returns the full data base name for the given attribute name''' +- from evalfactory import EvaluationFactory ++ from .evalfactory import EvaluationFactory + m = self.name_re.match(s) + if m is None: + return None +--- lib/taurus/core/evaluation/__init__.py (original) ++++ lib/taurus/core/evaluation/__init__.py (refactored) +@@ -176,8 +176,9 @@ + This syntax is now deprecated and should not be used. Taurus will + issue warnings if detected. + """ ++from __future__ import absolute_import + +-from evalfactory import EvaluationFactory +-from evalattribute import EvaluationAttribute +-from evalauthority import EvaluationAuthority +-from evaldevice import EvaluationDevice ++from .evalfactory import EvaluationFactory ++from .evalattribute import EvaluationAttribute ++from .evalauthority import EvaluationAuthority ++from .evaldevice import EvaluationDevice +--- lib/taurus/core/evaluation/test/res/dev_example.py (original) ++++ lib/taurus/core/evaluation/test/res/dev_example.py (refactored) +@@ -25,6 +25,7 @@ + ''' + Examples on using the evaluation scheme for exposing arbitrary non-tango quantities as taurus attributes + ''' ++from __future__ import print_function + + __all__ = ['FreeSpaceDevice'] + +@@ -70,7 +71,7 @@ + # calculates free space in Gb + a = taurus.Attribute( + 'eval:@taurus.core.evaluation.test.res.dev_example.FreeSpaceDevice/getFreeSpace("/").to("GiB")') +- print "Free space: {:s}".format(a.read().rvalue), a.read().rvalue.units ++ print("Free space: {:s}".format(a.read().rvalue), a.read().rvalue.units) + + + def test2(): +--- lib/taurus/core/evaluation/test/res/ipap_example.py (original) ++++ lib/taurus/core/evaluation/test/res/ipap_example.py (refactored) +@@ -26,6 +26,7 @@ + Examples on using the evaluation scheme for exposing icepap driver values + as taurus attributes + """ ++from __future__ import print_function + + + ATTR_IPAP_POS = ( 'eval:@ipap=pyIcePAP.EthIcePAP("icepap06", port=5000)' + +@@ -35,7 +36,7 @@ + def _test1(): + import taurus.core + a = taurus.Attribute(ATTR_IPAP_POS) +- print "axis pos:", a.read().rvalue ++ print("axis pos:", a.read().rvalue) + + + def _test2(): +--- lib/taurus/core/evaluation/test/res/mymod.py (original) ++++ lib/taurus/core/evaluation/test/res/mymod.py (refactored) +@@ -26,6 +26,7 @@ + """ + This module is used for the tests of custom evaluation devices. + """ ++from __future__ import print_function + + import os + from taurus.external.pint import Quantity +@@ -82,16 +83,16 @@ + def test1(): + n = 'eval:@c=taurus.core.evaluation.test.res.mymod.MyClass(987)/c.foo' + a = taurus.Attribute(n) +- print "READ 1: ", a.read() ++ print("READ 1: ", a.read()) + # print a.range +- print "WRITE+READ", a.write(Quantity(999, "m")) +- print "READ 2: ", a.read(cache=False) ++ print("WRITE+READ", a.write(Quantity(999, "m"))) ++ print("READ 2: ", a.read(cache=False)) + + def test2(models): + for m in models: +- print m ++ print(m) + a = taurus.Attribute(m) +- print " -->", a.writable, a.read().rvalue ++ print(" -->", a.writable, a.read().rvalue) + + models = [ + # instance models +--- lib/taurus/core/init_bkcomp.py (original) ++++ lib/taurus/core/init_bkcomp.py (refactored) +@@ -24,10 +24,11 @@ + ############################################################################# + + """The core module""" ++from __future__ import absolute_import + + __docformat__ = "restructuredtext" + +-import release as Release ++from . import release as Release + # from .enums import * #note: all the enums from enums.py were moved to + # taurusbasetypes.py + from .taurusbasetypes import * +--- lib/taurus/core/__init__.py (original) ++++ lib/taurus/core/__init__.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """The core module""" ++from __future__ import absolute_import + + __docformat__ = "restructuredtext" + +@@ -33,6 +34,6 @@ + taurus.tauruscustomsettings, 'LIGHTWEIGHT_IMPORTS', False) + + if LIGHTWEIGHT_IMPORTS: +- from init_lightweight import * ++ from .init_lightweight import * + else: +- from init_bkcomp import * ++ from .init_bkcomp import * +--- lib/taurus/core/resource/__init__.py (original) ++++ lib/taurus/core/resource/__init__.py (refactored) +@@ -99,5 +99,6 @@ + is not even defined). + + """ ++from __future__ import absolute_import + +-from resfactory import * ++from .resfactory import * +--- lib/taurus/core/resource/resfactory.py (original) ++++ lib/taurus/core/resource/resfactory.py (refactored) +@@ -26,6 +26,7 @@ + """ + resfactory.py: + """ ++from __future__ import absolute_import + + import os + import imp +@@ -86,7 +87,7 @@ + raise ValueError('priority must be >=1') + if operator.isMappingType(obj): + name = name or 'DICT%02d' % priority +- elif type(obj) in types.StringTypes or obj is None: ++ elif type(obj) in (str,) or obj is None: + name, mod = self.__reloadResource(obj) + obj = {} + for k, v in mod.__dict__.items(): +@@ -136,7 +137,7 @@ + m = imp.load_module(module_name, file_, pathname, desc) + if file_: + file_.close() +- except Exception, e: ++ except Exception as e: + if file_: + file_.close() + raise e +@@ -246,15 +247,15 @@ + + def getAuthorityNameValidator(self): + """Return ResourceAuthorityNameValidator""" +- import resvalidator ++ from . import resvalidator + return resvalidator.ResourceAuthorityNameValidator() + + def getDeviceNameValidator(self): + """Return ResourceDeviceNameValidator""" +- import resvalidator ++ from . import resvalidator + return resvalidator.ResourceDeviceNameValidator() + + def getAttributeNameValidator(self): + """Return ResourceAttributeNameValidator""" +- import resvalidator ++ from . import resvalidator + return resvalidator.ResourceAttributeNameValidator() +--- lib/taurus/core/resource/test/test_resfactory.py (original) ++++ lib/taurus/core/resource/test/test_resfactory.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """Test for taurus.core.resource.test.test_resfactory...""" ++from __future__ import print_function + __all__ = ["ResourceFactoryTestCase"] + + import os.path as osp +@@ -68,7 +69,7 @@ + + file_name1 = osp.join(osp.dirname(osp.abspath(__file__)), + 'res', 'attr_resources_file.py') +-print file_name1 ++print(file_name1) + + # TODO: the same key can be defined in different dictionaries (with different + # priority) but getValue method can not access to the less priority values in +--- lib/taurus/core/tango/img/__init__.py (original) ++++ lib/taurus/core/tango/img/__init__.py (refactored) +@@ -25,10 +25,11 @@ + + """The img package. It contains specific part of tango devices dedicated to + images (CCDs, detectors, etc)""" ++from __future__ import absolute_import + + __docformat__ = 'restructuredtext' + +-from img import * ++from .img import * + + + def registerExtensions(): +--- lib/taurus/core/tango/__init__.py (original) ++++ lib/taurus/core/tango/__init__.py (refactored) +@@ -102,12 +102,13 @@ + This syntax is now deprecated and should not be used. Taurus will + issue warnings if detected. + """ ++from __future__ import absolute_import + + __docformat__ = "restructuredtext" + +-from enums import * +-from tangodatabase import * +-from tangodevice import * +-from tangofactory import * +-from tangoattribute import * +-from tangoconfiguration import * ++from .enums import * ++from .tangodatabase import * ++from .tangodevice import * ++from .tangofactory import * ++from .tangoattribute import * ++from .tangoconfiguration import * +--- lib/taurus/core/tango/starter.py (original) ++++ lib/taurus/core/tango/starter.py (refactored) +@@ -29,6 +29,7 @@ + It is not a replacement of the Tango Starter Device Server since this is much + more limited in scope. + """ ++from __future__ import print_function + + __docformat__ = 'restructuredtext' + +@@ -236,9 +237,9 @@ + s.addNewDevice(devname, klass='Timeout') + s.startDs() + try: +- print 'Is running:', s.isRunning() +- print "ping:", PyTango.DeviceProxy(devname).ping() +- except Exception, e: +- print e ++ print('Is running:', s.isRunning()) ++ print("ping:", PyTango.DeviceProxy(devname).ping()) ++ except Exception as e: ++ print(e) + s.stopDs() + s.cleanDb(force=False) +--- lib/taurus/core/tango/tangoattribute.py (original) ++++ lib/taurus/core/tango/tangoattribute.py (refactored) +@@ -425,7 +425,7 @@ + # handle old PyTango + dev.write_attribute(name, value) + result = dev.read_attribute(name) +- except PyTango.DevFailed, df: ++ except PyTango.DevFailed as df: + for err in df: + # Handle old device servers + if err.reason == 'API_UnsupportedFeature': +@@ -439,12 +439,12 @@ + else: + dev.write_attribute(name, value) + return None +- except PyTango.DevFailed, df: ++ except PyTango.DevFailed as df: + err = df[0] + self.error("[Tango] write failed (%s): %s" % + (err.reason, err.desc)) + raise df +- except Exception, e: ++ except Exception as e: + self.error("[Tango] write failed: %s" % str(e)) + raise e + +@@ -473,12 +473,12 @@ + ): + return + self.__attr_value = value +- except PyTango.DevFailed, df: ++ except PyTango.DevFailed as df: + self.__subscription_event.set() + self.debug("Error polling: %s" % df[0].desc) + self.traceback() + self.fireEvent(TaurusEventType.Error, self.__attr_err) +- except Exception, e: ++ except Exception as e: + self.__subscription_event.set() + self.debug("Error polling: %s" % str(e)) + self.fireEvent(TaurusEventType.Error, self.__attr_err) +@@ -686,7 +686,7 @@ + try: + self.__dev_hw_obj.unsubscribe_event(self.__chg_evt_id) + self.__chg_evt_id = None +- except PyTango.DevFailed, df: ++ except PyTango.DevFailed as df: + if len(df.args) and df[0].reason == 'API_EventNotFound': + # probably tango shutdown has been initiated before and + # it unsubscribed from events itself +@@ -751,7 +751,7 @@ + try: + self.__dev_hw_obj.unsubscribe_event(self.__cfg_evt_id) + self.__cfg_evt_id = None +- except PyTango.DevFailed, e: ++ except PyTango.DevFailed as e: + self.debug("Error trying to unsubscribe configuration events") + self.trace(str(e)) + +--- lib/taurus/core/tango/tangodatabase.py (original) ++++ lib/taurus/core/tango/tangodatabase.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module contains all taurus tango authority""" ++from __future__ import print_function + + __all__ = ["TangoInfo", "TangoAttrInfo", "TangoDevInfo", "TangoServInfo", + "TangoDevClassInfo", "TangoDatabaseCache", "TangoDatabase", +@@ -288,8 +289,8 @@ + if not alive: + break + self._alive = alive +- except Exception, e: +- print "except", e ++ except Exception as e: ++ print("except", e) + self._alive = False + self._alivePending = False + return self._alive +@@ -514,9 +515,9 @@ + for dev in other: + try: + self.addDevice(dev) +- except Exception, e: +- print e +- except Exception, e: ++ except Exception as e: ++ print(e) ++ except Exception as e: + raise Exception( + "Must give dict or sequence") + +@@ -560,9 +561,9 @@ + for serv in other: + try: + self.addServer(serv) +- except Exception, e: +- print e +- except Exception, e: ++ except Exception as e: ++ print(e) ++ except Exception as e: + raise Exception( + "Must give dict or sequence") + +@@ -666,7 +667,7 @@ + try: + host, port = TangoAuthority.get_default_tango_host().rsplit(':', 1) + pars = host, port +- except Exception, e: ++ except Exception as e: + from taurus import warning + warning("Error getting default Tango host") + else: +--- lib/taurus/core/tango/tangodevice.py (original) ++++ lib/taurus/core/tango/tangodevice.py (refactored) +@@ -201,7 +201,7 @@ + def _createHWObject(self): + try: + return DeviceProxy(self.getFullName()) +- except DevFailed, e: ++ except DevFailed as e: + self.warning('Could not create HW object: %s' % (e[0].desc)) + self.traceback() + +--- lib/taurus/core/tango/tangofactory.py (original) ++++ lib/taurus/core/tango/tangofactory.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module provides the `TangoFactory` object""" ++from __future__ import absolute_import + + __all__ = ["TangoFactory"] + +@@ -220,7 +221,7 @@ + + :param attr_name: (str) attribute name + """ +- if self.tango_attr_klasses.has_key(attr_name): ++ if attr_name in self.tango_attr_klasses: + del self.tango_attr_klasses[attr_name] + + def registerDeviceClass(self, dev_klass_name, dev_klass): +@@ -239,7 +240,7 @@ + + :param dev_klass_name: (str) tango device class name + """ +- if self.tango_dev_klasses.has_key(dev_klass_name): ++ if dev_klass_name in self.tango_dev_klasses: + del self.tango_dev_klasses[dev_klass_name] + + def getDatabase(self, name=None): +@@ -398,7 +399,7 @@ + attr_klass = self._getAttributeClass( + attr_name=attr_name) + kwargs['storeCallback'] = self._storeAttribute +- if not kwargs.has_key('pollingPeriod'): ++ if 'pollingPeriod' not in kwargs: + kwargs[ + 'pollingPeriod'] = self.getDefaultPollingPeriod() + attr = attr_klass(full_attr_name, dev, **kwargs) +@@ -514,10 +515,10 @@ + raise KeyError("Device %s not found" % dev_or_dev_name) + dev.cleanUp() + full_name = dev.getFullName() +- if self.tango_devs.has_key(full_name): ++ if full_name in self.tango_devs: + del self.tango_devs[full_name] + simp_name = dev.getSimpleName() +- if self.tango_alias_devs.has_key(simp_name): ++ if simp_name in self.tango_alias_devs: + del self.tango_alias_devs[simp_name] + + def removeExistingAttribute(self, attr_or_attr_name): +@@ -533,7 +534,7 @@ + raise KeyError("Attribute %s not found" % attr_or_attr_name) + attr.cleanUp() + full_name = attr.getFullName() +- if self.tango_attrs.has_key(full_name): ++ if full_name in self.tango_attrs: + del self.tango_attrs[full_name] + + def isPollingEnabled(self): +@@ -567,17 +568,17 @@ + + def getAuthorityNameValidator(self): + """Return TangoAuthorityNameValidator""" +- import tangovalidator ++ from . import tangovalidator + return tangovalidator.TangoAuthorityNameValidator() + + def getDeviceNameValidator(self): + """Return TangoDeviceNameValidator""" +- import tangovalidator ++ from . import tangovalidator + return tangovalidator.TangoDeviceNameValidator() + + def getAttributeNameValidator(self): + """Return TangoAttributeNameValidator""" +- import tangovalidator ++ from . import tangovalidator + return tangovalidator.TangoAttributeNameValidator() + + def setOperationMode(self, mode): +--- lib/taurus/core/tango/test/__init__.py (original) ++++ lib/taurus/core/tango/test/__init__.py (refactored) +@@ -23,4 +23,5 @@ + ## + ############################################################################# + +-from tgtestds import TangoSchemeTestLauncher ++from __future__ import absolute_import ++from .tgtestds import TangoSchemeTestLauncher +--- lib/taurus/core/tango/util/__init__.py (original) ++++ lib/taurus/core/tango/util/__init__.py (refactored) +@@ -24,7 +24,8 @@ + ############################################################################# + + """The sardana package. It contains specific part of sardana""" ++from __future__ import absolute_import + + __docformat__ = 'restructuredtext' + +-from formatter import tangoFormatter ++from .formatter import tangoFormatter +--- lib/taurus/core/taurusauthority.py (original) ++++ lib/taurus/core/taurusauthority.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module contains the base class for a taurus database""" ++from __future__ import absolute_import + + __all__ = ["TaurusAuthority"] + +@@ -87,7 +88,7 @@ + + def getDevice(self, devname): + """Returns the device object given its name""" +- import taurusdevice ++ from . import taurusdevice + return self.factory().getObject(taurusdevice.TaurusDevice, devname) + + @property +--- lib/taurus/core/taurusfactory.py (original) ++++ lib/taurus/core/taurusfactory.py (refactored) +@@ -55,6 +55,7 @@ + ) + + """ ++from __future__ import absolute_import + + __all__ = ["TaurusFactory"] + +@@ -62,12 +63,12 @@ + + import atexit + from weakref import WeakValueDictionary +-from taurusbasetypes import TaurusElementType +-from taurusauthority import TaurusAuthority +-from taurusdevice import TaurusDevice +-from taurusattribute import TaurusAttribute +-from taurusconfiguration import TaurusConfiguration, TaurusConfigurationProxy +-from taurusexception import TaurusException ++from .taurusbasetypes import TaurusElementType ++from .taurusauthority import TaurusAuthority ++from .taurusdevice import TaurusDevice ++from .taurusattribute import TaurusAttribute ++from .taurusconfiguration import TaurusConfiguration, TaurusConfigurationProxy ++from .taurusexception import TaurusException + from taurus.core.tauruspollingtimer import TaurusPollingTimer + + +@@ -93,7 +94,7 @@ + self._devs = WeakValueDictionary() + self._auths = WeakValueDictionary() + +- import taurusmanager ++ from . import taurusmanager + manager = taurusmanager.TaurusManager() + self._serialization_mode = manager.getSerializationMode() + +--- lib/taurus/core/taurushelper.py (original) ++++ lib/taurus/core/taurushelper.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """a list of helper methods""" ++from __future__ import print_function + + __all__ = ['check_dependencies', 'log_dependencies', 'getSchemeFromName', + 'getValidTypesForName', 'isValidName', 'makeSchemeExplicit', +@@ -74,36 +75,36 @@ + } + import pkg_resources + d = pkg_resources.get_distribution('taurus') +- print "Dependencies for %s:" % d ++ print("Dependencies for %s:" % d) + # minimum requirements (without extras) + for r in d.requires(): + try: + pkg_resources.require(str(r)) +- print '\t[*]', ++ print('\t[*]', end=' ') + except Exception: +- print '\t[ ]', +- print '%s' % r ++ print('\t[ ]', end=' ') ++ print('%s' % r) + # requirements for the extras +- print '\nExtras:' ++ print('\nExtras:') + for extra in sorted(d.extras): +- print "Dependencies for taurus[%s]:" % extra ++ print("Dependencies for taurus[%s]:" % extra) + # requirements from PyPI + for r in d.requires(extras=[extra]): + try: + r = str(r).split(';')[0] # remove marker if present (see #612) + pkg_resources.require(r) +- print '\t[*]', ++ print('\t[*]', end=' ') + except Exception: +- print '\t[ ]', +- print '%s' % r ++ print('\t[ ]', end=' ') ++ print('%s' % r) + # requirements outside PyPI + for r, check in non_pypi.get(extra, ()): + try: + check() +- print '\t[*]', ++ print('\t[*]', end=' ') + except Exception: +- print '\t[ ]', +- print '%s (not in PyPI)' % r ++ print('\t[ ]', end=' ') ++ print('%s (not in PyPI)' % r) + + + def log_dependencies(): +@@ -296,7 +297,7 @@ + if attr_name is None: + return Factory(scheme=getSchemeFromName(dev_or_attr_name)).getAttribute(dev_or_attr_name) + else: +- if type(dev_or_attr_name) in types.StringTypes: ++ if type(dev_or_attr_name) in (str,): + dev = Device(dev_or_attr_name) + else: + dev = dev_or_attr_name +--- lib/taurus/core/tauruslistener.py (original) ++++ lib/taurus/core/tauruslistener.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module contains the taurus base listeners classes""" ++from __future__ import print_function + + __all__ = ["TaurusListener", "TaurusExceptionListener"] + +@@ -70,4 +71,4 @@ + self._printException(exception) + + def _printException(self, exception): +- print self.__class__.__name__, "received", exception.__class__.__name__, str(exception) ++ print(self.__class__.__name__, "received", exception.__class__.__name__, str(exception)) +--- lib/taurus/core/taurusmanager.py (original) ++++ lib/taurus/core/taurusmanager.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module contains the taurus base manager class""" ++from __future__ import print_function + + __all__ = ["TaurusManager"] + +@@ -291,7 +292,7 @@ + for plugin_class in plugin_classes: + schemes = list(plugin_class.schemes) + for scheme in schemes: +- if plugins.has_key(scheme): ++ if scheme in plugins: + k = plugins[scheme] + self.warning("Conflicting plugins: %s and %s both implement " + "scheme %s. Will keep using %s" % (k.__name__, +@@ -336,7 +337,7 @@ + for full_module_name in full_module_names: + try: + m = __import__(full_module_name, fromlist=['*'], level=0) +- except Exception, imp1: ++ except Exception as imp1: + # just in case we are in python 2.4 + try: + m = __import__(full_module_name, +@@ -397,4 +398,4 @@ + + if __name__ == '__main__': + manager = TaurusManager() +- print manager.getPlugins() ++ print(manager.getPlugins()) +--- lib/taurus/core/tauruspollingtimer.py (original) ++++ lib/taurus/core/tauruspollingtimer.py (refactored) +@@ -75,7 +75,7 @@ + self.lock.acquire() + try: + attr_dict = self.dev_dict.get(dev) +- return attr_dict and attr_dict.has_key(attr_name) ++ return attr_dict and attr_name in attr_dict + finally: + self.lock.release() + +--- lib/taurus/core/taurusvalidator.py (original) ++++ lib/taurus/core/taurusvalidator.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module contains the base taurus name validator classes""" ++from __future__ import print_function + + + __all__ = ["TaurusAuthorityNameValidator", "TaurusDeviceNameValidator", +@@ -313,5 +314,5 @@ + + v = FooAttributeNameValidator() + name = 'foo://bar#label' +- print v.isValid(name) +- print v.getUriGroups(name) ++ print(v.isValid(name)) ++ print(v.getUriGroups(name)) +--- lib/taurus/core/util/argparse/taurusargparse.py (original) ++++ lib/taurus/core/util/argparse/taurusargparse.py (refactored) +@@ -198,7 +198,7 @@ + rfoo.utils.rconsole.spawn_server(port=options.remote_console_port) + taurus.info("rconsole started. You can connect to it by typing: rconsole -p %d", + options.remote_console_port) +- except Exception, e: ++ except Exception as e: + taurus.warning("Cannot spawn debugger. Reason: %s", str(e)) + + # initialize default formatter +--- lib/taurus/core/util/codecs.py (original) ++++ lib/taurus/core/util/codecs.py (refactored) +@@ -62,6 +62,7 @@ + >>> codec = CodecFactory().getCodec(v.format) + >>> f, d = codec.decode((v.format, v.value)) + """ ++from __future__ import absolute_import + + __all__ = ["Codec", "NullCodec", "ZIPCodec", "BZ2Codec", "JSONCodec", + "FunctionCodec", "PlotCodec", "CodecPipeline", "CodecFactory"] +@@ -74,9 +75,9 @@ + import struct + import numpy + +-from singleton import Singleton +-from log import Logger +-from containers import CaselessDict ++from .singleton import Singleton ++from .log import Logger ++from .containers import CaselessDict + + + class Codec(Logger): +@@ -879,7 +880,7 @@ + self._codec_klasses[format] = klass + + # del old codec if exists +- if self._codecs.has_key(format): ++ if format in self._codecs: + del self._codecs[format] + + def unregisterCodec(self, format): +@@ -889,10 +890,10 @@ + :param format: (str) the codec id + + :raises: KeyError""" +- if self._codec_klasses.has_key(format): ++ if format in self._codec_klasses: + del self._codec_klasses[format] + +- if self._codecs.has_key(format): ++ if format in self._codecs: + del self._codecs[format] + + def getCodec(self, format): +--- lib/taurus/core/util/colors.py (original) ++++ lib/taurus/core/util/colors.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module contains color codes for state and quality""" ++from __future__ import print_function + + __all__ = ["DEVICE_STATE_DATA", "ATTRIBUTE_QUALITY_DATA", "ColorPalette", + "DEVICE_STATE_PALETTE", "ATTRIBUTE_QUALITY_PALETTE"] +@@ -94,7 +95,7 @@ + self._int_decoder_dict = int_decoder_dict + + def _decoder(self, elem): +- if type(elem) == types.IntType or type(elem) == types.LongType: ++ if type(elem) == int or type(elem) == int: + elem = self._int_decoder_dict.get(elem) + return str(elem) + +@@ -133,7 +134,7 @@ + return self._rgb_data[name][0] + + def has(self, name): +- return self._rgb_data.has_key(name) ++ return name in self._rgb_data + + def size(self): + return len(self._rgb_data) +@@ -215,7 +216,7 @@ + bg_color = pal.name(stoq) + rgb = "(%3.3d, %3.3d, %3.3d)" % pal.rgb(stoq) + hx = pal.hex(stoq) +- print "%7s %5s on %13s %15s #%s" % (stoq, fg_color, bg_color, rgb, hx) ++ print("%7s %5s on %13s %15s #%s" % (stoq, fg_color, bg_color, rgb, hx)) + + + if __name__ == "__main__": +@@ -223,8 +224,8 @@ + print_color_palette(ATTRIBUTE_QUALITY_PALETTE) + from taurus.core import TaurusDevState + import PyTango +- print +- print DEVICE_STATE_PALETTE.rgb(TaurusDevState.Ready) +- print DEVICE_STATE_PALETTE.rgb('TaurusDevState.Ready') +- print DEVICE_STATE_PALETTE.rgb(PyTango.DevState.ON) +- print DEVICE_STATE_PALETTE.rgb(0) ++ print() ++ print(DEVICE_STATE_PALETTE.rgb(TaurusDevState.Ready)) ++ print(DEVICE_STATE_PALETTE.rgb('TaurusDevState.Ready')) ++ print(DEVICE_STATE_PALETTE.rgb(PyTango.DevState.ON)) ++ print(DEVICE_STATE_PALETTE.rgb(0)) +--- lib/taurus/core/util/constant.py (original) ++++ lib/taurus/core/util/constant.py (refactored) +@@ -60,8 +60,8 @@ + def __setattr__(self, name, value): + v = self.__dict__.get(name, value) + if type(v) is not type(value): +- raise self._ConstTypeError, "Can't rebind %s to %s" % ( +- type(v), type(value)) ++ raise self._ConstTypeError("Can't rebind %s to %s" % ( ++ type(v), type(value))) + self.__dict__[name] = value + + def __del__(self): +--- lib/taurus/core/util/containers.py (original) ++++ lib/taurus/core/util/containers.py (refactored) +@@ -27,6 +27,7 @@ + This module contains a set of useful containers that are not part of the standard + python distribution. + """ ++from __future__ import print_function + + __all__ = ["CaselessList", "CaselessDict", "CaselessWeakValueDict", "LoopList", + "CircBuf", "LIFO", "TimedQueue", "self_locked", "ThreadDict", +@@ -682,12 +683,12 @@ + self.lock.acquire() + try: + if self.trace: +- print "locked: %s" % self.lock ++ print("locked: %s" % self.lock) + result = func(self, *args, **kwargs) + finally: + self.lock.release() + if self.trace: +- print "released: %s" % self.lock ++ print("released: %s" % self.lock) + return result + return lock_fun + +@@ -721,7 +722,7 @@ + self.parent = type(self).mro()[1] + + def tracer(self, text): +- print text ++ print(text) + + def start(self): + import threading +@@ -1052,7 +1053,7 @@ + lines = [] + if isinstance(d, dict): + for k, v in d.items(): +- print 'with key "%s"' % k ++ print('with key "%s"' % k) + lines.append([''] * l + [str(k)]) + lines += add_to_level(l + 1, v) + elif type(d) in [list, set]: # End of recursion +@@ -1065,7 +1066,7 @@ + lines.append([''] * l + [str(d)]) + return lines + ls = ['\t'.join(line) for line in add_to_level(0, dct)] +- print 'lines are : \n', ls ++ print('lines are : \n', ls) + return '\n'.join(ls) + + +--- lib/taurus/core/util/decorator/typecheck.py (original) ++++ lib/taurus/core/util/decorator/typecheck.py (refactored) +@@ -62,6 +62,7 @@ + TypeError: 'fib' method accepts (int), but was given (float) + + """ ++from __future__ import print_function + + __all__ = ["accepts", "returns"] + +@@ -97,17 +98,17 @@ + if argtypes != types: + msg = info(f.__name__, types, argtypes, 0) + if debug == 1: +- print >> sys.stderr, 'TypeWarning: ', msg ++ print('TypeWarning: ', msg, file=sys.stderr) + elif debug == 2: +- raise TypeError, msg ++ raise TypeError(msg) + return f(*args) + newf.__name__ = f.__name__ + return newf + return decorator +- except KeyError, key: +- raise KeyError, key + "is not a valid keyword argument" +- except TypeError, msg: +- raise TypeError, msg ++ except KeyError as key: ++ raise KeyError(key + "is not a valid keyword argument") ++ except TypeError as msg: ++ raise TypeError(msg) + + + def returns(ret_type, **kw): +@@ -138,17 +139,17 @@ + if res_type != ret_type: + msg = info(f.__name__, (ret_type,), (res_type,), 1) + if debug == 1: +- print >> sys.stderr, 'TypeWarning: ', msg ++ print('TypeWarning: ', msg, file=sys.stderr) + elif debug == 2: +- raise TypeError, msg ++ raise TypeError(msg) + return result + newf.__name__ = f.__name__ + return newf + return decorator +- except KeyError, key: +- raise KeyError, key + "is not a valid keyword argument" +- except TypeError, msg: +- raise TypeError, msg ++ except KeyError as key: ++ raise KeyError(key + "is not a valid keyword argument") ++ except TypeError as msg: ++ raise TypeError(msg) + + + def info(fname, expected, actual, flag): +--- lib/taurus/core/util/enumeration.py (original) ++++ lib/taurus/core/util/enumeration.py (refactored) +@@ -149,7 +149,7 @@ + return self.lookup[i] + + def __getattr__(self, attr): +- if not self.has_key(attr): ++ if attr not in self: + raise AttributeError + return self.lookup[attr] + +--- lib/taurus/core/util/event.py (original) ++++ lib/taurus/core/util/event.py (refactored) +@@ -26,6 +26,8 @@ + """ + event.py: + """ ++from __future__ import print_function ++from __future__ import absolute_import + + __all__ = ["BoundMethodWeakref", "CallableRef", "EventGenerator", + "ConfigEventGenerator", "ListEventGenerator", "EventListener", +@@ -95,7 +97,7 @@ + :return: a weak reference for the given callable + :rtype: BoundMethodWeakref or weakref.ref""" + if hasattr(object, 'im_self'): +- if object.im_self is not None: ++ if object.__self__ is not None: + return BoundMethodWeakref(object, del_cb) + return weakref.ref(object, del_cb) + +@@ -151,7 +153,7 @@ + return read + + +-from object import Object ++from .object import Object + + + class EventGenerator(Object): +@@ -202,7 +204,7 @@ + :type data: boolean + """ + if not self.events_active: +- raise RuntimeError, ('%s does not have ' ++ raise RuntimeError('%s does not have ' + 'events/polling active' % self.event_name) + + cb_ref = CallableRef(cb, self.unsubscribeDeletedEvent) +@@ -210,7 +212,7 @@ + try: + self.lock() + if (cb_ref, data) in self.cb_list: +- raise RuntimeError, ('Callback %s(%s) already reg. on %s' % ++ raise RuntimeError('Callback %s(%s) already reg. on %s' % + (cb, data, self.event_name)) + self.cb_list.append((cb_ref, data)) + if with_first_event: +@@ -314,7 +316,7 @@ + :return: the value of the event that unblocked the wait + :rtype: object""" + if not self.events_active: +- raise RuntimeError, ('%s does not have ' ++ raise RuntimeError('%s does not have ' + 'events/polling active' % self.event_name) + try: + self.lock() +@@ -539,8 +541,8 @@ + name = th.name + else: + name = "" +- print "WARNING: Thread %s trying to unlock condition previously " \ +- "locked by thread %s" % (curr_th.name, name) ++ print("WARNING: Thread %s trying to unlock condition previously " \ ++ "locked by thread %s" % (curr_th.name, name)) + + def clearEventSet(self): + "Clears the internal event buffer" +@@ -652,7 +654,7 @@ + return + self._cond.wait(timeout) + retries -= 1 +- except Exception, e: ++ except Exception as e: + sys.stderr.write( + "AttributeEventWait: Caught exception while waitting: %s\n" % str(e)) + raise e +@@ -693,8 +695,8 @@ + lock = getattr(self._cond, "_Condition__lock") + th = getattr(lock, "_RLock__owner") + curr_th = threading.current_thread() +- print "WARNING: Thread %s trying to unlock condition previously " \ +- "locked by thread %s" % (curr_th.name, th.name) ++ print("WARNING: Thread %s trying to unlock condition previously " \ ++ "locked by thread %s" % (curr_th.name, th.name)) + + def eventReceived(self, s, t, v): + if t not in (taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic): +@@ -716,7 +718,7 @@ + while True: + self._cond.wait(timeout) + yield self._data +- except Exception, e: +- print "INFO: Caught exception while waiting", str(e) +- finally: +- self.unlock() ++ except Exception as e: ++ print("INFO: Caught exception while waiting", str(e)) ++ finally: ++ self.unlock() +--- lib/taurus/core/util/fandango_search.py (original) ++++ lib/taurus/core/util/fandango_search.py (refactored) +@@ -125,7 +125,7 @@ + db = taurus.Authority() + try: + return db.get_device_alias(alias) +- except Exception, e: ++ except Exception as e: + if 'no device found' in str(e).lower(): + return None + return None # raise e +@@ -137,7 +137,7 @@ + # .get_database_device().DbGetDeviceAlias(dev) + result = db.get_alias(dev) + return result +- except Exception, e: ++ except Exception as e: + if 'no alias found' in str(e).lower(): + return None + return None # raise e +--- lib/taurus/core/util/init_bkcomp.py (original) ++++ lib/taurus/core/util/init_bkcomp.py (refactored) +@@ -33,6 +33,7 @@ + #. if python >= 2.6 use standard json from python distribution + #. otherwise use private implementation distributed with taurus + """ ++from __future__ import absolute_import + + __docformat__ = "restructuredtext" + +@@ -61,7 +62,7 @@ + from .threadpool import * + from .user import * + +-import eventfilters ++from . import eventfilters + + try: + from lxml import etree +--- lib/taurus/core/util/__init__.py (original) ++++ lib/taurus/core/util/__init__.py (refactored) +@@ -33,6 +33,7 @@ + #. if python >= 2.6 use standard json from python distribution + #. otherwise use private implementation distributed with taurus + """ ++from __future__ import absolute_import + + __docformat__ = "restructuredtext" + +@@ -42,6 +43,6 @@ + taurus.tauruscustomsettings, 'LIGHTWEIGHT_IMPORTS', False) + + if LIGHTWEIGHT_IMPORTS: +- from init_lightweight import * ++ from .init_lightweight import * + else: +- from init_bkcomp import * ++ from .init_bkcomp import * +--- lib/taurus/core/util/log.py (original) ++++ lib/taurus/core/util/log.py (refactored) +@@ -25,6 +25,8 @@ + + """This module contains a set of useful logging elements based on python's + :mod:`logging` system.""" ++from __future__ import print_function ++from __future__ import absolute_import + + __all__ = ["LogIt", "TraceIt", "DebugIt", "InfoIt", "WarnIt", "ErrorIt", + "CriticalIt", "MemoryLogHandler", "LogExceptHook", "Logger", +@@ -45,9 +47,9 @@ + import threading + import functools + +-from object import Object +-from wrap import wraps +-from excepthook import BaseExceptHook ++from .object import Object ++from .wrap import wraps ++from .excepthook import BaseExceptHook + + # ------------------------------------------------------------------------------ + # TODO: substitute this ugly hack (below) by a more general mechanism +@@ -168,7 +170,7 @@ + return f(*args, **kwargs) + + has_log = hasattr(f_self, "log") +- fname = f.func_name ++ fname = f.__name__ + log_obj = f_self + if not has_log: + log_obj = logging.getLogger() +@@ -188,7 +190,7 @@ + out_msg = "<-" + try: + ret = f(*args, **kwargs) +- except Exception, e: ++ except Exception as e: + exc_info = sys.exc_info() + out_msg += " (with %s) %s" % (e.__class__.__name__, fname) + log_obj.log(self._level, out_msg, exc_info=exc_info) +@@ -325,27 +327,27 @@ + def __call__(self, f): + @wraps(f) + def wrapper(*args, **kwargs): +- fname = f.func_name ++ fname = f.__name__ + in_msg = "-> %s" % fname + if self._showargs: + if len(args) > 1: + in_msg += str(args[1:]) + if len(kwargs): + in_msg += str(kwargs) +- print +- print in_msg ++ print() ++ print(in_msg) + out_msg = "<-" + try: + ret = f(*args, **kwargs) +- except Exception, e: ++ except Exception as e: + out_msg += " (with %s) %s" % (e.__class__.__name__, fname) +- print out_msg ++ print(out_msg) + raise + out_msg += " %s" % fname + if not ret is None and self._showret: + out_msg += " = %s" % str(ret) +- print out_msg +- print ++ print(out_msg) ++ print() + return ret + return wrapper + +@@ -1070,4 +1072,4 @@ + - zab + """ + +- print foo.__doc__ ++ print(foo.__doc__) +--- lib/taurus/core/util/parse_args.py (original) ++++ lib/taurus/core/util/parse_args.py (refactored) +@@ -23,6 +23,7 @@ + ## + ############################################################################# + ++from __future__ import print_function + from ast import literal_eval + + +@@ -60,7 +61,7 @@ + + if __name__ == "__main__": + +- print parse_args('1, 2, b=3, c=4') +- print parse_args(' (1, 2, b=3, c=4 )', strip_pars=True) ++ print(parse_args('1, 2, b=3, c=4')) ++ print(parse_args(' (1, 2, b=3, c=4 )', strip_pars=True)) + +- print parse_args('1, 2, b=3, c=4, 5') # <--this should raise a SyntaxError ++ print(parse_args('1, 2, b=3, c=4, 5')) # <--this should raise a SyntaxError +--- lib/taurus/core/util/propertyfile.py (original) ++++ lib/taurus/core/util/propertyfile.py (refactored) +@@ -170,7 +170,7 @@ + # same property + while line[-1] == '\\': + # Read next line +- nextline = i.next() ++ nextline = next(i) + nextline = nextline.strip() + lineno += 1 + # This line will become part of the value +@@ -216,7 +216,7 @@ + self._props[key] = value.strip() + + # Check if an entry exists in pristine keys +- if self._keymap.has_key(key): ++ if key in self._keymap: + oldkey = self._keymap.get(key) + self._origprops[oldkey] = oldvalue.strip() + else: +@@ -247,15 +247,15 @@ + + # For the time being only accept file input streams + if type(stream) is not file: +- raise TypeError, 'Argument should be a file object!' ++ raise TypeError('Argument should be a file object!') + # Check for the opened mode + if stream.mode != 'r': +- raise ValueError, 'Stream should be opened in read-only mode!' ++ raise ValueError('Stream should be opened in read-only mode!') + + try: + lines = stream.readlines() + self.__parse(lines) +- except IOError, e: ++ except IOError as e: + raise + + def getProperty(self, key): +@@ -269,7 +269,7 @@ + if type(key) is str and type(value) is str: + self.processPair(key, value) + else: +- raise TypeError, 'both key and value should be strings!' ++ raise TypeError('both key and value should be strings!') + + def propertyNames(self): + """ Return an iterator over all the keys of the property +@@ -290,7 +290,7 @@ + with the optional 'header' """ + + if out.mode[0] != 'w': +- raise ValueError, 'Steam should be opened in write mode!' ++ raise ValueError('Steam should be opened in write mode!') + + try: + out.write(''.join(('#', header, '\n'))) +@@ -302,7 +302,7 @@ + out.write(''.join((prop, '=', self.escape(val), '\n'))) + + out.close() +- except IOError, e: ++ except IOError as e: + raise + + def getPropertyDict(self): +--- lib/taurus/core/util/property_parser.py (original) ++++ lib/taurus/core/util/property_parser.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This is an experimental property parser""" ++from __future__ import print_function + + import os + +@@ -68,7 +69,7 @@ + else: + t.value = float(t.value) + except: +- print "[%d]: Number %s is not valid!" % (t.lineno, t.value) ++ print("[%d]: Number %s is not valid!" % (t.lineno, t.value)) + t.value = 0 + return t + +@@ -117,12 +118,12 @@ + + + def t_error(t): +- print "[%d]: Illegal character '%s'" % (t.lexer.lineno, t.value[0]) ++ print("[%d]: Illegal character '%s'" % (t.lexer.lineno, t.value[0])) + t.lexer.skip(1) + + + def p_error(p): +- print "[%d]: Syntax error in input [%s]" % (p.lineno, (str(p))) ++ print("[%d]: Syntax error in input [%s]" % (p.lineno, (str(p)))) + + #------------------------------------------------------------------------- + # Yacc Starting symbol +@@ -228,7 +229,7 @@ + res = self.parse_file( + f, logger=logger, debug=debug, optimize=optimize) + f.close() +- except IOError, e: ++ except IOError as e: + if f: + f.close() + raise +@@ -241,4 +242,4 @@ + import sys + pp = PropertyParser() + res = pp.parse(sys.argv[1]) +- print res ++ print(res) +--- lib/taurus/core/util/prop.py (original) ++++ lib/taurus/core/util/prop.py (refactored) +@@ -24,6 +24,8 @@ + ############################################################################# + + """This module contains a decorator to simplify the use of property.""" ++from __future__ import print_function ++from __future__ import absolute_import + + __all__ = ["propertx"] + +@@ -47,7 +49,7 @@ + + if __name__ == '__main__': + +- from log import Logger ++ from .log import Logger + + class example(object, Logger): + +@@ -60,15 +62,15 @@ + def bar(): + # BAR doc + def get(self): +- print "\tgetting", self._a ++ print("\tgetting", self._a) + return self._a + + def set(self, val): +- print "\tsetting", val ++ print("\tsetting", val) + self._a = val + return get, set + + foo = example() +- print foo.bar ++ print(foo.bar) + # foo.bar='egg' + # print foo.bar +--- lib/taurus/core/util/safeeval.py (original) ++++ lib/taurus/core/util/safeeval.py (refactored) +@@ -26,6 +26,7 @@ + """ + safeeval.py: Safe eval replacement with whitelist support + """ ++from __future__ import print_function + + __all__ = ["SafeEvaluator"] + +@@ -117,12 +118,12 @@ + + x = range(6) + sev = SafeEvaluator() +- print "trying to evaluate a variable that has not been registered" ++ print("trying to evaluate a variable that has not been registered") + try: + # This will fail because 'x' is not registered in sev +- print sev.safeEval('x+2') ++ print(sev.safeEval('x+2')) + except: +- print "failed!!" ++ print("failed!!") + + sev.addSafe({'x': x}) # After registering x, we can use it... + f0 = 'x' +@@ -134,16 +135,16 @@ + f5 = 'open("/etc/passwd")' + + for f in [f0, f1, f2, f3, f4, f5]: +- print 'Evaluating "%s":' % f ++ print('Evaluating "%s":' % f) + try: +- print sev.eval(f) ++ print(sev.eval(f)) + except: +- print 'ERROR: %s cannot be evaluated' % f ++ print('ERROR: %s cannot be evaluated' % f) + + vector = numpy.arange(6) + # Another way of registering a variable is using the init method... + sev2 = SafeEvaluator({'x': x, 'y': vector}, defaultSafe=False) +- print 'x*y=', sev2.eval('x*y') ++ print('x*y=', sev2.eval('x*y')) + y = 0 # note that the registered variable is local to the evaluator!! + # here, y still has the previously registered value instead of 0 +- print 'x*y=', sev2.eval('x*y') ++ print('x*y=', sev2.eval('x*y')) +--- lib/taurus/core/util/tablepprint.py (original) ++++ lib/taurus/core/util/tablepprint.py (refactored) +@@ -24,6 +24,8 @@ + ############################################################################# + + """Adapted from http://code.activestate.com/recipes/267662/""" ++from __future__ import print_function ++from functools import reduce + + __docformat__ = "restructuredtext" + +@@ -135,19 +137,19 @@ + Aristidis,Papageorgopoulos,28,Senior Reseacher''' + rows = [row.strip().split(',') for row in data.splitlines()] + +- print 'Without wrapping function\n' ++ print('Without wrapping function\n') + for l in indent([labels] + rows, hasHeader=True): +- print l ++ print(l) + + # test indent with different wrapping functions + width = 10 + for wrapper in (wrap_always, wrap_onspace, wrap_onspace_strict): +- print 'Wrapping function: %s(x,width=%d)\n' % (wrapper.__name__, width) ++ print('Wrapping function: %s(x,width=%d)\n' % (wrapper.__name__, width)) + o = indent([labels] + rows, headerChar='=', hasHeader=True, separateRows=False, + prefix='|', postfix='|', delim=' ', + wrapfunc=lambda x: wrapper(x, width)) + for l in o: +- print l ++ print(l) + + # output: + # +--- lib/taurus/core/util/threadpool.py (original) ++++ lib/taurus/core/util/threadpool.py (refactored) +@@ -24,6 +24,8 @@ + ############################################################################# + + """adapted from http://code.activestate.com/recipes/576576/""" ++from __future__ import print_function ++from __future__ import absolute_import + + __all__ = ["ThreadPool", "Worker"] + +@@ -34,8 +36,8 @@ + from time import sleep, time + from traceback import extract_stack, format_list + +-from prop import propertx +-from log import Logger, DebugIt, TraceIt ++from .prop import propertx ++from .log import Logger, DebugIt, TraceIt + + + class ThreadPool(Logger): +@@ -152,44 +154,44 @@ + + def easyJob(*arg, **kw): + n = arg[0] +- print '\tSleep\t\t', n ++ print('\tSleep\t\t', n) + sleep(n) + return 'Slept\t%d' % n + + def longJob(*arg, **kw): +- print "\tStart\t\t\t", arg, kw ++ print("\tStart\t\t\t", arg, kw) + n = arg[0] * 3 + sleep(n) + return "Job done in %d" % n + + def badJob(*a, **k): +- print '\n !!! OOOPS !!!\n' ++ print('\n !!! OOOPS !!!\n') + a = 1 / 0 + + def show(*arg, **kw): +- print 'callback : %s' % arg[0] ++ print('callback : %s' % arg[0]) + + def test_1(**kwargs): + workers = kwargs.pop('workers', 5) + jobqueue = kwargs.pop('jobqueue', 10) + pool = ThreadPool(name='ThreadPool', Psize=workers, Qsize=jobqueue) +- print "\n\t\t... let's add some jobs ...\n" ++ print("\n\t\t... let's add some jobs ...\n") + for j in range(5): + if j == 1: + pool.add(badJob) + for i in range(5, 0, -1): + pool.add(longJob, show, i) + pool.add(easyJob, show, i) +- print ''' ++ print(''' + \t\t... and now, we're waiting for the %i workers to get the %i jobs done ... +- ''' % (pool.size, pool.qsize) ++ ''' % (pool.size, pool.qsize)) + sleep(15) +- print "\n\t\t... ok, that may take a while, let's get some reinforcement ...\n" ++ print("\n\t\t... ok, that may take a while, let's get some reinforcement ...\n") + sleep(5) + pool.size = 50 +- print '\n\t\t... Joining ...\n' ++ print('\n\t\t... Joining ...\n') + pool.join() +- print '\n\t\t... Ok ...\n' ++ print('\n\t\t... Ok ...\n') + + def test_2(**kwargs): + workers = kwargs.pop('workers', 5) +@@ -198,21 +200,21 @@ + sleep_t = kwargs.pop('sleep_t', 1) + #from taurus.core.util.threadpool import ThreadPool + pool = ThreadPool(name='ThreadPool', Psize=workers, Qsize=jobqueue) +- print "\n\t\t... Check the number of busy workers ...\n" +- print "Num of busy workers = %s" % (pool.getNumOfBusyWorkers()) +- print "\n\t\t... let's add some jobs ...\n" ++ print("\n\t\t... Check the number of busy workers ...\n") ++ print("Num of busy workers = %s" % (pool.getNumOfBusyWorkers())) ++ print("\n\t\t... let's add some jobs ...\n") + for i in range(numjobs): + pool.add(easyJob, None, sleep_t) +- print '\n\t\t... Monitoring the busy workers ...\n' ++ print('\n\t\t... Monitoring the busy workers ...\n') + t0 = time() + while pool.getNumOfBusyWorkers() > 0: +- print "busy workers = %s" % (pool.getNumOfBusyWorkers()) ++ print("busy workers = %s" % (pool.getNumOfBusyWorkers())) + sleep(0.5) + t1 = time() +- print "Run %s jobs of 1 second took %.3f" % (numjobs, t1 - t0) +- print '\n\t\t... Joining ...\n' ++ print("Run %s jobs of 1 second took %.3f" % (numjobs, t1 - t0)) ++ print('\n\t\t... Joining ...\n') + pool.join() +- print '\n\t\t... Ok ...\n' ++ print('\n\t\t... Ok ...\n') + + def main(argv): + kwargs = {} +--- lib/taurus/qt/qtcore/communication/communication.py (original) ++++ lib/taurus/qt/qtcore/communication/communication.py (refactored) +@@ -26,6 +26,7 @@ + """ + comunications.py: + """ ++from __future__ import print_function + + from taurus.external.qt import QtCore + import weakref +@@ -333,7 +334,7 @@ + ''' + A slot which you can connect as a reader for debugging. It will print info to the stdout + ''' +- print "SharedDataManager: \n\tSender=: %s\n\tData=%s" % (self.sender(), repr(data)) ++ print("SharedDataManager: \n\tSender=: %s\n\tData=%s" % (self.sender(), repr(data))) + + def info(self): + s = "" +--- lib/taurus/qt/qtcore/configuration/configuration.py (original) ++++ lib/taurus/qt/qtcore/configuration/configuration.py (refactored) +@@ -25,6 +25,7 @@ + + """This module provides the set of base classes designed to provide + configuration features to the classes that inherit from them""" ++from __future__ import print_function + + __all__ = ["configurableProperty", "BaseConfigurableClass"] + +@@ -149,7 +150,7 @@ + + for k in x['__orderedConfigNames__']: + if k not in x['__itemConfigurations__']: +- print 'missing configuration for "%s" in %s' % (k, repr(x)) ++ print('missing configuration for "%s" in %s' % (k, repr(x))) + return True + + def createConfig(self, allowUnpickable=False): +@@ -250,7 +251,7 @@ + self.__configurableItems = {} + + def registerConfigurableItem(self, item, name=None): +- print "Deprecation WARNING: %s.registerConfigurableItem() has been deprecated. Use registerConfigDelegate() instead" % repr(self) ++ print("Deprecation WARNING: %s.registerConfigurableItem() has been deprecated. Use registerConfigDelegate() instead" % repr(self)) + self._registerConfigurableItem(item, name=name) + + def registerConfigDelegate(self, delegate, name=None): +--- lib/taurus/qt/qtcore/model/__init__.py (original) ++++ lib/taurus/qt/qtcore/model/__init__.py (refactored) +@@ -53,8 +53,9 @@ + view.setModel(model) + + """ ++from __future__ import absolute_import + + __docformat__ = 'restructuredtext' + +-from taurusmodel import * +-from taurusdatabasemodel import * ++from .taurusmodel import * ++from .taurusdatabasemodel import * +--- lib/taurus/qt/qtcore/util/emitter.py (original) ++++ lib/taurus/qt/qtcore/util/emitter.py (refactored) +@@ -225,7 +225,7 @@ + size = self.getQueue().qsize() + if size: + self.log.info('onRefresh(%s)' % size) +- self.next() ++ next(self) + else: + self.log.debug('onRefresh()') + except: +@@ -266,7 +266,7 @@ + nqueue.put(i) + while not nqueue.empty(): + self.queue.put(nqueue.get()) +- self.next() ++ next(self) + + def _doSomething(self, params): + self.log.debug('At TaurusEmitterThread._doSomething(%s)' % str(params)) +@@ -317,7 +317,7 @@ + Qt.QApplication.instance().thread().msleep(self.timewait) + self.log.info('#' * 80) + self.log.info('At TaurusEmitterThread.run()') +- self.next() ++ next(self) + + if self.refreshTimer: + self.refreshTimer.start(self.polling) +@@ -394,7 +394,7 @@ + self.info('addUnsubscribedAttributes([%d])' % len(items)) + for attr in items: + self._addModelObj(attr) +- self._modelsThread.next() ++ next(self._modelsThread) + self.info('Thread queue: [%d]' % (self._modelsQueue.qsize())) + except: + self.warning(traceback.format_exc()) +@@ -504,7 +504,7 @@ + self.thread.start() + except: + pass +- self.next() ++ next(self) + self._running = True + return + +@@ -535,7 +535,7 @@ + nqueue.put(i) + while not nqueue.empty(): + self.queue.put(nqueue.get()) +- self.next() ++ next(self) + + def isRunning(self): + return self._running +--- lib/taurus/qt/qtcore/util/__init__.py (original) ++++ lib/taurus/qt/qtcore/util/__init__.py (refactored) +@@ -24,7 +24,8 @@ + ############################################################################# + + """This package provides a set of utilities (e.g. logging) to taurus qtcore""" ++from __future__ import absolute_import + + __docformat__ = 'restructuredtext' + +-from tauruslog import * ++from .tauruslog import * +--- lib/taurus/qt/qtcore/util/signal.py (original) ++++ lib/taurus/qt/qtcore/util/signal.py (refactored) +@@ -1,4 +1,5 @@ + """Provide a Signal class for non-QObject objects""" ++from __future__ import print_function + + __all__ = ['baseSignal'] + +--- lib/taurus/qt/qtdesigner/containerplugin.py (original) ++++ lib/taurus/qt/qtdesigner/containerplugin.py (refactored) +@@ -36,6 +36,7 @@ + - 'model' - will have a '...' button that will open a customized dialog for + editing the widget model (same has 'Edit model...' task menu item + """ ++from __future__ import absolute_import + + from taurus.core.util.log import Logger + from taurus.external.qt import Qt +@@ -105,7 +106,7 @@ + + + def create_plugin(): +- from taurusplugin.taurusplugin import TaurusWidgetPlugin ++ from .taurusplugin.taurusplugin import TaurusWidgetPlugin + + class QGroupWidgetPlugin(TaurusWidgetPlugin): + +--- lib/taurus/qt/qtdesigner/tauruspluginplugin.py (original) ++++ lib/taurus/qt/qtdesigner/tauruspluginplugin.py (refactored) +@@ -26,12 +26,13 @@ + """ + tauruspluginplugin.py: + """ ++from __future__ import absolute_import + + from taurus.external.qt import QtDesigner + + + def build_qtdesigner_widget_plugin(klass): +- import taurusplugin ++ from . import taurusplugin + + class Plugin(taurusplugin.TaurusWidgetPlugin): + WidgetClass = klass +@@ -74,7 +75,7 @@ + #_log.debug("E2: Canceled %s (widget doesn't have getQtDesignerPluginInfo())" % name) + e2_nb += 1 + cont = True +- except Exception, e: ++ except Exception as e: + #_log.debug("E3: Canceled %s (%s)" % (name, str(e))) + e3_nb += 1 + cont = True +@@ -82,7 +83,7 @@ + if cont: + continue + for k in ('module', ): +- if not qt_info.has_key(k): ++ if k not in qt_info: + #_log.debug("E4: Canceled %s (getQtDesignerPluginInfo doesn't have key %s)" % (name, k)) + e4_nb += 1 + cont = True +--- lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py (original) ++++ lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py (refactored) +@@ -36,6 +36,7 @@ + - 'model' - will have a '...' button that will open a customized dialog for + editing the widget model (same has 'Edit model...' task menu item + """ ++from __future__ import print_function + + import inspect + +@@ -103,11 +104,11 @@ + designMode=True, + parent=parent) + w = klass(*args, **kwargs) +- except Exception, e: ++ except Exception as e: + name = self._getWidgetClassName() +- print 100 * "=" +- print "taurus designer plugin error creating %s: %s" % (name, str(e)) +- print 100 * "-" ++ print(100 * "=") ++ print("taurus designer plugin error creating %s: %s" % (name, str(e))) ++ print(100 * "-") + import traceback + traceback.print_exc() + w = None +--- lib/taurus/qt/qtgui/base/taurusbase.py (original) ++++ lib/taurus/qt/qtgui/base/taurusbase.py (refactored) +@@ -736,7 +736,7 @@ + if self._format is None: + try: + self._updateFormat(type(v)) +- except Exception, e: ++ except Exception as e: + self.warning(('Cannot update format. Reverting to default.' + + ' Reason: %r'), e) + self.setFormat(defaultFormatter) +@@ -2147,9 +2147,9 @@ + bottom = evt_value.min_value + top = evt_value.max_value + bottom = int( +- bottom) if bottom != TaurusConfiguration.no_min_value else -sys.maxint ++ bottom) if bottom != TaurusConfiguration.no_min_value else -sys.maxsize + top = int( +- top) if top != TaurusConfiguration.no_max_value else sys.maxint ++ top) if top != TaurusConfiguration.no_max_value else sys.maxsize + v.setRange(bottom, top) + self.debug("Validator range set to %i-%i" % (bottom, top)) + elif isinstance(v, Qt.QDoubleValidator): +--- lib/taurus/qt/qtgui/base/tauruscontroller.py (original) ++++ lib/taurus/qt/qtgui/base/tauruscontroller.py (refactored) +@@ -204,7 +204,7 @@ + for i in idx: + value = value[i] + return widget.displayValue(value) +- except Exception, e: ++ except Exception as e: + return widget.getNoneValue() + + def displayValue(self, value): +--- lib/taurus/qt/qtgui/button/qbuttonbox.py (original) ++++ lib/taurus/qt/qtgui/button/qbuttonbox.py (refactored) +@@ -26,6 +26,7 @@ + """ + qbuttonbox.py: + """ ++from __future__ import print_function + + __all__ = ["QButtonBox"] + +--- lib/taurus/qt/qtgui/button/taurusbutton.py (original) ++++ lib/taurus/qt/qtgui/button/taurusbutton.py (refactored) +@@ -25,6 +25,7 @@ + ############################################################################# + + """This module provides a taurus QPushButton based widgets""" ++from __future__ import print_function + + __all__ = ["TaurusLauncherButton", "TaurusCommandButton", "TaurusLockButton"] + +@@ -179,7 +180,7 @@ + if self._dialog.previousWidgetConfig is not None: + try: + widget.applyConfig(self._dialog.previousWidgetConfig) +- except Exception, e: ++ except Exception as e: + self.warning( + 'Cannot apply previous configuration to widget. Reason: %s', repr(e)) + +@@ -347,7 +348,7 @@ + modelobj.set_timeout_millis(int(self._timeout * 1000)) + result = modelobj.command_inout(self._command, self._castParameters( + self._parameters, self._command, modelobj)) +- except Exception, e: ++ except Exception as e: + self.error('Unexpected error when executing command %s of %s: %s' % ( + self._command, modelobj.getNormalName(), str(e))) + raise +@@ -381,7 +382,7 @@ + + try: + param_type = dev.command_query(command).in_type +- except Exception, e: ++ except Exception as e: + self.warning( + 'Cannot get parameters info for command %s:%s' % (command, str(e))) + return parameters +@@ -666,7 +667,7 @@ + 'Booo scary command!!\n Maybe you should think twice!') + + def f(*a): +- print a ++ print(a) + form.commandExecuted.connect(f) + form.show() + sys.exit(app.exec_()) +--- lib/taurus/qt/qtgui/compact/abstractswitcher.py (original) ++++ lib/taurus/qt/qtgui/compact/abstractswitcher.py (refactored) +@@ -193,7 +193,7 @@ + for sig in self.enterEditSignals: + try: + getattr(self.readWidget, sig).connect(self.enterEdit) +- except Exception, e: ++ except Exception as e: + self.debug('Cannot connect signal. Reason: %s', e) + # update size policy + self._updateSizePolicy() +@@ -220,7 +220,7 @@ + for sig in self.exitEditSignals: + try: + getattr(self.writeWidget, sig).connect(self.exitEdit) +- except Exception, e: ++ except Exception as e: + if isinstance(e, AttributeError) and hasattr(Qt, "SIGNAL"): + # Support old-style signal + self.connect(self.writeWidget, Qt.SIGNAL(sig), +--- lib/taurus/qt/qtgui/compact/basicswitcher.py (original) ++++ lib/taurus/qt/qtgui/compact/basicswitcher.py (refactored) +@@ -25,6 +25,7 @@ + + """This module provides some basic usable widgets based on TaurusReadWriteSwitcher + """ ++from __future__ import absolute_import + + __all__ = ["TaurusLabelEditRW", "TaurusBoolRW"] + +@@ -33,7 +34,7 @@ + from taurus.external.qt import Qt + from taurus.qt.qtgui.display import TaurusLabel, TaurusLed + from taurus.qt.qtgui.input import TaurusValueLineEdit, TaurusValueCheckBox +-from abstractswitcher import TaurusReadWriteSwitcher ++from .abstractswitcher import TaurusReadWriteSwitcher + + + class TaurusLabelEditRW(TaurusReadWriteSwitcher): +--- lib/taurus/qt/qtgui/console/__init__.py (original) ++++ lib/taurus/qt/qtgui/console/__init__.py (refactored) +@@ -35,7 +35,7 @@ + + try: + from silx.gui.console import IPythonWidget as TaurusConsole +-except Exception, e: ++except Exception as e: + from taurus.qt.qtgui.display import TaurusFallBackWidget + + class TaurusConsole(TaurusFallBackWidget): +--- lib/taurus/qt/qtgui/container/taurusframe.py (original) ++++ lib/taurus/qt/qtgui/container/taurusframe.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module provides basic taurus container widgets""" ++from __future__ import absolute_import + + __all__ = ["TaurusFrame"] + +@@ -31,7 +32,7 @@ + + from taurus.external.qt import Qt + from taurus.qt.qtgui.base import TaurusBaseComponent +-from taurusbasecontainer import TaurusBaseContainer ++from .taurusbasecontainer import TaurusBaseContainer + + + class TaurusFrame(Qt.QFrame, TaurusBaseContainer): +--- lib/taurus/qt/qtgui/container/taurusgroupbox.py (original) ++++ lib/taurus/qt/qtgui/container/taurusgroupbox.py (refactored) +@@ -24,13 +24,14 @@ + ############################################################################# + + """This module provides basic taurus group box widget""" ++from __future__ import absolute_import + + __all__ = ["TaurusGroupBox"] + + __docformat__ = 'restructuredtext' + + from taurus.external.qt import Qt +-from taurusbasecontainer import TaurusBaseContainer ++from .taurusbasecontainer import TaurusBaseContainer + + + class TaurusGroupBox(Qt.QGroupBox, TaurusBaseContainer): +--- lib/taurus/qt/qtgui/container/taurusgroupwidget.py (original) ++++ lib/taurus/qt/qtgui/container/taurusgroupwidget.py (refactored) +@@ -24,14 +24,15 @@ + ############################################################################# + + """This module provides a taurus group widget""" ++from __future__ import absolute_import + + __all__ = ["TaurusGroupWidget"] + + __docformat__ = 'restructuredtext' + + from taurus.external.qt import Qt +-from qcontainer import QGroupWidget +-from taurusbasecontainer import TaurusBaseContainer ++from .qcontainer import QGroupWidget ++from .taurusbasecontainer import TaurusBaseContainer + + + class TaurusGroupWidget(QGroupWidget, TaurusBaseContainer): +--- lib/taurus/qt/qtgui/container/taurusmainwindow.py (original) ++++ lib/taurus/qt/qtgui/container/taurusmainwindow.py (refactored) +@@ -26,6 +26,7 @@ + """ + mainwindow.py: a main window implementation with many added features by default + """ ++from __future__ import absolute_import + + __all__ = ["TaurusMainWindow"] + +@@ -37,7 +38,7 @@ + from taurus import tauruscustomsettings + from taurus.core.util import deprecation_decorator + from taurus.external.qt import Qt +-from taurusbasecontainer import TaurusBaseContainer ++from .taurusbasecontainer import TaurusBaseContainer + + from taurus.qt.qtcore.configuration import BaseConfigurableClass + from taurus.qt.qtgui.util import ExternalAppAction +@@ -620,7 +621,7 @@ + ba = Qt.from_qvariant(settings.value( + "TaurusConfig"), 'toByteArray') or Qt.QByteArray() + self.applyQConfig(ba) +- except Exception, e: ++ except Exception as e: + msg = 'Problem loading configuration from "%s". Some settings may not be restored.\n Details: %s' % ( + unicode(settings.fileName()), repr(e)) + self.error(msg) +--- lib/taurus/qt/qtgui/container/taurusscrollarea.py (original) ++++ lib/taurus/qt/qtgui/container/taurusscrollarea.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module provides basic taurus scroll area widget""" ++from __future__ import absolute_import + + __all__ = ["TaurusScrollArea"] + +@@ -32,7 +33,7 @@ + from taurus.external.qt import Qt + from taurus.qt.qtgui.base import TaurusBaseComponent + +-from taurusbasecontainer import TaurusBaseContainer ++from .taurusbasecontainer import TaurusBaseContainer + + + class TaurusScrollArea(Qt.QScrollArea, TaurusBaseContainer): +--- lib/taurus/qt/qtgui/container/tauruswidget.py (original) ++++ lib/taurus/qt/qtgui/container/tauruswidget.py (refactored) +@@ -24,13 +24,14 @@ + ############################################################################# + + """This module provides basic taurus container widget""" ++from __future__ import absolute_import + + __all__ = ["TaurusWidget"] + + __docformat__ = 'restructuredtext' + + from taurus.external.qt import Qt +-from taurusbasecontainer import TaurusBaseContainer ++from .taurusbasecontainer import TaurusBaseContainer + + + class TaurusWidget(Qt.QWidget, TaurusBaseContainer): +--- lib/taurus/qt/qtgui/dialog/taurusinputdialog.py (original) ++++ lib/taurus/qt/qtgui/dialog/taurusinputdialog.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module provides a set of dialog based widgets""" ++from __future__ import print_function + + __all__ = ["TaurusInputDialog", "get_input"] + +@@ -199,7 +200,7 @@ + data_type='Text', key="Memo", default_value="By default a memo is\na long thing") + + for d in [d1, d2, d3, d4, d5, d6, d7, d8]: +- print get_input(input_data=d, title=d['prompt']) ++ print(get_input(input_data=d, title=d['prompt'])) + + if __name__ == "__main__": + main() +--- lib/taurus/qt/qtgui/dialog/taurusmessagebox.py (original) ++++ lib/taurus/qt/qtgui/dialog/taurusmessagebox.py (refactored) +@@ -334,7 +334,7 @@ + try: + PyTango.Except.throw_exception('TangoException', + 'A simple tango exception', 'right here') +- except PyTango.DevFailed, df1: ++ except PyTango.DevFailed as df1: + try: + import traceback + import StringIO +--- lib/taurus/qt/qtgui/display/qled.py (original) ++++ lib/taurus/qt/qtgui/display/qled.py (refactored) +@@ -98,7 +98,7 @@ + :type color: str + :return: True is the given color name is valid or False otherwise + :rtype: bool""" +- return LedColor.has_key(name.upper()) ++ return name.upper() in LedColor + + def _refresh(self): + """internal usage only""" +--- lib/taurus/qt/qtgui/display/qpixmapwidget.py (original) ++++ lib/taurus/qt/qtgui/display/qpixmapwidget.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module contains a pure Qt widget that displays an image""" ++from __future__ import absolute_import + + __all__ = ["QPixmapWidget"] + +@@ -225,7 +226,7 @@ + + def demo(): + "QPixmap Widget" +- import demo.qpixmapwidgetdemo ++ from . import demo.qpixmapwidgetdemo + return demo.qpixmapwidgetdemo.main() + + +--- lib/taurus/qt/qtgui/display/qsevensegment.py (original) ++++ lib/taurus/qt/qtgui/display/qsevensegment.py (refactored) +@@ -26,6 +26,7 @@ + """ + qsevensegmentdisplay.py + """ ++from __future__ import print_function + + __all__ = ['Q7SegDigit'] + +@@ -574,7 +575,7 @@ + dw = Q7SegDigit() + dw.setValue(int(sys.argv[1])) + dw.setVisible(True) +- print dw ++ print(dw) + a.exec_() + + +--- lib/taurus/qt/qtgui/display/tauruslabel.py (original) ++++ lib/taurus/qt/qtgui/display/tauruslabel.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module provides a set of basic Taurus widgets based on QLabel""" ++from __future__ import absolute_import + + __all__ = ["TaurusLabel"] + +@@ -619,7 +620,7 @@ + + def demo(): + "Label" +- import demo.tauruslabeldemo ++ from . import demo.tauruslabeldemo + return demo.tauruslabeldemo.main() + + +--- lib/taurus/qt/qtgui/display/tauruslcd.py (original) ++++ lib/taurus/qt/qtgui/display/tauruslcd.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module provides a Taurus widget based on QLCDNumber""" ++from __future__ import absolute_import + + __all__ = ["TaurusLCD"] + +@@ -106,7 +107,7 @@ + for i in idx: + value = value[i] + return widget.displayValue(value) +- except Exception, e: ++ except Exception as e: + return widget.getNoneValue() + + +@@ -386,7 +387,7 @@ + + def demo(): + "LCD" +- import demo.tauruslcddemo ++ from . import demo.tauruslcddemo + return demo.tauruslcddemo.main() + + +--- lib/taurus/qt/qtgui/display/taurusled.py (original) ++++ lib/taurus/qt/qtgui/display/taurusled.py (refactored) +@@ -25,6 +25,7 @@ + ############################################################################# + + """This module provides a set of basic Taurus widgets based on QLed""" ++from __future__ import absolute_import + + __all__ = ["TaurusLed"] + +@@ -38,7 +39,7 @@ + from taurus.core import DataFormat, AttrQuality, DataType + + from taurus.qt.qtgui.base import TaurusBaseWidget +-from qled import QLed ++from .qled import QLed + + _QT_PLUGIN_INFO = { + 'module': 'taurus.qt.qtgui.display', +@@ -454,7 +455,7 @@ + + def demo(): + "Led" +- import demo.taurusleddemo ++ from . import demo.taurusleddemo + return demo.taurusleddemo.main() + + +--- lib/taurus/qt/qtgui/extra_guiqwt/builder.py (original) ++++ lib/taurus/qt/qtgui/extra_guiqwt/builder.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """Extension of :mod:`guiqwt.builder`""" ++from __future__ import absolute_import + + __all__ = ["TaurusPlotItemBuilder", "make"] + +@@ -31,8 +32,8 @@ + + import guiqwt.builder + +-from curve import TaurusCurveItem, TaurusTrendItem +-from image import (TaurusImageItem, TaurusRGBImageItem, TaurusEncodedImageItem, ++from .curve import TaurusCurveItem, TaurusTrendItem ++from .image import (TaurusImageItem, TaurusRGBImageItem, TaurusEncodedImageItem, + TaurusEncodedRGBImageItem, TaurusXYImageItem) + from guiqwt.curve import CurveParam + from guiqwt.image import ImageParam, XYImageItem +--- lib/taurus/qt/qtgui/extra_guiqwt/curve.py (original) ++++ lib/taurus/qt/qtgui/extra_guiqwt/curve.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """Extension of :mod:`guiqwt.curve`""" ++from __future__ import print_function + + __all__ = ["TaurusCurveItem"] + +@@ -356,11 +357,11 @@ + elif n == 2: + mx, my = mx_my + else: +- print "Invalid model: %s\n" % mx_my ++ print("Invalid model: %s\n" % mx_my) + parser.print_help(sys.stderr) + sys.exit(1) + # cycle colors +- style = make.style.next() ++ style = next(make.style) + color = style[0] + linestyle = style[1:] + plot.add_item(make.curve(mx, my, color=color, +--- lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py (original) ++++ lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py (refactored) +@@ -26,6 +26,7 @@ + """ + curvesmodel Model and view for new CurveItem configuration + """ ++from __future__ import print_function + __all__ = ['TaurusCurveItemTableModel', 'CurveItemConf', 'CurveItemConfDlg'] + #raise UnimplementedError('Under Construction!') + +@@ -108,7 +109,7 @@ + self.taurusparam = taurusparam + if curveparam is None: + curveparam = CurveParam() +- style = make.style.next() # cycle through colors and linestyles ++ style = next(make.style) # cycle through colors and linestyles + update_style_attr(style, curveparam) + curveparam.line.width = 2 + self.curveparam = curveparam +@@ -488,7 +489,7 @@ + self.applied.emit() + + def onReload(self): +- print "RELOAD!!! (todo)" ++ print("RELOAD!!! (todo)") + + + # +--- lib/taurus/qt/qtgui/extra_guiqwt/image.py (original) ++++ lib/taurus/qt/qtgui/extra_guiqwt/image.py (refactored) +@@ -69,7 +69,7 @@ + # TODO: units should be used for setting some title in the colorbar + try: + v = self.filterData(v) +- except Exception, e: ++ except Exception as e: + self.info('Ignoring event. Reason: %s', e.message) + return + # this is the range of the z axis (color scale) +@@ -143,7 +143,7 @@ + + try: + fmt, decoded_data = codec.decode(data) +- except Exception, e: ++ except Exception as e: + self.info('Decoder error: %s', e.message) + raise e + +--- lib/taurus/qt/qtgui/extra_guiqwt/plot.py (original) ++++ lib/taurus/qt/qtgui/extra_guiqwt/plot.py (refactored) +@@ -152,7 +152,7 @@ + else: + self.warning('Invalid model "%s" (Skipping)' % mx_my) + # cycle styles +- style = self.style.next() ++ style = next(self.style) + color = style[0] + linestyle = style[1:] + # add the item +@@ -289,7 +289,7 @@ + # create and attach new TaurusCurveItems + for m in modelNames: + # cycle styles +- style = self.style.next() ++ style = next(self.style) + # add the item + item = make.ttrend(m, color=style[0], linestyle=style[ + 1:], linewidth=2, taurusparam=copy.deepcopy(self.defaultTaurusparam)) +--- lib/taurus/qt/qtgui/extra_guiqwt/scales.py (original) ++++ lib/taurus/qt/qtgui/extra_guiqwt/scales.py (refactored) +@@ -26,6 +26,7 @@ + """ + scales.py: Custom scales used by taurus.qt.qtgui.plot module + """ ++from __future__ import print_function + __all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", + "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", + "FixedLabelsScaleDraw"] +@@ -326,8 +327,8 @@ + t = datetime.fromtimestamp(val) + try: # If the scaleDiv was created by a DateTimeScaleEngine it has a _datetimeLabelFormat + s = t.strftime(self._datetimeLabelFormat) +- except AttributeError, e: +- print "Warning: cannot get the datetime label format (Are you using a DateTimeScaleEngine?)" ++ except AttributeError as e: ++ print("Warning: cannot get the datetime label format (Are you using a DateTimeScaleEngine?)") + s = t.isoformat(' ') + return qwt.QwtText(s) + +--- lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py (original) ++++ lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py (refactored) +@@ -325,7 +325,7 @@ + try: + p = yacc.yacc(tabmodule=jdraw_yacctab, debugfile=None, write_tables=1, + **common_kwargs) +- except Exception, e: ++ except Exception as e: + msg = ('Error creating jdraw parser.\n' + + 'HINT: Try removing jdraw_lextab.* and jdraw_yacctab.* from %s' % + outputdir) +--- lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py (original) ++++ lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module contains the graphics factory for the jdraw file format""" ++from __future__ import absolute_import + + __all__ = ["TaurusJDrawGraphicsFactory"] + +@@ -371,9 +372,9 @@ + pen.setWidth(lineWidth) + pen.setStyle(LINESTYLE_JDW2QT[params.get("lineStyle", 0)]) + item.setPen(pen) +- except AttributeError, ae: ++ except AttributeError as ae: + pass +- except Exception, e: ++ except Exception as e: + self.warning('jdraw.set_common_params(%s(%s)).(foreground,width,style) failed!: \n\t%s' % ( + type(item).__name__, name, traceback.format_exc())) + +@@ -419,5 +420,5 @@ + return + + if __name__ == "__main__": +- import jdraw_view ++ from . import jdraw_view + jdraw_view.jdraw_view_main() +--- lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py (original) ++++ lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module contains the graphics view widget for jdraw files""" ++from __future__ import absolute_import + + __all__ = ["TaurusJDrawSynopticsView"] + +@@ -39,7 +40,7 @@ + from taurus.qt.qtcore.mimetypes import TAURUS_ATTR_MIME_TYPE, TAURUS_DEV_MIME_TYPE, TAURUS_MODEL_MIME_TYPE + from taurus.qt.qtgui.base import TaurusBaseWidget + +-import jdraw_parser ++from . import jdraw_parser + + + class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget): +@@ -268,7 +269,7 @@ + # self.fitting() + + def getGraphicsFactory(self, delayed=False): +- import jdraw ++ from . import jdraw + # self.parent()) + return jdraw.TaurusJDrawGraphicsFactory(self, alias=(self.alias or None), delayed=delayed) + +--- lib/taurus/qt/qtgui/graphic/taurusgraphic.py (original) ++++ lib/taurus/qt/qtgui/graphic/taurusgraphic.py (refactored) +@@ -25,6 +25,7 @@ + """ + taurusgraphic.py: + """ ++from __future__ import print_function + + # TODO: Tango-centric + +@@ -140,7 +141,7 @@ + p = self.parent() + while True: + item = p.getQueue().get(True) +- if type(item) in types.StringTypes: ++ if type(item) in (str,): + if item == "exit": + break + else: +@@ -214,7 +215,7 @@ + self.debug = self.info = self.warning = self.error = lambda l: self.logger.warning( + l) + except: +- print 'Unable to initialize TaurusGraphicsSceneLogger: %s' % traceback.format_exc() ++ print('Unable to initialize TaurusGraphicsSceneLogger: %s' % traceback.format_exc()) + + try: + if parent and parent.panelClass() is not None: +@@ -439,7 +440,7 @@ + elif not last_was_separator: + menu.addSeparator() + last_was_separator = True +- except Exception, e: ++ except Exception as e: + self.warning('Unable to add Menu Action: %s:%s' % (k, e)) + return last_was_separator + if (mouseEvent.button() == Qt.Qt.RightButton): +@@ -575,7 +576,7 @@ + if item not in self._selectedItems: + self._selectedItems.append(item) + retval = True +- except Exception, e: ++ except Exception as e: + self.warning('selectGraphicsItem(%s) failed! %s' % + (getattr(item, '_name', item), str(e))) + self.warning(traceback.format_exc()) +--- lib/taurus/qt/qtgui/icon/catalog.py (original) ++++ lib/taurus/qt/qtgui/icon/catalog.py (refactored) +@@ -24,6 +24,7 @@ + """ + This module provides an icon catalog widget + """ ++from __future__ import print_function + + import os + import hashlib +@@ -57,7 +58,7 @@ + + for path in Qt.QDir.searchPaths(prefix): + if not os.path.exists(path): +- print " %s not found. Skipping.!" % path ++ print(" %s not found. Skipping.!" % path) + continue + + for fname in os.listdir(path): +--- lib/taurus/qt/qtgui/icon/icon.py (original) ++++ lib/taurus/qt/qtgui/icon/icon.py (refactored) +@@ -135,7 +135,7 @@ + for filename in pathfilenames: + try: + pathmap = json.load(open(filename)) +- except Exception, e: ++ except Exception as e: + __LOGGER.error('Error registering "%s": %r', filename, e) + pathmap = [] + +--- lib/taurus/qt/qtgui/icon/__init__.py (original) ++++ lib/taurus/qt/qtgui/icon/__init__.py (refactored) +@@ -27,6 +27,7 @@ + Utilities for using the bundled icons in Taurus and for registering external + sources of icons. + """ ++from __future__ import absolute_import + +-from icon import * +-from catalog import QIconCatalog ++from .icon import * ++from .catalog import QIconCatalog +--- lib/taurus/qt/qtgui/__init__.py (original) ++++ lib/taurus/qt/qtgui/__init__.py (refactored) +@@ -27,12 +27,13 @@ + taurus models. The widgets are generic in the sence that they do not assume any + behavior associated with a specific HW device. They intend to represent only + abstract model data.""" ++from __future__ import absolute_import + + __docformat__ = 'restructuredtext' + + + # register icon path files and icon theme on import of taurus.qt.qtgui +-import icon as __icon ++from . import icon as __icon + import os + import sys + import glob +--- lib/taurus/qt/qtgui/input/choicedlg.py (original) ++++ lib/taurus/qt/qtgui/input/choicedlg.py (refactored) +@@ -24,6 +24,7 @@ + ########################################################################### + + """This package provides a dialog for graphically choosing a Taurus class""" ++from __future__ import print_function + + __all__ = ["GraphicalChoiceDlg", "GraphicalChoiceWidget"] + +@@ -255,7 +256,7 @@ + for k in row: + pixmaps[k] = getCachedPixmap('snapshot:%s.png' % k) + +- print GraphicalChoiceDlg.getChoice(parent=None, title='Panel chooser', msg='Choose the type of Panel:', choices=choices, pixmaps=pixmaps) ++ print(GraphicalChoiceDlg.getChoice(parent=None, title='Panel chooser', msg='Choose the type of Panel:', choices=choices, pixmaps=pixmaps)) + + sys.exit() + +--- lib/taurus/qt/qtgui/input/taurusspinbox.py (original) ++++ lib/taurus/qt/qtgui/input/taurusspinbox.py (refactored) +@@ -26,10 +26,11 @@ + """ + This module provides a set of basic taurus widgets based on QAbstractSpinBox + """ ++from __future__ import absolute_import + + from taurus.external.qt import Qt + +-from tauruslineedit import TaurusValueLineEdit ++from .tauruslineedit import TaurusValueLineEdit + from taurus.qt.qtgui.icon import getStandardIcon + from taurus.external.pint import Quantity + +--- lib/taurus/qt/qtgui/input/tauruswheel.py (original) ++++ lib/taurus/qt/qtgui/input/tauruswheel.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module provides a set of basic taurus widgets based on QWheelEdit""" ++from __future__ import absolute_import + + __all__ = ["TaurusWheelEdit"] + +@@ -34,7 +35,7 @@ + + from taurus.core.taurusbasetypes import TaurusEventType + from taurus.qt.qtgui.base import TaurusBaseWritableWidget +-from qwheel import QWheelEdit ++from .qwheel import QWheelEdit + + + class TaurusWheelEdit(QWheelEdit, TaurusBaseWritableWidget): +--- lib/taurus/qt/qtgui/panel/qdataexportdialog.py (original) ++++ lib/taurus/qt/qtgui/panel/qdataexportdialog.py (refactored) +@@ -25,6 +25,7 @@ + + """DataExportDlg.py: A Qt dialog for showing and exporting x-y Ascii data from + one or more curves""" ++from __future__ import print_function + + __all__ = ["QDataExportDialog"] + +@@ -123,9 +124,9 @@ + else: + for x,y in zip(xdata, ydata): + text+="%r\t%r\n" % (x, y) +- print >> ofile, str(text) +- else: +- print >> ofile, str(self.dataTE.toPlainText()) ++ print(str(text), file=ofile) ++ else: ++ print(str(self.dataTE.toPlainText()), file=ofile) + except: + Qt.QMessageBox.warning(self, + "File saving failed", +--- lib/taurus/qt/qtgui/panel/qdoublelist.py (original) ++++ lib/taurus/qt/qtgui/panel/qdoublelist.py (refactored) +@@ -28,6 +28,7 @@ + qdoublelist.py: Provides a generic dialog containing two list which can move + items from one to the other + """ ++from __future__ import print_function + + __all__ = ["QDoubleListDlg"] + +@@ -132,9 +133,9 @@ + list1=['11', '22'], list2=['123', '33']) + result = dlg.exec_() + +- print "Result", result +- print "list1", dlg.getAll1() +- print "list2", dlg.getAll2() ++ print("Result", result) ++ print("list1", dlg.getAll1()) ++ print("list2", dlg.getAll2()) + + + if __name__ == "__main__": +--- lib/taurus/qt/qtgui/panel/report/albareport.py (original) ++++ lib/taurus/qt/qtgui/panel/report/albareport.py (refactored) +@@ -24,13 +24,14 @@ + ############################################################################# + + """This module provides a panel to display taurus messages""" ++from __future__ import absolute_import + + __all__ = ["TicketReportHandler"] + + __docformat__ = 'restructuredtext' + + from taurus.external.qt import Qt +-from basicreport import SendMailDialog, SMTPReportHandler ++from .basicreport import SendMailDialog, SMTPReportHandler + + + class SendTicketDialog(SendMailDialog): +--- lib/taurus/qt/qtgui/panel/taurusconfigeditor.py (original) ++++ lib/taurus/qt/qtgui/panel/taurusconfigeditor.py (refactored) +@@ -138,7 +138,7 @@ + key = val[0] + dict[key] = self.removeBranch(dict[key], path) + if self._delete == True: +- if not dict.has_key('__orderedConfigNames__'): ++ if '__orderedConfigNames__' not in dict: + return dict + dict['__orderedConfigNames__'] = self.removeBranch( + dict['__orderedConfigNames__'], path) +@@ -150,7 +150,7 @@ + return dict + dict.remove(val[0]) + return dict +- if not dict.has_key('__orderedConfigNames__'): ++ if '__orderedConfigNames__' not in dict: + self._delete = True + dict.pop(val[0]) + return dict +@@ -346,7 +346,7 @@ + if qstate is not None and not qstate.isNull(): + try: + result = pickle.loads(qstate.data()) +- except Exception, e: ++ except Exception as e: + msg = 'problems loading TaurusConfig: \n%s' % repr(e) + Qt.QMessageBox.critical(None, 'Error loading settings', msg) + return result +--- lib/taurus/qt/qtgui/panel/taurusdemo.py (original) ++++ lib/taurus/qt/qtgui/panel/taurusdemo.py (refactored) +@@ -23,6 +23,7 @@ + ## + ############################################################################# + ++from __future__ import print_function + import sys + import operator + +@@ -75,10 +76,10 @@ + continue + try: + self.addDemo(demo_func.__doc__, demo_func, group) +- except Exception, e: +- print 80 * "-" +- print "Problems adding demo", demo_name +- print e ++ except Exception as e: ++ print(80 * "-") ++ print("Problems adding demo", demo_name) ++ print(e) + + def addGroup(self, name): + g = Qt.QGroupBox(name) +@@ -111,12 +112,12 @@ + dialog.setLayout(layout) + layout.addWidget(w) + dialog.exec_() +- except Exception, e: ++ except Exception as e: + if dialog is not None: + dialog.done(0) + dialog.hide() + dialog = None +- print str(e) ++ print(str(e)) + return + d = Qt.QErrorMessage() + d.showMessage(str(e)) +--- lib/taurus/qt/qtgui/panel/taurusform.py (original) ++++ lib/taurus/qt/qtgui/panel/taurusform.py (refactored) +@@ -24,6 +24,8 @@ + ############################################################################# + + """This module contains taurus Qt form widgets""" ++from __future__ import print_function ++from __future__ import absolute_import + + __all__ = ["TaurusAttrForm", "TaurusCommandsForm", "TaurusForm"] + +@@ -40,7 +42,7 @@ + TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_MODEL_MIME_TYPE) + from taurus.qt.qtgui.container import TaurusWidget, TaurusScrollArea + from taurus.qt.qtgui.button import QButtonBox, TaurusCommandButton +-from taurusmodelchooser import TaurusModelChooser ++from .taurusmodelchooser import TaurusModelChooser + + + class ParameterCB(Qt.QComboBox): +@@ -979,7 +981,7 @@ + class DummyCW(TaurusValue): + + def setModel(self, model): +- print "!!!!! IN DUMMYCW.SETMODEL", model ++ print("!!!!! IN DUMMYCW.SETMODEL", model) + TaurusValue.setModel(self, model + '/double_scalar') + + models = ['sys/database/2', 'sys/tg_test/1', 'sys/tg_test/1/short_spectrum', +--- lib/taurus/qt/qtgui/panel/taurusinputpanel.py (original) ++++ lib/taurus/qt/qtgui/panel/taurusinputpanel.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module provides an Input panel (usually used inside a TaurusDialog)""" ++from __future__ import print_function + + __all__ = ["TaurusInputPanel"] + +@@ -402,7 +403,7 @@ + class Listener(object): + + def on_accept(self): +- print "user selected", self.panel.value() ++ print("user selected", self.panel.value()) + + d = dict(prompt="What's your favourite car brand?", + data_type=["Mazda", "Skoda", "Citroen", +--- lib/taurus/qt/qtgui/panel/taurusmessagepanel.py (original) ++++ lib/taurus/qt/qtgui/panel/taurusmessagepanel.py (refactored) +@@ -580,7 +580,7 @@ + try: + PyTango.Except.throw_exception( + 'TangoException', 'A simple tango exception', 'right here') +- except PyTango.DevFailed, df1: ++ except PyTango.DevFailed as df1: + try: + import traceback + import StringIO +--- lib/taurus/qt/qtgui/panel/taurusmodelchooser.py (original) ++++ lib/taurus/qt/qtgui/panel/taurusmodelchooser.py (refactored) +@@ -26,6 +26,8 @@ + """ + AttributeChooser.py: widget for choosing (a list of) attributes from a tango DB + """ ++from __future__ import print_function ++from __future__ import absolute_import + + __all__ = ["TaurusModelSelectorTree", "TaurusModelChooser"] + +@@ -35,7 +37,7 @@ + from taurus.qt.qtgui.container import TaurusWidget + from taurus.qt.qtgui.tree import TaurusDbTreeWidget + from taurus.core.util.containers import CaselessList +-from taurusmodellist import TaurusModelList ++from .taurusmodellist import TaurusModelList + + + class TaurusModelSelectorTree(TaurusWidget): +@@ -358,7 +360,7 @@ + host = None + + app = Qt.QApplication(args) +- print TaurusModelChooser.modelChooserDlg(host=host) ++ print(TaurusModelChooser.modelChooserDlg(host=host)) + sys.exit() + + if __name__ == "__main__": +--- lib/taurus/qt/qtgui/panel/taurusvalue.py (original) ++++ lib/taurus/qt/qtgui/panel/taurusvalue.py (refactored) +@@ -820,7 +820,7 @@ + try: + klass = self.readWidgetClassFactory(self.readWidgetClassID) + self._readWidget = self._newSubwidget(self._readWidget, klass) +- except Exception, e: ++ except Exception as e: + self._destroyWidget(self._readWidget) + self._readWidget = Qt.QLabel('[Error]') + msg = 'Error creating read widget:\n' + str(e) +@@ -1145,7 +1145,7 @@ + widget_configdict = configdict[key] + getattr(self, 'set%sClass' % key)( + widget_configdict.get('classid', None)) +- if widget_configdict.has_key('delegate'): ++ if 'delegate' in widget_configdict: + widget = getattr(self, key[0].lower() + key[1:])() + if isinstance(widget, BaseConfigurableClass): + widget.applyConfig(widget_configdict[ +--- lib/taurus/qt/qtgui/plot/arrayedit.py (original) ++++ lib/taurus/qt/qtgui/plot/arrayedit.py (refactored) +@@ -26,12 +26,13 @@ + """ + arrayedit.py: Widget for editing a spectrum/array via control points + """ ++from __future__ import absolute_import + + + import numpy + from taurus.external.qt import Qt, Qwt5 + from taurus.qt.qtgui.util.ui import UILoadable +-from curvesAppearanceChooserDlg import CurveAppearanceProperties ++from .curvesAppearanceChooserDlg import CurveAppearanceProperties + + + @UILoadable +--- lib/taurus/qt/qtgui/plot/curveprops.py (original) ++++ lib/taurus/qt/qtgui/plot/curveprops.py (refactored) +@@ -26,6 +26,7 @@ + """ + curveprops: Model and view for curve properties + """ ++from __future__ import absolute_import + __all__ = ['CurveConf', 'CurvesTableModel', + 'ExtendedSelectionModel', 'CurvePropertiesView'] + #raise NotImplementedError('Under Construction!') +@@ -40,7 +41,7 @@ + from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE + from taurus.qt.qtgui.util.ui import UILoadable + +-from curvesAppearanceChooserDlg import NamedLineStyles, ReverseNamedLineStyles, \ ++from .curvesAppearanceChooserDlg import NamedLineStyles, ReverseNamedLineStyles, \ + NamedCurveStyles, ReverseNamedCurveStyles, \ + NamedSymbolStyles, ReverseNamedSymbolStyles, \ + NamedColors, CurveAppearanceProperties +--- lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py (original) ++++ lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py (refactored) +@@ -28,6 +28,7 @@ + A Qt dialog for choosing plot appearance (symbols and lines) + for a QwtPlot-derived widget (like Taurusplot) + """ ++from __future__ import print_function + + import copy + +@@ -430,10 +431,10 @@ + + def _print(self): + """Just for debug""" +- print "-" * 77 ++ print("-" * 77) + for k in self.propertyList: +- print k + "= ", self.__getattribute__(k) +- print "-" * 77 ++ print(k + "= ", self.__getattribute__(k)) ++ print("-" * 77) + + @staticmethod + def inConflict_update_a(a, b): +--- lib/taurus/qt/qtgui/plot/monitor.py (original) ++++ lib/taurus/qt/qtgui/plot/monitor.py (refactored) +@@ -26,6 +26,7 @@ + """ + monitor.py: Specialized mini-trend widget to monitor some scalar value + """ ++from __future__ import print_function + + from taurus.external.qt import Qt + from taurus.qt.qtgui.plot import TaurusTrend +@@ -109,7 +110,7 @@ + elif a.startswith('-config='): + CONFIG = a.split('=')[-1] + elif a.startswith('-'): # whatever other argument starting by "-" +- print "\n Usage: \n%s [-xe|-xt] [-config=configfilename] [model1 [model2] ...]\n" % sys.argv[0] ++ print("\n Usage: \n%s [-xe|-xt] [-config=configfilename] [model1 [model2] ...]\n" % sys.argv[0]) + sys.exit(1) + else: # anything that is not a parameter is interpreted as a model + MODELS.append(a) +--- lib/taurus/qt/qtgui/plot/qwtdialog.py (original) ++++ lib/taurus/qt/qtgui/plot/qwtdialog.py (refactored) +@@ -26,6 +26,8 @@ + """ + qwtdialog.py: Dialogs for Taurusplot + """ ++from __future__ import print_function ++from __future__ import absolute_import + + __all__ = ["TaurusPlotConfigDialog"] + +@@ -72,7 +74,7 @@ + + # insert the CurvesAppearanceWidget + #(@TODO:must be changed to be done directly in the ui, but I couldn't make the widget available to TaurusDesigner) +- from curvesAppearanceChooserDlg import CurvesAppearanceChooser ++ from .curvesAppearanceChooserDlg import CurvesAppearanceChooser + layout = Qt.QVBoxLayout() + self.curvesAppearanceChooser = CurvesAppearanceChooser(None) + layout.addWidget(self.curvesAppearanceChooser) +@@ -165,7 +167,7 @@ + elif scaleType == Qwt5.QwtScaleTransformation.Log10: + axes[axis].setCurrentIndex(1) + else: +- raise TypeError, "TaurusPlotConfigDialog::__init__(): unexpected axis scale type (linear or logarihtmic expected)" ++ raise TypeError("TaurusPlotConfigDialog::__init__(): unexpected axis scale type (linear or logarihtmic expected)") + self.ui.xModeComboBox.setEnabled(not self.parent.getXIsTime()) + + # determine which axes are visible +@@ -268,11 +270,11 @@ + if strtime[-1] in timeunits.keys(): + try: + return float(strtime[:-1]) * timeunits[strtime[-1]] +- except Exception, e: +- print '[str2deltatime] No format could be applied to "%s"' % strtime ++ except Exception as e: ++ print('[str2deltatime] No format could be applied to "%s"' % strtime) + return None + else: +- print '[str2deltatime] Non-supported unit "%s"' % strtime[-1] ++ print('[str2deltatime] Non-supported unit "%s"' % strtime[-1]) + return None + + def strtime2epoch(self, strtime): +@@ -321,12 +323,12 @@ + t = (lt[0], lt[1], lt[2], t[3], t[ + 4], lt[5], lt[6], lt[7], lt[8]) + break +- except Exception, e: ++ except Exception as e: + pass + if t: + return time.mktime(t) + else: +- print 'No format could be applied to "%s"' % strtime ++ print('No format could be applied to "%s"' % strtime) + return None + + def validate(self): +--- lib/taurus/qt/qtgui/plot/qwtplot.py (original) ++++ lib/taurus/qt/qtgui/plot/qwtplot.py (refactored) +@@ -23,9 +23,9 @@ + ## + ############################################################################# + +-print "*" * 77 +-print \ +- """ ++from __future__ import print_function ++print("*" * 77) ++print(""" + If you are seeing this, it is because you tried to access qwtplot.py directly. + All funcionality has been moved to taurusplot.py, taurustrend.py and scales.py + +@@ -34,5 +34,5 @@ + + If you were trying to launch a stand-alone Taurusplot or TaurusTrend from a script, + you should update such script. +-""" +-print "*" * 77 ++""") ++print("*" * 77) +--- lib/taurus/qt/qtgui/plot/scales.py (original) ++++ lib/taurus/qt/qtgui/plot/scales.py (refactored) +@@ -26,6 +26,7 @@ + """ + scales.py: Custom scales used by taurus.qt.qtgui.plot module + """ ++from __future__ import print_function + __all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", + "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", + "FixedLabelsScaleDraw"] +@@ -318,8 +319,8 @@ + t = datetime.fromtimestamp(val) + try: # If the scaleDiv was created by a DateTimeScaleEngine it has a _datetimeLabelFormat + s = t.strftime(self._datetimeLabelFormat) +- except AttributeError, e: +- print "Warning: cannot get the datetime label format (Are you using a DateTimeScaleEngine?)" ++ except AttributeError as e: ++ print("Warning: cannot get the datetime label format (Are you using a DateTimeScaleEngine?)") + s = t.isoformat(' ') + return Qwt5.QwtText(s) + +--- lib/taurus/qt/qtgui/plot/taurusarrayedit.py (original) ++++ lib/taurus/qt/qtgui/plot/taurusarrayedit.py (refactored) +@@ -24,12 +24,13 @@ + ############################################################################# + + ++from __future__ import absolute_import + from taurus.external.qt import Qt + import taurus + import numpy + + from taurus.qt.qtgui.container import TaurusWidget +-from arrayedit import ArrayEditor ++from .arrayedit import ArrayEditor + + + class TaurusArrayEditor(TaurusWidget): +@@ -137,7 +138,7 @@ + x = numpy.arange(y.size) + else: + x = numpy.array(self._xAttr.read().rvalue) +- except Exception, e: ++ except Exception as e: + self.error('Error reading from attribute(s): %s' % (str(e))) + if not quiet: + Qt.QMessageBox.warning( +@@ -182,7 +183,7 @@ + if self._xAttr is not None and numpy.any(self._xAttr.read(cache=False).wvalue != x): + raise IOError('Unexpected Write error: %s' % + self._xAttr.getFullName()) +- except Exception, e: ++ except Exception as e: + self.error('Error writing to attribute(s): %s' % (str(e))) + if not quiet: + Qt.QMessageBox.warning( +--- lib/taurus/qt/qtgui/plot/taurusplotconf.py (original) ++++ lib/taurus/qt/qtgui/plot/taurusplotconf.py (refactored) +@@ -26,6 +26,8 @@ + """ + TaurusPlotConf: widget for configurating the contents and appearance of a TaurusPlot + """ ++from __future__ import print_function ++from __future__ import absolute_import + + __all__ = ['TaurusPlotConfDlg'] + +@@ -35,7 +37,7 @@ + from taurus.external.qt import Qt, Qwt5 + from taurus.qt.qtgui.util.ui import UILoadable + +-import curveprops ++from . import curveprops + try: + import taurus.qt.qtgui.extra_nexus as extra_nexus + except: +@@ -121,7 +123,7 @@ + return new + + def onModelsAdded(self, models): +- print models ++ print(models) + nmodels = len(models) + rowcount = self.model.rowCount() + self.model.insertRows(rowcount, nmodels) +@@ -130,14 +132,14 @@ + value=Qt.QVariant(m)) + + def onApply(self): +- print "APPLY!!! (todo)" ++ print("APPLY!!! (todo)") + curveConfs = self.model.dumpData() + + for c in curveConfs: +- print repr(c) ++ print(repr(c)) + + def onReload(self): +- print "RELOAD!!! (todo)" ++ print("RELOAD!!! (todo)") + + + class demo(Qt.QDialog): +@@ -200,7 +202,7 @@ + + def onData(self): + cmds = self.model.dumpData() +- print self.model.curves ++ print(self.model.curves) + + + def main1(): +--- lib/taurus/qt/qtgui/plot/taurusplot.py (original) ++++ lib/taurus/qt/qtgui/plot/taurusplot.py (refactored) +@@ -26,6 +26,8 @@ + """ + taurusplot.py: Generic graphical plotting widget for Taurus + """ ++from __future__ import print_function ++from __future__ import absolute_import + __all__ = ["TaurusCurve", "TaurusCurveMarker", + "TaurusXValues", "TaurusPlot", "isodatestr2float"] + +@@ -48,7 +50,7 @@ + from taurus.qt.qtgui.base import TaurusBaseComponent, TaurusBaseWidget + from taurus.qt.qtgui.plot import TaurusPlotConfigDialog, FancyScaleDraw,\ + DateTimeScaleEngine, FixedLabelsScaleEngine, FixedLabelsScaleDraw +-from curvesAppearanceChooserDlg import CurveAppearanceProperties ++from .curvesAppearanceChooserDlg import CurveAppearanceProperties + + + def isodatestr2float(s, sep='_'): +@@ -535,7 +537,7 @@ + ''' + if self.isRawData: + #self.warning('fireEvent of a RawData curve has been called by %s'%repr(self.sender())) +- raise StandardError('called handleEvent of a RawData curve') ++ raise Exception('called handleEvent of a RawData curve') + return + model = src if src is not None else self.getModelObj() + if model is None: +@@ -554,7 +556,7 @@ + return + try: + self.setXYFromModel(value) +- except Exception, e: ++ except Exception as e: + self._onDroppedEvent(reason=str(e)) + return + self._updateMarkers() +@@ -1457,7 +1459,7 @@ + + def __debug(self, *args, **kwargs): + '''put code here that you want to debug''' +- print "!!!!!!!!!!!!!!!1", self.pos() ++ print("!!!!!!!!!!!!!!!1", self.pos()) + Qt.QToolTip.showText(self.mapToGlobal(self.pos()), + "ASDASDASDASD DASDAS ASDA", self) + +@@ -1568,7 +1570,7 @@ + TaurusPlot.getPlot()''' + self.info( + 'DEPRECATION WARNING!: Calling TaurusPlot.getPlot() is deprecated. Use the TaurusPlot object itself instead') +- print self.sender() ++ print(self.sender()) + return self + + def getCurve(self, name): +@@ -1807,11 +1809,11 @@ + properties = CurveAppearanceProperties( + lColor=self._curvePens.next().color(), lWidth=2) + # Deprecation Warning: +- if rawdata.has_key("pen") or rawdata.has_key("style"): ++ if "pen" in rawdata or "style" in rawdata: + raise DeprecationWarning( + "'pen' or 'style' are no longer supported. Use the properties parameter instead") +- if rawdata.has_key("name"): +- if rawdata.has_key("title"): ++ if "name" in rawdata: ++ if "title" in rawdata: + self.error( + 'Inconsistence: both "name" and "title" passed for rawdata. Use "title" only') + else: +@@ -1861,7 +1863,7 @@ + name = id + self.curves_lock.acquire() + try: +- if self.curves.has_key(name): ++ if name in self.curves: + curve = self.curves.get(name) + if curve.isRawData: + self.detachRawData(name) +@@ -1942,7 +1944,7 @@ + """ + self.curves_lock.acquire() + try: +- if self.curves.has_key(curvename): ++ if curvename in self.curves: + data = self.curves[curvename].data() + x = [data.x(i) for i in xrange(data.size())] + y = [data.y(i) for i in xrange(data.size())] +@@ -1992,7 +1994,7 @@ + xname = xnames[i] + name = str(name) + self.debug('updating curve %s' % name) +- if not self.curves.has_key(name): ++ if name not in self.curves: + curve = TaurusCurve(name, xname, self, + optimized=self.isOptimizationEnabled()) + curve.attach(self) +@@ -2003,7 +2005,7 @@ + curve.attachMaxMarker(self) + if self._showMinPeaks: + curve.attachMinMarker(self) +- curve.setPen(self._curvePens.next()) ++ curve.setPen(next(self._curvePens)) + curve.setUseParentModel(self.getUseParentModel()) + curve.setTitleText(self.getDefaultCurvesTitle()) + curve.registerDataChanged(self, self.curveDataChanged) +@@ -2399,7 +2401,7 @@ + rawdatadict[name] = curve.getRawData() + else: + tangodict[name] = curve.getModel() +- except Exception, e: ++ except Exception as e: + self.error( + 'Exception while gathering curves configuration info' + str(e)) + finally: +@@ -2889,8 +2891,8 @@ + :param axis: (Qwt5.QwtPlot.Axis) the axis + """ + if not Qwt5.QwtPlot.axisValid(axis): +- raise ValueError, "TaurusPlot::setCurvesYAxis. Invalid axis ID: " + \ +- repr(axis) ++ raise ValueError("TaurusPlot::setCurvesYAxis. Invalid axis ID: " + \ ++ repr(axis)) + self.curves_lock.acquire() + try: + for curveName in curvesNamesList: +@@ -3725,12 +3727,12 @@ + + def exportIfAllCurves(curve, trend=w, counters=curves): + curve = str(curve) +- print '*' * 10 + ' %s: Event received for %s ' % (datetime.now().isoformat(), curve) + '*' * 10 ++ print('*' * 10 + ' %s: Event received for %s ' % (datetime.now().isoformat(), curve) + '*' * 10) + if curve in counters: + counters[curve] += 1 + if all(counters.values()): + trend.exportPdf(options.export_file) +- print '*' * 10 + ' %s: Exported to : %s ' % (datetime.now().isoformat(), options.export_file) + '*' * 10 ++ print('*' * 10 + ' %s: Exported to : %s ' % (datetime.now().isoformat(), options.export_file) + '*' * 10) + trend.close() + return + if not curves: +--- lib/taurus/qt/qtgui/plot/taurustrend.py (original) ++++ lib/taurus/qt/qtgui/plot/taurustrend.py (refactored) +@@ -26,6 +26,7 @@ + """ + taurustrend.py: Generic trend widget for Taurus + """ ++from __future__ import print_function + __all__ = ["ScanTrendsSet", "TaurusTrend", "TaurusTrendsSet"] + + from datetime import datetime +@@ -338,7 +339,7 @@ + v = value.rvalue + try: + self._yBuffer.append(v) +- except Exception, e: ++ except Exception as e: + self.warning('Problem updating history (%s=%s):%s', + model, v, e) + value = None +@@ -354,7 +355,7 @@ + if self.parent().getXDynScale() or not self.parent().axisAutoScale(Qwt5.QwtPlot.xBottom): + try: + getArchivedTrendValues(self, model, insert=True) +- except Exception, e: ++ except Exception as e: + import traceback + self.warning('%s: reading from archiving failed: %s' % ( + datetime.now().isoformat('_'), traceback.format_exc())) +@@ -438,7 +439,7 @@ + try: + self._xValues, self._yValues = self._updateHistory( + model=model or self.getModel(), value=value) +- except Exception, e: ++ except Exception as e: + self._onDroppedEvent(reason=str(e)) + raise + +@@ -1171,7 +1172,7 @@ + raise ValueError( + 'composed ("X|Y") models are not supported by TaurusTrend') + # create a new TrendSet if not already there +- if not self.trendSets.has_key(name): ++ if name not in self.trendSets: + # check if the model name is of scan type and provides a + # door + matchScan = re.search(r"scan:\/\/(.*)", name) +@@ -1926,12 +1927,12 @@ + + def exportIfAllCurves(curve, trend=w, counters=curves): + curve = str(curve) +- print '*' * 10 + ' %s: Event received for %s ' % (datetime.now().isoformat(), curve) + '*' * 10 ++ print('*' * 10 + ' %s: Event received for %s ' % (datetime.now().isoformat(), curve) + '*' * 10) + if curve in counters: + counters[curve] += 1 + if all(counters.values()): + trend.exportPdf(options.export_file) +- print '*' * 10 + ' %s: Exported to : %s ' % (datetime.now().isoformat(), options.export_file) + '*' * 10 ++ print('*' * 10 + ' %s: Exported to : %s ' % (datetime.now().isoformat(), options.export_file) + '*' * 10) + trend.close() + return + if not curves: +--- lib/taurus/qt/qtgui/resource/__init__.py (original) ++++ lib/taurus/qt/qtgui/resource/__init__.py (refactored) +@@ -27,6 +27,7 @@ + Old module supporting resources (now it just contains a reimplementation + based on taurus.qt.qtgui.icon for bck-compat) + """ ++from __future__ import absolute_import + + from taurus.core.util.log import deprecated as __deprecated + +@@ -34,4 +35,4 @@ + alt='taurus.qt.qtgui.icon', + rel='4.0') + +-from taurus_resource_utils import * ++from .taurus_resource_utils import * +--- lib/taurus/qt/qtgui/table/qdictionary.py (original) ++++ lib/taurus/qt/qtgui/table/qdictionary.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module provides basic python dictionary/list editor widgets""" ++from __future__ import print_function + + __all__ = ["QDictionaryEditor", "QListEditor"] + +--- lib/taurus/qt/qtgui/table/qlogtable.py (original) ++++ lib/taurus/qt/qtgui/table/qlogtable.py (refactored) +@@ -25,6 +25,7 @@ + + """This module provides Qt table widgets which display logging messages from the + python :mod:`logging` module""" ++from __future__ import absolute_import + + __all__ = ["QLoggingTableModel", "QLoggingTable", "QLoggingWidget", + "QRemoteLoggingTableModel"] +@@ -47,7 +48,7 @@ + from taurus.qt.qtgui.model import FilterToolBar + from taurus.qt.qtgui.util import ActionFactory + +-from qtable import QBaseTableWidget ++from .qtable import QBaseTableWidget + + LEVEL, TIME, MSG, NAME, ORIGIN = range(5) + HORIZ_HEADER = 'Level', 'Time', 'Message', 'By', 'Origin' +--- lib/taurus/qt/qtgui/table/taurusdbtable.py (original) ++++ lib/taurus/qt/qtgui/table/taurusdbtable.py (refactored) +@@ -25,6 +25,7 @@ + + """This module provides a base widget that can be used to display a taurus + model in a table widget""" ++from __future__ import absolute_import + + # todo: tango-centric!!! + +@@ -37,7 +38,7 @@ + from taurus.qt.qtcore.model import * + from taurus.core.taurusauthority import TaurusAuthority + from taurus.qt.qtgui.icon import getElementTypeIcon, getElementTypeIconName +-from taurustable import TaurusBaseTableWidget ++from .taurustable import TaurusBaseTableWidget + + + class TaurusDbTableWidget(TaurusBaseTableWidget): +--- lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py (original) ++++ lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py (refactored) +@@ -26,6 +26,7 @@ + """ + taurusdevicepropertytable.py: + """ ++from __future__ import print_function + + # todo: tango-centric + +@@ -54,7 +55,7 @@ + self.defineStyle() + self.db = None + +- except Exception, e: ++ except Exception as e: + self.traceback() + + #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- +--- lib/taurus/qt/qtgui/table/taurusgrid.py (original) ++++ lib/taurus/qt/qtgui/table/taurusgrid.py (refactored) +@@ -29,6 +29,7 @@ + integrated with taurus and regular expressions by srubio + alba, 2009 + """ ++from __future__ import print_function + + # This module needs a total cleanup. Both re. code conventions and algorithms. + # --cpascual 20140827 +@@ -128,7 +129,7 @@ + taurus_dp.attribute_list_query( + ) if re_match_low(attribute, att.name)] + targets.extend(dev + '/' + att for att in attrs) +- except Exception, e: ++ except Exception as e: + # self.warning( 'ERROR! TaurusGrid.get_all_models(): Unable to get attributes for device %s: %s' % (dev,str(e))) + pass + else: +@@ -195,7 +196,7 @@ + ) if re_match_low(attribute, + att.name) and att.isReadOnly()] + targets.extend(dev + '/' + att for att in attrs) +- except Exception, e: ++ except Exception as e: + pass + else: + targets.append(dev + '/' + attribute) +@@ -494,7 +495,7 @@ + else: + # print 'In setModel(): Thread already started! (%d + # objs in queue)'%(self.modelsThread.queue.qsize()) +- self.modelsThread.next() ++ next(self.modelsThread) + else: + self.trace('In setModel(): models loading delayed!') + pass +@@ -526,7 +527,7 @@ + try: + labels = eval(text) + return labels +- except Exception, e: ++ except Exception as e: + self.warning( + 'ERROR! Unable to parse labels property: %s' % str(e)) + return [] +@@ -546,7 +547,7 @@ + section = self.rows[i] + self.table.setVerticalHeaderItem( + i, QtGui.QTableWidgetItem(section)) +- except Exception, e: ++ except Exception as e: + self.debug("setRowLabels(): Exception! %s" % e) + # self.create_widgets_table(self._columnsNames) + +@@ -567,7 +568,7 @@ + equipment = self.columns[i] + self.table.setHorizontalHeaderItem( + i, QtGui.QTableWidgetItem(equipment)) +- except Exception, e: ++ except Exception as e: + self.debug("setColumnLabels(): Exception! %s" % e) + # self.create_widgets_table(self._columnsNames) + +@@ -1022,9 +1023,9 @@ + from taurus.qt.qtgui.application import TaurusApplication + + if len(sys.argv) < 2: +- print "The format of the call is something like:" +- print '\t/usr/bin/python taurusgrid.py grid.pickle.file' +- print '\t/usr/bin/python taurusgrid.py "model=lt.*/VC.*/.*/((C*)|(P*)|(I*))" cols=IP,CCG,PNV rows=LT01,LT02 others=False rowframe=True colframe=False' ++ print("The format of the call is something like:") ++ print('\t/usr/bin/python taurusgrid.py grid.pickle.file') ++ print('\t/usr/bin/python taurusgrid.py "model=lt.*/VC.*/.*/((C*)|(P*)|(I*))" cols=IP,CCG,PNV rows=LT01,LT02 others=False rowframe=True colframe=False') + exit() + + app = TaurusApplication(sys.argv[0:1]) +@@ -1037,7 +1038,7 @@ + except: + args = sysargs_to_dict( + ['model', 'rows', 'cols', 'others', 'rowframe', 'colframe']) +- print "args = %s" % args ++ print("args = %s" % args) + if args.get('rows'): + gui.setRowLabels(args['rows']) + if args.get('cols'): +@@ -1048,6 +1049,6 @@ + gui.showColumnFrame('colframe' in args and args['colframe'] and True) + gui.showOthers('others' in args and args['others'] or True) + +- print "current TaurusGrid model= %s" % (gui.getModel()) ++ print("current TaurusGrid model= %s" % (gui.getModel())) + gui.show() + sys.exit(app.exec_()) +--- lib/taurus/qt/qtgui/table/taurustable.py (original) ++++ lib/taurus/qt/qtgui/table/taurustable.py (refactored) +@@ -25,13 +25,14 @@ + + """This module provides a base widget that can be used to display a taurus + model in a table widget""" ++from __future__ import absolute_import + + __all__ = ["TaurusBaseTableWidget"] + + __docformat__ = 'restructuredtext' + + from taurus.qt.qtgui.model import TaurusBaseModelWidget +-from qtable import QBaseTableWidget ++from .qtable import QBaseTableWidget + + + class TaurusBaseTableWidget(QBaseTableWidget, TaurusBaseModelWidget): +--- lib/taurus/qt/qtgui/table/taurusvaluestable.py (original) ++++ lib/taurus/qt/qtgui/table/taurusvaluestable.py (refactored) +@@ -117,7 +117,7 @@ + value = self.typeCastingMap[tabledata.dtype.kind](value) + return Qt.QVariant(value) + elif role == Qt.Qt.DecorationRole: +- if (self._modifiedDict.has_key((index.row(), index.column()))) and\ ++ if ((index.row(), index.column()) in self._modifiedDict) and\ + (self._writeMode): + if self.getAttr().type in [DataType.Integer, DataType.Float]: + value = self._modifiedDict[(index.row(), index.column())] +@@ -130,7 +130,7 @@ + return Qt.QVariant(icon) + elif role == Qt.Qt.EditRole: + value = None +- if self._modifiedDict.has_key((index.row(), index.column())) and\ ++ if (index.row(), index.column()) in self._modifiedDict and\ + (self._writeMode): + value = self._modifiedDict[(index.row(), index.column())] + else: +@@ -144,7 +144,7 @@ + else: + return Qt.QVariant(Qt.QColor('white')) + elif role == Qt.Qt.ForegroundRole: +- if self._modifiedDict.has_key((index.row(), index.column())) and\ ++ if (index.row(), index.column()) in self._modifiedDict and\ + (self._writeMode): + if self.getAttr().type in [DataType.Integer, DataType.Float]: + value = self._modifiedDict[(index.row(), index.column())] +@@ -156,11 +156,11 @@ + return Qt.QVariant(Qt.QColor('blue')) + return Qt.QVariant(Qt.QColor('black')) + elif role == Qt.Qt.FontRole: +- if self._modifiedDict.has_key((index.row(), index.column())) and\ ++ if (index.row(), index.column()) in self._modifiedDict and\ + (self._writeMode): + return Qt.QVariant(Qt.QFont("Arial", 10, Qt.QFont.Bold)) + elif role == Qt.Qt.ToolTipRole: +- if self._modifiedDict.has_key((index.row(), index.column())) and\ ++ if (index.row(), index.column()) in self._modifiedDict and\ + (self._writeMode): + value = str(self._modifiedDict[(index.row(), index.column())]) + msg = 'Original value: %s.\nNew value that will be saved: %s' %\ +@@ -243,7 +243,7 @@ + + :param index: (QModelIndex) table index + ''' +- if self._modifiedDict.has_key((index.row(), index.column())): ++ if (index.row(), index.column()) in self._modifiedDict: + self._modifiedDict.pop((index.row(), index.column())) + + def flags(self, index): +@@ -748,7 +748,7 @@ + index = self._tableView.selectedIndexes()[0] + if index.isValid(): + val = self._tableView.model().getReadValue(index) +- if self._tableView.model().getModifiedDict().has_key((index.row(), index.column())): ++ if (index.row(), index.column()) in self._tableView.model().getModifiedDict(): + menu.addAction(Qt.QIcon.fromTheme( + 'edit-undo'), "Reset to original value (%s) " % repr(val), self._tableView.removeChange) + menu.addSeparator() +--- lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py (original) ++++ lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py (refactored) +@@ -32,6 +32,7 @@ + time and those customizations will also be stored, this file defines what a + user will find when launching the GUI for the first time. + """ ++from __future__ import print_function + + __all__ = ["AppSettingsWizard", "ExternalAppEditor"] + +@@ -241,7 +242,7 @@ + if not os.path.exists(dirname): + try: + os.makedirs(dirname) +- except Exception, e: ++ except Exception as e: + Qt.QMessageBox.warning(self, 'Error creating project directory', + 'Could not create the project directory.\nReason:%s' % repr( + e), +@@ -260,7 +261,7 @@ + if option == Qt.QMessageBox.Yes: + try: + self.wizard().loadXml(fname) +- except Exception, e: ++ except Exception as e: + Qt.QMessageBox.warning(self, 'Error loading project configuration', + 'Could not load the existing configuration.\nReason:%s' % repr( + e), +@@ -1304,7 +1305,7 @@ + def validatePage(self): + try: + self.createProject() +- except Exception, e: ++ except Exception as e: + Qt.QMessageBox.warning(self, 'Error creating project', + 'Could not create project files. \nReason:%s' % repr( + e), +@@ -1398,9 +1399,9 @@ + 'Application project created', msg, Qt.QMessageBox.Ok, self) + dlg.setDetailedText(details) + dlg.exec_() +- print +- print msg + details +- print ++ print() ++ print(msg + details) ++ print() + + + class AppSettingsWizard(Qt.QWizard): +@@ -1487,7 +1488,7 @@ + def getXml(self): + try: + return self.__getitem__("xml") +- except Exception, e: ++ except Exception as e: + return None + + def __setitem__(self, name, value): +@@ -1499,7 +1500,7 @@ + if isinstance(p, BasePage): + try: + return p[name]() +- except Exception, e: ++ except Exception as e: + pass + return self._item_funcs[name]() + +--- lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/__init__.py (original) ++++ lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/__init__.py (refactored) +@@ -23,4 +23,5 @@ + ## + ########################################################################### + +-from config import * ++from __future__ import absolute_import ++from .config import * +--- lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/__init__.py (original) ++++ lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/__init__.py (refactored) +@@ -23,4 +23,5 @@ + ## + ########################################################################### + +-from config import * ++from __future__ import absolute_import ++from .config import * +--- lib/taurus/qt/qtgui/taurusgui/__init__.py (original) ++++ lib/taurus/qt/qtgui/taurusgui/__init__.py (refactored) +@@ -49,14 +49,15 @@ + prevail). + + """ ++from __future__ import absolute_import + + __docformat__ = 'restructuredtext' + +-import utils +-from paneldescriptionwizard import * +-from taurusgui import * +-from appsettingswizard import * ++from . import utils ++from .paneldescriptionwizard import * ++from .taurusgui import * ++from .appsettingswizard import * + try: +- from macrolistener import * ++ from .macrolistener import * + except ImportError: + pass # allow for sardana not being installed +--- lib/taurus/qt/qtgui/taurusgui/macrolistener.py (original) ++++ lib/taurus/qt/qtgui/taurusgui/macrolistener.py (refactored) +@@ -33,6 +33,7 @@ + + .. note:: This module will be moved to sardana.taurus at some point. + """ ++from __future__ import print_function + + # TODO: move to sardana.taurus + +@@ -596,5 +597,5 @@ + + b.setModel('door/cp1/1') + +- print '...' ++ print('...') + sys.exit(app.exec_()) +--- lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py (original) ++++ lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py (refactored) +@@ -23,6 +23,7 @@ + ## + ########################################################################### + ++from __future__ import print_function + __all__ = ["PanelDescriptionWizard"] + """ + paneldescriptionwizard.py: +@@ -99,7 +100,7 @@ + # We use this because __import__('x.y') returns x instead of y !! + self.module = sys.modules[modulename] + self.moduleNameLE.setStyleSheet('QLineEdit {color: green}') +- except Exception, e: ++ except Exception as e: + Logger().debug(repr(e)) + self.moduleNameLE.setStyleSheet('QLineEdit {color: red}') + return +@@ -129,7 +130,7 @@ + membername = str(self.membersCB.currentText()) + member = getattr(self.module, membername, None) + result = {'modulename': self.module.__name__} +- except Exception, e: ++ except Exception as e: + Logger().debug('Cannot get member description: %s', repr(e)) + return None + if inspect.isclass(member): +@@ -307,7 +308,7 @@ + paneldesc.name = Qt.from_qvariant(self.field('panelname'), str) + # allow the wizard to proceed + return True +- except Exception, e: ++ except Exception as e: + Qt.QMessageBox.warning( + self, 'Invalid panel', 'The requested panel cannot be created. \nReason:\n%s' % repr(e)) + return False +@@ -406,7 +407,7 @@ + def initializePage(self): + try: + widget = self.wizard().getPanelDescription().getWidget() +- except Exception, e: ++ except Exception as e: + Logger().debug(repr(e)) + widget = None + # prevent the user from changing the model if it was already set +@@ -417,7 +418,7 @@ + try: + if isinstance(Qt.qApp.SDM, SharedDataManager): + sdm = Qt.qApp.SDM +- except Exception, e: ++ except Exception as e: + Logger().debug(repr(e)) + sdm = None + #@todo set selection filter in modelChooser based on the widget's modelclass +@@ -652,7 +653,7 @@ + form = PanelDescriptionWizard() + + def kk(d): +- print d ++ print(d) + Qt.qApp.SDM = SharedDataManager(form) + Qt.qApp.SDM.connectReader('111111', kk) + Qt.qApp.SDM.connectWriter('222222', form, 'thisisasignalname') +@@ -664,7 +665,7 @@ + def test2(): + from taurus.qt.qtgui.application import TaurusApplication + app = TaurusApplication(sys.argv) +- print ExpertWidgetChooserDlg.getDialog() ++ print(ExpertWidgetChooserDlg.getDialog()) + sys.exit() + + +@@ -675,7 +676,7 @@ + form = Qt.QMainWindow() + + def kk(d): +- print d ++ print(d) + Qt.qApp.SDM = SharedDataManager(form) + Qt.qApp.SDM.connectReader('someUID', kk) + Qt.qApp.SDM.connectWriter('anotherUID', form, 'thisisasignalname') +@@ -688,7 +689,7 @@ + w = paneldesc.getWidget(sdm=Qt.qApp.SDM) + form.setCentralWidget(w) + form.setWindowTitle(paneldesc.name) +- print Qt.qApp.SDM.info() ++ print(Qt.qApp.SDM.info()) + + sys.exit(app.exec_()) + +--- lib/taurus/qt/qtgui/taurusgui/taurusgui.py (original) ++++ lib/taurus/qt/qtgui/taurusgui/taurusgui.py (refactored) +@@ -162,7 +162,7 @@ + module = __import__(modulename, fromlist=['']) + klass = getattr(module, classname) + w = klass() +- except Exception, e: ++ except Exception as e: + raise RuntimeError( + 'Cannot create widget from classname "%s". Reason: %s' % (classname, repr(e))) + # set customwidgetmap if necessary +@@ -191,7 +191,7 @@ + 'widgetClassName'), modulename=configdict.get('widgetModuleName', None)) + if isinstance(self.widget(), BaseConfigurableClass): + self.widget().applyConfig(configdict['widget']) +- except Exception, e: ++ except Exception as e: + self.info( + 'Failed to set the widget for this panel. Reason: %s' % repr(e)) + self.traceback(self.Debug) +@@ -820,7 +820,7 @@ + synoptic = TaurusJDrawSynopticsView() + synoptic.setModel(jdwFileName) + self.__synoptics.append(synoptic) +- except Exception, e: ++ except Exception as e: + # print repr(e) + msg = 'Error loading synoptic file "%s".\nSynoptic won\'t be available' % jdwFileName + self.error(msg) +@@ -880,7 +880,7 @@ + instruments = ms.getElementsOfType('Instrument') + if instruments is None: + raise +- except Exception, e: ++ except Exception as e: + msg = 'Could not fetch Instrument list from "%s"' % macroservername + self.error(msg) + result = Qt.QMessageBox.critical(self, 'Initialization error', '%s\n\n%s' % ( +@@ -984,7 +984,7 @@ + else: # if confname is not a dir name, we assume it is a module name in the python path + conf = self._importConfiguration(confname) + self._confDirectory = os.path.dirname(conf.__file__) +- except Exception, e: ++ except Exception as e: + import traceback + msg = 'Error loading configuration: %s' % traceback.format_exc() # repr(e) + self.error(msg) +@@ -1010,7 +1010,7 @@ + xmlstring = xmlFile.read() + xmlFile.close() + xmlroot = etree.fromstring(xmlstring) +- except Exception, e: ++ except Exception as e: + msg = 'Error reading the XML file: "%s"' % xmlfname + self.error(msg) + self.traceback(level=taurus.Info) +@@ -1185,7 +1185,7 @@ + # create a panel + self.createPanel(w, p.name, floating=p.floating, registerconfig=registerconfig, + instrumentkey=instrumentkey, permanent=True) +- except Exception, e: ++ except Exception as e: + msg = 'Cannot create panel %s' % getattr( + p, 'name', '__Unknown__') + self.error(msg) +@@ -1227,7 +1227,7 @@ + if isinstance(w, BaseConfigurableClass): + self.registerConfigDelegate(w, d.name) + +- except Exception, e: ++ except Exception as e: + msg = 'Cannot add toolbar %s' % getattr( + d, 'name', '__Unknown__') + self.error(msg) +@@ -1273,7 +1273,7 @@ + # register the toolbar as delegate if it supports it + if isinstance(w, BaseConfigurableClass): + self.registerConfigDelegate(w, d.name) +- except Exception, e: ++ except Exception as e: + msg = 'Cannot add applet %s' % getattr( + d, 'name', '__Unknown__') + self.error(msg) +@@ -1509,7 +1509,7 @@ + f = open(self._xmlConfigFileName, 'r') + xmlroot = etree.fromstring(f.read()) + f.close() +- except Exception, e: ++ except Exception as e: + self.error('Cannot parse file "%s": %s', + self._xmlConfigFileName, str(e)) + return +@@ -1564,7 +1564,7 @@ + f.write(xml) + f.close() + break +- except Exception, e: ++ except Exception as e: + msg = 'Cannot write to %s: %s' % (fname, str(e)) + self.error(msg) + Qt.QMessageBox.warning( +--- lib/taurus/qt/qtgui/taurusgui/utils.py (original) ++++ lib/taurus/qt/qtgui/taurusgui/utils.py (refactored) +@@ -387,7 +387,7 @@ + # if model is a sequence, convert to space-separated string + try: + model = " ".join(model) +- except Exception, e: ++ except Exception as e: + msg = ('Cannot convert %s to a space-separated string: %s' % + (model, e)) + Logger().debug(msg) +--- lib/taurus/qt/qtgui/tree/taurusdbtree.py (original) ++++ lib/taurus/qt/qtgui/tree/taurusdbtree.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module provides widgets that display the database in a tree format""" ++from __future__ import absolute_import + + # todo: tango-centric!! + +@@ -37,7 +38,7 @@ + from taurus.qt.qtcore.model import * + from taurus.qt.qtgui.base import TaurusBaseWidget + from taurus.qt.qtgui.icon import getElementTypeIcon, getElementTypeIconName +-from taurustree import TaurusBaseTreeWidget ++from .taurustree import TaurusBaseTreeWidget + + + class TaurusDbTreeWidget(TaurusBaseTreeWidget): +--- lib/taurus/qt/qtgui/tree/taurusdevicetree.py (original) ++++ lib/taurus/qt/qtgui/tree/taurusdevicetree.py (refactored) +@@ -26,6 +26,7 @@ + """ + taurusdevicetree.py: + """ ++from __future__ import print_function + + # @todo: This module is not being used anywhere in Taurus and depends on + # non-standard and non-provided modules. It is also quite specific and +@@ -568,7 +569,7 @@ + def trace(self, msg): + if self.TRACE_ALL or self.getLogLevel() in ('DEBUG', 40,): + # @TODO: use the taurus logger instead! ~~cpascual 20121121 +- print 'TaurusDevTree.%s: %s' % (self.getLogLevel(), msg) ++ print('TaurusDevTree.%s: %s' % (self.getLogLevel(), msg)) + + def setTangoHost(self, tango_host=None): + self.db = taurus.Authority(tango_host) +@@ -761,12 +762,12 @@ + label = aname == my_attr.label and aname.lower( + ) or "%s (%s)" % (aname.lower(), my_attr.label) + dct[str(my_device).lower() + '/' + label] = 0 +- except PyTango.DevFailed, e: ++ except PyTango.DevFailed as e: + self.warning('addAttrToDev(%s): %s' % (my_device, str(e))) + qmsg = Qt.QMessageBox(Qt.QMessageBox.Critical, '%s Error' % + my_device, '%s not available' % my_device, Qt.QMessageBox.Ok, self) + qmsg.show() +- except Exception, e: ++ except Exception as e: + self.warning('addAttrToDev(%s): %s' % (my_device, str(e))) + qmsg = Qt.QMessageBox(Qt.QMessageBox.Critical, '%s Error' % + my_device, str(e), Qt.QMessageBox.Ok, self) +@@ -1006,7 +1007,7 @@ + for item in self.item_list if item.isExpanded()] + self.debug('findInTree(%s): Node not found' % (regexp)) + if queue: +- self.Expander.next() ++ next(self.Expander) + except: + self.warning('findInTree(%s): failed' % (regexp)) + self.error(traceback.format_exc()) +@@ -1019,7 +1020,7 @@ + allChildren[str(it.text(0))] = it + + sorter = lambda k, ks=[re.compile(c) for c in order]: str( +- (i for i, r in enumerate(ks) if r.match(k.lower())).next()) + str(k) ++ next((i for i, r in enumerate(ks) if r.match(k.lower())))) + str(k) + for c, it in sorted(allChildren.items(), key=lambda k: sorter(k[0])): + self.debug('tree.sortCustom(%s): %s inserted at %d' % + (order, it.text(0), self.topLevelItemCount())) +@@ -1298,7 +1299,7 @@ + elif not last_was_separator: + menu.addSeparator() + last_was_separator = True +- except Exception, e: ++ except Exception as e: + self.warning('Unable to add Menu Action: %s:%s' % (t, e)) + + if hasattr(node, 'ExpertMenu'): +@@ -1319,7 +1320,7 @@ + elif not last_was_separator: + expert.addSeparator() + last_was_separator = True +- except Exception, e: ++ except Exception as e: + self.warning('Unable to add Expert Action: %s:%s' % (t, e)) + # menu.addSeparator() + menu.exec_(event.globalPos()) +@@ -1666,7 +1667,7 @@ + try: + setattr(self, k, partial( + self.method_forwarder, method=k, object=self.tree)) +- except Exception, e: ++ except Exception as e: + self.warning('Unable to add slot %s: %s' % (k, e)) + # Event forwarding ... + self.tree.refreshTree.connect(self.refreshTree) +--- lib/taurus/qt/qtgui/tree/taurustree.py (original) ++++ lib/taurus/qt/qtgui/tree/taurustree.py (refactored) +@@ -25,13 +25,14 @@ + + """This module provides a base widget that can be used to display a taurus + model in a tree widget""" ++from __future__ import absolute_import + + __all__ = ["TaurusBaseTreeWidget"] + + __docformat__ = 'restructuredtext' + + from taurus.qt.qtgui.model import TaurusBaseModelWidget +-from qtree import QBaseTreeWidget ++from .qtree import QBaseTreeWidget + + + class TaurusBaseTreeWidget(QBaseTreeWidget, TaurusBaseModelWidget): +--- lib/taurus/qt/qtgui/util/taurusactionfactory.py (original) ++++ lib/taurus/qt/qtgui/util/taurusactionfactory.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module is designed to provide a factory class for taurus Qt actions """ ++from __future__ import absolute_import + + __all__ = ["ActionFactory"] + +@@ -33,7 +34,7 @@ + from taurus.core.util.singleton import Singleton + from taurus.external.qt import Qt + +-import taurusaction ++from . import taurusaction + + + class ActionFactory(Singleton, Logger): +--- lib/taurus/qt/qtgui/util/taurusaction.py (original) ++++ lib/taurus/qt/qtgui/util/taurusaction.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """This module is designed to provide a library of taurus Qt actions""" ++from __future__ import absolute_import + + __all__ = ["ExternalAppAction", + "TaurusMenu", +@@ -171,7 +172,7 @@ + self.buildFromXML(m_node) + + def getActionFactory(self): +- import taurusactionfactory ++ from . import taurusactionfactory + return taurusactionfactory.ActionFactory() + + def buildFromXML(self, m_node): +--- lib/taurus/qt/qtgui/util/tauruscolor.py (original) ++++ lib/taurus/qt/qtgui/util/tauruscolor.py (refactored) +@@ -57,10 +57,10 @@ + + f = self._qbrush_cache_fg + b = self._qbrush_cache_bg +- if not f.has_key(name): ++ if name not in f: + f[name] = Qt.QBrush(self.qcolor(stoq)[1]) + +- if not b.has_key(name): ++ if name not in b: + b[name] = Qt.QBrush(self.qcolor(stoq)[0]) + if name == 'None': + b[name].setStyle(Qt.Qt.BDiagPattern) +@@ -73,10 +73,10 @@ + + f = self._qcolor_cache_fg + b = self._qcolor_cache_bg +- if not f.has_key(name): ++ if name not in f: + f[name] = Qt.QColor(self.number(name, True)) + +- if not b.has_key(name): ++ if name not in b: + b[name] = Qt.QColor(self.number(name)) + + return (b[name], f[name]) +@@ -87,7 +87,7 @@ + + f = self._qvariant_cache_fg + b = self._qvariant_cache_bg +- if not f.has_key(name): ++ if name not in f: + (back, fore) = self.qcolor(name) + f[name] = Qt.QVariant(fore) + b[name] = Qt.QVariant(back) +--- lib/taurus/qt/qtgui/util/taurusropepatch.py (original) ++++ lib/taurus/qt/qtgui/util/taurusropepatch.py (refactored) +@@ -39,7 +39,7 @@ + """Monkey patching rope for better performances""" + import rope + if rope.VERSION not in ('0.9.3', '0.9.2'): +- raise ImportError, "rope %s can't be patched" % rope.VERSION ++ raise ImportError("rope %s can't be patched" % rope.VERSION) + + # Patching pycore.PyCore, so that forced builtin modules (i.e. modules + # that were declared as 'extension_modules' in rope preferences) +--- lib/taurus/qt/qtgui/util/tauruswidgetfactory.py (original) ++++ lib/taurus/qt/qtgui/util/tauruswidgetfactory.py (refactored) +@@ -120,9 +120,9 @@ + qt_ret[dir_name] = package, attr + if issubclass(attr, taurus.qt.qtgui.base.TaurusBaseWidget): + taurus_ret[dir_name] = package, attr +- except Exception, e: ++ except Exception as e: + pass +- except Exception, e: ++ except Exception as e: + return taurus_ret, qt_ret + + if not recursive: +@@ -161,13 +161,13 @@ + try: + self.debug("Trying to find extra module %s", m_name) + f, fname, data = imp.find_module(m_name, [path]) +- except ImportError, ie: ++ except ImportError as ie: + self.debug("Could not find extra module %s:%s", m_name, ie) + continue + try: + self.debug("Trying to load extra module %s", m_name) + mod = imp.load_module(m_name, f, fname, data) +- except ImportError, ie: ++ except ImportError as ie: + self.debug("Could not load extra module %s:%s", m_name, ie) + continue + dir_names = dir(mod) +@@ -184,7 +184,7 @@ + taurus_ret[dir_name] = qt_info['module'], attr + qt_widgets[dir_name] = qt_info['module'], attr + self.debug("registered taurus widget %s", dir_name) +- except Exception, e: ++ except Exception as e: + pass + + def getWidgets(self): +--- lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py (original) ++++ lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + """Unit tests for UILoadable decorator""" ++from __future__ import absolute_import + + import os.path + +@@ -31,7 +32,7 @@ + from taurus.external.qt import Qt + from taurus.qt.qtgui.util.ui import UILoadable + from taurus.qt.qtgui.test import BaseWidgetTestCase +-from mywidget3 import MyWidget3 ++from .mywidget3 import MyWidget3 + + + class UILoadableTestCase(unittest.TestCase): +--- lib/taurus/test/fuzzytest.py (original) ++++ lib/taurus/test/fuzzytest.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + '''Utility functions to deal with non-ideal (fuzzy) tests''' ++from __future__ import print_function + + + def loopTest(testname, maxtries=100, maxfails=10): +@@ -97,8 +98,8 @@ + times that the test should be passed to have a confidence>99%% + that the bug is fixed' + ''' +- print ("Running the test %i times (or until it fails %i times)" + +- "to estimate the failure rate") % (maxtries, maxfails) ++ print(("Running the test %i times (or until it fails %i times)" + ++ "to estimate the failure rate") % (maxtries, maxfails)) + import numpy + + if isinstance(test, str): +@@ -108,11 +109,11 @@ + maxfails=maxfails, **kwargs) + r = float(fails) / tries + dr = numpy.sqrt(fails) / tries +- print 'Failure rate = %g +/- %g (%i/%i)' % (r, dr, fails, tries) ++ print('Failure rate = %g +/- %g (%i/%i)' % (r, dr, fails, tries)) + # calculating n using p-value=1% and failure rate with -1 sigma + n = numpy.ceil(numpy.log(.01) / numpy.log(1 - (r - dr))) +- print ('Number of consecutive times that the test should be passed ' + +- 'to have a confidence>99%% that the bug is fixed: %g') % n ++ print(('Number of consecutive times that the test should be passed ' + ++ 'to have a confidence>99%% that the bug is fixed: %g') % n) + return r, dr, n + + +@@ -127,7 +128,7 @@ + exit(1) + return + +- print calculateTestFuzziness(kk) ++ print(calculateTestFuzziness(kk)) + + # print calculateTestFuzziness('test_pytango_bug659.TestPyTango_Bug659') + # +--- lib/taurus/test/moduleexplorer.py (original) ++++ lib/taurus/test/moduleexplorer.py (refactored) +@@ -25,6 +25,7 @@ + ########################################################################### + + '''Utility code for returning info about a module''' ++from __future__ import print_function + + import sys + import os +@@ -50,7 +51,7 @@ + for p in paterns: + if re.match(p, name) is not None: + if self.verbose: +- print 'excluding "%s" (matches %s)' % (name, p.pattern) ++ print('excluding "%s" (matches %s)' % (name, p.pattern)) + return True + return False + +@@ -90,7 +91,7 @@ + externalmembernames, submodules, warnings + ''' + if self.verbose: +- print "Exploring %s..." % modulename ++ print("Exploring %s..." % modulename) + warnings = [] + try: + module = __import__(modulename, fromlist=['']) +@@ -99,7 +100,7 @@ + modulename, repr(e)) + warnings.append(msg) + if self.verbose: +- print msg ++ print(msg) + return dict(modulename=modulename, + basemodulename=modulename.split('.')[-1], + modulepath=None, +@@ -213,12 +214,12 @@ + ): + moduleinfo, allw = ModuleExplorer.explore( + modulename, exclude_patterns=exclude_patterns, verbose=True) +- print '\n\n' + '*' * 50 +- print "Exploration finished with %i warnings:" % (len(allw)) ++ print('\n\n' + '*' * 50) ++ print("Exploration finished with %i warnings:" % (len(allw))) + for m, w in allw: +- print w +- print '*' * 50 + '\n' +- print ++ print(w) ++ print('*' * 50 + '\n') ++ print() + assert len(allw) == 0 + + # import pprint +--- lib/taurus/test/resource.py (original) ++++ lib/taurus/test/resource.py (refactored) +@@ -24,6 +24,7 @@ + ########################################################################### + + '''Utility code for working with test resources''' ++from __future__ import print_function + + import os + import sys +@@ -62,8 +63,8 @@ + + + if __name__ == "__main__": +- print getResourcePath('taurus.test') +- print getResourcePath('taurus.test', 'resource.py') ++ print(getResourcePath('taurus.test')) ++ print(getResourcePath('taurus.test', 'resource.py')) + # print getResourcePath('taurus.qt.qtgui.plot', 'taurusplot.py') + # print getResourcePath('taurus.test', 'kk.py') + # print getResourcePath('taurus.kk', 'resource.py') +--- lib/taurus/test/test_import.py (original) ++++ lib/taurus/test/test_import.py (refactored) +@@ -24,6 +24,7 @@ + + + """Taurus import tests""" ++from __future__ import absolute_import + + from taurus.external import unittest + +@@ -36,7 +37,7 @@ + + def setUp(self): + """Preconditions: moduleexplorer utility has to be available """ +- from moduleexplorer import ModuleExplorer ++ from .moduleexplorer import ModuleExplorer + self.explore = ModuleExplorer.explore + + def testImportSubmodules(self): +--- lib/taurus/test/testsuite.py (original) ++++ lib/taurus/test/testsuite.py (refactored) +@@ -31,6 +31,7 @@ + testsuite.run() + + """ ++from __future__ import print_function + + __docformat__ = 'restructuredtext' + +@@ -47,7 +48,7 @@ + for e in suite: + if isinstance(e, unittest.TestCase): + if re.match(exclude_pattern, e.id()): +- print "Excluded %s" % e.id() ++ print("Excluded %s" % e.id()) + continue + ret.addTest(e) + else: +@@ -99,7 +100,7 @@ + args = parser.parse_args() + + if args.version: +- print Release.version ++ print(Release.version) + sys.exit(0) + + if args.skip_gui: diff --git a/lib/taurus/console/list.py b/lib/taurus/console/list.py index 035f135a2..c1a71f296 100644 --- a/lib/taurus/console/list.py +++ b/lib/taurus/console/list.py @@ -24,6 +24,7 @@ ############################################################################# """ """ +from __future__ import absolute_import __all__ = ["List"] @@ -32,7 +33,7 @@ import textwrap import operator -from enums import Alignment +from .enums import Alignment class List(list): diff --git a/lib/taurus/console/table.py b/lib/taurus/console/table.py index dfdf7943a..48bfbd0f3 100644 --- a/lib/taurus/console/table.py +++ b/lib/taurus/console/table.py @@ -24,6 +24,7 @@ ############################################################################# """ """ +from functools import reduce __all__ = ["Table"] @@ -64,7 +65,7 @@ def __init__(self, elem_list, elem_fmt=None, term_width=None, if row_head_str is not None and len(row_head_str) != self.nr_row: msg = 'RowHeadStr nr (%d) and RowNr (%d) mistmatch' % \ (len(row_head_str), self.nr_row) - raise ValueError, msg + raise ValueError(msg) if row_head_width is None: if row_head_str is not None: row_head_width = max_len_fn(row_head_str) @@ -77,7 +78,7 @@ def __init__(self, elem_list, elem_fmt=None, term_width=None, if col_head_str is not None and len(col_head_str) != self.nr_col: msg = 'ColHeadStr nr (%d) and ColNr (%d) mistmatch' % \ len(col_head_str), self.nr_col - raise ValueError, msg + raise ValueError(msg) if col_head_width is None: if col_head_str is not None: col_head_width = reduce(max, map(max_len_fn, col_head_str)) diff --git a/lib/taurus/core/__init__.py b/lib/taurus/core/__init__.py index 0ef1314bb..4dd084d5b 100644 --- a/lib/taurus/core/__init__.py +++ b/lib/taurus/core/__init__.py @@ -24,6 +24,7 @@ ############################################################################# """The core module""" +from __future__ import absolute_import __docformat__ = "restructuredtext" @@ -33,6 +34,6 @@ taurus.tauruscustomsettings, 'LIGHTWEIGHT_IMPORTS', False) if LIGHTWEIGHT_IMPORTS: - from init_lightweight import * + from .init_lightweight import * else: - from init_bkcomp import * + from .init_bkcomp import * diff --git a/lib/taurus/core/epics/__init__.py b/lib/taurus/core/epics/__init__.py index 086177492..09f15fd32 100644 --- a/lib/taurus/core/epics/__init__.py +++ b/lib/taurus/core/epics/__init__.py @@ -66,5 +66,6 @@ are just convenience dummy objects in the epics scheme at this point. Epics records may eventually be mapped as Devices. """ +from __future__ import absolute_import -from epicsfactory import * +from .epicsfactory import * diff --git a/lib/taurus/core/epics/epicsattribute.py b/lib/taurus/core/epics/epicsattribute.py index d5e0f6c8c..4ff3b30a0 100644 --- a/lib/taurus/core/epics/epicsattribute.py +++ b/lib/taurus/core/epics/epicsattribute.py @@ -25,6 +25,8 @@ ''' Epics module. See __init__.py for more detailed documentation ''' +from __future__ import print_function +from __future__ import absolute_import __all__ = ['EpicsAttribute'] @@ -233,12 +235,12 @@ def _unsubscribeEvents(self): # ------------------------------------------------------------------------------ def factory(self): - from epicsfactory import EpicsFactory + from .epicsfactory import EpicsFactory return EpicsFactory() @classmethod def getNameValidator(cls): - from epicsvalidator import EpicsAttributeNameValidator + from .epicsvalidator import EpicsAttributeNameValidator return EpicsAttributeNameValidator() @@ -251,6 +253,6 @@ def getNameValidator(cls): b.write(4.) s.read() - print "!$!", s.read(cache=False) - print "a,b,s", a.read().rvalue, b.read().rvalue, s.read().rvalue - print "DF=", a.getDataFormat(), DataFormat.whatis(a.getDataFormat()) + print("!$!", s.read(cache=False)) + print("a,b,s", a.read().rvalue, b.read().rvalue, s.read().rvalue) + print("DF=", a.getDataFormat(), DataFormat.whatis(a.getDataFormat())) diff --git a/lib/taurus/core/epics/epicsfactory.py b/lib/taurus/core/epics/epicsfactory.py index aeda48f34..ebc101249 100644 --- a/lib/taurus/core/epics/epicsfactory.py +++ b/lib/taurus/core/epics/epicsfactory.py @@ -25,6 +25,7 @@ ''' Epics module. See __init__.py for more detailed documentation ''' +from __future__ import absolute_import __all__ = ['EpicsFactory'] @@ -44,9 +45,9 @@ from taurus.core.taurusbasetypes import TaurusElementType from taurus.core.taurusfactory import TaurusFactory -from epicsattribute import EpicsAttribute -from epicsdevice import EpicsDevice -from epicsauthority import EpicsAuthority +from .epicsattribute import EpicsAttribute +from .epicsdevice import EpicsDevice +from .epicsauthority import EpicsAuthority class EpicsFactory(Singleton, TaurusFactory, Logger): @@ -145,17 +146,17 @@ def getAttribute(self, attr_name): def getAuthorityNameValidator(self): """Return EpicsAuthorityNameValidator""" - import epicsvalidator + from . import epicsvalidator return epicsvalidator.EpicsAuthorityNameValidator() def getDeviceNameValidator(self): """Return EpicsDeviceNameValidator""" - import epicsvalidator + from . import epicsvalidator return epicsvalidator.EpicsDeviceNameValidator() def getAttributeNameValidator(self): """Return EpicsAttributeNameValidator""" - import epicsvalidator + from . import epicsvalidator return epicsvalidator.EpicsAttributeNameValidator() if __name__ == "__main__": diff --git a/lib/taurus/core/epics/test/test_epicsattribute.py b/lib/taurus/core/epics/test/test_epicsattribute.py index 06caa0cc1..844190fba 100755 --- a/lib/taurus/core/epics/test/test_epicsattribute.py +++ b/lib/taurus/core/epics/test/test_epicsattribute.py @@ -56,7 +56,7 @@ error=None, ) ) -@unittest.skipIf(sys.modules.has_key('epics') is False, +@unittest.skipIf(('epics' in sys.modules) is False, "epics module is not available") class AttributeTestCase(unittest.TestCase): """TestCase for the taurus.Attribute helper""" diff --git a/lib/taurus/core/epics/test/test_epicsvalidator.py b/lib/taurus/core/epics/test/test_epicsvalidator.py index 7d38bddc3..83733794b 100644 --- a/lib/taurus/core/epics/test/test_epicsvalidator.py +++ b/lib/taurus/core/epics/test/test_epicsvalidator.py @@ -47,7 +47,7 @@ @invalid(name='ca:/') @invalid(name='ca:///') @invalid(name='ca://a') -@unittest.skipIf(sys.modules.has_key('epics') is False, +@unittest.skipIf(('epics' in sys.modules) is False, "epics module is not available") class EpicsAuthValidatorTestCase(AbstractNameValidatorTestCase, unittest.TestCase): @@ -66,7 +66,7 @@ class EpicsAuthValidatorTestCase(AbstractNameValidatorTestCase, @invalid(name='ca:foo') # device requires absolute path @invalid(name='ca:/foo') # devname must be empty (for now) @invalid(name='ca:@foo') -@unittest.skipIf(sys.modules.has_key('epics') is False, +@unittest.skipIf(('epics' in sys.modules) is False, "epics module is not available") class EpicsDevValidatorTestCase(AbstractNameValidatorTestCase, unittest.TestCase): @@ -129,7 +129,7 @@ class EpicsDevValidatorTestCase(AbstractNameValidatorTestCase, @valid(name='ca:1#units', groups={'fragment': 'units'}) @valid(name='ca:a') @names(name='ca:XXX:sum', out=('ca:XXX:sum', 'XXX:sum', 'XXX:sum')) -@unittest.skipIf(sys.modules.has_key('epics') is False, +@unittest.skipIf(('epics' in sys.modules) is False, "epics module is not available") class EpicsAttrValidatorTestCase(AbstractNameValidatorTestCase, unittest.TestCase): diff --git a/lib/taurus/core/evaluation/__init__.py b/lib/taurus/core/evaluation/__init__.py index 7dad996f0..612feb3f6 100644 --- a/lib/taurus/core/evaluation/__init__.py +++ b/lib/taurus/core/evaluation/__init__.py @@ -176,8 +176,9 @@ class MyClass(object): This syntax is now deprecated and should not be used. Taurus will issue warnings if detected. """ +from __future__ import absolute_import -from evalfactory import EvaluationFactory -from evalattribute import EvaluationAttribute -from evalauthority import EvaluationAuthority -from evaldevice import EvaluationDevice +from .evalfactory import EvaluationFactory +from .evalattribute import EvaluationAttribute +from .evalauthority import EvaluationAuthority +from .evaldevice import EvaluationDevice diff --git a/lib/taurus/core/evaluation/evalattribute.py b/lib/taurus/core/evaluation/evalattribute.py index f45fbaf89..1139bc7fe 100644 --- a/lib/taurus/core/evaluation/evalattribute.py +++ b/lib/taurus/core/evaluation/evalattribute.py @@ -200,7 +200,7 @@ def _initWritable(self, trstring): for n in names[1:-1]: obj = getattr(obj, n) obj = getattr(obj.__class__, names[-1]) - except Exception, e: + except Exception as e: # self.info("%r", e) return ###################################################################### @@ -359,7 +359,7 @@ def applyTransformation(self): self._value.rvalue = rvalue self._value.time = TaurusTimeVal.now() self._value.quality = AttrQuality.ATTR_VALID - except Exception, e: + except Exception as e: self._value.quality = AttrQuality.ATTR_INVALID msg = " the function '%s' could not be evaluated. Reason: %s" \ % (self._transformation, repr(e)) diff --git a/lib/taurus/core/evaluation/evalfactory.py b/lib/taurus/core/evaluation/evalfactory.py index 95b5cd05a..8ca09543b 100755 --- a/lib/taurus/core/evaluation/evalfactory.py +++ b/lib/taurus/core/evaluation/evalfactory.py @@ -25,15 +25,16 @@ ''' evaluation module. See __init__.py for more detailed documentation ''' +from __future__ import absolute_import __all__ = ['EvaluationFactory'] import weakref from taurus.core.taurusbasetypes import TaurusElementType -from evalattribute import EvaluationAttribute -from evalauthority import EvaluationAuthority -from evaldevice import EvaluationDevice +from .evalattribute import EvaluationAttribute +from .evalauthority import EvaluationAuthority +from .evaldevice import EvaluationDevice from taurus.core.taurusexception import TaurusException, DoubleRegistration from taurus.core.util.log import Logger from taurus.core.util.singleton import Singleton @@ -195,7 +196,7 @@ def getAttribute(self, attr_name, **kwargs): if a is None: # if the full name is not there, create one dev = self.getDevice(validator.getDeviceName(attr_name)) kwargs['storeCallback'] = self._storeAttr - if not kwargs.has_key('pollingPeriod'): + if 'pollingPeriod' not in kwargs: kwargs['pollingPeriod'] = self.getDefaultPollingPeriod() a = EvaluationAttribute(fullname, parent=dev, **kwargs) return a @@ -242,15 +243,15 @@ def _storeConfig(self, fullname, config): def getAuthorityNameValidator(self): """Return EvaluationAuthorityNameValidator""" - import evalvalidator + from . import evalvalidator return evalvalidator.EvaluationAuthorityNameValidator() def getDeviceNameValidator(self): """Return EvaluationDeviceNameValidator""" - import evalvalidator + from . import evalvalidator return evalvalidator.EvaluationDeviceNameValidator() def getAttributeNameValidator(self): """Return EvaluationAttributeNameValidator""" - import evalvalidator + from . import evalvalidator return evalvalidator.EvaluationAttributeNameValidator() diff --git a/lib/taurus/core/evaluation/evalvalidator.py b/lib/taurus/core/evaluation/evalvalidator.py index 3876f84fc..3227df52c 100644 --- a/lib/taurus/core/evaluation/evalvalidator.py +++ b/lib/taurus/core/evaluation/evalvalidator.py @@ -22,6 +22,7 @@ ## ############################################################################# +from __future__ import absolute_import __all__ = ['EvaluationDeviceNameValidator', 'EvaluationAttributeNameValidator'] @@ -180,7 +181,7 @@ def getUriGroups(self, name, strict=None): def getNames(self, fullname, factory=None): '''reimplemented from :class:`TaurusDeviceNameValidator`''' - from evalfactory import EvaluationFactory + from .evalfactory import EvaluationFactory # TODO: add mechanism to select strict mode instead of hardcoding here groups = self.getUriGroups(fullname) if groups is None: @@ -424,7 +425,7 @@ def _expandRefNames(self, attrname): def getNames(self, fullname, factory=None, fragment=False): '''reimplemented from :class:`TaurusDeviceNameValidator`''' - from evalfactory import EvaluationFactory + from .evalfactory import EvaluationFactory groups = self.getUriGroups(fullname) if groups is None: return None @@ -497,7 +498,7 @@ def getAttrName(self, s): def getDeviceName(self, name): #@TODO: Maybe this belongs to the factory, not the validator '''Obtain the fullname of the device from the attribute name''' - from evalfactory import EvaluationFactory + from .evalfactory import EvaluationFactory groups = self.getUriGroups(name) if groups is None: return None @@ -512,7 +513,7 @@ def getDeviceName(self, name): def getDBName(self, s): #@TODO: Maybe this belongs to the factory, not the validator '''returns the full data base name for the given attribute name''' - from evalfactory import EvaluationFactory + from .evalfactory import EvaluationFactory m = self.name_re.match(s) if m is None: return None diff --git a/lib/taurus/core/evaluation/test/res/dev_example.py b/lib/taurus/core/evaluation/test/res/dev_example.py index 3ab06109b..84386080c 100644 --- a/lib/taurus/core/evaluation/test/res/dev_example.py +++ b/lib/taurus/core/evaluation/test/res/dev_example.py @@ -25,6 +25,7 @@ ''' Examples on using the evaluation scheme for exposing arbitrary non-tango quantities as taurus attributes ''' +from __future__ import print_function __all__ = ['FreeSpaceDevice'] @@ -70,7 +71,7 @@ def test1(): # calculates free space in Gb a = taurus.Attribute( 'eval:@taurus.core.evaluation.test.res.dev_example.FreeSpaceDevice/getFreeSpace("/").to("GiB")') - print "Free space: {:s}".format(a.read().rvalue), a.read().rvalue.units + print("Free space: {:s}".format(a.read().rvalue), a.read().rvalue.units) def test2(): diff --git a/lib/taurus/core/evaluation/test/res/ipap_example.py b/lib/taurus/core/evaluation/test/res/ipap_example.py index 61e5ef729..f07ce3339 100644 --- a/lib/taurus/core/evaluation/test/res/ipap_example.py +++ b/lib/taurus/core/evaluation/test/res/ipap_example.py @@ -26,6 +26,7 @@ Examples on using the evaluation scheme for exposing icepap driver values as taurus attributes """ +from __future__ import print_function ATTR_IPAP_POS = ( 'eval:@ipap=pyIcePAP.EthIcePAP("icepap06", port=5000)' + @@ -35,7 +36,7 @@ def _test1(): import taurus.core a = taurus.Attribute(ATTR_IPAP_POS) - print "axis pos:", a.read().rvalue + print("axis pos:", a.read().rvalue) def _test2(): diff --git a/lib/taurus/core/evaluation/test/res/mymod.py b/lib/taurus/core/evaluation/test/res/mymod.py index 67ef14a66..261e6f0f8 100644 --- a/lib/taurus/core/evaluation/test/res/mymod.py +++ b/lib/taurus/core/evaluation/test/res/mymod.py @@ -26,6 +26,7 @@ """ This module is used for the tests of custom evaluation devices. """ +from __future__ import print_function import os from taurus.external.pint import Quantity @@ -82,16 +83,16 @@ def staticmeth(): def test1(): n = 'eval:@c=taurus.core.evaluation.test.res.mymod.MyClass(987)/c.foo' a = taurus.Attribute(n) - print "READ 1: ", a.read() + print("READ 1: ", a.read()) # print a.range - print "WRITE+READ", a.write(Quantity(999, "m")) - print "READ 2: ", a.read(cache=False) + print("WRITE+READ", a.write(Quantity(999, "m"))) + print("READ 2: ", a.read(cache=False)) def test2(models): for m in models: - print m + print(m) a = taurus.Attribute(m) - print " -->", a.writable, a.read().rvalue + print(" -->", a.writable, a.read().rvalue) models = [ # instance models diff --git a/lib/taurus/core/init_bkcomp.py b/lib/taurus/core/init_bkcomp.py index 72777df8e..6b043cb5a 100644 --- a/lib/taurus/core/init_bkcomp.py +++ b/lib/taurus/core/init_bkcomp.py @@ -24,10 +24,11 @@ ############################################################################# """The core module""" +from __future__ import absolute_import __docformat__ = "restructuredtext" -import release as Release +from . import release as Release # from .enums import * #note: all the enums from enums.py were moved to # taurusbasetypes.py from .taurusbasetypes import * diff --git a/lib/taurus/core/resource/__init__.py b/lib/taurus/core/resource/__init__.py index 7dcd15eb6..552312db0 100644 --- a/lib/taurus/core/resource/__init__.py +++ b/lib/taurus/core/resource/__init__.py @@ -99,5 +99,6 @@ is not even defined). """ +from __future__ import absolute_import -from resfactory import * +from .resfactory import * diff --git a/lib/taurus/core/resource/resfactory.py b/lib/taurus/core/resource/resfactory.py index 48d714f89..4954111a7 100644 --- a/lib/taurus/core/resource/resfactory.py +++ b/lib/taurus/core/resource/resfactory.py @@ -26,6 +26,7 @@ """ resfactory.py: """ +from __future__ import absolute_import import os import imp @@ -86,7 +87,7 @@ def reloadResource(self, obj=None, priority=1, name=None): raise ValueError('priority must be >=1') if operator.isMappingType(obj): name = name or 'DICT%02d' % priority - elif type(obj) in types.StringTypes or obj is None: + elif type(obj) in (str,) or obj is None: name, mod = self.__reloadResource(obj) obj = {} for k, v in mod.__dict__.items(): @@ -136,7 +137,7 @@ def __reloadResource(self, name=None): m = imp.load_module(module_name, file_, pathname, desc) if file_: file_.close() - except Exception, e: + except Exception as e: if file_: file_.close() raise e @@ -246,15 +247,15 @@ def getAttribute(self, name): def getAuthorityNameValidator(self): """Return ResourceAuthorityNameValidator""" - import resvalidator + from . import resvalidator return resvalidator.ResourceAuthorityNameValidator() def getDeviceNameValidator(self): """Return ResourceDeviceNameValidator""" - import resvalidator + from . import resvalidator return resvalidator.ResourceDeviceNameValidator() def getAttributeNameValidator(self): """Return ResourceAttributeNameValidator""" - import resvalidator + from . import resvalidator return resvalidator.ResourceAttributeNameValidator() diff --git a/lib/taurus/core/resource/test/test_resfactory.py b/lib/taurus/core/resource/test/test_resfactory.py index 7ab47b75d..da1976e10 100755 --- a/lib/taurus/core/resource/test/test_resfactory.py +++ b/lib/taurus/core/resource/test/test_resfactory.py @@ -24,6 +24,7 @@ ############################################################################# """Test for taurus.core.resource.test.test_resfactory...""" +from __future__ import print_function __all__ = ["ResourceFactoryTestCase"] import os.path as osp @@ -68,7 +69,7 @@ file_name1 = osp.join(osp.dirname(osp.abspath(__file__)), 'res', 'attr_resources_file.py') -print file_name1 +print(file_name1) # TODO: the same key can be defined in different dictionaries (with different # priority) but getValue method can not access to the less priority values in diff --git a/lib/taurus/core/tango/__init__.py b/lib/taurus/core/tango/__init__.py index 984643031..e76cbe0d8 100644 --- a/lib/taurus/core/tango/__init__.py +++ b/lib/taurus/core/tango/__init__.py @@ -102,12 +102,13 @@ This syntax is now deprecated and should not be used. Taurus will issue warnings if detected. """ +from __future__ import absolute_import __docformat__ = "restructuredtext" -from enums import * -from tangodatabase import * -from tangodevice import * -from tangofactory import * -from tangoattribute import * -from tangoconfiguration import * +from .enums import * +from .tangodatabase import * +from .tangodevice import * +from .tangofactory import * +from .tangoattribute import * +from .tangoconfiguration import * diff --git a/lib/taurus/core/tango/img/__init__.py b/lib/taurus/core/tango/img/__init__.py index 49d285024..81d3679ad 100644 --- a/lib/taurus/core/tango/img/__init__.py +++ b/lib/taurus/core/tango/img/__init__.py @@ -25,10 +25,11 @@ """The img package. It contains specific part of tango devices dedicated to images (CCDs, detectors, etc)""" +from __future__ import absolute_import __docformat__ = 'restructuredtext' -from img import * +from .img import * def registerExtensions(): diff --git a/lib/taurus/core/tango/starter.py b/lib/taurus/core/tango/starter.py index 290dcc718..7e8eb577f 100644 --- a/lib/taurus/core/tango/starter.py +++ b/lib/taurus/core/tango/starter.py @@ -29,6 +29,7 @@ It is not a replacement of the Tango Starter Device Server since this is much more limited in scope. """ +from __future__ import print_function __docformat__ = 'restructuredtext' @@ -236,9 +237,9 @@ def hardKill(self): s.addNewDevice(devname, klass='Timeout') s.startDs() try: - print 'Is running:', s.isRunning() - print "ping:", PyTango.DeviceProxy(devname).ping() - except Exception, e: - print e + print('Is running:', s.isRunning()) + print("ping:", PyTango.DeviceProxy(devname).ping()) + except Exception as e: + print(e) s.stopDs() s.cleanDb(force=False) diff --git a/lib/taurus/core/tango/tangoattribute.py b/lib/taurus/core/tango/tangoattribute.py index deed0369d..0d8ffba2f 100755 --- a/lib/taurus/core/tango/tangoattribute.py +++ b/lib/taurus/core/tango/tangoattribute.py @@ -425,7 +425,7 @@ def write(self, value, with_read=True): # handle old PyTango dev.write_attribute(name, value) result = dev.read_attribute(name) - except PyTango.DevFailed, df: + except PyTango.DevFailed as df: for err in df: # Handle old device servers if err.reason == 'API_UnsupportedFeature': @@ -439,12 +439,12 @@ def write(self, value, with_read=True): else: dev.write_attribute(name, value) return None - except PyTango.DevFailed, df: + except PyTango.DevFailed as df: err = df[0] self.error("[Tango] write failed (%s): %s" % (err.reason, err.desc)) raise df - except Exception, e: + except Exception as e: self.error("[Tango] write failed: %s" % str(e)) raise e @@ -473,12 +473,12 @@ def poll(self, single=True, value=None, time=None, error=None): ): return self.__attr_value = value - except PyTango.DevFailed, df: + except PyTango.DevFailed as df: self.__subscription_event.set() self.debug("Error polling: %s" % df[0].desc) self.traceback() self.fireEvent(TaurusEventType.Error, self.__attr_err) - except Exception, e: + except Exception as e: self.__subscription_event.set() self.debug("Error polling: %s" % str(e)) self.fireEvent(TaurusEventType.Error, self.__attr_err) @@ -686,7 +686,7 @@ def _unsubscribeEvents(self): try: self.__dev_hw_obj.unsubscribe_event(self.__chg_evt_id) self.__chg_evt_id = None - except PyTango.DevFailed, df: + except PyTango.DevFailed as df: if len(df.args) and df[0].reason == 'API_EventNotFound': # probably tango shutdown has been initiated before and # it unsubscribed from events itself @@ -751,7 +751,7 @@ def _unsubscribeConfEvents(self): try: self.__dev_hw_obj.unsubscribe_event(self.__cfg_evt_id) self.__cfg_evt_id = None - except PyTango.DevFailed, e: + except PyTango.DevFailed as e: self.debug("Error trying to unsubscribe configuration events") self.trace(str(e)) diff --git a/lib/taurus/core/tango/tangodatabase.py b/lib/taurus/core/tango/tangodatabase.py index af09ef1d8..976d41233 100644 --- a/lib/taurus/core/tango/tangodatabase.py +++ b/lib/taurus/core/tango/tangodatabase.py @@ -24,6 +24,7 @@ ############################################################################# """This module contains all taurus tango authority""" +from __future__ import print_function __all__ = ["TangoInfo", "TangoAttrInfo", "TangoDevInfo", "TangoServInfo", "TangoDevClassInfo", "TangoDatabaseCache", "TangoDatabase", @@ -288,8 +289,8 @@ def alive(self): if not alive: break self._alive = alive - except Exception, e: - print "except", e + except Exception as e: + print("except", e) self._alive = False self._alivePending = False return self._alive @@ -514,9 +515,9 @@ def _update(self, other): for dev in other: try: self.addDevice(dev) - except Exception, e: - print e - except Exception, e: + except Exception as e: + print(e) + except Exception as e: raise Exception( "Must give dict or sequence") @@ -560,9 +561,9 @@ def _update(self, other): for serv in other: try: self.addServer(serv) - except Exception, e: - print e - except Exception, e: + except Exception as e: + print(e) + except Exception as e: raise Exception( "Must give dict or sequence") @@ -666,7 +667,7 @@ def __init__(self, host=None, port=None, parent=None): try: host, port = TangoAuthority.get_default_tango_host().rsplit(':', 1) pars = host, port - except Exception, e: + except Exception as e: from taurus import warning warning("Error getting default Tango host") else: diff --git a/lib/taurus/core/tango/tangodevice.py b/lib/taurus/core/tango/tangodevice.py index 7f5899516..bd88a1b70 100755 --- a/lib/taurus/core/tango/tangodevice.py +++ b/lib/taurus/core/tango/tangodevice.py @@ -201,7 +201,7 @@ def getDisplayValue(self, cache=True): def _createHWObject(self): try: return DeviceProxy(self.getFullName()) - except DevFailed, e: + except DevFailed as e: self.warning('Could not create HW object: %s' % (e[0].desc)) self.traceback() diff --git a/lib/taurus/core/tango/tangofactory.py b/lib/taurus/core/tango/tangofactory.py index e3fa9c994..758a29d4d 100644 --- a/lib/taurus/core/tango/tangofactory.py +++ b/lib/taurus/core/tango/tangofactory.py @@ -24,6 +24,7 @@ ############################################################################# """This module provides the `TangoFactory` object""" +from __future__ import absolute_import __all__ = ["TangoFactory"] @@ -220,7 +221,7 @@ def unregisterAttributeClass(self, attr_name): :param attr_name: (str) attribute name """ - if self.tango_attr_klasses.has_key(attr_name): + if attr_name in self.tango_attr_klasses: del self.tango_attr_klasses[attr_name] def registerDeviceClass(self, dev_klass_name, dev_klass): @@ -239,7 +240,7 @@ def unregisterDeviceClass(self, dev_klass_name): :param dev_klass_name: (str) tango device class name """ - if self.tango_dev_klasses.has_key(dev_klass_name): + if dev_klass_name in self.tango_dev_klasses: del self.tango_dev_klasses[dev_klass_name] def getDatabase(self, name=None): @@ -398,7 +399,7 @@ def getAttribute(self, attr_name, create_if_needed=True, **kwargs): attr_klass = self._getAttributeClass( attr_name=attr_name) kwargs['storeCallback'] = self._storeAttribute - if not kwargs.has_key('pollingPeriod'): + if 'pollingPeriod' not in kwargs: kwargs[ 'pollingPeriod'] = self.getDefaultPollingPeriod() attr = attr_klass(full_attr_name, dev, **kwargs) @@ -514,10 +515,10 @@ def removeExistingDevice(self, dev_or_dev_name): raise KeyError("Device %s not found" % dev_or_dev_name) dev.cleanUp() full_name = dev.getFullName() - if self.tango_devs.has_key(full_name): + if full_name in self.tango_devs: del self.tango_devs[full_name] simp_name = dev.getSimpleName() - if self.tango_alias_devs.has_key(simp_name): + if simp_name in self.tango_alias_devs: del self.tango_alias_devs[simp_name] def removeExistingAttribute(self, attr_or_attr_name): @@ -533,7 +534,7 @@ def removeExistingAttribute(self, attr_or_attr_name): raise KeyError("Attribute %s not found" % attr_or_attr_name) attr.cleanUp() full_name = attr.getFullName() - if self.tango_attrs.has_key(full_name): + if full_name in self.tango_attrs: del self.tango_attrs[full_name] def isPollingEnabled(self): @@ -567,17 +568,17 @@ def getDatabaseNameValidator(self): def getAuthorityNameValidator(self): """Return TangoAuthorityNameValidator""" - import tangovalidator + from . import tangovalidator return tangovalidator.TangoAuthorityNameValidator() def getDeviceNameValidator(self): """Return TangoDeviceNameValidator""" - import tangovalidator + from . import tangovalidator return tangovalidator.TangoDeviceNameValidator() def getAttributeNameValidator(self): """Return TangoAttributeNameValidator""" - import tangovalidator + from . import tangovalidator return tangovalidator.TangoAttributeNameValidator() def setOperationMode(self, mode): diff --git a/lib/taurus/core/tango/test/__init__.py b/lib/taurus/core/tango/test/__init__.py index 7ba300bdc..769f3e503 100644 --- a/lib/taurus/core/tango/test/__init__.py +++ b/lib/taurus/core/tango/test/__init__.py @@ -23,4 +23,5 @@ ## ############################################################################# -from tgtestds import TangoSchemeTestLauncher +from __future__ import absolute_import +from .tgtestds import TangoSchemeTestLauncher diff --git a/lib/taurus/core/tango/util/__init__.py b/lib/taurus/core/tango/util/__init__.py index 206e4640d..fe277eaaf 100644 --- a/lib/taurus/core/tango/util/__init__.py +++ b/lib/taurus/core/tango/util/__init__.py @@ -24,7 +24,8 @@ ############################################################################# """The sardana package. It contains specific part of sardana""" +from __future__ import absolute_import __docformat__ = 'restructuredtext' -from formatter import tangoFormatter \ No newline at end of file +from .formatter import tangoFormatter \ No newline at end of file diff --git a/lib/taurus/core/taurusauthority.py b/lib/taurus/core/taurusauthority.py index b0b88786d..99f210120 100644 --- a/lib/taurus/core/taurusauthority.py +++ b/lib/taurus/core/taurusauthority.py @@ -24,6 +24,7 @@ ############################################################################# """This module contains the base class for a taurus database""" +from __future__ import absolute_import __all__ = ["TaurusAuthority"] @@ -87,7 +88,7 @@ def getChildObj(self, child_name): def getDevice(self, devname): """Returns the device object given its name""" - import taurusdevice + from . import taurusdevice return self.factory().getObject(taurusdevice.TaurusDevice, devname) @property diff --git a/lib/taurus/core/taurusfactory.py b/lib/taurus/core/taurusfactory.py index db71cce0b..a371ff31c 100644 --- a/lib/taurus/core/taurusfactory.py +++ b/lib/taurus/core/taurusfactory.py @@ -55,6 +55,7 @@ ) """ +from __future__ import absolute_import __all__ = ["TaurusFactory"] @@ -62,12 +63,12 @@ import atexit from weakref import WeakValueDictionary -from taurusbasetypes import TaurusElementType -from taurusauthority import TaurusAuthority -from taurusdevice import TaurusDevice -from taurusattribute import TaurusAttribute -from taurusconfiguration import TaurusConfiguration, TaurusConfigurationProxy -from taurusexception import TaurusException +from .taurusbasetypes import TaurusElementType +from .taurusauthority import TaurusAuthority +from .taurusdevice import TaurusDevice +from .taurusattribute import TaurusAttribute +from .taurusconfiguration import TaurusConfiguration, TaurusConfigurationProxy +from .taurusexception import TaurusException from taurus.core.tauruspollingtimer import TaurusPollingTimer @@ -93,7 +94,7 @@ def __init__(self): self._devs = WeakValueDictionary() self._auths = WeakValueDictionary() - import taurusmanager + from . import taurusmanager manager = taurusmanager.TaurusManager() self._serialization_mode = manager.getSerializationMode() diff --git a/lib/taurus/core/taurushelper.py b/lib/taurus/core/taurushelper.py index 78170fe92..011bbb9c2 100644 --- a/lib/taurus/core/taurushelper.py +++ b/lib/taurus/core/taurushelper.py @@ -24,6 +24,7 @@ ############################################################################# """a list of helper methods""" +from __future__ import print_function __all__ = ['check_dependencies', 'log_dependencies', 'getSchemeFromName', 'getValidTypesForName', 'isValidName', 'makeSchemeExplicit', @@ -74,36 +75,36 @@ def check_dependencies(): } import pkg_resources d = pkg_resources.get_distribution('taurus') - print "Dependencies for %s:" % d + print("Dependencies for %s:" % d) # minimum requirements (without extras) for r in d.requires(): try: pkg_resources.require(str(r)) - print '\t[*]', + print('\t[*]', end=' ') except Exception: - print '\t[ ]', - print '%s' % r + print('\t[ ]', end=' ') + print('%s' % r) # requirements for the extras - print '\nExtras:' + print('\nExtras:') for extra in sorted(d.extras): - print "Dependencies for taurus[%s]:" % extra + print("Dependencies for taurus[%s]:" % extra) # requirements from PyPI for r in d.requires(extras=[extra]): try: r = str(r).split(';')[0] # remove marker if present (see #612) pkg_resources.require(r) - print '\t[*]', + print('\t[*]', end=' ') except Exception: - print '\t[ ]', - print '%s' % r + print('\t[ ]', end=' ') + print('%s' % r) # requirements outside PyPI for r, check in non_pypi.get(extra, ()): try: check() - print '\t[*]', + print('\t[*]', end=' ') except Exception: - print '\t[ ]', - print '%s (not in PyPI)' % r + print('\t[ ]', end=' ') + print('%s (not in PyPI)' % r) def log_dependencies(): @@ -296,7 +297,7 @@ def Attribute(dev_or_attr_name, attr_name=None): if attr_name is None: return Factory(scheme=getSchemeFromName(dev_or_attr_name)).getAttribute(dev_or_attr_name) else: - if type(dev_or_attr_name) in types.StringTypes: + if type(dev_or_attr_name) in (str,): dev = Device(dev_or_attr_name) else: dev = dev_or_attr_name diff --git a/lib/taurus/core/tauruslistener.py b/lib/taurus/core/tauruslistener.py index dddd36b07..469bd6311 100644 --- a/lib/taurus/core/tauruslistener.py +++ b/lib/taurus/core/tauruslistener.py @@ -24,6 +24,7 @@ ############################################################################# """This module contains the taurus base listeners classes""" +from __future__ import print_function __all__ = ["TaurusListener", "TaurusExceptionListener"] @@ -70,4 +71,4 @@ def exceptionReceived(self, exception): self._printException(exception) def _printException(self, exception): - print self.__class__.__name__, "received", exception.__class__.__name__, str(exception) + print(self.__class__.__name__, "received", exception.__class__.__name__, str(exception)) diff --git a/lib/taurus/core/taurusmanager.py b/lib/taurus/core/taurusmanager.py index ed503dd0e..1779b1ec3 100644 --- a/lib/taurus/core/taurusmanager.py +++ b/lib/taurus/core/taurusmanager.py @@ -24,6 +24,7 @@ ############################################################################# """This module contains the taurus base manager class""" +from __future__ import print_function __all__ = ["TaurusManager"] @@ -291,7 +292,7 @@ def _build_plugins(self): for plugin_class in plugin_classes: schemes = list(plugin_class.schemes) for scheme in schemes: - if plugins.has_key(scheme): + if scheme in plugins: k = plugins[scheme] self.warning("Conflicting plugins: %s and %s both implement " "scheme %s. Will keep using %s" % (k.__name__, @@ -336,7 +337,7 @@ def _get_plugin_classes(self): for full_module_name in full_module_names: try: m = __import__(full_module_name, fromlist=['*'], level=0) - except Exception, imp1: + except Exception as imp1: # just in case we are in python 2.4 try: m = __import__(full_module_name, @@ -397,4 +398,4 @@ def __repr__(self): if __name__ == '__main__': manager = TaurusManager() - print manager.getPlugins() + print(manager.getPlugins()) diff --git a/lib/taurus/core/tauruspollingtimer.py b/lib/taurus/core/tauruspollingtimer.py index c34b2976c..b465b9610 100644 --- a/lib/taurus/core/tauruspollingtimer.py +++ b/lib/taurus/core/tauruspollingtimer.py @@ -75,7 +75,7 @@ def containsAttribute(self, attribute): self.lock.acquire() try: attr_dict = self.dev_dict.get(dev) - return attr_dict and attr_dict.has_key(attr_name) + return attr_dict and attr_name in attr_dict finally: self.lock.release() diff --git a/lib/taurus/core/taurusvalidator.py b/lib/taurus/core/taurusvalidator.py index 8985a07a6..33fdd695d 100644 --- a/lib/taurus/core/taurusvalidator.py +++ b/lib/taurus/core/taurusvalidator.py @@ -24,6 +24,7 @@ ############################################################################# """This module contains the base taurus name validator classes""" +from __future__ import print_function __all__ = ["TaurusAuthorityNameValidator", "TaurusDeviceNameValidator", @@ -313,5 +314,5 @@ class FooAttributeNameValidator(TaurusAttributeNameValidator): v = FooAttributeNameValidator() name = 'foo://bar#label' - print v.isValid(name) - print v.getUriGroups(name) + print(v.isValid(name)) + print(v.getUriGroups(name)) diff --git a/lib/taurus/core/util/__init__.py b/lib/taurus/core/util/__init__.py index 207517da5..d74d2a2e1 100644 --- a/lib/taurus/core/util/__init__.py +++ b/lib/taurus/core/util/__init__.py @@ -33,6 +33,7 @@ #. if python >= 2.6 use standard json from python distribution #. otherwise use private implementation distributed with taurus """ +from __future__ import absolute_import __docformat__ = "restructuredtext" @@ -42,6 +43,6 @@ taurus.tauruscustomsettings, 'LIGHTWEIGHT_IMPORTS', False) if LIGHTWEIGHT_IMPORTS: - from init_lightweight import * + from .init_lightweight import * else: - from init_bkcomp import * + from .init_bkcomp import * diff --git a/lib/taurus/core/util/argparse/taurusargparse.py b/lib/taurus/core/util/argparse/taurusargparse.py index 14f129c7d..4ca6c63c1 100644 --- a/lib/taurus/core/util/argparse/taurusargparse.py +++ b/lib/taurus/core/util/argparse/taurusargparse.py @@ -198,7 +198,7 @@ def init_taurus_args(parser=None, args=None, values=None): rfoo.utils.rconsole.spawn_server(port=options.remote_console_port) taurus.info("rconsole started. You can connect to it by typing: rconsole -p %d", options.remote_console_port) - except Exception, e: + except Exception as e: taurus.warning("Cannot spawn debugger. Reason: %s", str(e)) # initialize default formatter diff --git a/lib/taurus/core/util/codecs.py b/lib/taurus/core/util/codecs.py index d39701fda..8ccf6bf41 100644 --- a/lib/taurus/core/util/codecs.py +++ b/lib/taurus/core/util/codecs.py @@ -62,6 +62,7 @@ >>> codec = CodecFactory().getCodec(v.format) >>> f, d = codec.decode((v.format, v.value)) """ +from __future__ import absolute_import __all__ = ["Codec", "NullCodec", "ZIPCodec", "BZ2Codec", "JSONCodec", "FunctionCodec", "PlotCodec", "CodecPipeline", "CodecFactory"] @@ -74,9 +75,9 @@ import struct import numpy -from singleton import Singleton -from log import Logger -from containers import CaselessDict +from .singleton import Singleton +from .log import Logger +from .containers import CaselessDict class Codec(Logger): @@ -879,7 +880,7 @@ def registerCodec(self, format, klass): self._codec_klasses[format] = klass # del old codec if exists - if self._codecs.has_key(format): + if format in self._codecs: del self._codecs[format] def unregisterCodec(self, format): @@ -889,10 +890,10 @@ def unregisterCodec(self, format): :param format: (str) the codec id :raises: KeyError""" - if self._codec_klasses.has_key(format): + if format in self._codec_klasses: del self._codec_klasses[format] - if self._codecs.has_key(format): + if format in self._codecs: del self._codecs[format] def getCodec(self, format): diff --git a/lib/taurus/core/util/colors.py b/lib/taurus/core/util/colors.py index 9f9780e2d..c0c83410c 100644 --- a/lib/taurus/core/util/colors.py +++ b/lib/taurus/core/util/colors.py @@ -24,6 +24,7 @@ ############################################################################# """This module contains color codes for state and quality""" +from __future__ import print_function __all__ = ["DEVICE_STATE_DATA", "ATTRIBUTE_QUALITY_DATA", "ColorPalette", "DEVICE_STATE_PALETTE", "ATTRIBUTE_QUALITY_PALETTE"] @@ -94,7 +95,7 @@ def __init__(self, dat, int_decoder_dict=None): self._int_decoder_dict = int_decoder_dict def _decoder(self, elem): - if type(elem) == types.IntType or type(elem) == types.LongType: + if type(elem) == int or type(elem) == int: elem = self._int_decoder_dict.get(elem) return str(elem) @@ -133,7 +134,7 @@ def name(self, stoq, fg=False): return self._rgb_data[name][0] def has(self, name): - return self._rgb_data.has_key(name) + return name in self._rgb_data def size(self): return len(self._rgb_data) @@ -215,7 +216,7 @@ def print_color_palette(pal): bg_color = pal.name(stoq) rgb = "(%3.3d, %3.3d, %3.3d)" % pal.rgb(stoq) hx = pal.hex(stoq) - print "%7s %5s on %13s %15s #%s" % (stoq, fg_color, bg_color, rgb, hx) + print("%7s %5s on %13s %15s #%s" % (stoq, fg_color, bg_color, rgb, hx)) if __name__ == "__main__": @@ -223,8 +224,8 @@ def print_color_palette(pal): print_color_palette(ATTRIBUTE_QUALITY_PALETTE) from taurus.core import TaurusDevState import PyTango - print - print DEVICE_STATE_PALETTE.rgb(TaurusDevState.Ready) - print DEVICE_STATE_PALETTE.rgb('TaurusDevState.Ready') - print DEVICE_STATE_PALETTE.rgb(PyTango.DevState.ON) - print DEVICE_STATE_PALETTE.rgb(0) + print() + print(DEVICE_STATE_PALETTE.rgb(TaurusDevState.Ready)) + print(DEVICE_STATE_PALETTE.rgb('TaurusDevState.Ready')) + print(DEVICE_STATE_PALETTE.rgb(PyTango.DevState.ON)) + print(DEVICE_STATE_PALETTE.rgb(0)) diff --git a/lib/taurus/core/util/constant.py b/lib/taurus/core/util/constant.py index 2221d72a5..6120cccd4 100644 --- a/lib/taurus/core/util/constant.py +++ b/lib/taurus/core/util/constant.py @@ -60,8 +60,8 @@ def __repr__(self): def __setattr__(self, name, value): v = self.__dict__.get(name, value) if type(v) is not type(value): - raise self._ConstTypeError, "Can't rebind %s to %s" % ( - type(v), type(value)) + raise self._ConstTypeError("Can't rebind %s to %s" % ( + type(v), type(value))) self.__dict__[name] = value def __del__(self): diff --git a/lib/taurus/core/util/containers.py b/lib/taurus/core/util/containers.py index eba3a4655..899af160d 100644 --- a/lib/taurus/core/util/containers.py +++ b/lib/taurus/core/util/containers.py @@ -27,6 +27,7 @@ This module contains a set of useful containers that are not part of the standard python distribution. """ +from __future__ import print_function __all__ = ["CaselessList", "CaselessDict", "CaselessWeakValueDict", "LoopList", "CircBuf", "LIFO", "TimedQueue", "self_locked", "ThreadDict", @@ -682,12 +683,12 @@ def lock_fun(self, *args, **kwargs): self.lock.acquire() try: if self.trace: - print "locked: %s" % self.lock + print("locked: %s" % self.lock) result = func(self, *args, **kwargs) finally: self.lock.release() if self.trace: - print "released: %s" % self.lock + print("released: %s" % self.lock) return result return lock_fun @@ -721,7 +722,7 @@ def __init__(self, other=None, read_method=None, write_method=None, timewait=0.1 self.parent = type(self).mro()[1] def tracer(self, text): - print text + print(text) def start(self): import threading @@ -1052,7 +1053,7 @@ def add_to_level(l, d): lines = [] if isinstance(d, dict): for k, v in d.items(): - print 'with key "%s"' % k + print('with key "%s"' % k) lines.append([''] * l + [str(k)]) lines += add_to_level(l + 1, v) elif type(d) in [list, set]: # End of recursion @@ -1065,7 +1066,7 @@ def add_to_level(l, d): lines.append([''] * l + [str(d)]) return lines ls = ['\t'.join(line) for line in add_to_level(0, dct)] - print 'lines are : \n', ls + print('lines are : \n', ls) return '\n'.join(ls) diff --git a/lib/taurus/core/util/decorator/typecheck.py b/lib/taurus/core/util/decorator/typecheck.py index 66947025a..2a1c27a0b 100644 --- a/lib/taurus/core/util/decorator/typecheck.py +++ b/lib/taurus/core/util/decorator/typecheck.py @@ -62,6 +62,7 @@ TypeError: 'fib' method accepts (int), but was given (float) """ +from __future__ import print_function __all__ = ["accepts", "returns"] @@ -97,17 +98,17 @@ def newf(*args): if argtypes != types: msg = info(f.__name__, types, argtypes, 0) if debug == 1: - print >> sys.stderr, 'TypeWarning: ', msg + print('TypeWarning: ', msg, file=sys.stderr) elif debug == 2: - raise TypeError, msg + raise TypeError(msg) return f(*args) newf.__name__ = f.__name__ return newf return decorator - except KeyError, key: - raise KeyError, key + "is not a valid keyword argument" - except TypeError, msg: - raise TypeError, msg + except KeyError as key: + raise KeyError(key + "is not a valid keyword argument") + except TypeError as msg: + raise TypeError(msg) def returns(ret_type, **kw): @@ -138,17 +139,17 @@ def newf(*args): if res_type != ret_type: msg = info(f.__name__, (ret_type,), (res_type,), 1) if debug == 1: - print >> sys.stderr, 'TypeWarning: ', msg + print('TypeWarning: ', msg, file=sys.stderr) elif debug == 2: - raise TypeError, msg + raise TypeError(msg) return result newf.__name__ = f.__name__ return newf return decorator - except KeyError, key: - raise KeyError, key + "is not a valid keyword argument" - except TypeError, msg: - raise TypeError, msg + except KeyError as key: + raise KeyError(key + "is not a valid keyword argument") + except TypeError as msg: + raise TypeError(msg) def info(fname, expected, actual, flag): diff --git a/lib/taurus/core/util/enumeration.py b/lib/taurus/core/util/enumeration.py index 7a216565d..6cdf95788 100644 --- a/lib/taurus/core/util/enumeration.py +++ b/lib/taurus/core/util/enumeration.py @@ -149,7 +149,7 @@ def __getitem__(self, i): return self.lookup[i] def __getattr__(self, attr): - if not self.has_key(attr): + if attr not in self: raise AttributeError return self.lookup[attr] diff --git a/lib/taurus/core/util/event.py b/lib/taurus/core/util/event.py index 8e85e39c6..fc90127fc 100644 --- a/lib/taurus/core/util/event.py +++ b/lib/taurus/core/util/event.py @@ -26,6 +26,8 @@ """ event.py: """ +from __future__ import print_function +from __future__ import absolute_import __all__ = ["BoundMethodWeakref", "CallableRef", "EventGenerator", "ConfigEventGenerator", "ListEventGenerator", "EventListener", @@ -95,7 +97,7 @@ def CallableRef(object, del_cb=None): :return: a weak reference for the given callable :rtype: BoundMethodWeakref or weakref.ref""" if hasattr(object, 'im_self'): - if object.im_self is not None: + if object.__self__ is not None: return BoundMethodWeakref(object, del_cb) return weakref.ref(object, del_cb) @@ -151,7 +153,7 @@ def getAllRead(self): return read -from object import Object +from .object import Object class EventGenerator(Object): @@ -202,7 +204,7 @@ def subscribeEvent(self, cb, data=None, with_first_event=True): :type data: boolean """ if not self.events_active: - raise RuntimeError, ('%s does not have ' + raise RuntimeError('%s does not have ' 'events/polling active' % self.event_name) cb_ref = CallableRef(cb, self.unsubscribeDeletedEvent) @@ -210,7 +212,7 @@ def subscribeEvent(self, cb, data=None, with_first_event=True): try: self.lock() if (cb_ref, data) in self.cb_list: - raise RuntimeError, ('Callback %s(%s) already reg. on %s' % + raise RuntimeError('Callback %s(%s) already reg. on %s' % (cb, data, self.event_name)) self.cb_list.append((cb_ref, data)) if with_first_event: @@ -314,7 +316,7 @@ def waitEvent(self, val=None, equal=True, any=False, timeout=None, :return: the value of the event that unblocked the wait :rtype: object""" if not self.events_active: - raise RuntimeError, ('%s does not have ' + raise RuntimeError('%s does not have ' 'events/polling active' % self.event_name) try: self.lock() @@ -539,8 +541,8 @@ def unlock(self): name = th.name else: name = "" - print "WARNING: Thread %s trying to unlock condition previously " \ - "locked by thread %s" % (curr_th.name, name) + print("WARNING: Thread %s trying to unlock condition previously " \ + "locked by thread %s" % (curr_th.name, name)) def clearEventSet(self): "Clears the internal event buffer" @@ -652,7 +654,7 @@ def waitEvent(self, val, after=0, equal=True, timeout=None, retries=-1, return self._cond.wait(timeout) retries -= 1 - except Exception, e: + except Exception as e: sys.stderr.write( "AttributeEventWait: Caught exception while waitting: %s\n" % str(e)) raise e @@ -693,8 +695,8 @@ def unlock(self): lock = getattr(self._cond, "_Condition__lock") th = getattr(lock, "_RLock__owner") curr_th = threading.current_thread() - print "WARNING: Thread %s trying to unlock condition previously " \ - "locked by thread %s" % (curr_th.name, th.name) + print("WARNING: Thread %s trying to unlock condition previously " \ + "locked by thread %s" % (curr_th.name, th.name)) def eventReceived(self, s, t, v): if t not in (taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic): @@ -716,7 +718,7 @@ def events(self, timeout=1): while True: self._cond.wait(timeout) yield self._data - except Exception, e: - print "INFO: Caught exception while waiting", str(e) + except Exception as e: + print("INFO: Caught exception while waiting", str(e)) finally: self.unlock() diff --git a/lib/taurus/core/util/fandango_search.py b/lib/taurus/core/util/fandango_search.py index 3eb2c530f..fda760188 100644 --- a/lib/taurus/core/util/fandango_search.py +++ b/lib/taurus/core/util/fandango_search.py @@ -125,7 +125,7 @@ def get_device_for_alias(alias): db = taurus.Authority() try: return db.get_device_alias(alias) - except Exception, e: + except Exception as e: if 'no device found' in str(e).lower(): return None return None # raise e @@ -137,7 +137,7 @@ def get_alias_for_device(dev): # .get_database_device().DbGetDeviceAlias(dev) result = db.get_alias(dev) return result - except Exception, e: + except Exception as e: if 'no alias found' in str(e).lower(): return None return None # raise e diff --git a/lib/taurus/core/util/init_bkcomp.py b/lib/taurus/core/util/init_bkcomp.py index ccd1a9522..4cccf0a9e 100644 --- a/lib/taurus/core/util/init_bkcomp.py +++ b/lib/taurus/core/util/init_bkcomp.py @@ -33,6 +33,7 @@ #. if python >= 2.6 use standard json from python distribution #. otherwise use private implementation distributed with taurus """ +from __future__ import absolute_import __docformat__ = "restructuredtext" @@ -61,7 +62,7 @@ from .threadpool import * from .user import * -import eventfilters +from . import eventfilters try: from lxml import etree diff --git a/lib/taurus/core/util/log.py b/lib/taurus/core/util/log.py index 189e00534..1b87cba2b 100644 --- a/lib/taurus/core/util/log.py +++ b/lib/taurus/core/util/log.py @@ -25,6 +25,8 @@ """This module contains a set of useful logging elements based on python's :mod:`logging` system.""" +from __future__ import print_function +from __future__ import absolute_import __all__ = ["LogIt", "TraceIt", "DebugIt", "InfoIt", "WarnIt", "ErrorIt", "CriticalIt", "MemoryLogHandler", "LogExceptHook", "Logger", @@ -45,9 +47,9 @@ import threading import functools -from object import Object -from wrap import wraps -from excepthook import BaseExceptHook +from .object import Object +from .wrap import wraps +from .excepthook import BaseExceptHook # ------------------------------------------------------------------------------ # TODO: substitute this ugly hack (below) by a more general mechanism @@ -168,7 +170,7 @@ def wrapper(*args, **kwargs): return f(*args, **kwargs) has_log = hasattr(f_self, "log") - fname = f.func_name + fname = f.__name__ log_obj = f_self if not has_log: log_obj = logging.getLogger() @@ -188,7 +190,7 @@ def wrapper(*args, **kwargs): out_msg = "<-" try: ret = f(*args, **kwargs) - except Exception, e: + except Exception as e: exc_info = sys.exc_info() out_msg += " (with %s) %s" % (e.__class__.__name__, fname) log_obj.log(self._level, out_msg, exc_info=exc_info) @@ -325,27 +327,27 @@ def __init__(self, showargs=False, showret=False): def __call__(self, f): @wraps(f) def wrapper(*args, **kwargs): - fname = f.func_name + fname = f.__name__ in_msg = "-> %s" % fname if self._showargs: if len(args) > 1: in_msg += str(args[1:]) if len(kwargs): in_msg += str(kwargs) - print - print in_msg + print() + print(in_msg) out_msg = "<-" try: ret = f(*args, **kwargs) - except Exception, e: + except Exception as e: out_msg += " (with %s) %s" % (e.__class__.__name__, fname) - print out_msg + print(out_msg) raise out_msg += " %s" % fname if not ret is None and self._showret: out_msg += " = %s" % str(ret) - print out_msg - print + print(out_msg) + print() return ret return wrapper @@ -1070,4 +1072,4 @@ def foo(x): - zab """ - print foo.__doc__ + print(foo.__doc__) diff --git a/lib/taurus/core/util/parse_args.py b/lib/taurus/core/util/parse_args.py index b97c95507..3da75c671 100644 --- a/lib/taurus/core/util/parse_args.py +++ b/lib/taurus/core/util/parse_args.py @@ -23,6 +23,7 @@ ## ############################################################################# +from __future__ import print_function from ast import literal_eval @@ -60,7 +61,7 @@ def parse_args(s, strip_pars=False): if __name__ == "__main__": - print parse_args('1, 2, b=3, c=4') - print parse_args(' (1, 2, b=3, c=4 )', strip_pars=True) + print(parse_args('1, 2, b=3, c=4')) + print(parse_args(' (1, 2, b=3, c=4 )', strip_pars=True)) - print parse_args('1, 2, b=3, c=4, 5') # <--this should raise a SyntaxError + print(parse_args('1, 2, b=3, c=4, 5')) # <--this should raise a SyntaxError diff --git a/lib/taurus/core/util/prop.py b/lib/taurus/core/util/prop.py index cb6d41c16..304218d26 100644 --- a/lib/taurus/core/util/prop.py +++ b/lib/taurus/core/util/prop.py @@ -24,6 +24,8 @@ ############################################################################# """This module contains a decorator to simplify the use of property.""" +from __future__ import print_function +from __future__ import absolute_import __all__ = ["propertx"] @@ -47,7 +49,7 @@ def propertx(fct): if __name__ == '__main__': - from log import Logger + from .log import Logger class example(object, Logger): @@ -60,15 +62,15 @@ def __init__(self): def bar(): # BAR doc def get(self): - print "\tgetting", self._a + print("\tgetting", self._a) return self._a def set(self, val): - print "\tsetting", val + print("\tsetting", val) self._a = val return get, set foo = example() - print foo.bar + print(foo.bar) # foo.bar='egg' # print foo.bar diff --git a/lib/taurus/core/util/property_parser.py b/lib/taurus/core/util/property_parser.py index e8fae071e..e09225fa1 100644 --- a/lib/taurus/core/util/property_parser.py +++ b/lib/taurus/core/util/property_parser.py @@ -24,6 +24,7 @@ ############################################################################# """This is an experimental property parser""" +from __future__ import print_function import os @@ -68,7 +69,7 @@ def t_NUMBER(t): else: t.value = float(t.value) except: - print "[%d]: Number %s is not valid!" % (t.lineno, t.value) + print("[%d]: Number %s is not valid!" % (t.lineno, t.value)) t.value = 0 return t @@ -117,12 +118,12 @@ def t_newline(t): def t_error(t): - print "[%d]: Illegal character '%s'" % (t.lexer.lineno, t.value[0]) + print("[%d]: Illegal character '%s'" % (t.lexer.lineno, t.value[0])) t.lexer.skip(1) def p_error(p): - print "[%d]: Syntax error in input [%s]" % (p.lineno, (str(p))) + print("[%d]: Syntax error in input [%s]" % (p.lineno, (str(p)))) #------------------------------------------------------------------------- # Yacc Starting symbol @@ -228,7 +229,7 @@ def parse(self, filename, logger=None, debug=0, optimize=1): res = self.parse_file( f, logger=logger, debug=debug, optimize=optimize) f.close() - except IOError, e: + except IOError as e: if f: f.close() raise @@ -241,4 +242,4 @@ def getLastFilename(self): import sys pp = PropertyParser() res = pp.parse(sys.argv[1]) - print res + print(res) diff --git a/lib/taurus/core/util/propertyfile.py b/lib/taurus/core/util/propertyfile.py index 15a3ab669..5327f7a01 100644 --- a/lib/taurus/core/util/propertyfile.py +++ b/lib/taurus/core/util/propertyfile.py @@ -170,7 +170,7 @@ def __parse(self, lines): # same property while line[-1] == '\\': # Read next line - nextline = i.next() + nextline = next(i) nextline = nextline.strip() lineno += 1 # This line will become part of the value @@ -216,7 +216,7 @@ def processPair(self, key, value): self._props[key] = value.strip() # Check if an entry exists in pristine keys - if self._keymap.has_key(key): + if key in self._keymap: oldkey = self._keymap.get(key) self._origprops[oldkey] = oldvalue.strip() else: @@ -247,15 +247,15 @@ def load(self, stream): # For the time being only accept file input streams if type(stream) is not file: - raise TypeError, 'Argument should be a file object!' + raise TypeError('Argument should be a file object!') # Check for the opened mode if stream.mode != 'r': - raise ValueError, 'Stream should be opened in read-only mode!' + raise ValueError('Stream should be opened in read-only mode!') try: lines = stream.readlines() self.__parse(lines) - except IOError, e: + except IOError as e: raise def getProperty(self, key): @@ -269,7 +269,7 @@ def setProperty(self, key, value): if type(key) is str and type(value) is str: self.processPair(key, value) else: - raise TypeError, 'both key and value should be strings!' + raise TypeError('both key and value should be strings!') def propertyNames(self): """ Return an iterator over all the keys of the property @@ -290,7 +290,7 @@ def store(self, out, header=""): with the optional 'header' """ if out.mode[0] != 'w': - raise ValueError, 'Steam should be opened in write mode!' + raise ValueError('Steam should be opened in write mode!') try: out.write(''.join(('#', header, '\n'))) @@ -302,7 +302,7 @@ def store(self, out, header=""): out.write(''.join((prop, '=', self.escape(val), '\n'))) out.close() - except IOError, e: + except IOError as e: raise def getPropertyDict(self): diff --git a/lib/taurus/core/util/safeeval.py b/lib/taurus/core/util/safeeval.py index ea075bb58..f42332e7a 100644 --- a/lib/taurus/core/util/safeeval.py +++ b/lib/taurus/core/util/safeeval.py @@ -26,6 +26,7 @@ """ safeeval.py: Safe eval replacement with whitelist support """ +from __future__ import print_function __all__ = ["SafeEvaluator"] @@ -117,12 +118,12 @@ def getSafe(self): x = range(6) sev = SafeEvaluator() - print "trying to evaluate a variable that has not been registered" + print("trying to evaluate a variable that has not been registered") try: # This will fail because 'x' is not registered in sev - print sev.safeEval('x+2') + print(sev.safeEval('x+2')) except: - print "failed!!" + print("failed!!") sev.addSafe({'x': x}) # After registering x, we can use it... f0 = 'x' @@ -134,16 +135,16 @@ def getSafe(self): f5 = 'open("/etc/passwd")' for f in [f0, f1, f2, f3, f4, f5]: - print 'Evaluating "%s":' % f + print('Evaluating "%s":' % f) try: - print sev.eval(f) + print(sev.eval(f)) except: - print 'ERROR: %s cannot be evaluated' % f + print('ERROR: %s cannot be evaluated' % f) vector = numpy.arange(6) # Another way of registering a variable is using the init method... sev2 = SafeEvaluator({'x': x, 'y': vector}, defaultSafe=False) - print 'x*y=', sev2.eval('x*y') + print('x*y=', sev2.eval('x*y')) y = 0 # note that the registered variable is local to the evaluator!! # here, y still has the previously registered value instead of 0 - print 'x*y=', sev2.eval('x*y') + print('x*y=', sev2.eval('x*y')) diff --git a/lib/taurus/core/util/tablepprint.py b/lib/taurus/core/util/tablepprint.py index d65b96f14..6bfaf5a75 100644 --- a/lib/taurus/core/util/tablepprint.py +++ b/lib/taurus/core/util/tablepprint.py @@ -24,6 +24,8 @@ ############################################################################# """Adapted from http://code.activestate.com/recipes/267662/""" +from __future__ import print_function +from functools import reduce __docformat__ = "restructuredtext" @@ -135,19 +137,19 @@ def wrap_always(text, width): Aristidis,Papageorgopoulos,28,Senior Reseacher''' rows = [row.strip().split(',') for row in data.splitlines()] - print 'Without wrapping function\n' + print('Without wrapping function\n') for l in indent([labels] + rows, hasHeader=True): - print l + print(l) # test indent with different wrapping functions width = 10 for wrapper in (wrap_always, wrap_onspace, wrap_onspace_strict): - print 'Wrapping function: %s(x,width=%d)\n' % (wrapper.__name__, width) + print('Wrapping function: %s(x,width=%d)\n' % (wrapper.__name__, width)) o = indent([labels] + rows, headerChar='=', hasHeader=True, separateRows=False, prefix='|', postfix='|', delim=' ', wrapfunc=lambda x: wrapper(x, width)) for l in o: - print l + print(l) # output: # diff --git a/lib/taurus/core/util/threadpool.py b/lib/taurus/core/util/threadpool.py index c0208977f..f7945c2cf 100644 --- a/lib/taurus/core/util/threadpool.py +++ b/lib/taurus/core/util/threadpool.py @@ -24,6 +24,8 @@ ############################################################################# """adapted from http://code.activestate.com/recipes/576576/""" +from __future__ import print_function +from __future__ import absolute_import __all__ = ["ThreadPool", "Worker"] @@ -34,8 +36,8 @@ from time import sleep, time from traceback import extract_stack, format_list -from prop import propertx -from log import Logger, DebugIt, TraceIt +from .prop import propertx +from .log import Logger, DebugIt, TraceIt class ThreadPool(Logger): @@ -152,44 +154,44 @@ def isBusy(self): def easyJob(*arg, **kw): n = arg[0] - print '\tSleep\t\t', n + print('\tSleep\t\t', n) sleep(n) return 'Slept\t%d' % n def longJob(*arg, **kw): - print "\tStart\t\t\t", arg, kw + print("\tStart\t\t\t", arg, kw) n = arg[0] * 3 sleep(n) return "Job done in %d" % n def badJob(*a, **k): - print '\n !!! OOOPS !!!\n' + print('\n !!! OOOPS !!!\n') a = 1 / 0 def show(*arg, **kw): - print 'callback : %s' % arg[0] + print('callback : %s' % arg[0]) def test_1(**kwargs): workers = kwargs.pop('workers', 5) jobqueue = kwargs.pop('jobqueue', 10) pool = ThreadPool(name='ThreadPool', Psize=workers, Qsize=jobqueue) - print "\n\t\t... let's add some jobs ...\n" + print("\n\t\t... let's add some jobs ...\n") for j in range(5): if j == 1: pool.add(badJob) for i in range(5, 0, -1): pool.add(longJob, show, i) pool.add(easyJob, show, i) - print ''' + print(''' \t\t... and now, we're waiting for the %i workers to get the %i jobs done ... - ''' % (pool.size, pool.qsize) + ''' % (pool.size, pool.qsize)) sleep(15) - print "\n\t\t... ok, that may take a while, let's get some reinforcement ...\n" + print("\n\t\t... ok, that may take a while, let's get some reinforcement ...\n") sleep(5) pool.size = 50 - print '\n\t\t... Joining ...\n' + print('\n\t\t... Joining ...\n') pool.join() - print '\n\t\t... Ok ...\n' + print('\n\t\t... Ok ...\n') def test_2(**kwargs): workers = kwargs.pop('workers', 5) @@ -198,21 +200,21 @@ def test_2(**kwargs): sleep_t = kwargs.pop('sleep_t', 1) #from taurus.core.util.threadpool import ThreadPool pool = ThreadPool(name='ThreadPool', Psize=workers, Qsize=jobqueue) - print "\n\t\t... Check the number of busy workers ...\n" - print "Num of busy workers = %s" % (pool.getNumOfBusyWorkers()) - print "\n\t\t... let's add some jobs ...\n" + print("\n\t\t... Check the number of busy workers ...\n") + print("Num of busy workers = %s" % (pool.getNumOfBusyWorkers())) + print("\n\t\t... let's add some jobs ...\n") for i in range(numjobs): pool.add(easyJob, None, sleep_t) - print '\n\t\t... Monitoring the busy workers ...\n' + print('\n\t\t... Monitoring the busy workers ...\n') t0 = time() while pool.getNumOfBusyWorkers() > 0: - print "busy workers = %s" % (pool.getNumOfBusyWorkers()) + print("busy workers = %s" % (pool.getNumOfBusyWorkers())) sleep(0.5) t1 = time() - print "Run %s jobs of 1 second took %.3f" % (numjobs, t1 - t0) - print '\n\t\t... Joining ...\n' + print("Run %s jobs of 1 second took %.3f" % (numjobs, t1 - t0)) + print('\n\t\t... Joining ...\n') pool.join() - print '\n\t\t... Ok ...\n' + print('\n\t\t... Ok ...\n') def main(argv): kwargs = {} diff --git a/lib/taurus/qt/qtcore/communication/communication.py b/lib/taurus/qt/qtcore/communication/communication.py index 17072422a..dd4d5dbbc 100644 --- a/lib/taurus/qt/qtcore/communication/communication.py +++ b/lib/taurus/qt/qtcore/communication/communication.py @@ -26,6 +26,7 @@ """ comunications.py: """ +from __future__ import print_function from taurus.external.qt import QtCore import weakref @@ -333,7 +334,7 @@ def debugReader(self, data): ''' A slot which you can connect as a reader for debugging. It will print info to the stdout ''' - print "SharedDataManager: \n\tSender=: %s\n\tData=%s" % (self.sender(), repr(data)) + print("SharedDataManager: \n\tSender=: %s\n\tData=%s" % (self.sender(), repr(data))) def info(self): s = "" diff --git a/lib/taurus/qt/qtcore/configuration/configuration.py b/lib/taurus/qt/qtcore/configuration/configuration.py index 7e8979d0f..0706787ab 100644 --- a/lib/taurus/qt/qtcore/configuration/configuration.py +++ b/lib/taurus/qt/qtcore/configuration/configuration.py @@ -25,6 +25,7 @@ """This module provides the set of base classes designed to provide configuration features to the classes that inherit from them""" +from __future__ import print_function __all__ = ["configurableProperty", "BaseConfigurableClass"] @@ -149,7 +150,7 @@ def isTaurusConfig(x): for k in x['__orderedConfigNames__']: if k not in x['__itemConfigurations__']: - print 'missing configuration for "%s" in %s' % (k, repr(x)) + print('missing configuration for "%s" in %s' % (k, repr(x))) return True def createConfig(self, allowUnpickable=False): @@ -250,7 +251,7 @@ def resetConfigurableItems(self): self.__configurableItems = {} def registerConfigurableItem(self, item, name=None): - print "Deprecation WARNING: %s.registerConfigurableItem() has been deprecated. Use registerConfigDelegate() instead" % repr(self) + print("Deprecation WARNING: %s.registerConfigurableItem() has been deprecated. Use registerConfigDelegate() instead" % repr(self)) self._registerConfigurableItem(item, name=name) def registerConfigDelegate(self, delegate, name=None): diff --git a/lib/taurus/qt/qtcore/model/__init__.py b/lib/taurus/qt/qtcore/model/__init__.py index d65eba15a..adf1ad8cd 100644 --- a/lib/taurus/qt/qtcore/model/__init__.py +++ b/lib/taurus/qt/qtcore/model/__init__.py @@ -53,8 +53,9 @@ view.setModel(model) """ +from __future__ import absolute_import __docformat__ = 'restructuredtext' -from taurusmodel import * -from taurusdatabasemodel import * +from .taurusmodel import * +from .taurusdatabasemodel import * diff --git a/lib/taurus/qt/qtcore/util/__init__.py b/lib/taurus/qt/qtcore/util/__init__.py index e029ac989..75ea2c97d 100644 --- a/lib/taurus/qt/qtcore/util/__init__.py +++ b/lib/taurus/qt/qtcore/util/__init__.py @@ -24,7 +24,8 @@ ############################################################################# """This package provides a set of utilities (e.g. logging) to taurus qtcore""" +from __future__ import absolute_import __docformat__ = 'restructuredtext' -from tauruslog import * +from .tauruslog import * diff --git a/lib/taurus/qt/qtcore/util/emitter.py b/lib/taurus/qt/qtcore/util/emitter.py index df6d4c235..e6b04e11a 100644 --- a/lib/taurus/qt/qtcore/util/emitter.py +++ b/lib/taurus/qt/qtcore/util/emitter.py @@ -225,7 +225,7 @@ def onRefresh(self): size = self.getQueue().qsize() if size: self.log.info('onRefresh(%s)' % size) - self.next() + next(self) else: self.log.debug('onRefresh()') except: @@ -266,7 +266,7 @@ def purge(self, obj): nqueue.put(i) while not nqueue.empty(): self.queue.put(nqueue.get()) - self.next() + next(self) def _doSomething(self, params): self.log.debug('At TaurusEmitterThread._doSomething(%s)' % str(params)) @@ -317,7 +317,7 @@ def run(self): Qt.QApplication.instance().thread().msleep(self.timewait) self.log.info('#' * 80) self.log.info('At TaurusEmitterThread.run()') - self.next() + next(self) if self.refreshTimer: self.refreshTimer.start(self.polling) @@ -394,7 +394,7 @@ def addUnsubscribedAttributes(self): self.info('addUnsubscribedAttributes([%d])' % len(items)) for attr in items: self._addModelObj(attr) - self._modelsThread.next() + next(self._modelsThread) self.info('Thread queue: [%d]' % (self._modelsQueue.qsize())) except: self.warning(traceback.format_exc()) @@ -504,7 +504,7 @@ def start(self): self.thread.start() except: pass - self.next() + next(self) self._running = True return @@ -535,7 +535,7 @@ def purge(self, obj): nqueue.put(i) while not nqueue.empty(): self.queue.put(nqueue.get()) - self.next() + next(self) def isRunning(self): return self._running diff --git a/lib/taurus/qt/qtcore/util/signal.py b/lib/taurus/qt/qtcore/util/signal.py index e82d2e1f1..c24fa0412 100644 --- a/lib/taurus/qt/qtcore/util/signal.py +++ b/lib/taurus/qt/qtcore/util/signal.py @@ -1,4 +1,5 @@ """Provide a Signal class for non-QObject objects""" +from __future__ import print_function __all__ = ['baseSignal'] diff --git a/lib/taurus/qt/qtdesigner/containerplugin.py b/lib/taurus/qt/qtdesigner/containerplugin.py index 077a1eca7..7e1330930 100644 --- a/lib/taurus/qt/qtdesigner/containerplugin.py +++ b/lib/taurus/qt/qtdesigner/containerplugin.py @@ -36,6 +36,7 @@ - 'model' - will have a '...' button that will open a customized dialog for editing the widget model (same has 'Edit model...' task menu item """ +from __future__ import absolute_import from taurus.core.util.log import Logger from taurus.external.qt import Qt @@ -105,7 +106,8 @@ def createExtension(self, obj, iid, parent): def create_plugin(): - from taurusplugin.taurusplugin import TaurusWidgetPlugin + #from .taurusplugin.taurusplugin import TaurusWidgetPlugin # - after futurize stage1 + from taurusplugin.taurusplugin import TaurusWidgetPlugin # + after futurize stage1 class QGroupWidgetPlugin(TaurusWidgetPlugin): diff --git a/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py b/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py index ba4f950e2..2287f0ac7 100644 --- a/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py +++ b/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py @@ -36,6 +36,7 @@ - 'model' - will have a '...' button that will open a customized dialog for editing the widget model (same has 'Edit model...' task menu item """ +from __future__ import print_function import inspect @@ -103,11 +104,11 @@ def createWidget(self, parent): designMode=True, parent=parent) w = klass(*args, **kwargs) - except Exception, e: + except Exception as e: name = self._getWidgetClassName() - print 100 * "=" - print "taurus designer plugin error creating %s: %s" % (name, str(e)) - print 100 * "-" + print(100 * "=") + print("taurus designer plugin error creating %s: %s" % (name, str(e))) + print(100 * "-") import traceback traceback.print_exc() w = None diff --git a/lib/taurus/qt/qtdesigner/tauruspluginplugin.py b/lib/taurus/qt/qtdesigner/tauruspluginplugin.py index f7d1cf447..2abb98f93 100644 --- a/lib/taurus/qt/qtdesigner/tauruspluginplugin.py +++ b/lib/taurus/qt/qtdesigner/tauruspluginplugin.py @@ -26,12 +26,14 @@ """ tauruspluginplugin.py: """ +from __future__ import absolute_import from taurus.external.qt import QtDesigner def build_qtdesigner_widget_plugin(klass): - import taurusplugin + #from . import taurusplugin # - after futurize stage 1 + import taurusplugin.taurusplugin as taurusplugin # + after futurize stage 1 class Plugin(taurusplugin.TaurusWidgetPlugin): WidgetClass = klass @@ -74,7 +76,7 @@ def main(): #_log.debug("E2: Canceled %s (widget doesn't have getQtDesignerPluginInfo())" % name) e2_nb += 1 cont = True - except Exception, e: + except Exception as e: #_log.debug("E3: Canceled %s (%s)" % (name, str(e))) e3_nb += 1 cont = True @@ -82,7 +84,7 @@ def main(): if cont: continue for k in ('module', ): - if not qt_info.has_key(k): + if k not in qt_info: #_log.debug("E4: Canceled %s (getQtDesignerPluginInfo doesn't have key %s)" % (name, k)) e4_nb += 1 cont = True diff --git a/lib/taurus/qt/qtgui/__init__.py b/lib/taurus/qt/qtgui/__init__.py index c0499237f..00029add9 100644 --- a/lib/taurus/qt/qtgui/__init__.py +++ b/lib/taurus/qt/qtgui/__init__.py @@ -27,12 +27,13 @@ taurus models. The widgets are generic in the sence that they do not assume any behavior associated with a specific HW device. They intend to represent only abstract model data.""" +from __future__ import absolute_import __docformat__ = 'restructuredtext' # register icon path files and icon theme on import of taurus.qt.qtgui -import icon as __icon +from . import icon as __icon import os import sys import glob diff --git a/lib/taurus/qt/qtgui/base/taurusbase.py b/lib/taurus/qt/qtgui/base/taurusbase.py index f4b561240..dce0e8489 100644 --- a/lib/taurus/qt/qtgui/base/taurusbase.py +++ b/lib/taurus/qt/qtgui/base/taurusbase.py @@ -736,7 +736,7 @@ def baseFormatter(dtype=None, basecomponent=None, **kwargs): if self._format is None: try: self._updateFormat(type(v)) - except Exception, e: + except Exception as e: self.warning(('Cannot update format. Reverting to default.' + ' Reason: %r'), e) self.setFormat(defaultFormatter) @@ -2147,9 +2147,9 @@ def _updateValidator(self, evt_value): # TODO: Remove this method bottom = evt_value.min_value top = evt_value.max_value bottom = int( - bottom) if bottom != TaurusConfiguration.no_min_value else -sys.maxint + bottom) if bottom != TaurusConfiguration.no_min_value else -sys.maxsize top = int( - top) if top != TaurusConfiguration.no_max_value else sys.maxint + top) if top != TaurusConfiguration.no_max_value else sys.maxsize v.setRange(bottom, top) self.debug("Validator range set to %i-%i" % (bottom, top)) elif isinstance(v, Qt.QDoubleValidator): diff --git a/lib/taurus/qt/qtgui/base/tauruscontroller.py b/lib/taurus/qt/qtgui/base/tauruscontroller.py index 28103fe6d..60e21418a 100644 --- a/lib/taurus/qt/qtgui/base/tauruscontroller.py +++ b/lib/taurus/qt/qtgui/base/tauruscontroller.py @@ -204,7 +204,7 @@ def _getDisplayValue(self, widget, valueObj, idx, write): for i in idx: value = value[i] return widget.displayValue(value) - except Exception, e: + except Exception as e: return widget.getNoneValue() def displayValue(self, value): diff --git a/lib/taurus/qt/qtgui/button/qbuttonbox.py b/lib/taurus/qt/qtgui/button/qbuttonbox.py index dc3646207..bf07ee444 100644 --- a/lib/taurus/qt/qtgui/button/qbuttonbox.py +++ b/lib/taurus/qt/qtgui/button/qbuttonbox.py @@ -26,6 +26,7 @@ """ qbuttonbox.py: """ +from __future__ import print_function __all__ = ["QButtonBox"] diff --git a/lib/taurus/qt/qtgui/button/taurusbutton.py b/lib/taurus/qt/qtgui/button/taurusbutton.py index 2b5ee9b53..bd2eac735 100644 --- a/lib/taurus/qt/qtgui/button/taurusbutton.py +++ b/lib/taurus/qt/qtgui/button/taurusbutton.py @@ -25,6 +25,7 @@ ############################################################################# """This module provides a taurus QPushButton based widgets""" +from __future__ import print_function __all__ = ["TaurusLauncherButton", "TaurusCommandButton", "TaurusLockButton"] @@ -179,7 +180,7 @@ def createWidget(self): if self._dialog.previousWidgetConfig is not None: try: widget.applyConfig(self._dialog.previousWidgetConfig) - except Exception, e: + except Exception as e: self.warning( 'Cannot apply previous configuration to widget. Reason: %s', repr(e)) @@ -347,7 +348,7 @@ def _onClicked(self): modelobj.set_timeout_millis(int(self._timeout * 1000)) result = modelobj.command_inout(self._command, self._castParameters( self._parameters, self._command, modelobj)) - except Exception, e: + except Exception as e: self.error('Unexpected error when executing command %s of %s: %s' % ( self._command, modelobj.getNormalName(), str(e))) raise @@ -381,7 +382,7 @@ def _castParameters(self, parameters=None, command=None, dev=None): try: param_type = dev.command_query(command).in_type - except Exception, e: + except Exception as e: self.warning( 'Cannot get parameters info for command %s:%s' % (command, str(e))) return parameters @@ -666,7 +667,7 @@ def commandButtonMain(): 'Booo scary command!!\n Maybe you should think twice!') def f(*a): - print a + print(a) form.commandExecuted.connect(f) form.show() sys.exit(app.exec_()) diff --git a/lib/taurus/qt/qtgui/compact/abstractswitcher.py b/lib/taurus/qt/qtgui/compact/abstractswitcher.py index b8fa8de33..88ff6f442 100644 --- a/lib/taurus/qt/qtgui/compact/abstractswitcher.py +++ b/lib/taurus/qt/qtgui/compact/abstractswitcher.py @@ -193,7 +193,7 @@ def setReadWidget(self, widget): for sig in self.enterEditSignals: try: getattr(self.readWidget, sig).connect(self.enterEdit) - except Exception, e: + except Exception as e: self.debug('Cannot connect signal. Reason: %s', e) # update size policy self._updateSizePolicy() @@ -220,7 +220,7 @@ def setWriteWidget(self, widget): for sig in self.exitEditSignals: try: getattr(self.writeWidget, sig).connect(self.exitEdit) - except Exception, e: + except Exception as e: if isinstance(e, AttributeError) and hasattr(Qt, "SIGNAL"): # Support old-style signal self.connect(self.writeWidget, Qt.SIGNAL(sig), diff --git a/lib/taurus/qt/qtgui/compact/basicswitcher.py b/lib/taurus/qt/qtgui/compact/basicswitcher.py index 7cd4d2e1c..e13fed3f2 100644 --- a/lib/taurus/qt/qtgui/compact/basicswitcher.py +++ b/lib/taurus/qt/qtgui/compact/basicswitcher.py @@ -25,6 +25,7 @@ """This module provides some basic usable widgets based on TaurusReadWriteSwitcher """ +from __future__ import absolute_import __all__ = ["TaurusLabelEditRW", "TaurusBoolRW"] @@ -33,7 +34,7 @@ from taurus.external.qt import Qt from taurus.qt.qtgui.display import TaurusLabel, TaurusLed from taurus.qt.qtgui.input import TaurusValueLineEdit, TaurusValueCheckBox -from abstractswitcher import TaurusReadWriteSwitcher +from .abstractswitcher import TaurusReadWriteSwitcher class TaurusLabelEditRW(TaurusReadWriteSwitcher): diff --git a/lib/taurus/qt/qtgui/console/__init__.py b/lib/taurus/qt/qtgui/console/__init__.py index f0dfefcf9..a2aa414b4 100644 --- a/lib/taurus/qt/qtgui/console/__init__.py +++ b/lib/taurus/qt/qtgui/console/__init__.py @@ -35,7 +35,7 @@ try: from silx.gui.console import IPythonWidget as TaurusConsole -except Exception, e: +except Exception as e: from taurus.qt.qtgui.display import TaurusFallBackWidget class TaurusConsole(TaurusFallBackWidget): diff --git a/lib/taurus/qt/qtgui/container/taurusframe.py b/lib/taurus/qt/qtgui/container/taurusframe.py index eac1ca3a5..d12b679e8 100644 --- a/lib/taurus/qt/qtgui/container/taurusframe.py +++ b/lib/taurus/qt/qtgui/container/taurusframe.py @@ -24,6 +24,7 @@ ############################################################################# """This module provides basic taurus container widgets""" +from __future__ import absolute_import __all__ = ["TaurusFrame"] @@ -31,7 +32,7 @@ from taurus.external.qt import Qt from taurus.qt.qtgui.base import TaurusBaseComponent -from taurusbasecontainer import TaurusBaseContainer +from .taurusbasecontainer import TaurusBaseContainer class TaurusFrame(Qt.QFrame, TaurusBaseContainer): diff --git a/lib/taurus/qt/qtgui/container/taurusgroupbox.py b/lib/taurus/qt/qtgui/container/taurusgroupbox.py index 584c9d8d8..ec4e9c7b8 100644 --- a/lib/taurus/qt/qtgui/container/taurusgroupbox.py +++ b/lib/taurus/qt/qtgui/container/taurusgroupbox.py @@ -24,13 +24,14 @@ ############################################################################# """This module provides basic taurus group box widget""" +from __future__ import absolute_import __all__ = ["TaurusGroupBox"] __docformat__ = 'restructuredtext' from taurus.external.qt import Qt -from taurusbasecontainer import TaurusBaseContainer +from .taurusbasecontainer import TaurusBaseContainer class TaurusGroupBox(Qt.QGroupBox, TaurusBaseContainer): diff --git a/lib/taurus/qt/qtgui/container/taurusgroupwidget.py b/lib/taurus/qt/qtgui/container/taurusgroupwidget.py index bb1bd6c6d..9e4add722 100644 --- a/lib/taurus/qt/qtgui/container/taurusgroupwidget.py +++ b/lib/taurus/qt/qtgui/container/taurusgroupwidget.py @@ -24,14 +24,15 @@ ############################################################################# """This module provides a taurus group widget""" +from __future__ import absolute_import __all__ = ["TaurusGroupWidget"] __docformat__ = 'restructuredtext' from taurus.external.qt import Qt -from qcontainer import QGroupWidget -from taurusbasecontainer import TaurusBaseContainer +from .qcontainer import QGroupWidget +from .taurusbasecontainer import TaurusBaseContainer class TaurusGroupWidget(QGroupWidget, TaurusBaseContainer): diff --git a/lib/taurus/qt/qtgui/container/taurusmainwindow.py b/lib/taurus/qt/qtgui/container/taurusmainwindow.py index 0eeb676f7..934341ca5 100644 --- a/lib/taurus/qt/qtgui/container/taurusmainwindow.py +++ b/lib/taurus/qt/qtgui/container/taurusmainwindow.py @@ -26,6 +26,7 @@ """ mainwindow.py: a main window implementation with many added features by default """ +from __future__ import absolute_import __all__ = ["TaurusMainWindow"] @@ -37,7 +38,7 @@ from taurus import tauruscustomsettings from taurus.core.util import deprecation_decorator from taurus.external.qt import Qt -from taurusbasecontainer import TaurusBaseContainer +from .taurusbasecontainer import TaurusBaseContainer from taurus.qt.qtcore.configuration import BaseConfigurableClass from taurus.qt.qtgui.util import ExternalAppAction @@ -620,7 +621,7 @@ def loadSettings(self, settings=None, group=None, ignoreGeometry=False, factoryS ba = Qt.from_qvariant(settings.value( "TaurusConfig"), 'toByteArray') or Qt.QByteArray() self.applyQConfig(ba) - except Exception, e: + except Exception as e: msg = 'Problem loading configuration from "%s". Some settings may not be restored.\n Details: %s' % ( unicode(settings.fileName()), repr(e)) self.error(msg) diff --git a/lib/taurus/qt/qtgui/container/taurusscrollarea.py b/lib/taurus/qt/qtgui/container/taurusscrollarea.py index 124b5d114..c9db150d8 100644 --- a/lib/taurus/qt/qtgui/container/taurusscrollarea.py +++ b/lib/taurus/qt/qtgui/container/taurusscrollarea.py @@ -24,6 +24,7 @@ ############################################################################# """This module provides basic taurus scroll area widget""" +from __future__ import absolute_import __all__ = ["TaurusScrollArea"] @@ -32,7 +33,7 @@ from taurus.external.qt import Qt from taurus.qt.qtgui.base import TaurusBaseComponent -from taurusbasecontainer import TaurusBaseContainer +from .taurusbasecontainer import TaurusBaseContainer class TaurusScrollArea(Qt.QScrollArea, TaurusBaseContainer): diff --git a/lib/taurus/qt/qtgui/container/tauruswidget.py b/lib/taurus/qt/qtgui/container/tauruswidget.py index f6edfe1d9..c52aac520 100644 --- a/lib/taurus/qt/qtgui/container/tauruswidget.py +++ b/lib/taurus/qt/qtgui/container/tauruswidget.py @@ -24,13 +24,14 @@ ############################################################################# """This module provides basic taurus container widget""" +from __future__ import absolute_import __all__ = ["TaurusWidget"] __docformat__ = 'restructuredtext' from taurus.external.qt import Qt -from taurusbasecontainer import TaurusBaseContainer +from .taurusbasecontainer import TaurusBaseContainer class TaurusWidget(Qt.QWidget, TaurusBaseContainer): diff --git a/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py b/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py index f965aa9c2..9965c4168 100644 --- a/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py +++ b/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py @@ -24,6 +24,7 @@ ############################################################################# """This module provides a set of dialog based widgets""" +from __future__ import print_function __all__ = ["TaurusInputDialog", "get_input"] @@ -199,7 +200,7 @@ def main(): data_type='Text', key="Memo", default_value="By default a memo is\na long thing") for d in [d1, d2, d3, d4, d5, d6, d7, d8]: - print get_input(input_data=d, title=d['prompt']) + print(get_input(input_data=d, title=d['prompt'])) if __name__ == "__main__": main() diff --git a/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py b/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py index 1d8142e73..371246e5c 100644 --- a/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py +++ b/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py @@ -334,7 +334,7 @@ def py_tg_serv_exc(): try: PyTango.Except.throw_exception('TangoException', 'A simple tango exception', 'right here') - except PyTango.DevFailed, df1: + except PyTango.DevFailed as df1: try: import traceback import StringIO diff --git a/lib/taurus/qt/qtgui/display/qled.py b/lib/taurus/qt/qtgui/display/qled.py index fd5bce969..efca5c705 100644 --- a/lib/taurus/qt/qtgui/display/qled.py +++ b/lib/taurus/qt/qtgui/display/qled.py @@ -98,7 +98,7 @@ def isLedColorValid(self, name): :type color: str :return: True is the given color name is valid or False otherwise :rtype: bool""" - return LedColor.has_key(name.upper()) + return name.upper() in LedColor def _refresh(self): """internal usage only""" diff --git a/lib/taurus/qt/qtgui/display/qpixmapwidget.py b/lib/taurus/qt/qtgui/display/qpixmapwidget.py index 38a0bdcd5..f2d7f32a4 100644 --- a/lib/taurus/qt/qtgui/display/qpixmapwidget.py +++ b/lib/taurus/qt/qtgui/display/qpixmapwidget.py @@ -24,6 +24,7 @@ ############################################################################# """This module contains a pure Qt widget that displays an image""" +from __future__ import absolute_import __all__ = ["QPixmapWidget"] @@ -225,8 +226,9 @@ def resetAlignment(self): def demo(): "QPixmap Widget" - import demo.qpixmapwidgetdemo - return demo.qpixmapwidgetdemo.main() + from .demo import qpixmapwidgetdemo # after futurize stage1 + return qpixmapwidgetdemo.main() + def main(): diff --git a/lib/taurus/qt/qtgui/display/qsevensegment.py b/lib/taurus/qt/qtgui/display/qsevensegment.py index 8287f8820..999dc5ffb 100644 --- a/lib/taurus/qt/qtgui/display/qsevensegment.py +++ b/lib/taurus/qt/qtgui/display/qsevensegment.py @@ -26,6 +26,7 @@ """ qsevensegmentdisplay.py """ +from __future__ import print_function __all__ = ['Q7SegDigit'] @@ -574,7 +575,7 @@ def main2(): dw = Q7SegDigit() dw.setValue(int(sys.argv[1])) dw.setVisible(True) - print dw + print(dw) a.exec_() diff --git a/lib/taurus/qt/qtgui/display/tauruslabel.py b/lib/taurus/qt/qtgui/display/tauruslabel.py index 7bf7af39c..1473c94f3 100644 --- a/lib/taurus/qt/qtgui/display/tauruslabel.py +++ b/lib/taurus/qt/qtgui/display/tauruslabel.py @@ -24,6 +24,7 @@ ############################################################################# """This module provides a set of basic Taurus widgets based on QLabel""" +from __future__ import absolute_import __all__ = ["TaurusLabel"] @@ -619,7 +620,7 @@ def getQtDesignerPluginInfo(cls): def demo(): "Label" - import demo.tauruslabeldemo + from . import demo.tauruslabeldemo return demo.tauruslabeldemo.main() diff --git a/lib/taurus/qt/qtgui/display/tauruslcd.py b/lib/taurus/qt/qtgui/display/tauruslcd.py index ffc744211..5316b220b 100644 --- a/lib/taurus/qt/qtgui/display/tauruslcd.py +++ b/lib/taurus/qt/qtgui/display/tauruslcd.py @@ -24,6 +24,7 @@ ############################################################################# """This module provides a Taurus widget based on QLCDNumber""" +from __future__ import absolute_import __all__ = ["TaurusLCD"] @@ -106,7 +107,7 @@ def _getDisplayValue(self, widget, valueObj, idx, write): for i in idx: value = value[i] return widget.displayValue(value) - except Exception, e: + except Exception as e: return widget.getNoneValue() @@ -386,7 +387,7 @@ def getQtDesignerPluginInfo(cls): def demo(): "LCD" - import demo.tauruslcddemo + from . import demo.tauruslcddemo return demo.tauruslcddemo.main() diff --git a/lib/taurus/qt/qtgui/display/taurusled.py b/lib/taurus/qt/qtgui/display/taurusled.py index 7ed559add..9da7dfad1 100644 --- a/lib/taurus/qt/qtgui/display/taurusled.py +++ b/lib/taurus/qt/qtgui/display/taurusled.py @@ -25,6 +25,7 @@ ############################################################################# """This module provides a set of basic Taurus widgets based on QLed""" +from __future__ import absolute_import __all__ = ["TaurusLed"] @@ -38,7 +39,7 @@ from taurus.core import DataFormat, AttrQuality, DataType from taurus.qt.qtgui.base import TaurusBaseWidget -from qled import QLed +from .qled import QLed _QT_PLUGIN_INFO = { 'module': 'taurus.qt.qtgui.display', @@ -454,7 +455,7 @@ def getQtDesignerPluginInfo(cls): def demo(): "Led" - import demo.taurusleddemo + from . import demo.taurusleddemo return demo.taurusleddemo.main() diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/builder.py b/lib/taurus/qt/qtgui/extra_guiqwt/builder.py index 0469d401f..5a5175b9b 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/builder.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/builder.py @@ -24,6 +24,7 @@ ############################################################################# """Extension of :mod:`guiqwt.builder`""" +from __future__ import absolute_import __all__ = ["TaurusPlotItemBuilder", "make"] @@ -31,8 +32,8 @@ import guiqwt.builder -from curve import TaurusCurveItem, TaurusTrendItem -from image import (TaurusImageItem, TaurusRGBImageItem, TaurusEncodedImageItem, +from .curve import TaurusCurveItem, TaurusTrendItem +from .image import (TaurusImageItem, TaurusRGBImageItem, TaurusEncodedImageItem, TaurusEncodedRGBImageItem, TaurusXYImageItem) from guiqwt.curve import CurveParam from guiqwt.image import ImageParam, XYImageItem diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/curve.py b/lib/taurus/qt/qtgui/extra_guiqwt/curve.py index fc93efc3d..8ddf2b927 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/curve.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/curve.py @@ -24,6 +24,7 @@ ############################################################################# """Extension of :mod:`guiqwt.curve`""" +from __future__ import print_function __all__ = ["TaurusCurveItem"] @@ -356,11 +357,11 @@ def taurusCurveMain(): elif n == 2: mx, my = mx_my else: - print "Invalid model: %s\n" % mx_my + print("Invalid model: %s\n" % mx_my) parser.print_help(sys.stderr) sys.exit(1) # cycle colors - style = make.style.next() + style = next(make.style) color = style[0] linestyle = style[1:] plot.add_item(make.curve(mx, my, color=color, diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py index d212d74d0..deb30cd14 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py @@ -26,6 +26,7 @@ """ curvesmodel Model and view for new CurveItem configuration """ +from __future__ import print_function __all__ = ['TaurusCurveItemTableModel', 'CurveItemConf', 'CurveItemConfDlg'] #raise UnimplementedError('Under Construction!') @@ -108,7 +109,7 @@ def __init__(self, taurusparam=None, curveparam=None, axesparam=None): self.taurusparam = taurusparam if curveparam is None: curveparam = CurveParam() - style = make.style.next() # cycle through colors and linestyles + style = next(make.style) # cycle through colors and linestyles update_style_attr(style, curveparam) curveparam.line.width = 2 self.curveparam = curveparam @@ -488,7 +489,7 @@ def onApply(self): self.applied.emit() def onReload(self): - print "RELOAD!!! (todo)" + print("RELOAD!!! (todo)") # diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/image.py b/lib/taurus/qt/qtgui/extra_guiqwt/image.py index 0ba398e15..034f6ca3f 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/image.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/image.py @@ -69,7 +69,7 @@ def handleEvent(self, evt_src, evt_type, evt_value): # TODO: units should be used for setting some title in the colorbar try: v = self.filterData(v) - except Exception, e: + except Exception as e: self.info('Ignoring event. Reason: %s', e.message) return # this is the range of the z axis (color scale) @@ -143,7 +143,7 @@ def filterData(self, data): try: fmt, decoded_data = codec.decode(data) - except Exception, e: + except Exception as e: self.info('Decoder error: %s', e.message) raise e diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py index 32f2db748..c68e4cb43 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py @@ -152,7 +152,7 @@ def addModels(self, modelNames): else: self.warning('Invalid model "%s" (Skipping)' % mx_my) # cycle styles - style = self.style.next() + style = next(self.style) color = style[0] linestyle = style[1:] # add the item @@ -289,7 +289,7 @@ def addModels(self, modelNames): # create and attach new TaurusCurveItems for m in modelNames: # cycle styles - style = self.style.next() + style = next(self.style) # add the item item = make.ttrend(m, color=style[0], linestyle=style[ 1:], linewidth=2, taurusparam=copy.deepcopy(self.defaultTaurusparam)) diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/scales.py b/lib/taurus/qt/qtgui/extra_guiqwt/scales.py index e51a4cad1..ab3216cd0 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/scales.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/scales.py @@ -26,6 +26,7 @@ """ scales.py: Custom scales used by taurus.qt.qtgui.plot module """ +from __future__ import print_function __all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", "FixedLabelsScaleDraw"] @@ -326,8 +327,8 @@ def label(self, val): t = datetime.fromtimestamp(val) try: # If the scaleDiv was created by a DateTimeScaleEngine it has a _datetimeLabelFormat s = t.strftime(self._datetimeLabelFormat) - except AttributeError, e: - print "Warning: cannot get the datetime label format (Are you using a DateTimeScaleEngine?)" + except AttributeError as e: + print("Warning: cannot get the datetime label format (Are you using a DateTimeScaleEngine?)") s = t.isoformat(' ') return qwt.QwtText(s) diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py index caf8faac6..dfa2fef84 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py @@ -24,6 +24,7 @@ ############################################################################# """This module contains the graphics factory for the jdraw file format""" +from __future__ import absolute_import __all__ = ["TaurusJDrawGraphicsFactory"] @@ -371,9 +372,9 @@ def set_common_params(self, item, params): pen.setWidth(lineWidth) pen.setStyle(LINESTYLE_JDW2QT[params.get("lineStyle", 0)]) item.setPen(pen) - except AttributeError, ae: + except AttributeError as ae: pass - except Exception, e: + except Exception as e: self.warning('jdraw.set_common_params(%s(%s)).(foreground,width,style) failed!: \n\t%s' % ( type(item).__name__, name, traceback.format_exc())) @@ -419,5 +420,5 @@ def set_item_filling(self, item, pattern=Qt.Qt.Dense4Pattern, expand=False): return if __name__ == "__main__": - import jdraw_view + from . import jdraw_view jdraw_view.jdraw_view_main() diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py index 524378164..3611a48fe 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py @@ -325,7 +325,7 @@ def new_parser(optimize=None, debug=0, outputdir=None): try: p = yacc.yacc(tabmodule=jdraw_yacctab, debugfile=None, write_tables=1, **common_kwargs) - except Exception, e: + except Exception as e: msg = ('Error creating jdraw parser.\n' + 'HINT: Try removing jdraw_lextab.* and jdraw_yacctab.* from %s' % outputdir) diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py index e98dd1a5c..e7bc1792b 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py @@ -24,6 +24,7 @@ ############################################################################# """This module contains the graphics view widget for jdraw files""" +from __future__ import absolute_import __all__ = ["TaurusJDrawSynopticsView"] @@ -39,7 +40,7 @@ from taurus.qt.qtcore.mimetypes import TAURUS_ATTR_MIME_TYPE, TAURUS_DEV_MIME_TYPE, TAURUS_MODEL_MIME_TYPE from taurus.qt.qtgui.base import TaurusBaseWidget -import jdraw_parser +from . import jdraw_parser class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget): @@ -268,7 +269,7 @@ def repaint(self): # self.fitting() def getGraphicsFactory(self, delayed=False): - import jdraw + from . import jdraw # self.parent()) return jdraw.TaurusJDrawGraphicsFactory(self, alias=(self.alias or None), delayed=delayed) diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py index 7373eac44..3bda0d189 100755 --- a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py +++ b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py @@ -25,6 +25,7 @@ """ taurusgraphic.py: """ +from __future__ import print_function # TODO: Tango-centric @@ -140,7 +141,7 @@ def run(self): p = self.parent() while True: item = p.getQueue().get(True) - if type(item) in types.StringTypes: + if type(item) in (str,): if item == "exit": break else: @@ -214,7 +215,7 @@ def __init__(self, parent=None, strt=True): self.debug = self.info = self.warning = self.error = lambda l: self.logger.warning( l) except: - print 'Unable to initialize TaurusGraphicsSceneLogger: %s' % traceback.format_exc() + print('Unable to initialize TaurusGraphicsSceneLogger: %s' % traceback.format_exc()) try: if parent and parent.panelClass() is not None: @@ -439,7 +440,7 @@ def addMenuAction(menu, k, action, last_was_separator=False): elif not last_was_separator: menu.addSeparator() last_was_separator = True - except Exception, e: + except Exception as e: self.warning('Unable to add Menu Action: %s:%s' % (k, e)) return last_was_separator if (mouseEvent.button() == Qt.Qt.RightButton): @@ -575,7 +576,7 @@ def _displaySelectionAsEllipse(self, items): if item not in self._selectedItems: self._selectedItems.append(item) retval = True - except Exception, e: + except Exception as e: self.warning('selectGraphicsItem(%s) failed! %s' % (getattr(item, '_name', item), str(e))) self.warning(traceback.format_exc()) diff --git a/lib/taurus/qt/qtgui/icon/__init__.py b/lib/taurus/qt/qtgui/icon/__init__.py index d660f66a4..1c43a4a5f 100644 --- a/lib/taurus/qt/qtgui/icon/__init__.py +++ b/lib/taurus/qt/qtgui/icon/__init__.py @@ -27,6 +27,7 @@ Utilities for using the bundled icons in Taurus and for registering external sources of icons. """ +from __future__ import absolute_import -from icon import * -from catalog import QIconCatalog +from .icon import * +from .catalog import QIconCatalog diff --git a/lib/taurus/qt/qtgui/icon/catalog.py b/lib/taurus/qt/qtgui/icon/catalog.py index 3d271b98d..b57e2c064 100644 --- a/lib/taurus/qt/qtgui/icon/catalog.py +++ b/lib/taurus/qt/qtgui/icon/catalog.py @@ -24,6 +24,7 @@ """ This module provides an icon catalog widget """ +from __future__ import print_function import os import hashlib @@ -57,7 +58,7 @@ def __build_catalog(self, prefix, columns=10): for path in Qt.QDir.searchPaths(prefix): if not os.path.exists(path): - print " %s not found. Skipping.!" % path + print(" %s not found. Skipping.!" % path) continue for fname in os.listdir(path): diff --git a/lib/taurus/qt/qtgui/icon/icon.py b/lib/taurus/qt/qtgui/icon/icon.py index d7ead72e9..250676d8c 100644 --- a/lib/taurus/qt/qtgui/icon/icon.py +++ b/lib/taurus/qt/qtgui/icon/icon.py @@ -135,7 +135,7 @@ def registerPathFiles(pathfilenames): for filename in pathfilenames: try: pathmap = json.load(open(filename)) - except Exception, e: + except Exception as e: __LOGGER.error('Error registering "%s": %r', filename, e) pathmap = [] diff --git a/lib/taurus/qt/qtgui/input/choicedlg.py b/lib/taurus/qt/qtgui/input/choicedlg.py index 3e50fc322..e07cd69a6 100644 --- a/lib/taurus/qt/qtgui/input/choicedlg.py +++ b/lib/taurus/qt/qtgui/input/choicedlg.py @@ -24,6 +24,7 @@ ########################################################################### """This package provides a dialog for graphically choosing a Taurus class""" +from __future__ import print_function __all__ = ["GraphicalChoiceDlg", "GraphicalChoiceWidget"] @@ -255,7 +256,7 @@ def main(): for k in row: pixmaps[k] = getCachedPixmap('snapshot:%s.png' % k) - print GraphicalChoiceDlg.getChoice(parent=None, title='Panel chooser', msg='Choose the type of Panel:', choices=choices, pixmaps=pixmaps) + print(GraphicalChoiceDlg.getChoice(parent=None, title='Panel chooser', msg='Choose the type of Panel:', choices=choices, pixmaps=pixmaps)) sys.exit() diff --git a/lib/taurus/qt/qtgui/input/taurusspinbox.py b/lib/taurus/qt/qtgui/input/taurusspinbox.py index 078f00637..53613fe00 100644 --- a/lib/taurus/qt/qtgui/input/taurusspinbox.py +++ b/lib/taurus/qt/qtgui/input/taurusspinbox.py @@ -26,10 +26,11 @@ """ This module provides a set of basic taurus widgets based on QAbstractSpinBox """ +from __future__ import absolute_import from taurus.external.qt import Qt -from tauruslineedit import TaurusValueLineEdit +from .tauruslineedit import TaurusValueLineEdit from taurus.qt.qtgui.icon import getStandardIcon from taurus.external.pint import Quantity diff --git a/lib/taurus/qt/qtgui/input/tauruswheel.py b/lib/taurus/qt/qtgui/input/tauruswheel.py index 3070b61f9..1d669767b 100644 --- a/lib/taurus/qt/qtgui/input/tauruswheel.py +++ b/lib/taurus/qt/qtgui/input/tauruswheel.py @@ -24,6 +24,7 @@ ############################################################################# """This module provides a set of basic taurus widgets based on QWheelEdit""" +from __future__ import absolute_import __all__ = ["TaurusWheelEdit"] @@ -34,7 +35,7 @@ from taurus.core.taurusbasetypes import TaurusEventType from taurus.qt.qtgui.base import TaurusBaseWritableWidget -from qwheel import QWheelEdit +from .qwheel import QWheelEdit class TaurusWheelEdit(QWheelEdit, TaurusBaseWritableWidget): diff --git a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py index dd09e26bb..1f59b5612 100755 --- a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py +++ b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py @@ -25,6 +25,7 @@ """DataExportDlg.py: A Qt dialog for showing and exporting x-y Ascii data from one or more curves""" +from __future__ import print_function __all__ = ["QDataExportDialog"] @@ -123,9 +124,9 @@ def exportCurrentData(self, set=None, ofile=None, verbose=True, AllowCloseAfter= else: for x,y in zip(xdata, ydata): text+="%r\t%r\n" % (x, y) - print >> ofile, str(text) + print(str(text), file=ofile) else: - print >> ofile, str(self.dataTE.toPlainText()) + print(str(self.dataTE.toPlainText()), file=ofile) except: Qt.QMessageBox.warning(self, "File saving failed", diff --git a/lib/taurus/qt/qtgui/panel/qdoublelist.py b/lib/taurus/qt/qtgui/panel/qdoublelist.py index 76a051e00..1f6c25cc9 100644 --- a/lib/taurus/qt/qtgui/panel/qdoublelist.py +++ b/lib/taurus/qt/qtgui/panel/qdoublelist.py @@ -28,6 +28,7 @@ qdoublelist.py: Provides a generic dialog containing two list which can move items from one to the other """ +from __future__ import print_function __all__ = ["QDoubleListDlg"] @@ -132,9 +133,9 @@ def main(): list1=['11', '22'], list2=['123', '33']) result = dlg.exec_() - print "Result", result - print "list1", dlg.getAll1() - print "list2", dlg.getAll2() + print("Result", result) + print("list1", dlg.getAll1()) + print("list2", dlg.getAll2()) if __name__ == "__main__": diff --git a/lib/taurus/qt/qtgui/panel/report/albareport.py b/lib/taurus/qt/qtgui/panel/report/albareport.py index 6e5591ae8..4490aacff 100644 --- a/lib/taurus/qt/qtgui/panel/report/albareport.py +++ b/lib/taurus/qt/qtgui/panel/report/albareport.py @@ -24,13 +24,14 @@ ############################################################################# """This module provides a panel to display taurus messages""" +from __future__ import absolute_import __all__ = ["TicketReportHandler"] __docformat__ = 'restructuredtext' from taurus.external.qt import Qt -from basicreport import SendMailDialog, SMTPReportHandler +from .basicreport import SendMailDialog, SMTPReportHandler class SendTicketDialog(SendMailDialog): diff --git a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py index 1f0316aa3..c01a680ed 100644 --- a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py +++ b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py @@ -138,7 +138,7 @@ def removeBranch(self, dict, path): key = val[0] dict[key] = self.removeBranch(dict[key], path) if self._delete == True: - if not dict.has_key('__orderedConfigNames__'): + if '__orderedConfigNames__' not in dict: return dict dict['__orderedConfigNames__'] = self.removeBranch( dict['__orderedConfigNames__'], path) @@ -150,7 +150,7 @@ def removeBranch(self, dict, path): return dict dict.remove(val[0]) return dict - if not dict.has_key('__orderedConfigNames__'): + if '__orderedConfigNames__' not in dict: self._delete = True dict.pop(val[0]) return dict @@ -346,7 +346,7 @@ def getTaurusConfigFromSettings(self, key='TaurusConfig'): if qstate is not None and not qstate.isNull(): try: result = pickle.loads(qstate.data()) - except Exception, e: + except Exception as e: msg = 'problems loading TaurusConfig: \n%s' % repr(e) Qt.QMessageBox.critical(None, 'Error loading settings', msg) return result diff --git a/lib/taurus/qt/qtgui/panel/taurusdemo.py b/lib/taurus/qt/qtgui/panel/taurusdemo.py index de0ef0272..dd7da5032 100644 --- a/lib/taurus/qt/qtgui/panel/taurusdemo.py +++ b/lib/taurus/qt/qtgui/panel/taurusdemo.py @@ -23,6 +23,7 @@ ## ############################################################################# +from __future__ import print_function import sys import operator @@ -75,10 +76,10 @@ def __init__(self, parent=None): continue try: self.addDemo(demo_func.__doc__, demo_func, group) - except Exception, e: - print 80 * "-" - print "Problems adding demo", demo_name - print e + except Exception as e: + print(80 * "-") + print("Problems adding demo", demo_name) + print(e) def addGroup(self, name): g = Qt.QGroupBox(name) @@ -111,12 +112,12 @@ def go(self): dialog.setLayout(layout) layout.addWidget(w) dialog.exec_() - except Exception, e: + except Exception as e: if dialog is not None: dialog.done(0) dialog.hide() dialog = None - print str(e) + print(str(e)) return d = Qt.QErrorMessage() d.showMessage(str(e)) diff --git a/lib/taurus/qt/qtgui/panel/taurusform.py b/lib/taurus/qt/qtgui/panel/taurusform.py index 45cc4a641..09e91c4a8 100644 --- a/lib/taurus/qt/qtgui/panel/taurusform.py +++ b/lib/taurus/qt/qtgui/panel/taurusform.py @@ -24,6 +24,8 @@ ############################################################################# """This module contains taurus Qt form widgets""" +from __future__ import print_function +from __future__ import absolute_import __all__ = ["TaurusAttrForm", "TaurusCommandsForm", "TaurusForm"] @@ -40,7 +42,7 @@ TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_MODEL_MIME_TYPE) from taurus.qt.qtgui.container import TaurusWidget, TaurusScrollArea from taurus.qt.qtgui.button import QButtonBox, TaurusCommandButton -from taurusmodelchooser import TaurusModelChooser +from .taurusmodelchooser import TaurusModelChooser class ParameterCB(Qt.QComboBox): @@ -979,7 +981,7 @@ def test4(): class DummyCW(TaurusValue): def setModel(self, model): - print "!!!!! IN DUMMYCW.SETMODEL", model + print("!!!!! IN DUMMYCW.SETMODEL", model) TaurusValue.setModel(self, model + '/double_scalar') models = ['sys/database/2', 'sys/tg_test/1', 'sys/tg_test/1/short_spectrum', diff --git a/lib/taurus/qt/qtgui/panel/taurusinputpanel.py b/lib/taurus/qt/qtgui/panel/taurusinputpanel.py index 7feb94381..a82c0a9eb 100644 --- a/lib/taurus/qt/qtgui/panel/taurusinputpanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusinputpanel.py @@ -24,6 +24,7 @@ ############################################################################# """This module provides an Input panel (usually used inside a TaurusDialog)""" +from __future__ import print_function __all__ = ["TaurusInputPanel"] @@ -402,7 +403,7 @@ def main(): class Listener(object): def on_accept(self): - print "user selected", self.panel.value() + print("user selected", self.panel.value()) d = dict(prompt="What's your favourite car brand?", data_type=["Mazda", "Skoda", "Citroen", diff --git a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py index 338af7c20..c8af71e57 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py @@ -580,7 +580,7 @@ def py_tg_serv_exc(): try: PyTango.Except.throw_exception( 'TangoException', 'A simple tango exception', 'right here') - except PyTango.DevFailed, df1: + except PyTango.DevFailed as df1: try: import traceback import StringIO diff --git a/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py b/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py index 26365975b..4e04aa3b2 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py +++ b/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py @@ -26,6 +26,8 @@ """ AttributeChooser.py: widget for choosing (a list of) attributes from a tango DB """ +from __future__ import print_function +from __future__ import absolute_import __all__ = ["TaurusModelSelectorTree", "TaurusModelChooser"] @@ -35,7 +37,7 @@ from taurus.qt.qtgui.container import TaurusWidget from taurus.qt.qtgui.tree import TaurusDbTreeWidget from taurus.core.util.containers import CaselessList -from taurusmodellist import TaurusModelList +from .taurusmodellist import TaurusModelList class TaurusModelSelectorTree(TaurusWidget): @@ -358,7 +360,7 @@ def main(args): host = None app = Qt.QApplication(args) - print TaurusModelChooser.modelChooserDlg(host=host) + print(TaurusModelChooser.modelChooserDlg(host=host)) sys.exit() if __name__ == "__main__": diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py index df71a62a5..a7da1e2ac 100644 --- a/lib/taurus/qt/qtgui/panel/taurusvalue.py +++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py @@ -820,7 +820,7 @@ def updateReadWidget(self): try: klass = self.readWidgetClassFactory(self.readWidgetClassID) self._readWidget = self._newSubwidget(self._readWidget, klass) - except Exception, e: + except Exception as e: self._destroyWidget(self._readWidget) self._readWidget = Qt.QLabel('[Error]') msg = 'Error creating read widget:\n' + str(e) @@ -1145,7 +1145,7 @@ def applyConfig(self, configdict, **kwargs): widget_configdict = configdict[key] getattr(self, 'set%sClass' % key)( widget_configdict.get('classid', None)) - if widget_configdict.has_key('delegate'): + if 'delegate' in widget_configdict: widget = getattr(self, key[0].lower() + key[1:])() if isinstance(widget, BaseConfigurableClass): widget.applyConfig(widget_configdict[ diff --git a/lib/taurus/qt/qtgui/plot/arrayedit.py b/lib/taurus/qt/qtgui/plot/arrayedit.py index 984733a27..9d48d5e07 100644 --- a/lib/taurus/qt/qtgui/plot/arrayedit.py +++ b/lib/taurus/qt/qtgui/plot/arrayedit.py @@ -26,12 +26,13 @@ """ arrayedit.py: Widget for editing a spectrum/array via control points """ +from __future__ import absolute_import import numpy from taurus.external.qt import Qt, Qwt5 from taurus.qt.qtgui.util.ui import UILoadable -from curvesAppearanceChooserDlg import CurveAppearanceProperties +from .curvesAppearanceChooserDlg import CurveAppearanceProperties @UILoadable diff --git a/lib/taurus/qt/qtgui/plot/curveprops.py b/lib/taurus/qt/qtgui/plot/curveprops.py index ecfaee425..253ea1fe9 100755 --- a/lib/taurus/qt/qtgui/plot/curveprops.py +++ b/lib/taurus/qt/qtgui/plot/curveprops.py @@ -26,6 +26,7 @@ """ curveprops: Model and view for curve properties """ +from __future__ import absolute_import __all__ = ['CurveConf', 'CurvesTableModel', 'ExtendedSelectionModel', 'CurvePropertiesView'] #raise NotImplementedError('Under Construction!') @@ -40,7 +41,7 @@ from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE from taurus.qt.qtgui.util.ui import UILoadable -from curvesAppearanceChooserDlg import NamedLineStyles, ReverseNamedLineStyles, \ +from .curvesAppearanceChooserDlg import NamedLineStyles, ReverseNamedLineStyles, \ NamedCurveStyles, ReverseNamedCurveStyles, \ NamedSymbolStyles, ReverseNamedSymbolStyles, \ NamedColors, CurveAppearanceProperties diff --git a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py index 51d6a0c2f..0abb8f4ca 100644 --- a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py +++ b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py @@ -28,6 +28,7 @@ A Qt dialog for choosing plot appearance (symbols and lines) for a QwtPlot-derived widget (like Taurusplot) """ +from __future__ import print_function import copy @@ -430,10 +431,10 @@ def __init__(self, sStyle=None, sSize=None, sColor=None, sFill=None, def _print(self): """Just for debug""" - print "-" * 77 + print("-" * 77) for k in self.propertyList: - print k + "= ", self.__getattribute__(k) - print "-" * 77 + print(k + "= ", self.__getattribute__(k)) + print("-" * 77) @staticmethod def inConflict_update_a(a, b): diff --git a/lib/taurus/qt/qtgui/plot/monitor.py b/lib/taurus/qt/qtgui/plot/monitor.py index fca92c3dd..8d9ba2c31 100644 --- a/lib/taurus/qt/qtgui/plot/monitor.py +++ b/lib/taurus/qt/qtgui/plot/monitor.py @@ -26,6 +26,7 @@ """ monitor.py: Specialized mini-trend widget to monitor some scalar value """ +from __future__ import print_function from taurus.external.qt import Qt from taurus.qt.qtgui.plot import TaurusTrend @@ -109,7 +110,7 @@ def event(self, event): elif a.startswith('-config='): CONFIG = a.split('=')[-1] elif a.startswith('-'): # whatever other argument starting by "-" - print "\n Usage: \n%s [-xe|-xt] [-config=configfilename] [model1 [model2] ...]\n" % sys.argv[0] + print("\n Usage: \n%s [-xe|-xt] [-config=configfilename] [model1 [model2] ...]\n" % sys.argv[0]) sys.exit(1) else: # anything that is not a parameter is interpreted as a model MODELS.append(a) diff --git a/lib/taurus/qt/qtgui/plot/qwtdialog.py b/lib/taurus/qt/qtgui/plot/qwtdialog.py index eaf0a5978..e58be927f 100644 --- a/lib/taurus/qt/qtgui/plot/qwtdialog.py +++ b/lib/taurus/qt/qtgui/plot/qwtdialog.py @@ -26,6 +26,8 @@ """ qwtdialog.py: Dialogs for Taurusplot """ +from __future__ import print_function +from __future__ import absolute_import __all__ = ["TaurusPlotConfigDialog"] @@ -72,7 +74,7 @@ def __init__(self, parent=None, flags=Qt.Qt.WindowFlags()): # insert the CurvesAppearanceWidget #(@TODO:must be changed to be done directly in the ui, but I couldn't make the widget available to TaurusDesigner) - from curvesAppearanceChooserDlg import CurvesAppearanceChooser + from .curvesAppearanceChooserDlg import CurvesAppearanceChooser layout = Qt.QVBoxLayout() self.curvesAppearanceChooser = CurvesAppearanceChooser(None) layout.addWidget(self.curvesAppearanceChooser) @@ -165,7 +167,7 @@ def __init__(self, parent=None, flags=Qt.Qt.WindowFlags()): elif scaleType == Qwt5.QwtScaleTransformation.Log10: axes[axis].setCurrentIndex(1) else: - raise TypeError, "TaurusPlotConfigDialog::__init__(): unexpected axis scale type (linear or logarihtmic expected)" + raise TypeError("TaurusPlotConfigDialog::__init__(): unexpected axis scale type (linear or logarihtmic expected)") self.ui.xModeComboBox.setEnabled(not self.parent.getXIsTime()) # determine which axes are visible @@ -268,11 +270,11 @@ def str2deltatime(self, strtime): if strtime[-1] in timeunits.keys(): try: return float(strtime[:-1]) * timeunits[strtime[-1]] - except Exception, e: - print '[str2deltatime] No format could be applied to "%s"' % strtime + except Exception as e: + print('[str2deltatime] No format could be applied to "%s"' % strtime) return None else: - print '[str2deltatime] Non-supported unit "%s"' % strtime[-1] + print('[str2deltatime] Non-supported unit "%s"' % strtime[-1]) return None def strtime2epoch(self, strtime): @@ -321,12 +323,12 @@ def strtime2epoch(self, strtime): t = (lt[0], lt[1], lt[2], t[3], t[ 4], lt[5], lt[6], lt[7], lt[8]) break - except Exception, e: + except Exception as e: pass if t: return time.mktime(t) else: - print 'No format could be applied to "%s"' % strtime + print('No format could be applied to "%s"' % strtime) return None def validate(self): diff --git a/lib/taurus/qt/qtgui/plot/qwtplot.py b/lib/taurus/qt/qtgui/plot/qwtplot.py index abb62408b..e7f2225f4 100644 --- a/lib/taurus/qt/qtgui/plot/qwtplot.py +++ b/lib/taurus/qt/qtgui/plot/qwtplot.py @@ -23,9 +23,9 @@ ## ############################################################################# -print "*" * 77 -print \ - """ +from __future__ import print_function +print("*" * 77) +print(""" If you are seeing this, it is because you tried to access qwtplot.py directly. All funcionality has been moved to taurusplot.py, taurustrend.py and scales.py @@ -34,5 +34,5 @@ If you were trying to launch a stand-alone Taurusplot or TaurusTrend from a script, you should update such script. -""" -print "*" * 77 +""") +print("*" * 77) diff --git a/lib/taurus/qt/qtgui/plot/scales.py b/lib/taurus/qt/qtgui/plot/scales.py index e28993ef2..6d7460ea9 100644 --- a/lib/taurus/qt/qtgui/plot/scales.py +++ b/lib/taurus/qt/qtgui/plot/scales.py @@ -26,6 +26,7 @@ """ scales.py: Custom scales used by taurus.qt.qtgui.plot module """ +from __future__ import print_function __all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", "FixedLabelsScaleDraw"] @@ -318,8 +319,8 @@ def label(self, val): t = datetime.fromtimestamp(val) try: # If the scaleDiv was created by a DateTimeScaleEngine it has a _datetimeLabelFormat s = t.strftime(self._datetimeLabelFormat) - except AttributeError, e: - print "Warning: cannot get the datetime label format (Are you using a DateTimeScaleEngine?)" + except AttributeError as e: + print("Warning: cannot get the datetime label format (Are you using a DateTimeScaleEngine?)") s = t.isoformat(' ') return Qwt5.QwtText(s) diff --git a/lib/taurus/qt/qtgui/plot/taurusarrayedit.py b/lib/taurus/qt/qtgui/plot/taurusarrayedit.py index 2af8463d1..a42db4d51 100644 --- a/lib/taurus/qt/qtgui/plot/taurusarrayedit.py +++ b/lib/taurus/qt/qtgui/plot/taurusarrayedit.py @@ -24,12 +24,13 @@ ############################################################################# +from __future__ import absolute_import from taurus.external.qt import Qt import taurus import numpy from taurus.qt.qtgui.container import TaurusWidget -from arrayedit import ArrayEditor +from .arrayedit import ArrayEditor class TaurusArrayEditor(TaurusWidget): @@ -137,7 +138,7 @@ def onFromAttr(self, quiet=False): x = numpy.arange(y.size) else: x = numpy.array(self._xAttr.read().rvalue) - except Exception, e: + except Exception as e: self.error('Error reading from attribute(s): %s' % (str(e))) if not quiet: Qt.QMessageBox.warning( @@ -182,7 +183,7 @@ def onToAttr(self, quiet=False): if self._xAttr is not None and numpy.any(self._xAttr.read(cache=False).wvalue != x): raise IOError('Unexpected Write error: %s' % self._xAttr.getFullName()) - except Exception, e: + except Exception as e: self.error('Error writing to attribute(s): %s' % (str(e))) if not quiet: Qt.QMessageBox.warning( diff --git a/lib/taurus/qt/qtgui/plot/taurusplot.py b/lib/taurus/qt/qtgui/plot/taurusplot.py index 7163a5ddf..67cb53b79 100644 --- a/lib/taurus/qt/qtgui/plot/taurusplot.py +++ b/lib/taurus/qt/qtgui/plot/taurusplot.py @@ -26,6 +26,8 @@ """ taurusplot.py: Generic graphical plotting widget for Taurus """ +from __future__ import print_function +from __future__ import absolute_import __all__ = ["TaurusCurve", "TaurusCurveMarker", "TaurusXValues", "TaurusPlot", "isodatestr2float"] @@ -48,7 +50,7 @@ from taurus.qt.qtgui.base import TaurusBaseComponent, TaurusBaseWidget from taurus.qt.qtgui.plot import TaurusPlotConfigDialog, FancyScaleDraw,\ DateTimeScaleEngine, FixedLabelsScaleEngine, FixedLabelsScaleDraw -from curvesAppearanceChooserDlg import CurveAppearanceProperties +from .curvesAppearanceChooserDlg import CurveAppearanceProperties def isodatestr2float(s, sep='_'): @@ -535,7 +537,7 @@ def handleEvent(self, src, evt_type, val): ''' if self.isRawData: #self.warning('fireEvent of a RawData curve has been called by %s'%repr(self.sender())) - raise StandardError('called handleEvent of a RawData curve') + raise Exception('called handleEvent of a RawData curve') return model = src if src is not None else self.getModelObj() if model is None: @@ -554,7 +556,7 @@ def handleEvent(self, src, evt_type, val): return try: self.setXYFromModel(value) - except Exception, e: + except Exception as e: self._onDroppedEvent(reason=str(e)) return self._updateMarkers() @@ -1457,7 +1459,7 @@ def isPaused(self): def __debug(self, *args, **kwargs): '''put code here that you want to debug''' - print "!!!!!!!!!!!!!!!1", self.pos() + print("!!!!!!!!!!!!!!!1", self.pos()) Qt.QToolTip.showText(self.mapToGlobal(self.pos()), "ASDASDASDASD DASDAS ASDA", self) @@ -1568,7 +1570,7 @@ def getPlot(self): TaurusPlot.getPlot()''' self.info( 'DEPRECATION WARNING!: Calling TaurusPlot.getPlot() is deprecated. Use the TaurusPlot object itself instead') - print self.sender() + print(self.sender()) return self def getCurve(self, name): @@ -1807,11 +1809,11 @@ def attachRawData(self, rawdata, properties=None, id=None): properties = CurveAppearanceProperties( lColor=self._curvePens.next().color(), lWidth=2) # Deprecation Warning: - if rawdata.has_key("pen") or rawdata.has_key("style"): + if "pen" in rawdata or "style" in rawdata: raise DeprecationWarning( "'pen' or 'style' are no longer supported. Use the properties parameter instead") - if rawdata.has_key("name"): - if rawdata.has_key("title"): + if "name" in rawdata: + if "title" in rawdata: self.error( 'Inconsistence: both "name" and "title" passed for rawdata. Use "title" only') else: @@ -1861,7 +1863,7 @@ def attachRawData(self, rawdata, properties=None, id=None): name = id self.curves_lock.acquire() try: - if self.curves.has_key(name): + if name in self.curves: curve = self.curves.get(name) if curve.isRawData: self.detachRawData(name) @@ -1942,7 +1944,7 @@ def getCurveData(self, curvename, numpy=False): """ self.curves_lock.acquire() try: - if self.curves.has_key(curvename): + if curvename in self.curves: data = self.curves[curvename].data() x = [data.x(i) for i in xrange(data.size())] y = [data.y(i) for i in xrange(data.size())] @@ -1992,7 +1994,7 @@ def updateCurves(self, names): xname = xnames[i] name = str(name) self.debug('updating curve %s' % name) - if not self.curves.has_key(name): + if name not in self.curves: curve = TaurusCurve(name, xname, self, optimized=self.isOptimizationEnabled()) curve.attach(self) @@ -2003,7 +2005,7 @@ def updateCurves(self, names): curve.attachMaxMarker(self) if self._showMinPeaks: curve.attachMinMarker(self) - curve.setPen(self._curvePens.next()) + curve.setPen(next(self._curvePens)) curve.setUseParentModel(self.getUseParentModel()) curve.setTitleText(self.getDefaultCurvesTitle()) curve.registerDataChanged(self, self.curveDataChanged) @@ -2399,7 +2401,7 @@ def createConfig(self, allowUnpickable=False, curvenames=None, **kwargs): rawdatadict[name] = curve.getRawData() else: tangodict[name] = curve.getModel() - except Exception, e: + except Exception as e: self.error( 'Exception while gathering curves configuration info' + str(e)) finally: @@ -2889,8 +2891,8 @@ def setCurvesYAxis(self, curvesNamesList, axis): :param axis: (Qwt5.QwtPlot.Axis) the axis """ if not Qwt5.QwtPlot.axisValid(axis): - raise ValueError, "TaurusPlot::setCurvesYAxis. Invalid axis ID: " + \ - repr(axis) + raise ValueError("TaurusPlot::setCurvesYAxis. Invalid axis ID: " + \ + repr(axis)) self.curves_lock.acquire() try: for curveName in curvesNamesList: @@ -3725,12 +3727,12 @@ def main(): def exportIfAllCurves(curve, trend=w, counters=curves): curve = str(curve) - print '*' * 10 + ' %s: Event received for %s ' % (datetime.now().isoformat(), curve) + '*' * 10 + print('*' * 10 + ' %s: Event received for %s ' % (datetime.now().isoformat(), curve) + '*' * 10) if curve in counters: counters[curve] += 1 if all(counters.values()): trend.exportPdf(options.export_file) - print '*' * 10 + ' %s: Exported to : %s ' % (datetime.now().isoformat(), options.export_file) + '*' * 10 + print('*' * 10 + ' %s: Exported to : %s ' % (datetime.now().isoformat(), options.export_file) + '*' * 10) trend.close() return if not curves: diff --git a/lib/taurus/qt/qtgui/plot/taurusplotconf.py b/lib/taurus/qt/qtgui/plot/taurusplotconf.py index 6d0b490a6..5ade1b8f9 100644 --- a/lib/taurus/qt/qtgui/plot/taurusplotconf.py +++ b/lib/taurus/qt/qtgui/plot/taurusplotconf.py @@ -26,6 +26,8 @@ """ TaurusPlotConf: widget for configurating the contents and appearance of a TaurusPlot """ +from __future__ import print_function +from __future__ import absolute_import __all__ = ['TaurusPlotConfDlg'] @@ -35,7 +37,7 @@ from taurus.external.qt import Qt, Qwt5 from taurus.qt.qtgui.util.ui import UILoadable -import curveprops +from . import curveprops try: import taurus.qt.qtgui.extra_nexus as extra_nexus except: @@ -121,7 +123,7 @@ def __replaceWidget(self, new, old, layout=None): return new def onModelsAdded(self, models): - print models + print(models) nmodels = len(models) rowcount = self.model.rowCount() self.model.insertRows(rowcount, nmodels) @@ -130,14 +132,14 @@ def onModelsAdded(self, models): value=Qt.QVariant(m)) def onApply(self): - print "APPLY!!! (todo)" + print("APPLY!!! (todo)") curveConfs = self.model.dumpData() for c in curveConfs: - print repr(c) + print(repr(c)) def onReload(self): - print "RELOAD!!! (todo)" + print("RELOAD!!! (todo)") class demo(Qt.QDialog): @@ -200,7 +202,7 @@ def onRem(self): def onData(self): cmds = self.model.dumpData() - print self.model.curves + print(self.model.curves) def main1(): diff --git a/lib/taurus/qt/qtgui/plot/taurustrend.py b/lib/taurus/qt/qtgui/plot/taurustrend.py index e40b0327c..cefd98789 100644 --- a/lib/taurus/qt/qtgui/plot/taurustrend.py +++ b/lib/taurus/qt/qtgui/plot/taurustrend.py @@ -26,6 +26,7 @@ """ taurustrend.py: Generic trend widget for Taurus """ +from __future__ import print_function __all__ = ["ScanTrendsSet", "TaurusTrend", "TaurusTrendsSet"] from datetime import datetime @@ -338,7 +339,7 @@ def _updateHistory(self, model, value): v = value.rvalue try: self._yBuffer.append(v) - except Exception, e: + except Exception as e: self.warning('Problem updating history (%s=%s):%s', model, v, e) value = None @@ -354,7 +355,7 @@ def _updateHistory(self, model, value): if self.parent().getXDynScale() or not self.parent().axisAutoScale(Qwt5.QwtPlot.xBottom): try: getArchivedTrendValues(self, model, insert=True) - except Exception, e: + except Exception as e: import traceback self.warning('%s: reading from archiving failed: %s' % ( datetime.now().isoformat('_'), traceback.format_exc())) @@ -438,7 +439,7 @@ def handleEvent(self, evt_src, evt_type, evt_value): try: self._xValues, self._yValues = self._updateHistory( model=model or self.getModel(), value=value) - except Exception, e: + except Exception as e: self._onDroppedEvent(reason=str(e)) raise @@ -1171,7 +1172,7 @@ def updateCurves(self, names): raise ValueError( 'composed ("X|Y") models are not supported by TaurusTrend') # create a new TrendSet if not already there - if not self.trendSets.has_key(name): + if name not in self.trendSets: # check if the model name is of scan type and provides a # door matchScan = re.search(r"scan:\/\/(.*)", name) @@ -1926,12 +1927,12 @@ def main(): def exportIfAllCurves(curve, trend=w, counters=curves): curve = str(curve) - print '*' * 10 + ' %s: Event received for %s ' % (datetime.now().isoformat(), curve) + '*' * 10 + print('*' * 10 + ' %s: Event received for %s ' % (datetime.now().isoformat(), curve) + '*' * 10) if curve in counters: counters[curve] += 1 if all(counters.values()): trend.exportPdf(options.export_file) - print '*' * 10 + ' %s: Exported to : %s ' % (datetime.now().isoformat(), options.export_file) + '*' * 10 + print('*' * 10 + ' %s: Exported to : %s ' % (datetime.now().isoformat(), options.export_file) + '*' * 10) trend.close() return if not curves: diff --git a/lib/taurus/qt/qtgui/resource/__init__.py b/lib/taurus/qt/qtgui/resource/__init__.py index ef0a65b2d..8cc9e87f0 100644 --- a/lib/taurus/qt/qtgui/resource/__init__.py +++ b/lib/taurus/qt/qtgui/resource/__init__.py @@ -27,6 +27,7 @@ Old module supporting resources (now it just contains a reimplementation based on taurus.qt.qtgui.icon for bck-compat) """ +from __future__ import absolute_import from taurus.core.util.log import deprecated as __deprecated @@ -34,4 +35,4 @@ alt='taurus.qt.qtgui.icon', rel='4.0') -from taurus_resource_utils import * +from .taurus_resource_utils import * diff --git a/lib/taurus/qt/qtgui/table/qdictionary.py b/lib/taurus/qt/qtgui/table/qdictionary.py index dd47a808e..91c94b55d 100644 --- a/lib/taurus/qt/qtgui/table/qdictionary.py +++ b/lib/taurus/qt/qtgui/table/qdictionary.py @@ -24,6 +24,7 @@ ############################################################################# """This module provides basic python dictionary/list editor widgets""" +from __future__ import print_function __all__ = ["QDictionaryEditor", "QListEditor"] diff --git a/lib/taurus/qt/qtgui/table/qlogtable.py b/lib/taurus/qt/qtgui/table/qlogtable.py index afbc1b394..eb3919db7 100644 --- a/lib/taurus/qt/qtgui/table/qlogtable.py +++ b/lib/taurus/qt/qtgui/table/qlogtable.py @@ -25,6 +25,7 @@ """This module provides Qt table widgets which display logging messages from the python :mod:`logging` module""" +from __future__ import absolute_import __all__ = ["QLoggingTableModel", "QLoggingTable", "QLoggingWidget", "QRemoteLoggingTableModel"] @@ -47,7 +48,7 @@ from taurus.qt.qtgui.model import FilterToolBar from taurus.qt.qtgui.util import ActionFactory -from qtable import QBaseTableWidget +from .qtable import QBaseTableWidget LEVEL, TIME, MSG, NAME, ORIGIN = range(5) HORIZ_HEADER = 'Level', 'Time', 'Message', 'By', 'Origin' diff --git a/lib/taurus/qt/qtgui/table/taurusdbtable.py b/lib/taurus/qt/qtgui/table/taurusdbtable.py index 4dc111d64..58aab8469 100644 --- a/lib/taurus/qt/qtgui/table/taurusdbtable.py +++ b/lib/taurus/qt/qtgui/table/taurusdbtable.py @@ -25,6 +25,7 @@ """This module provides a base widget that can be used to display a taurus model in a table widget""" +from __future__ import absolute_import # todo: tango-centric!!! @@ -37,7 +38,7 @@ from taurus.qt.qtcore.model import * from taurus.core.taurusauthority import TaurusAuthority from taurus.qt.qtgui.icon import getElementTypeIcon, getElementTypeIconName -from taurustable import TaurusBaseTableWidget +from .taurustable import TaurusBaseTableWidget class TaurusDbTableWidget(TaurusBaseTableWidget): diff --git a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py index 6cab80c41..3f4f145d1 100755 --- a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py +++ b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py @@ -26,6 +26,7 @@ """ taurusdevicepropertytable.py: """ +from __future__ import print_function # todo: tango-centric @@ -54,7 +55,7 @@ def __init__(self, parent=None, designMode=False): self.defineStyle() self.db = None - except Exception, e: + except Exception as e: self.traceback() #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- diff --git a/lib/taurus/qt/qtgui/table/taurusgrid.py b/lib/taurus/qt/qtgui/table/taurusgrid.py index 6a4c5c0b2..1994670b0 100644 --- a/lib/taurus/qt/qtgui/table/taurusgrid.py +++ b/lib/taurus/qt/qtgui/table/taurusgrid.py @@ -29,6 +29,7 @@ integrated with taurus and regular expressions by srubio alba, 2009 """ +from __future__ import print_function # This module needs a total cleanup. Both re. code conventions and algorithms. # --cpascual 20140827 @@ -128,7 +129,7 @@ def get_all_models(expressions, limit=1000): taurus_dp.attribute_list_query( ) if re_match_low(attribute, att.name)] targets.extend(dev + '/' + att for att in attrs) - except Exception, e: + except Exception as e: # self.warning( 'ERROR! TaurusGrid.get_all_models(): Unable to get attributes for device %s: %s' % (dev,str(e))) pass else: @@ -195,7 +196,7 @@ def get_readwrite_models(expressions, limit=1000): ) if re_match_low(attribute, att.name) and att.isReadOnly()] targets.extend(dev + '/' + att for att in attrs) - except Exception, e: + except Exception as e: pass else: targets.append(dev + '/' + attribute) @@ -494,7 +495,7 @@ def setModel(self, model, devsInRows=False, delayed=False, append=False, else: # print 'In setModel(): Thread already started! (%d # objs in queue)'%(self.modelsThread.queue.qsize()) - self.modelsThread.next() + next(self.modelsThread) else: self.trace('In setModel(): models loading delayed!') pass @@ -526,7 +527,7 @@ def parse_labels(self, text): try: labels = eval(text) return labels - except Exception, e: + except Exception as e: self.warning( 'ERROR! Unable to parse labels property: %s' % str(e)) return [] @@ -546,7 +547,7 @@ def setRowLabels(self, rows): section = self.rows[i] self.table.setVerticalHeaderItem( i, QtGui.QTableWidgetItem(section)) - except Exception, e: + except Exception as e: self.debug("setRowLabels(): Exception! %s" % e) # self.create_widgets_table(self._columnsNames) @@ -567,7 +568,7 @@ def setColumnLabels(self, columns): equipment = self.columns[i] self.table.setHorizontalHeaderItem( i, QtGui.QTableWidgetItem(equipment)) - except Exception, e: + except Exception as e: self.debug("setColumnLabels(): Exception! %s" % e) # self.create_widgets_table(self._columnsNames) @@ -1022,9 +1023,9 @@ def sysargs_to_dict(defaults=[]): from taurus.qt.qtgui.application import TaurusApplication if len(sys.argv) < 2: - print "The format of the call is something like:" - print '\t/usr/bin/python taurusgrid.py grid.pickle.file' - print '\t/usr/bin/python taurusgrid.py "model=lt.*/VC.*/.*/((C*)|(P*)|(I*))" cols=IP,CCG,PNV rows=LT01,LT02 others=False rowframe=True colframe=False' + print("The format of the call is something like:") + print('\t/usr/bin/python taurusgrid.py grid.pickle.file') + print('\t/usr/bin/python taurusgrid.py "model=lt.*/VC.*/.*/((C*)|(P*)|(I*))" cols=IP,CCG,PNV rows=LT01,LT02 others=False rowframe=True colframe=False') exit() app = TaurusApplication(sys.argv[0:1]) @@ -1037,7 +1038,7 @@ def sysargs_to_dict(defaults=[]): except: args = sysargs_to_dict( ['model', 'rows', 'cols', 'others', 'rowframe', 'colframe']) - print "args = %s" % args + print("args = %s" % args) if args.get('rows'): gui.setRowLabels(args['rows']) if args.get('cols'): @@ -1048,6 +1049,6 @@ def sysargs_to_dict(defaults=[]): gui.showColumnFrame('colframe' in args and args['colframe'] and True) gui.showOthers('others' in args and args['others'] or True) - print "current TaurusGrid model= %s" % (gui.getModel()) + print("current TaurusGrid model= %s" % (gui.getModel())) gui.show() sys.exit(app.exec_()) diff --git a/lib/taurus/qt/qtgui/table/taurustable.py b/lib/taurus/qt/qtgui/table/taurustable.py index 2d8e00aba..bf08ae05e 100644 --- a/lib/taurus/qt/qtgui/table/taurustable.py +++ b/lib/taurus/qt/qtgui/table/taurustable.py @@ -25,13 +25,14 @@ """This module provides a base widget that can be used to display a taurus model in a table widget""" +from __future__ import absolute_import __all__ = ["TaurusBaseTableWidget"] __docformat__ = 'restructuredtext' from taurus.qt.qtgui.model import TaurusBaseModelWidget -from qtable import QBaseTableWidget +from .qtable import QBaseTableWidget class TaurusBaseTableWidget(QBaseTableWidget, TaurusBaseModelWidget): diff --git a/lib/taurus/qt/qtgui/table/taurusvaluestable.py b/lib/taurus/qt/qtgui/table/taurusvaluestable.py index db5586f3b..b567acb04 100755 --- a/lib/taurus/qt/qtgui/table/taurusvaluestable.py +++ b/lib/taurus/qt/qtgui/table/taurusvaluestable.py @@ -117,7 +117,7 @@ def data(self, index, role=Qt.Qt.DisplayRole): value = self.typeCastingMap[tabledata.dtype.kind](value) return Qt.QVariant(value) elif role == Qt.Qt.DecorationRole: - if (self._modifiedDict.has_key((index.row(), index.column()))) and\ + if ((index.row(), index.column()) in self._modifiedDict) and\ (self._writeMode): if self.getAttr().type in [DataType.Integer, DataType.Float]: value = self._modifiedDict[(index.row(), index.column())] @@ -130,7 +130,7 @@ def data(self, index, role=Qt.Qt.DisplayRole): return Qt.QVariant(icon) elif role == Qt.Qt.EditRole: value = None - if self._modifiedDict.has_key((index.row(), index.column())) and\ + if (index.row(), index.column()) in self._modifiedDict and\ (self._writeMode): value = self._modifiedDict[(index.row(), index.column())] else: @@ -144,7 +144,7 @@ def data(self, index, role=Qt.Qt.DisplayRole): else: return Qt.QVariant(Qt.QColor('white')) elif role == Qt.Qt.ForegroundRole: - if self._modifiedDict.has_key((index.row(), index.column())) and\ + if (index.row(), index.column()) in self._modifiedDict and\ (self._writeMode): if self.getAttr().type in [DataType.Integer, DataType.Float]: value = self._modifiedDict[(index.row(), index.column())] @@ -156,11 +156,11 @@ def data(self, index, role=Qt.Qt.DisplayRole): return Qt.QVariant(Qt.QColor('blue')) return Qt.QVariant(Qt.QColor('black')) elif role == Qt.Qt.FontRole: - if self._modifiedDict.has_key((index.row(), index.column())) and\ + if (index.row(), index.column()) in self._modifiedDict and\ (self._writeMode): return Qt.QVariant(Qt.QFont("Arial", 10, Qt.QFont.Bold)) elif role == Qt.Qt.ToolTipRole: - if self._modifiedDict.has_key((index.row(), index.column())) and\ + if (index.row(), index.column()) in self._modifiedDict and\ (self._writeMode): value = str(self._modifiedDict[(index.row(), index.column())]) msg = 'Original value: %s.\nNew value that will be saved: %s' %\ @@ -243,7 +243,7 @@ def removeValue(self, index): :param index: (QModelIndex) table index ''' - if self._modifiedDict.has_key((index.row(), index.column())): + if (index.row(), index.column()) in self._modifiedDict: self._modifiedDict.pop((index.row(), index.column())) def flags(self, index): @@ -748,7 +748,7 @@ def contextMenuEvent(self, event): index = self._tableView.selectedIndexes()[0] if index.isValid(): val = self._tableView.model().getReadValue(index) - if self._tableView.model().getModifiedDict().has_key((index.row(), index.column())): + if (index.row(), index.column()) in self._tableView.model().getModifiedDict(): menu.addAction(Qt.QIcon.fromTheme( 'edit-undo'), "Reset to original value (%s) " % repr(val), self._tableView.removeChange) menu.addSeparator() diff --git a/lib/taurus/qt/qtgui/taurusgui/__init__.py b/lib/taurus/qt/qtgui/taurusgui/__init__.py index 3bb7e6ab8..27c8c9fa6 100644 --- a/lib/taurus/qt/qtgui/taurusgui/__init__.py +++ b/lib/taurus/qt/qtgui/taurusgui/__init__.py @@ -49,14 +49,15 @@ prevail). """ +from __future__ import absolute_import __docformat__ = 'restructuredtext' -import utils -from paneldescriptionwizard import * -from taurusgui import * -from appsettingswizard import * +from . import utils +from .paneldescriptionwizard import * +from .taurusgui import * +from .appsettingswizard import * try: - from macrolistener import * + from .macrolistener import * except ImportError: pass # allow for sardana not being installed diff --git a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py index d3fdeec81..73052b9a5 100644 --- a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py +++ b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py @@ -32,6 +32,7 @@ time and those customizations will also be stored, this file defines what a user will find when launching the GUI for the first time. """ +from __future__ import print_function __all__ = ["AppSettingsWizard", "ExternalAppEditor"] @@ -241,7 +242,7 @@ def validatePage(self): if not os.path.exists(dirname): try: os.makedirs(dirname) - except Exception, e: + except Exception as e: Qt.QMessageBox.warning(self, 'Error creating project directory', 'Could not create the project directory.\nReason:%s' % repr( e), @@ -260,7 +261,7 @@ def validatePage(self): if option == Qt.QMessageBox.Yes: try: self.wizard().loadXml(fname) - except Exception, e: + except Exception as e: Qt.QMessageBox.warning(self, 'Error loading project configuration', 'Could not load the existing configuration.\nReason:%s' % repr( e), @@ -1304,7 +1305,7 @@ def initializePage(self): def validatePage(self): try: self.createProject() - except Exception, e: + except Exception as e: Qt.QMessageBox.warning(self, 'Error creating project', 'Could not create project files. \nReason:%s' % repr( e), @@ -1398,9 +1399,9 @@ def createProject(self): 'Application project created', msg, Qt.QMessageBox.Ok, self) dlg.setDetailedText(details) dlg.exec_() - print - print msg + details - print + print() + print(msg + details) + print() class AppSettingsWizard(Qt.QWizard): @@ -1487,7 +1488,7 @@ def loadXml(self, fname): def getXml(self): try: return self.__getitem__("xml") - except Exception, e: + except Exception as e: return None def __setitem__(self, name, value): @@ -1499,7 +1500,7 @@ def __getitem__(self, name): if isinstance(p, BasePage): try: return p[name]() - except Exception, e: + except Exception as e: pass return self._item_funcs[name]() diff --git a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/__init__.py b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/__init__.py index 1c3cba20c..931ce2d4b 100644 --- a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/__init__.py +++ b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/__init__.py @@ -23,4 +23,5 @@ ## ########################################################################### -from config import * +from __future__ import absolute_import +from .config import * diff --git a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/__init__.py b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/__init__.py index 1c3cba20c..931ce2d4b 100644 --- a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/__init__.py +++ b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/__init__.py @@ -23,4 +23,5 @@ ## ########################################################################### -from config import * +from __future__ import absolute_import +from .config import * diff --git a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py index 3e430d847..142a30d1a 100644 --- a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py +++ b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py @@ -33,6 +33,7 @@ .. note:: This module will be moved to sardana.taurus at some point. """ +from __future__ import print_function # TODO: move to sardana.taurus @@ -596,5 +597,5 @@ def removeTemporaryPanels(self, names=None): b.setModel('door/cp1/1') - print '...' + print('...') sys.exit(app.exec_()) diff --git a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py index 9167d0e8a..b6837c7dc 100644 --- a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py +++ b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py @@ -23,6 +23,7 @@ ## ########################################################################### +from __future__ import print_function __all__ = ["PanelDescriptionWizard"] """ paneldescriptionwizard.py: @@ -99,7 +100,7 @@ def onModuleSelected(self): # We use this because __import__('x.y') returns x instead of y !! self.module = sys.modules[modulename] self.moduleNameLE.setStyleSheet('QLineEdit {color: green}') - except Exception, e: + except Exception as e: Logger().debug(repr(e)) self.moduleNameLE.setStyleSheet('QLineEdit {color: red}') return @@ -129,7 +130,7 @@ def getMemberDescription(self): membername = str(self.membersCB.currentText()) member = getattr(self.module, membername, None) result = {'modulename': self.module.__name__} - except Exception, e: + except Exception as e: Logger().debug('Cannot get member description: %s', repr(e)) return None if inspect.isclass(member): @@ -307,7 +308,7 @@ def validatePage(self): paneldesc.name = Qt.from_qvariant(self.field('panelname'), str) # allow the wizard to proceed return True - except Exception, e: + except Exception as e: Qt.QMessageBox.warning( self, 'Invalid panel', 'The requested panel cannot be created. \nReason:\n%s' % repr(e)) return False @@ -406,7 +407,7 @@ def __init__(self, parent=None): def initializePage(self): try: widget = self.wizard().getPanelDescription().getWidget() - except Exception, e: + except Exception as e: Logger().debug(repr(e)) widget = None # prevent the user from changing the model if it was already set @@ -417,7 +418,7 @@ def initializePage(self): try: if isinstance(Qt.qApp.SDM, SharedDataManager): sdm = Qt.qApp.SDM - except Exception, e: + except Exception as e: Logger().debug(repr(e)) sdm = None #@todo set selection filter in modelChooser based on the widget's modelclass @@ -652,7 +653,7 @@ def test(): form = PanelDescriptionWizard() def kk(d): - print d + print(d) Qt.qApp.SDM = SharedDataManager(form) Qt.qApp.SDM.connectReader('111111', kk) Qt.qApp.SDM.connectWriter('222222', form, 'thisisasignalname') @@ -664,7 +665,7 @@ def kk(d): def test2(): from taurus.qt.qtgui.application import TaurusApplication app = TaurusApplication(sys.argv) - print ExpertWidgetChooserDlg.getDialog() + print(ExpertWidgetChooserDlg.getDialog()) sys.exit() @@ -675,7 +676,7 @@ def main(): form = Qt.QMainWindow() def kk(d): - print d + print(d) Qt.qApp.SDM = SharedDataManager(form) Qt.qApp.SDM.connectReader('someUID', kk) Qt.qApp.SDM.connectWriter('anotherUID', form, 'thisisasignalname') @@ -688,7 +689,7 @@ def kk(d): w = paneldesc.getWidget(sdm=Qt.qApp.SDM) form.setCentralWidget(w) form.setWindowTitle(paneldesc.name) - print Qt.qApp.SDM.info() + print(Qt.qApp.SDM.info()) sys.exit(app.exec_()) diff --git a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py index f79bd039d..05c91fb3c 100644 --- a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py +++ b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py @@ -162,7 +162,7 @@ def setWidgetFromClassName(self, classname, modulename=None): module = __import__(modulename, fromlist=['']) klass = getattr(module, classname) w = klass() - except Exception, e: + except Exception as e: raise RuntimeError( 'Cannot create widget from classname "%s". Reason: %s' % (classname, repr(e))) # set customwidgetmap if necessary @@ -191,7 +191,7 @@ def applyConfig(self, configdict, depth=-1): 'widgetClassName'), modulename=configdict.get('widgetModuleName', None)) if isinstance(self.widget(), BaseConfigurableClass): self.widget().applyConfig(configdict['widget']) - except Exception, e: + except Exception as e: self.info( 'Failed to set the widget for this panel. Reason: %s' % repr(e)) self.traceback(self.Debug) @@ -820,7 +820,7 @@ def createMainSynoptic(self, synopticname): synoptic = TaurusJDrawSynopticsView() synoptic.setModel(jdwFileName) self.__synoptics.append(synoptic) - except Exception, e: + except Exception as e: # print repr(e) msg = 'Error loading synoptic file "%s".\nSynoptic won\'t be available' % jdwFileName self.error(msg) @@ -880,7 +880,7 @@ def createInstrumentsFromPool(self, macroservername): instruments = ms.getElementsOfType('Instrument') if instruments is None: raise - except Exception, e: + except Exception as e: msg = 'Could not fetch Instrument list from "%s"' % macroservername self.error(msg) result = Qt.QMessageBox.critical(self, 'Initialization error', '%s\n\n%s' % ( @@ -984,7 +984,7 @@ def loadConfiguration(self, confname): else: # if confname is not a dir name, we assume it is a module name in the python path conf = self._importConfiguration(confname) self._confDirectory = os.path.dirname(conf.__file__) - except Exception, e: + except Exception as e: import traceback msg = 'Error loading configuration: %s' % traceback.format_exc() # repr(e) self.error(msg) @@ -1010,7 +1010,7 @@ def loadConfiguration(self, confname): xmlstring = xmlFile.read() xmlFile.close() xmlroot = etree.fromstring(xmlstring) - except Exception, e: + except Exception as e: msg = 'Error reading the XML file: "%s"' % xmlfname self.error(msg) self.traceback(level=taurus.Info) @@ -1185,7 +1185,7 @@ def loadConfiguration(self, confname): # create a panel self.createPanel(w, p.name, floating=p.floating, registerconfig=registerconfig, instrumentkey=instrumentkey, permanent=True) - except Exception, e: + except Exception as e: msg = 'Cannot create panel %s' % getattr( p, 'name', '__Unknown__') self.error(msg) @@ -1227,7 +1227,7 @@ def loadConfiguration(self, confname): if isinstance(w, BaseConfigurableClass): self.registerConfigDelegate(w, d.name) - except Exception, e: + except Exception as e: msg = 'Cannot add toolbar %s' % getattr( d, 'name', '__Unknown__') self.error(msg) @@ -1273,7 +1273,7 @@ def loadConfiguration(self, confname): # register the toolbar as delegate if it supports it if isinstance(w, BaseConfigurableClass): self.registerConfigDelegate(w, d.name) - except Exception, e: + except Exception as e: msg = 'Cannot add applet %s' % getattr( d, 'name', '__Unknown__') self.error(msg) @@ -1509,7 +1509,7 @@ def onExportCurrentPanelConfiguration(self, fname=None): f = open(self._xmlConfigFileName, 'r') xmlroot = etree.fromstring(f.read()) f.close() - except Exception, e: + except Exception as e: self.error('Cannot parse file "%s": %s', self._xmlConfigFileName, str(e)) return @@ -1564,7 +1564,7 @@ def onExportCurrentPanelConfiguration(self, fname=None): f.write(xml) f.close() break - except Exception, e: + except Exception as e: msg = 'Cannot write to %s: %s' % (fname, str(e)) self.error(msg) Qt.QMessageBox.warning( diff --git a/lib/taurus/qt/qtgui/taurusgui/utils.py b/lib/taurus/qt/qtgui/taurusgui/utils.py index 73f95a34a..94fa0e4d5 100644 --- a/lib/taurus/qt/qtgui/taurusgui/utils.py +++ b/lib/taurus/qt/qtgui/taurusgui/utils.py @@ -387,7 +387,7 @@ def fromPanel(panel): # if model is a sequence, convert to space-separated string try: model = " ".join(model) - except Exception, e: + except Exception as e: msg = ('Cannot convert %s to a space-separated string: %s' % (model, e)) Logger().debug(msg) diff --git a/lib/taurus/qt/qtgui/tree/taurusdbtree.py b/lib/taurus/qt/qtgui/tree/taurusdbtree.py index 240749cae..478af1412 100644 --- a/lib/taurus/qt/qtgui/tree/taurusdbtree.py +++ b/lib/taurus/qt/qtgui/tree/taurusdbtree.py @@ -24,6 +24,7 @@ ############################################################################# """This module provides widgets that display the database in a tree format""" +from __future__ import absolute_import # todo: tango-centric!! @@ -37,7 +38,7 @@ from taurus.qt.qtcore.model import * from taurus.qt.qtgui.base import TaurusBaseWidget from taurus.qt.qtgui.icon import getElementTypeIcon, getElementTypeIconName -from taurustree import TaurusBaseTreeWidget +from .taurustree import TaurusBaseTreeWidget class TaurusDbTreeWidget(TaurusBaseTreeWidget): diff --git a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py index 9c57f0e92..2d7773205 100644 --- a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py +++ b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py @@ -26,6 +26,7 @@ """ taurusdevicetree.py: """ +from __future__ import print_function # @todo: This module is not being used anywhere in Taurus and depends on # non-standard and non-provided modules. It is also quite specific and @@ -568,7 +569,7 @@ def defineStyle(self): def trace(self, msg): if self.TRACE_ALL or self.getLogLevel() in ('DEBUG', 40,): # @TODO: use the taurus logger instead! ~~cpascual 20121121 - print 'TaurusDevTree.%s: %s' % (self.getLogLevel(), msg) + print('TaurusDevTree.%s: %s' % (self.getLogLevel(), msg)) def setTangoHost(self, tango_host=None): self.db = taurus.Authority(tango_host) @@ -761,12 +762,12 @@ def addAttrToDev(self, my_device, expert=False, allow_types=None): label = aname == my_attr.label and aname.lower( ) or "%s (%s)" % (aname.lower(), my_attr.label) dct[str(my_device).lower() + '/' + label] = 0 - except PyTango.DevFailed, e: + except PyTango.DevFailed as e: self.warning('addAttrToDev(%s): %s' % (my_device, str(e))) qmsg = Qt.QMessageBox(Qt.QMessageBox.Critical, '%s Error' % my_device, '%s not available' % my_device, Qt.QMessageBox.Ok, self) qmsg.show() - except Exception, e: + except Exception as e: self.warning('addAttrToDev(%s): %s' % (my_device, str(e))) qmsg = Qt.QMessageBox(Qt.QMessageBox.Critical, '%s Error' % my_device, str(e), Qt.QMessageBox.Ok, self) @@ -1006,7 +1007,7 @@ def findInTree(self, regexp, collapseAll=None, exclude=None, select=True, queue= for item in self.item_list if item.isExpanded()] self.debug('findInTree(%s): Node not found' % (regexp)) if queue: - self.Expander.next() + next(self.Expander) except: self.warning('findInTree(%s): failed' % (regexp)) self.error(traceback.format_exc()) @@ -1019,7 +1020,7 @@ def sortCustom(self, order): allChildren[str(it.text(0))] = it sorter = lambda k, ks=[re.compile(c) for c in order]: str( - (i for i, r in enumerate(ks) if r.match(k.lower())).next()) + str(k) + next((i for i, r in enumerate(ks) if r.match(k.lower())))) + str(k) for c, it in sorted(allChildren.items(), key=lambda k: sorter(k[0])): self.debug('tree.sortCustom(%s): %s inserted at %d' % (order, it.text(0), self.topLevelItemCount())) @@ -1298,7 +1299,7 @@ def test_device(): elif not last_was_separator: menu.addSeparator() last_was_separator = True - except Exception, e: + except Exception as e: self.warning('Unable to add Menu Action: %s:%s' % (t, e)) if hasattr(node, 'ExpertMenu'): @@ -1319,7 +1320,7 @@ def test_device(): elif not last_was_separator: expert.addSeparator() last_was_separator = True - except Exception, e: + except Exception as e: self.warning('Unable to add Expert Action: %s:%s' % (t, e)) # menu.addSeparator() menu.exec_(event.globalPos()) @@ -1666,7 +1667,7 @@ def defineStyle(self): try: setattr(self, k, partial( self.method_forwarder, method=k, object=self.tree)) - except Exception, e: + except Exception as e: self.warning('Unable to add slot %s: %s' % (k, e)) # Event forwarding ... self.tree.refreshTree.connect(self.refreshTree) diff --git a/lib/taurus/qt/qtgui/tree/taurustree.py b/lib/taurus/qt/qtgui/tree/taurustree.py index f6d2493ba..57f610c11 100644 --- a/lib/taurus/qt/qtgui/tree/taurustree.py +++ b/lib/taurus/qt/qtgui/tree/taurustree.py @@ -25,13 +25,14 @@ """This module provides a base widget that can be used to display a taurus model in a tree widget""" +from __future__ import absolute_import __all__ = ["TaurusBaseTreeWidget"] __docformat__ = 'restructuredtext' from taurus.qt.qtgui.model import TaurusBaseModelWidget -from qtree import QBaseTreeWidget +from .qtree import QBaseTreeWidget class TaurusBaseTreeWidget(QBaseTreeWidget, TaurusBaseModelWidget): diff --git a/lib/taurus/qt/qtgui/util/taurusaction.py b/lib/taurus/qt/qtgui/util/taurusaction.py index cad0d5158..6395a1af1 100644 --- a/lib/taurus/qt/qtgui/util/taurusaction.py +++ b/lib/taurus/qt/qtgui/util/taurusaction.py @@ -24,6 +24,7 @@ ############################################################################# """This module is designed to provide a library of taurus Qt actions""" +from __future__ import absolute_import __all__ = ["ExternalAppAction", "TaurusMenu", @@ -171,7 +172,7 @@ def build(self, data): self.buildFromXML(m_node) def getActionFactory(self): - import taurusactionfactory + from . import taurusactionfactory return taurusactionfactory.ActionFactory() def buildFromXML(self, m_node): diff --git a/lib/taurus/qt/qtgui/util/taurusactionfactory.py b/lib/taurus/qt/qtgui/util/taurusactionfactory.py index 645167ba1..bf1cb1993 100644 --- a/lib/taurus/qt/qtgui/util/taurusactionfactory.py +++ b/lib/taurus/qt/qtgui/util/taurusactionfactory.py @@ -24,6 +24,7 @@ ############################################################################# """This module is designed to provide a factory class for taurus Qt actions """ +from __future__ import absolute_import __all__ = ["ActionFactory"] @@ -33,7 +34,7 @@ from taurus.core.util.singleton import Singleton from taurus.external.qt import Qt -import taurusaction +from . import taurusaction class ActionFactory(Singleton, Logger): diff --git a/lib/taurus/qt/qtgui/util/tauruscolor.py b/lib/taurus/qt/qtgui/util/tauruscolor.py index 5e3d3cb07..f9a469fb6 100644 --- a/lib/taurus/qt/qtgui/util/tauruscolor.py +++ b/lib/taurus/qt/qtgui/util/tauruscolor.py @@ -57,10 +57,10 @@ def qbrush(self, stoq): f = self._qbrush_cache_fg b = self._qbrush_cache_bg - if not f.has_key(name): + if name not in f: f[name] = Qt.QBrush(self.qcolor(stoq)[1]) - if not b.has_key(name): + if name not in b: b[name] = Qt.QBrush(self.qcolor(stoq)[0]) if name == 'None': b[name].setStyle(Qt.Qt.BDiagPattern) @@ -73,10 +73,10 @@ def qcolor(self, stoq): f = self._qcolor_cache_fg b = self._qcolor_cache_bg - if not f.has_key(name): + if name not in f: f[name] = Qt.QColor(self.number(name, True)) - if not b.has_key(name): + if name not in b: b[name] = Qt.QColor(self.number(name)) return (b[name], f[name]) @@ -87,7 +87,7 @@ def qvariant(self, stoq): f = self._qvariant_cache_fg b = self._qvariant_cache_bg - if not f.has_key(name): + if name not in f: (back, fore) = self.qcolor(name) f[name] = Qt.QVariant(fore) b[name] = Qt.QVariant(back) diff --git a/lib/taurus/qt/qtgui/util/taurusropepatch.py b/lib/taurus/qt/qtgui/util/taurusropepatch.py index 59d9cb7a3..9697c66e7 100644 --- a/lib/taurus/qt/qtgui/util/taurusropepatch.py +++ b/lib/taurus/qt/qtgui/util/taurusropepatch.py @@ -39,7 +39,7 @@ def apply(): """Monkey patching rope for better performances""" import rope if rope.VERSION not in ('0.9.3', '0.9.2'): - raise ImportError, "rope %s can't be patched" % rope.VERSION + raise ImportError("rope %s can't be patched" % rope.VERSION) # Patching pycore.PyCore, so that forced builtin modules (i.e. modules # that were declared as 'extension_modules' in rope preferences) diff --git a/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py b/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py index 26c407a4c..fde5a57a6 100644 --- a/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py +++ b/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py @@ -120,9 +120,9 @@ def _buildWidgets(self, module_name, path, recursive=True): qt_ret[dir_name] = package, attr if issubclass(attr, taurus.qt.qtgui.base.TaurusBaseWidget): taurus_ret[dir_name] = package, attr - except Exception, e: + except Exception as e: pass - except Exception, e: + except Exception as e: return taurus_ret, qt_ret if not recursive: @@ -161,13 +161,13 @@ def _addExtraTaurusWidgetsPath(self, taurus_ret, qt_widgets, path): try: self.debug("Trying to find extra module %s", m_name) f, fname, data = imp.find_module(m_name, [path]) - except ImportError, ie: + except ImportError as ie: self.debug("Could not find extra module %s:%s", m_name, ie) continue try: self.debug("Trying to load extra module %s", m_name) mod = imp.load_module(m_name, f, fname, data) - except ImportError, ie: + except ImportError as ie: self.debug("Could not load extra module %s:%s", m_name, ie) continue dir_names = dir(mod) @@ -184,7 +184,7 @@ def _addExtraTaurusWidgetsPath(self, taurus_ret, qt_widgets, path): taurus_ret[dir_name] = qt_info['module'], attr qt_widgets[dir_name] = qt_info['module'], attr self.debug("registered taurus widget %s", dir_name) - except Exception, e: + except Exception as e: pass def getWidgets(self): diff --git a/lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py b/lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py index c9222933d..1aea86efc 100644 --- a/lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py +++ b/lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py @@ -24,6 +24,7 @@ ############################################################################# """Unit tests for UILoadable decorator""" +from __future__ import absolute_import import os.path @@ -31,7 +32,7 @@ from taurus.external.qt import Qt from taurus.qt.qtgui.util.ui import UILoadable from taurus.qt.qtgui.test import BaseWidgetTestCase -from mywidget3 import MyWidget3 +from .mywidget3 import MyWidget3 class UILoadableTestCase(unittest.TestCase): diff --git a/lib/taurus/test/fuzzytest.py b/lib/taurus/test/fuzzytest.py index f6d1716bb..8efed2c11 100644 --- a/lib/taurus/test/fuzzytest.py +++ b/lib/taurus/test/fuzzytest.py @@ -24,6 +24,7 @@ ############################################################################# '''Utility functions to deal with non-ideal (fuzzy) tests''' +from __future__ import print_function def loopTest(testname, maxtries=100, maxfails=10): @@ -97,8 +98,8 @@ def calculateTestFuzziness(test, maxtries=100, maxfails=10, **kwargs): times that the test should be passed to have a confidence>99%% that the bug is fixed' ''' - print ("Running the test %i times (or until it fails %i times)" + - "to estimate the failure rate") % (maxtries, maxfails) + print(("Running the test %i times (or until it fails %i times)" + + "to estimate the failure rate") % (maxtries, maxfails)) import numpy if isinstance(test, str): @@ -108,11 +109,11 @@ def calculateTestFuzziness(test, maxtries=100, maxfails=10, **kwargs): maxfails=maxfails, **kwargs) r = float(fails) / tries dr = numpy.sqrt(fails) / tries - print 'Failure rate = %g +/- %g (%i/%i)' % (r, dr, fails, tries) + print('Failure rate = %g +/- %g (%i/%i)' % (r, dr, fails, tries)) # calculating n using p-value=1% and failure rate with -1 sigma n = numpy.ceil(numpy.log(.01) / numpy.log(1 - (r - dr))) - print ('Number of consecutive times that the test should be passed ' + - 'to have a confidence>99%% that the bug is fixed: %g') % n + print(('Number of consecutive times that the test should be passed ' + + 'to have a confidence>99%% that the bug is fixed: %g') % n) return r, dr, n @@ -127,7 +128,7 @@ def kk(): exit(1) return - print calculateTestFuzziness(kk) + print(calculateTestFuzziness(kk)) # print calculateTestFuzziness('test_pytango_bug659.TestPyTango_Bug659') # diff --git a/lib/taurus/test/moduleexplorer.py b/lib/taurus/test/moduleexplorer.py index dddd64d7c..af86ab1e6 100644 --- a/lib/taurus/test/moduleexplorer.py +++ b/lib/taurus/test/moduleexplorer.py @@ -25,6 +25,7 @@ ########################################################################### '''Utility code for returning info about a module''' +from __future__ import print_function import sys import os @@ -50,7 +51,7 @@ def _matchesAnyPattern(self, name, paterns): for p in paterns: if re.match(p, name) is not None: if self.verbose: - print 'excluding "%s" (matches %s)' % (name, p.pattern) + print('excluding "%s" (matches %s)' % (name, p.pattern)) return True return False @@ -90,7 +91,7 @@ def exploreModule(self, modulename): externalmembernames, submodules, warnings ''' if self.verbose: - print "Exploring %s..." % modulename + print("Exploring %s..." % modulename) warnings = [] try: module = __import__(modulename, fromlist=['']) @@ -99,7 +100,7 @@ def exploreModule(self, modulename): modulename, repr(e)) warnings.append(msg) if self.verbose: - print msg + print(msg) return dict(modulename=modulename, basemodulename=modulename.split('.')[-1], modulepath=None, @@ -213,12 +214,12 @@ def main(modulename='taurus', exclude_patterns=( ): moduleinfo, allw = ModuleExplorer.explore( modulename, exclude_patterns=exclude_patterns, verbose=True) - print '\n\n' + '*' * 50 - print "Exploration finished with %i warnings:" % (len(allw)) + print('\n\n' + '*' * 50) + print("Exploration finished with %i warnings:" % (len(allw))) for m, w in allw: - print w - print '*' * 50 + '\n' - print + print(w) + print('*' * 50 + '\n') + print() assert len(allw) == 0 # import pprint diff --git a/lib/taurus/test/resource.py b/lib/taurus/test/resource.py index c756bf83e..2ad8fbb5c 100644 --- a/lib/taurus/test/resource.py +++ b/lib/taurus/test/resource.py @@ -24,6 +24,7 @@ ########################################################################### '''Utility code for working with test resources''' +from __future__ import print_function import os import sys @@ -62,8 +63,8 @@ def getResourcePath(resmodule, fname=''): if __name__ == "__main__": - print getResourcePath('taurus.test') - print getResourcePath('taurus.test', 'resource.py') + print(getResourcePath('taurus.test')) + print(getResourcePath('taurus.test', 'resource.py')) # print getResourcePath('taurus.qt.qtgui.plot', 'taurusplot.py') # print getResourcePath('taurus.test', 'kk.py') # print getResourcePath('taurus.kk', 'resource.py') diff --git a/lib/taurus/test/test_import.py b/lib/taurus/test/test_import.py index 9f575a4a6..b8f281900 100644 --- a/lib/taurus/test/test_import.py +++ b/lib/taurus/test/test_import.py @@ -24,6 +24,7 @@ """Taurus import tests""" +from __future__ import absolute_import from taurus.external import unittest @@ -36,7 +37,7 @@ class TaurusImportTestCase(unittest.TestCase): def setUp(self): """Preconditions: moduleexplorer utility has to be available """ - from moduleexplorer import ModuleExplorer + from .moduleexplorer import ModuleExplorer self.explore = ModuleExplorer.explore def testImportSubmodules(self): diff --git a/lib/taurus/test/testsuite.py b/lib/taurus/test/testsuite.py index 34fc0502f..b9e23bc4a 100644 --- a/lib/taurus/test/testsuite.py +++ b/lib/taurus/test/testsuite.py @@ -31,6 +31,7 @@ testsuite.run() """ +from __future__ import print_function __docformat__ = 'restructuredtext' @@ -47,7 +48,7 @@ def _filter_suite(suite, exclude_pattern, ret=None): for e in suite: if isinstance(e, unittest.TestCase): if re.match(exclude_pattern, e.id()): - print "Excluded %s" % e.id() + print("Excluded %s" % e.id()) continue ret.addTest(e) else: @@ -99,7 +100,7 @@ def main(): args = parser.parse_args() if args.version: - print Release.version + print(Release.version) sys.exit(0) if args.skip_gui: From 41dbd47afe946b5c4cce1dcf3c692e435ee7404c Mon Sep 17 00:00:00 2001 From: piertoni Date: Wed, 21 Feb 2018 17:35:12 +0100 Subject: [PATCH 002/252] fix relative import errors --- lib/taurus/qt/qtgui/display/qled.py | 3 ++- lib/taurus/qt/qtgui/display/tauruslabel.py | 5 +++-- lib/taurus/qt/qtgui/display/tauruslcd.py | 3 ++- lib/taurus/qt/qtgui/display/taurusled.py | 5 +++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/taurus/qt/qtgui/display/qled.py b/lib/taurus/qt/qtgui/display/qled.py index efca5c705..9a07e7963 100644 --- a/lib/taurus/qt/qtgui/display/qled.py +++ b/lib/taurus/qt/qtgui/display/qled.py @@ -289,7 +289,8 @@ def resetBlinkingInterval(self): class QLedOld(Qt.QLabel): ledDirPattern = ":leds/images%(size)d" - def __init__(self, parent=None, ledsize=LedSize.SMALL, ledcolor=LedColor.GREEN): + #def __init__(self, parent=None, ledsize=LedSize.SMALL, ledcolor=LedColor.GREEN): #BUG + def __init__(self, parent=None, ledsize=24, ledcolor=LedColor.GREEN): Qt.QLabel.__init__(self, parent) diff --git a/lib/taurus/qt/qtgui/display/tauruslabel.py b/lib/taurus/qt/qtgui/display/tauruslabel.py index 1473c94f3..31e1f8a01 100644 --- a/lib/taurus/qt/qtgui/display/tauruslabel.py +++ b/lib/taurus/qt/qtgui/display/tauruslabel.py @@ -620,8 +620,9 @@ def getQtDesignerPluginInfo(cls): def demo(): "Label" - from . import demo.tauruslabeldemo - return demo.tauruslabeldemo.main() + #from . import demo.tauruslabeldemo # - after futurize stage1 + from display.demo import tauruslabeldemo # + after futurize stage1 + return tauruslabeldemo.main() def main(): diff --git a/lib/taurus/qt/qtgui/display/tauruslcd.py b/lib/taurus/qt/qtgui/display/tauruslcd.py index 5316b220b..b4789ccd6 100644 --- a/lib/taurus/qt/qtgui/display/tauruslcd.py +++ b/lib/taurus/qt/qtgui/display/tauruslcd.py @@ -387,7 +387,8 @@ def getQtDesignerPluginInfo(cls): def demo(): "LCD" - from . import demo.tauruslcddemo + #from . import demo.tauruslcddemo # - after futurize stage1 + import display.demo.tauruslcddemo # + after futurize stage1 return demo.tauruslcddemo.main() diff --git a/lib/taurus/qt/qtgui/display/taurusled.py b/lib/taurus/qt/qtgui/display/taurusled.py index 9da7dfad1..914530ecd 100644 --- a/lib/taurus/qt/qtgui/display/taurusled.py +++ b/lib/taurus/qt/qtgui/display/taurusled.py @@ -455,8 +455,9 @@ def getQtDesignerPluginInfo(cls): def demo(): "Led" - from . import demo.taurusleddemo - return demo.taurusleddemo.main() + #from . import demo.taurusleddemo # - after futurize stage1 + import display.demo.taurusleddemo # + after futurize stage1 + return display.demo.taurusleddemo.main() def main(): From de3d3da230a38d04f66a6f3fcab31182a498e719 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Thu, 28 Jun 2018 13:22:38 +0700 Subject: [PATCH 003/252] Expression 'x' in Enumeration failes on python3 with KeyError. To solve this problem, explicit __contains__ method is added. --- lib/taurus/core/util/enumeration.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/taurus/core/util/enumeration.py b/lib/taurus/core/util/enumeration.py index 7a216565d..45876a76e 100644 --- a/lib/taurus/core/util/enumeration.py +++ b/lib/taurus/core/util/enumeration.py @@ -142,6 +142,12 @@ def _generateUniqueId(self): self._uniqueId += 1 return n + def __contains__(self, i): + if isinstance(i, (int, long)): + return i in self.reverseLookup + elif isinstance(i, (str, unicode)): + return i in self.lookup + def __getitem__(self, i): if isinstance(i, (int, long)): return self.whatis(i) @@ -149,13 +155,13 @@ def __getitem__(self, i): return self.lookup[i] def __getattr__(self, attr): - if not self.has_key(attr): + if attr not in self: raise AttributeError return self.lookup[attr] def __doc_enum(self): rl = self.reverseLookup - keys = rl.keys() + keys = list(rl) keys.sort() values = "\n".join([" - {0} ({1})".format(rl[k], k) for k in keys]) self.__doc__ = self._name + " enumeration. " + \ @@ -163,14 +169,14 @@ def __doc_enum(self): def __str__(self): rl = self.reverseLookup - keys = rl.keys() + keys = list(rl) keys.sort() values = ", ".join([rl[k] for k in keys]) return self._name + "(" + values + ")" def __repr__(self): rl = self.reverseLookup - keys = rl.keys() + keys = list(rl) keys.sort() values = [rl[k] for k in keys] return "Enumeration('" + self._name + "', " + str(values) + ")" From 7210b56edab317dd650e1b96bdf86befaee12bea Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 28 Jun 2018 17:01:11 +0200 Subject: [PATCH 004/252] Add python3 tests to Travis Use the debian-stretch-py3 docker image to test taurus with the python3 stack --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index b95076515..4fab3b68b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,6 +19,7 @@ env: - DOCKER_IMG=cpascual/taurus-test:debian-jessie - DOCKER_IMG=cpascual/taurus-test:debian-stretch - DOCKER_IMG=cpascual/taurus-test:debian-buster + - DOCKER_IMG=cpascual/taurus-test:debian-stretch-py matrix: allow_failures: From 75decce896f4758649ba9ff7f34b1d464da679c0 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 28 Jun 2018 17:19:11 +0200 Subject: [PATCH 005/252] Fix typo in image name in travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4fab3b68b..e72206b41 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ env: - DOCKER_IMG=cpascual/taurus-test:debian-jessie - DOCKER_IMG=cpascual/taurus-test:debian-stretch - DOCKER_IMG=cpascual/taurus-test:debian-buster - - DOCKER_IMG=cpascual/taurus-test:debian-stretch-py + - DOCKER_IMG=cpascual/taurus-test:debian-stretch-py3 matrix: allow_failures: From d532274d23e454b73a382118e035af6ec3a27e55 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 28 Jun 2018 18:34:24 +0200 Subject: [PATCH 006/252] Revert workaround on use of Enumeration QLedOld's init kwarg ledsize was changed to an int in a previous commit as a workaround for python3 support, but the last commit should fix it without need of workaround, so we revert the workaround. --- lib/taurus/qt/qtgui/display/qled.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/taurus/qt/qtgui/display/qled.py b/lib/taurus/qt/qtgui/display/qled.py index 9a07e7963..0cb1e040f 100644 --- a/lib/taurus/qt/qtgui/display/qled.py +++ b/lib/taurus/qt/qtgui/display/qled.py @@ -289,9 +289,8 @@ def resetBlinkingInterval(self): class QLedOld(Qt.QLabel): ledDirPattern = ":leds/images%(size)d" - #def __init__(self, parent=None, ledsize=LedSize.SMALL, ledcolor=LedColor.GREEN): #BUG - def __init__(self, parent=None, ledsize=24, ledcolor=LedColor.GREEN): - + def __init__(self, parent=None, ledsize=LedSize.SMALL, + ledcolor=LedColor.GREEN): Qt.QLabel.__init__(self, parent) self.ledsize = ledsize From 5e632babe3e6e539d8218e1befa57636928093fc Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 28 Jun 2018 19:05:54 +0200 Subject: [PATCH 007/252] Remove calls to dict.has_key Replace them by python3-friendly "in" --- lib/taurus/core/util/containers.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/taurus/core/util/containers.py b/lib/taurus/core/util/containers.py index 899af160d..ce45c0869 100644 --- a/lib/taurus/core/util/containers.py +++ b/lib/taurus/core/util/containers.py @@ -265,8 +265,8 @@ def __contains__(self, key): return dict.__contains__(self, key.lower()) def has_key(self, key): - """overwritten from :meth:`dict.has_key`""" - return dict.has_key(self, key.lower()) + """overwritten from :meth:`dict.has_key` (needed for python2)""" + return key.lower() in self def get(self, key, def_val=None): """overwritten from :meth:`dict.get`""" @@ -318,8 +318,10 @@ def __contains__(self, key): return weakref.WeakValueDictionary.__contains__(self, key.lower()) def has_key(self, key): - """overwritten from :meth:`weakref.WeakValueDictionary.has_key`""" - return weakref.WeakValueDictionary.has_key(self, key.lower()) + """overwritten from :meth:`weakref.WeakValueDictionary + (needed for python2) + """ + return key in self def get(self, key, def_val=None): """overwritten from :meth:`weakref.WeakValueDictionary.get`""" @@ -799,7 +801,7 @@ def set_timewait(self, value): @self_locked def append(self, key, value=None): - if not dict.has_key(self, key): + if key not in self: self.parent.__setitem__(self, key, value) if key not in self._threadkeys: self._threadkeys.append(key) @@ -865,7 +867,7 @@ def __repr__(self): #__repr__ = self_locked(dict.__repr__) #get = self_locked(dict.get) - has_key = self_locked(dict.has_key) + #has_key = self_locked(dict.has_key) update = self_locked(dict.update) copy = self_locked(dict.copy) From 4d5e4d29528b59e238d4c7e808a17a28109ec504 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 28 Jun 2018 19:27:49 +0200 Subject: [PATCH 008/252] Remove declarations of iterXXX in ThreadedDict Just remove them as they are not called anywhere (nor should they) --- lib/taurus/core/util/containers.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/taurus/core/util/containers.py b/lib/taurus/core/util/containers.py index ce45c0869..35abb9607 100644 --- a/lib/taurus/core/util/containers.py +++ b/lib/taurus/core/util/containers.py @@ -874,9 +874,9 @@ def __repr__(self): keys = self_locked(dict.keys) values = self_locked(dict.values) items = self_locked(dict.items) - iterkeys = self_locked(dict.iterkeys) - itervalues = self_locked(dict.itervalues) - iteritems = self_locked(dict.iteritems) + #iterkeys = self_locked(dict.iterkeys) + #itervalues = self_locked(dict.itervalues) + #iteritems = self_locked(dict.iteritems) class SortedDict(dict): From 1b58868c97b6fd0a1aa97126f9a782c0e78d16f5 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 28 Jun 2018 19:39:17 +0200 Subject: [PATCH 009/252] Use six.moves.queue instead of Queue --- lib/taurus/qt/qtcore/util/emitter.py | 4 ++-- lib/taurus/qt/qtgui/graphic/taurusgraphic.py | 4 ++-- lib/taurus/qt/qtgui/table/taurusgrid.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/taurus/qt/qtcore/util/emitter.py b/lib/taurus/qt/qtcore/util/emitter.py index e6b04e11a..c0bb2702a 100644 --- a/lib/taurus/qt/qtcore/util/emitter.py +++ b/lib/taurus/qt/qtcore/util/emitter.py @@ -28,7 +28,7 @@ TaurusDevTree widgets """ -from Queue import Queue, Empty +from six.moves.queue import Queue, Empty import traceback from functools import partial from collections import Iterable @@ -144,7 +144,7 @@ class TaurusEmitterThread(Qt.QThread): .. code-block:: python #Applying TaurusEmitterThread to an existing class: - from Queue import Queue + from six.moves.queue import Queue from functools import partial def modelSetter(args): diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py index 3bda0d189..100c3e516 100755 --- a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py +++ b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py @@ -63,7 +63,7 @@ import operator import types -import Queue +from six.moves.queue import Queue from taurus import Manager from taurus.core import AttrQuality, DataType @@ -830,7 +830,7 @@ def getAllChildren(self, item, klass=None): def start(self): if self.updateThread: return - self.updateQueue = Queue.Queue() + self.updateQueue = Queue() self.updateThread = TaurusGraphicsUpdateThread(self) self.updateThread.start() # Qt.QThread.HighPriority) diff --git a/lib/taurus/qt/qtgui/table/taurusgrid.py b/lib/taurus/qt/qtgui/table/taurusgrid.py index 1994670b0..8e209ce2a 100644 --- a/lib/taurus/qt/qtgui/table/taurusgrid.py +++ b/lib/taurus/qt/qtgui/table/taurusgrid.py @@ -41,7 +41,7 @@ import re import operator import traceback -import Queue +from six.moves.queue import Queue from functools import partial from taurus.external.qt import Qt, QtGui, QtCore @@ -275,7 +275,7 @@ def __init__(self, parent=None, designMode=False): self.hideLabels = False self.defineStyle() - self.modelsQueue = Queue.Queue() + self.modelsQueue = Queue() self.__modelsThread = None if not designMode: self.modelsThread From 99d83c2a4c4d44667dc8b7fcbc9d978c8c56f114 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 28 Jun 2018 19:48:08 +0200 Subject: [PATCH 010/252] Use six.moves.queue instead of Queue (missing occurrence) --- lib/taurus/core/util/threadpool.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/core/util/threadpool.py b/lib/taurus/core/util/threadpool.py index f7945c2cf..2f0bf1006 100644 --- a/lib/taurus/core/util/threadpool.py +++ b/lib/taurus/core/util/threadpool.py @@ -32,7 +32,7 @@ __docformat__ = "restructuredtext" from threading import Thread, currentThread -from Queue import Queue +from six.moves.queue import Queue from time import sleep, time from traceback import extract_stack, format_list From 36e8603761b49d48488ef5f4c0bfa524ee90ee25 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Fri, 29 Jun 2018 01:33:21 +0700 Subject: [PATCH 011/252] Replace deprecated "operator.isSequenceType(obj)" with "isinstance(obj, collections.Sequence)". --- lib/taurus/console/list.py | 5 +++-- lib/taurus/core/taurusmodel.py | 3 ++- lib/taurus/core/util/containers.py | 3 ++- lib/taurus/core/util/event.py | 3 ++- lib/taurus/qt/qtgui/display/tauruslabel.py | 3 ++- lib/taurus/qt/qtgui/display/tauruslcd.py | 3 ++- lib/taurus/qt/qtgui/display/taurusled.py | 3 ++- lib/taurus/qt/qtgui/graphic/taurusgraphic.py | 3 ++- 8 files changed, 17 insertions(+), 9 deletions(-) diff --git a/lib/taurus/console/list.py b/lib/taurus/console/list.py index c1a71f296..56af151b5 100644 --- a/lib/taurus/console/list.py +++ b/lib/taurus/console/list.py @@ -31,6 +31,7 @@ __docformat__ = "restructuredtext" import textwrap +import collections import operator from .enums import Alignment @@ -83,7 +84,7 @@ def getRowSeparator(self): def setMaxColumnWidth(self, max_col_width): if max_col_width is None: max_col_width = -1 - if not operator.isSequenceType(max_col_width): + if not isinstance(max_col_width, collections.Sequence): max_col_width = self.col_nb * [max_col_width] self.MaxColumnWidth = max_col_width @@ -93,7 +94,7 @@ def getMaxColumnWidth(self): max_column_width = property(getMaxColumnWidth, setMaxColumnWidth) def setTextAlignment(self, text_alignment): - if not operator.isSequenceType(text_alignment): + if not isinstance(text_alignment, collections.Sequence): text_alignment = self.col_nb * [text_alignment] self.TextAlignment = text_alignment diff --git a/lib/taurus/core/taurusmodel.py b/lib/taurus/core/taurusmodel.py index dd678b923..0eb7dfa17 100644 --- a/lib/taurus/core/taurusmodel.py +++ b/lib/taurus/core/taurusmodel.py @@ -32,6 +32,7 @@ import weakref import operator import threading +import collections from .util.log import Logger from .util.event import (CallableRef, @@ -280,7 +281,7 @@ def fireEvent(self, event_type, event_value, listeners=None): if listeners is None: return - if not operator.isSequenceType(listeners): + if not isinstance(listeners, collections.Sequence): listeners = listeners, for listener in listeners: diff --git a/lib/taurus/core/util/containers.py b/lib/taurus/core/util/containers.py index 35abb9607..1e0c7c407 100644 --- a/lib/taurus/core/util/containers.py +++ b/lib/taurus/core/util/containers.py @@ -37,6 +37,7 @@ __docformat__ = "restructuredtext" import copy +import collections import time import weakref import operator @@ -622,7 +623,7 @@ def __init__(self, arg=None): """ Initializes the list with a sequence or an initial value. """ if arg is None: list.__init__(self) - elif operator.isSequenceType(arg): + elif isinstance(arg, collections.Sequence): list.__init__(self, arg) else: list.__init__(self) diff --git a/lib/taurus/core/util/event.py b/lib/taurus/core/util/event.py index 78c39ea73..b39142205 100644 --- a/lib/taurus/core/util/event.py +++ b/lib/taurus/core/util/event.py @@ -39,6 +39,7 @@ import weakref import threading import time +import collections import operator import taurus.core @@ -678,7 +679,7 @@ def __init__(self, *attrs): self.connect(attrs) def connect(self, attrs): - if not operator.isSequenceType(attrs): + if not isinstance(attrs, collections.Sequence): attrs = (attrs,) self.disconnect() self._attrs = attrs diff --git a/lib/taurus/qt/qtgui/display/tauruslabel.py b/lib/taurus/qt/qtgui/display/tauruslabel.py index 87e7a1212..81d25ed66 100644 --- a/lib/taurus/qt/qtgui/display/tauruslabel.py +++ b/lib/taurus/qt/qtgui/display/tauruslabel.py @@ -31,6 +31,7 @@ __docformat__ = 'restructuredtext' import operator +import collections import re from taurus.core.taurusbasetypes import (TaurusElementType, TaurusEventType, @@ -345,7 +346,7 @@ def setModelIndex(self, modelIndex): return if type(mi_value) == int: mi_value = mi_value, - if not operator.isSequenceType(mi_value): + if not isinstance(mi_value, collections.Sequence): return self._modelIndex = mi_value self._modelIndexStr = mi diff --git a/lib/taurus/qt/qtgui/display/tauruslcd.py b/lib/taurus/qt/qtgui/display/tauruslcd.py index b4789ccd6..906dcf522 100644 --- a/lib/taurus/qt/qtgui/display/tauruslcd.py +++ b/lib/taurus/qt/qtgui/display/tauruslcd.py @@ -30,6 +30,7 @@ __docformat__ = 'restructuredtext' +import collections import operator from taurus.core.taurusbasetypes import (TaurusElementType, TaurusEventType, @@ -279,7 +280,7 @@ def setModelIndex(self, modelIndex): return if type(mi_value) == int: mi_value = mi_value, - if not operator.isSequenceType(mi_value): + if not isinstance(mi_value, collections.Sequence): return self._modelIndex = mi_value self._modelIndexStr = mi diff --git a/lib/taurus/qt/qtgui/display/taurusled.py b/lib/taurus/qt/qtgui/display/taurusled.py index 41b4dc723..8dcce7212 100644 --- a/lib/taurus/qt/qtgui/display/taurusled.py +++ b/lib/taurus/qt/qtgui/display/taurusled.py @@ -32,6 +32,7 @@ __docformat__ = 'restructuredtext' import weakref +import collections import operator from taurus.external.qt import Qt @@ -345,7 +346,7 @@ def setModelIndex(self, modelIndex): return if type(mi_value) == int: mi_value = mi_value, - if not operator.isSequenceType(mi_value): + if not isinstance(mi_value, collections.Sequence): return self._modelIndex = mi_value self._modelIndexStr = mi diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py index 100c3e516..9b0e0dea8 100755 --- a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py +++ b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py @@ -60,6 +60,7 @@ import os import subprocess import traceback +import collections import operator import types @@ -146,7 +147,7 @@ def run(self): break else: continue - if not operator.isSequenceType(item): + if not isinstance(item, collections.Sequence): item = (item,) # @todo: Unless the call to boundingRect() has a side effect, this line is useless.. probably related to todo in _updateView() item_rects = [i.boundingRect() for i in item] From c035ff2e3c489157f1bdce1159b262f613bc0a4d Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 29 Jun 2018 12:25:55 +0200 Subject: [PATCH 012/252] Revert "Use six.moves.queue instead of Queue" This reverts commit 1b58868c97b6fd0a1aa97126f9a782c0e78d16f5. --- lib/taurus/qt/qtcore/util/emitter.py | 4 ++-- lib/taurus/qt/qtgui/graphic/taurusgraphic.py | 4 ++-- lib/taurus/qt/qtgui/table/taurusgrid.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/taurus/qt/qtcore/util/emitter.py b/lib/taurus/qt/qtcore/util/emitter.py index c0bb2702a..e6b04e11a 100644 --- a/lib/taurus/qt/qtcore/util/emitter.py +++ b/lib/taurus/qt/qtcore/util/emitter.py @@ -28,7 +28,7 @@ TaurusDevTree widgets """ -from six.moves.queue import Queue, Empty +from Queue import Queue, Empty import traceback from functools import partial from collections import Iterable @@ -144,7 +144,7 @@ class TaurusEmitterThread(Qt.QThread): .. code-block:: python #Applying TaurusEmitterThread to an existing class: - from six.moves.queue import Queue + from Queue import Queue from functools import partial def modelSetter(args): diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py index 100c3e516..3bda0d189 100755 --- a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py +++ b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py @@ -63,7 +63,7 @@ import operator import types -from six.moves.queue import Queue +import Queue from taurus import Manager from taurus.core import AttrQuality, DataType @@ -830,7 +830,7 @@ def getAllChildren(self, item, klass=None): def start(self): if self.updateThread: return - self.updateQueue = Queue() + self.updateQueue = Queue.Queue() self.updateThread = TaurusGraphicsUpdateThread(self) self.updateThread.start() # Qt.QThread.HighPriority) diff --git a/lib/taurus/qt/qtgui/table/taurusgrid.py b/lib/taurus/qt/qtgui/table/taurusgrid.py index 8e209ce2a..1994670b0 100644 --- a/lib/taurus/qt/qtgui/table/taurusgrid.py +++ b/lib/taurus/qt/qtgui/table/taurusgrid.py @@ -41,7 +41,7 @@ import re import operator import traceback -from six.moves.queue import Queue +import Queue from functools import partial from taurus.external.qt import Qt, QtGui, QtCore @@ -275,7 +275,7 @@ def __init__(self, parent=None, designMode=False): self.hideLabels = False self.defineStyle() - self.modelsQueue = Queue() + self.modelsQueue = Queue.Queue() self.__modelsThread = None if not designMode: self.modelsThread From dbf3a682742e9a3abbc9267449f49d07ab99bccf Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 29 Jun 2018 12:27:13 +0200 Subject: [PATCH 013/252] Revert "Use six.moves.queue instead of Queue (missing occurrence)" This reverts commit 99d83c2a4c4d44667dc8b7fcbc9d978c8c56f114. --- lib/taurus/core/util/threadpool.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/core/util/threadpool.py b/lib/taurus/core/util/threadpool.py index 2f0bf1006..f7945c2cf 100644 --- a/lib/taurus/core/util/threadpool.py +++ b/lib/taurus/core/util/threadpool.py @@ -32,7 +32,7 @@ __docformat__ = "restructuredtext" from threading import Thread, currentThread -from six.moves.queue import Queue +from Queue import Queue from time import sleep, time from traceback import extract_stack, format_list From 78ae13c243e4aa57c8a46526e30977ee01ffaf63 Mon Sep 17 00:00:00 2001 From: Piergiorgio Pancino Date: Sun, 8 Jul 2018 20:32:49 +0200 Subject: [PATCH 014/252] fix python3 iterator vs python2 list --- lib/taurus/test/test_import.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/test/test_import.py b/lib/taurus/test/test_import.py index 3e7d62428..23b321385 100644 --- a/lib/taurus/test/test_import.py +++ b/lib/taurus/test/test_import.py @@ -63,7 +63,7 @@ def testImportSubmodules(self): exclude_patterns=exclude_patterns) msg = None if wrn: - msg = '\n%s' % '\n'.join(zip(*wrn)[1]) + msg = '\n%s' % '\n'.join(list(zip(*wrn))[1]) self.assertEqual(len(wrn), 0, msg=msg) From 1910eb655d97782c3e2baa817c5395640f024fb6 Mon Sep 17 00:00:00 2001 From: Piergiorgio Pancino Date: Sun, 8 Jul 2018 20:34:28 +0200 Subject: [PATCH 015/252] fix mappingproxy on updating --- lib/taurus/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/taurus/__init__.py b/lib/taurus/__init__.py index 3ed39289e..6b71d42ee 100644 --- a/lib/taurus/__init__.py +++ b/lib/taurus/__init__.py @@ -32,7 +32,8 @@ class Release: pass -Release.__dict__.update(__R.__dict__) +for key, value in __R.__dict__.items(): + setattr(Release, key, value) Release.__doc__ = __R.__doc__ from .core.taurushelper import * From 6f6d9595e7ba831cdbc4042c987eaba2a7b9e812 Mon Sep 17 00:00:00 2001 From: Piergiorgio Pancino Date: Mon, 9 Jul 2018 04:30:55 +0200 Subject: [PATCH 016/252] fix import --- lib/taurus/qt/qtgui/display/tauruslabel.py | 5 ++--- lib/taurus/qt/qtgui/display/tauruslcd.py | 3 +-- lib/taurus/qt/qtgui/display/taurusled.py | 5 ++--- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/lib/taurus/qt/qtgui/display/tauruslabel.py b/lib/taurus/qt/qtgui/display/tauruslabel.py index 81d25ed66..7d97e4882 100644 --- a/lib/taurus/qt/qtgui/display/tauruslabel.py +++ b/lib/taurus/qt/qtgui/display/tauruslabel.py @@ -622,9 +622,8 @@ def getQtDesignerPluginInfo(cls): def demo(): "Label" - #from . import demo.tauruslabeldemo # - after futurize stage1 - from display.demo import tauruslabeldemo # + after futurize stage1 - return tauruslabeldemo.main() + from . import demo + return demo.tauruslabeldemo.main() def main(): diff --git a/lib/taurus/qt/qtgui/display/tauruslcd.py b/lib/taurus/qt/qtgui/display/tauruslcd.py index 906dcf522..cf9b91021 100644 --- a/lib/taurus/qt/qtgui/display/tauruslcd.py +++ b/lib/taurus/qt/qtgui/display/tauruslcd.py @@ -388,8 +388,7 @@ def getQtDesignerPluginInfo(cls): def demo(): "LCD" - #from . import demo.tauruslcddemo # - after futurize stage1 - import display.demo.tauruslcddemo # + after futurize stage1 + from . import demo return demo.tauruslcddemo.main() diff --git a/lib/taurus/qt/qtgui/display/taurusled.py b/lib/taurus/qt/qtgui/display/taurusled.py index 8dcce7212..6a58241bf 100644 --- a/lib/taurus/qt/qtgui/display/taurusled.py +++ b/lib/taurus/qt/qtgui/display/taurusled.py @@ -453,9 +453,8 @@ def getQtDesignerPluginInfo(cls): def demo(): "Led" - #from . import demo.taurusleddemo # - after futurize stage1 - import display.demo.taurusleddemo # + after futurize stage1 - return display.demo.taurusleddemo.main() + from . import demo + return demo.taurusleddemo.main() def main(): From b56e26b87bba864ee2eb95e5d87709d415856e95 Mon Sep 17 00:00:00 2001 From: Piergiorgio Pancino Date: Mon, 9 Jul 2018 04:45:26 +0200 Subject: [PATCH 017/252] apply futurize stage2 --- doc/auto_rst4api.py | 6 +- doc/source/devel/examples/TaurusTest.py | 5 +- doc/source/devel/examples/label06.py | 1 + doc/source/sphinxext/taurusextension.py | 2 + futurize2.log | 5652 +++++++++++++++++ lib/taurus/__init__.py | 5 +- lib/taurus/console/list.py | 8 +- lib/taurus/console/table.py | 31 +- .../core/epics/test/test_epicsattribute.py | 4 +- lib/taurus/core/evaluation/evalattribute.py | 3 +- lib/taurus/core/evaluation/evaldevice.py | 1 + lib/taurus/core/evaluation/evalvalidator.py | 9 +- lib/taurus/core/evaluation/test/res/mymod.py | 2 + .../evaluation/test/test_evalattribute.py | 8 +- lib/taurus/core/release.py | 1 + lib/taurus/core/resource/resfactory.py | 8 +- lib/taurus/core/resource/resvalidator.py | 1 + lib/taurus/core/tango/img/img.py | 6 +- lib/taurus/core/tango/starter.py | 2 + lib/taurus/core/tango/tangoattribute.py | 6 +- lib/taurus/core/tango/tangodatabase.py | 57 +- lib/taurus/core/tango/tangodevice.py | 7 +- lib/taurus/core/tango/tangofactory.py | 14 +- .../core/tango/test/test_tangoattribute.py | 9 +- lib/taurus/core/tango/test/tgtestds.py | 1 + lib/taurus/core/taurusattribute.py | 1 + lib/taurus/core/taurusbasetypes.py | 3 +- lib/taurus/core/taurusconfiguration.py | 1 + lib/taurus/core/taurusdevice.py | 2 +- lib/taurus/core/taurusexception.py | 1 + lib/taurus/core/taurusfactory.py | 7 +- lib/taurus/core/taurushelper.py | 1 + lib/taurus/core/tauruslistener.py | 2 + lib/taurus/core/taurusmanager.py | 5 +- lib/taurus/core/taurusmodel.py | 9 +- lib/taurus/core/tauruspollingtimer.py | 8 +- lib/taurus/core/test/basevalidator.py | 4 +- lib/taurus/core/test/modelequality.py | 1 + lib/taurus/core/test/test_taurushelper.py | 10 +- .../core/util/argparse/taurusargparse.py | 1 + lib/taurus/core/util/codecs.py | 9 +- lib/taurus/core/util/colors.py | 4 +- lib/taurus/core/util/console.py | 7 +- lib/taurus/core/util/constant.py | 3 +- lib/taurus/core/util/containers.py | 31 +- lib/taurus/core/util/decorator/memoize.py | 1 + lib/taurus/core/util/decorator/typecheck.py | 2 + lib/taurus/core/util/enumeration.py | 18 +- lib/taurus/core/util/event.py | 12 +- lib/taurus/core/util/eventfilters.py | 1 + lib/taurus/core/util/excepthook.py | 1 + lib/taurus/core/util/fandango_search.py | 5 +- lib/taurus/core/util/init_bkcomp.py | 2 +- lib/taurus/core/util/init_lightweight.py | 2 +- lib/taurus/core/util/lock.py | 1 + lib/taurus/core/util/log.py | 10 +- lib/taurus/core/util/object.py | 1 + lib/taurus/core/util/property_parser.py | 4 +- lib/taurus/core/util/propertyfile.py | 10 +- lib/taurus/core/util/remotelogmonitor.py | 4 +- lib/taurus/core/util/report/report.py | 1 + lib/taurus/core/util/safeeval.py | 4 +- lib/taurus/core/util/singleton.py | 1 + lib/taurus/core/util/tablepprint.py | 13 +- lib/taurus/core/util/tb.py | 5 +- lib/taurus/core/util/threadpool.py | 9 +- lib/taurus/external/qt/QtCore.py | 5 +- lib/taurus/external/qt/uic.py | 5 +- .../qt/qtcore/communication/communication.py | 4 +- .../qt/qtcore/configuration/configuration.py | 23 +- .../qt/qtcore/model/taurusdatabasemodel.py | 11 +- lib/taurus/qt/qtcore/model/taurusmodel.py | 1 + lib/taurus/qt/qtcore/util/emitter.py | 33 +- lib/taurus/qt/qtcore/util/properties.py | 4 +- lib/taurus/qt/qtcore/util/signal.py | 1 + lib/taurus/qt/qtdesigner/taurusdesigner.py | 1 + .../qtdesigner/taurusplugin/taurusplugin.py | 6 +- .../qt/qtdesigner/tauruspluginplugin.py | 2 +- .../qt/qtgui/application/taurusapplication.py | 1 + lib/taurus/qt/qtgui/base/taurusbase.py | 4 +- lib/taurus/qt/qtgui/base/tauruscontroller.py | 2 + lib/taurus/qt/qtgui/button/taurusbutton.py | 7 +- .../qt/qtgui/compact/abstractswitcher.py | 1 + lib/taurus/qt/qtgui/container/qcontainer.py | 1 + lib/taurus/qt/qtgui/container/taurusframe.py | 3 +- .../qt/qtgui/container/taurusgroupbox.py | 4 +- .../qt/qtgui/container/taurusgroupwidget.py | 3 +- .../qt/qtgui/container/taurusmainwindow.py | 27 +- .../qt/qtgui/container/taurusscrollarea.py | 3 +- .../qt/qtgui/dialog/taurusmessagebox.py | 7 +- lib/taurus/qt/qtgui/display/qled.py | 1 + lib/taurus/qt/qtgui/display/qpixmapwidget.py | 6 +- lib/taurus/qt/qtgui/display/qsevensegment.py | 14 +- lib/taurus/qt/qtgui/display/tauruslabel.py | 6 +- lib/taurus/qt/qtgui/display/tauruslcd.py | 5 +- lib/taurus/qt/qtgui/display/taurusled.py | 5 +- .../qt/qtgui/display/test/test_tauruslabel.py | 1 + lib/taurus/qt/qtgui/editor/tauruseditor.py | 1 + lib/taurus/qt/qtgui/extra_guiqwt/curve.py | 1 + .../qt/qtgui/extra_guiqwt/curvesmodel.py | 9 +- lib/taurus/qt/qtgui/extra_guiqwt/plot.py | 3 + lib/taurus/qt/qtgui/extra_guiqwt/scales.py | 13 +- .../qt/qtgui/extra_guiqwt/taurustrend2d.py | 1 + lib/taurus/qt/qtgui/extra_guiqwt/tools.py | 3 +- .../qt/qtgui/extra_nexus/taurusnexuswidget.py | 3 +- lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py | 12 +- .../qt/qtgui/graphic/jdraw/jdraw_parser.py | 1 + .../qt/qtgui/graphic/jdraw/jdraw_view.py | 10 +- lib/taurus/qt/qtgui/graphic/taurusgraphic.py | 28 +- lib/taurus/qt/qtgui/help/assistant.py | 4 +- lib/taurus/qt/qtgui/icon/catalog.py | 2 +- lib/taurus/qt/qtgui/icon/icon.py | 5 +- lib/taurus/qt/qtgui/input/choicedlg.py | 3 +- lib/taurus/qt/qtgui/input/qwheel.py | 20 +- lib/taurus/qt/qtgui/input/tauruscheckbox.py | 1 + lib/taurus/qt/qtgui/input/tauruscombobox.py | 1 + lib/taurus/qt/qtgui/input/tauruslineedit.py | 8 +- lib/taurus/qt/qtgui/input/taurusspinbox.py | 1 + lib/taurus/qt/qtgui/model/qbasemodel.py | 2 +- .../qt/qtgui/panel/qdataexportdialog.py | 7 +- lib/taurus/qt/qtgui/panel/qdoublelist.py | 6 +- lib/taurus/qt/qtgui/panel/qrawdatachooser.py | 1 + .../qt/qtgui/panel/report/albareport.py | 1 + .../qt/qtgui/panel/report/basicreport.py | 1 + .../qt/qtgui/panel/taurusconfigeditor.py | 9 +- .../qtgui/panel/taurusconfigurationpanel.py | 1 + lib/taurus/qt/qtgui/panel/taurusdemo.py | 5 +- .../qt/qtgui/panel/taurusdevicepanel.py | 12 +- lib/taurus/qt/qtgui/panel/taurusform.py | 12 +- lib/taurus/qt/qtgui/panel/taurusinputpanel.py | 13 +- .../qt/qtgui/panel/taurusmessagepanel.py | 12 +- .../qt/qtgui/panel/taurusmodelchooser.py | 1 + lib/taurus/qt/qtgui/panel/taurusmodellist.py | 10 +- lib/taurus/qt/qtgui/panel/taurusvalue.py | 1 + .../qt/qtgui/panel/test/test_taurusvalue.py | 1 + lib/taurus/qt/qtgui/plot/arrayedit.py | 11 +- lib/taurus/qt/qtgui/plot/curveStatsDlg.py | 22 +- lib/taurus/qt/qtgui/plot/curveprops.py | 13 +- .../qtgui/plot/curvesAppearanceChooserDlg.py | 16 +- lib/taurus/qt/qtgui/plot/qwtdialog.py | 12 +- lib/taurus/qt/qtgui/plot/scales.py | 10 +- lib/taurus/qt/qtgui/plot/taurusarrayedit.py | 1 + lib/taurus/qt/qtgui/plot/taurusplot.py | 92 +- lib/taurus/qt/qtgui/plot/taurustrend.py | 37 +- lib/taurus/qt/qtgui/table/qdictionary.py | 9 +- lib/taurus/qt/qtgui/table/qlogtable.py | 14 +- .../qtgui/table/taurusdevicepropertytable.py | 8 +- lib/taurus/qt/qtgui/table/taurusgrid.py | 14 +- .../qt/qtgui/table/taurusvaluestable.py | 7 +- .../taurusgui/PermanentCustomPanelsDlg.py | 1 + .../qt/qtgui/taurusgui/appsettingswizard.py | 24 +- .../qt/qtgui/taurusgui/macrolistener.py | 11 +- .../qtgui/taurusgui/paneldescriptionwizard.py | 9 +- lib/taurus/qt/qtgui/taurusgui/taurusgui.py | 76 +- lib/taurus/qt/qtgui/taurusgui/utils.py | 13 +- lib/taurus/qt/qtgui/test/base.py | 5 +- lib/taurus/qt/qtgui/tree/qtree.py | 1 + lib/taurus/qt/qtgui/tree/taurusdevicetree.py | 35 +- lib/taurus/qt/qtgui/util/taurusaction.py | 6 +- .../qt/qtgui/util/taurusactionfactory.py | 2 +- .../qt/qtgui/util/tauruswidgetfactory.py | 8 +- lib/taurus/qt/qtgui/util/tauruswidgettree.py | 1 + lib/taurus/qt/qtgui/util/ui.py | 1 + lib/taurus/test/base.py | 2 +- lib/taurus/test/fuzzytest.py | 8 +- lib/taurus/test/moduleexplorer.py | 3 +- lib/taurus/test/test_import.py | 1 + 167 files changed, 6470 insertions(+), 491 deletions(-) create mode 100644 futurize2.log diff --git a/doc/auto_rst4api.py b/doc/auto_rst4api.py index 2c79e6609..d182751b2 100644 --- a/doc/auto_rst4api.py +++ b/doc/auto_rst4api.py @@ -28,6 +28,8 @@ the API of a python module with sphinx''' from __future__ import print_function +from builtins import zip +from builtins import object import sys import os import imp @@ -172,7 +174,7 @@ def createStubs(self, info, docparentpath): if self.verbose: print(' skipping (file already exists)') # recurse for submodules - for sminfo in info['submodules'].itervalues(): + for sminfo in info['submodules'].values(): self.createStubs(sminfo, absdocpath) def documentModule(self, modulename, docparentpath, exclude_patterns=None): @@ -204,7 +206,7 @@ def documentModule(self, modulename, docparentpath, exclude_patterns=None): if len(w) == 0: return [] else: - return zip(*w)[1] + return list(zip(*w))[1] def main(): diff --git a/doc/source/devel/examples/TaurusTest.py b/doc/source/devel/examples/TaurusTest.py index 44149d31b..b6cd4b132 100644 --- a/doc/source/devel/examples/TaurusTest.py +++ b/doc/source/devel/examples/TaurusTest.py @@ -1,4 +1,7 @@ from __future__ import print_function +from __future__ import division +from builtins import range +from past.utils import old_div import PyTango import sys import math @@ -21,7 +24,7 @@ def init_device(self): self._velocity = 20.0 self._acceleration = 4.0 self._simulation_mode = False - self._abscissas = [x / 50.0 for x in xrange(1024)] + self._abscissas = [old_div(x, 50.0) for x in range(1024)] self._curve = [math.sin(x) for x in self._abscissas] def always_executed_hook(self): diff --git a/doc/source/devel/examples/label06.py b/doc/source/devel/examples/label06.py index 0dfbe2a09..4bff08df7 100644 --- a/doc/source/devel/examples/label06.py +++ b/doc/source/devel/examples/label06.py @@ -1,3 +1,4 @@ +from builtins import range import sys from taurus.external.qt import Qt from taurus.qt.qtgui.display import TaurusLabel diff --git a/doc/source/sphinxext/taurusextension.py b/doc/source/sphinxext/taurusextension.py index 16e021db2..c108cc0c2 100644 --- a/doc/source/sphinxext/taurusextension.py +++ b/doc/source/sphinxext/taurusextension.py @@ -26,6 +26,8 @@ """helper methods for taurus sphinx documentation""" from __future__ import print_function +from builtins import str +from builtins import map __expr = ('or',) diff --git a/futurize2.log b/futurize2.log new file mode 100644 index 000000000..12887a347 --- /dev/null +++ b/futurize2.log @@ -0,0 +1,5652 @@ +--- ./doc/auto_rst4api.py (original) ++++ ./doc/auto_rst4api.py (refactored) +@@ -28,6 +28,8 @@ + the API of a python module with sphinx''' + from __future__ import print_function + ++from builtins import zip ++from builtins import object + import sys + import os + import imp +@@ -172,7 +174,7 @@ + if self.verbose: + print(' skipping (file already exists)') + # recurse for submodules +- for sminfo in info['submodules'].itervalues(): ++ for sminfo in info['submodules'].values(): + self.createStubs(sminfo, absdocpath) + + def documentModule(self, modulename, docparentpath, exclude_patterns=None): +@@ -204,7 +206,7 @@ + if len(w) == 0: + return [] + else: +- return zip(*w)[1] ++ return list(zip(*w))[1] + + + def main(): +--- ./doc/source/devel/examples/TaurusTest.py (original) ++++ ./doc/source/devel/examples/TaurusTest.py (refactored) +@@ -1,4 +1,7 @@ + from __future__ import print_function ++from __future__ import division ++from builtins import range ++from past.utils import old_div + import PyTango + import sys + import math +@@ -21,7 +24,7 @@ + self._velocity = 20.0 + self._acceleration = 4.0 + self._simulation_mode = False +- self._abscissas = [x / 50.0 for x in xrange(1024)] ++ self._abscissas = [old_div(x, 50.0) for x in range(1024)] + self._curve = [math.sin(x) for x in self._abscissas] + + def always_executed_hook(self): +--- ./doc/source/devel/examples/label06.py (original) ++++ ./doc/source/devel/examples/label06.py (refactored) +@@ -1,3 +1,4 @@ ++from builtins import range + import sys + from taurus.external.qt import Qt + from taurus.qt.qtgui.display import TaurusLabel +--- ./doc/source/sphinxext/taurusextension.py (original) ++++ ./doc/source/sphinxext/taurusextension.py (refactored) +@@ -26,6 +26,8 @@ + """helper methods for taurus sphinx documentation""" + from __future__ import print_function + ++from builtins import str ++from builtins import map + __expr = ('or',) + + +--- ./lib/taurus/__init__.py (original) ++++ ./lib/taurus/__init__.py (refactored) +@@ -26,13 +26,14 @@ + """The main taurus module. It contains a reduced set of wrappers around the + real taurus model classes and information regarding the current release.""" + ++from builtins import object + from .core import release as __R + + +-class Release: ++class Release(object): + pass + +-for key, value in __R.__dict__.items(): ++for key, value in list(__R.__dict__.items()): + setattr(Release, key, value) + Release.__doc__ = __R.__doc__ + +--- ./lib/taurus/console/list.py (original) ++++ ./lib/taurus/console/list.py (refactored) +@@ -26,6 +26,8 @@ + """ """ + from __future__ import absolute_import + ++from builtins import map ++from builtins import range + __all__ = ["List"] + + __docformat__ = "restructuredtext" +@@ -62,7 +64,7 @@ + self.append(header) + + def setHeaderSeparator(self, header_separator): +- if isinstance(header_separator, (str, unicode)): ++ if isinstance(header_separator, (str, str)): + header_separator = self.col_nb * [header_separator] + self.HeaderSeparator = header_separator + +@@ -72,7 +74,7 @@ + header_separator = property(getHeaderSeparator, setHeaderSeparator) + + def setRowSeparator(self, row_separator): +- if isinstance(row_separator, (str, unicode)): ++ if isinstance(row_separator, (str, str)): + row_separator = self.col_nb * [row_separator] + self.RowSeparator = row_separator + +@@ -104,7 +106,7 @@ + text_alignment = property(getTextAlignment, setTextAlignment) + + def _transform_row(self, row): +- return map(str, row[:self.col_nb]) ++ return list(map(str, row[:self.col_nb])) + + def __setitem__(self, i, row): + return list.__setitem__(self, i, self._transform_row(row)) +--- ./lib/taurus/console/table.py (original) ++++ ./lib/taurus/console/table.py (refactored) +@@ -24,6 +24,11 @@ + ############################################################################# + + """ """ ++from __future__ import division ++from builtins import map ++from builtins import range ++from builtins import object ++from past.utils import old_div + from functools import reduce + + __all__ = ["Table"] +@@ -31,7 +36,7 @@ + __docformat__ = "restructuredtext" + + +-class Table: ++class Table(object): + + DefTermWidth = 80 + +@@ -58,7 +63,7 @@ + self.col_head_sep = col_head_sep + self.border = border + +- max_len_fn = lambda x: reduce(max, map(len, x)) ++ max_len_fn = lambda x: reduce(max, list(map(len, x))) + + self.row_head_str = row_head_str + self.row_head_fmt = row_head_fmt +@@ -81,7 +86,7 @@ + raise ValueError(msg) + if col_head_width is None: + if col_head_str is not None: +- col_head_width = reduce(max, map(max_len_fn, col_head_str)) ++ col_head_width = reduce(max, list(map(max_len_fn, col_head_str))) + else: + col_head_width = 10 + self.col_head_width = col_head_width +@@ -107,7 +112,7 @@ + width = term_width - chw # At least one disp column! + if rhw > 0: + width -= rhw + lcs +- disp_cols = width / (chw + lcs) + 1 ++ disp_cols = old_div(width, (chw + lcs)) + 1 + tot_width = chw + (disp_cols - 1) * (chw + lcs) + tot_rows = chl + self.nr_row + if rhw > 0: +@@ -124,36 +129,36 @@ + else: + row_head = [''] * tot_rows + +- for i in xrange(0, self.nr_col, disp_cols): ++ for i in range(0, self.nr_col, disp_cols): + if i > 0: +- nr_sep = tot_width / len(self.row_sep) ++ nr_sep = old_div(tot_width, len(self.row_sep)) + output.append(self.row_sep * nr_sep) + + row_end = min(i + disp_cols, self.nr_col) + line = list(row_head) +- for j in xrange(i, row_end): ++ for j in range(i, row_end): + elem = self.elem_list[j] + if chl: + col_head = self.col_head_str[j] + if j > i: +- for k in xrange(tot_rows): ++ for k in range(tot_rows): + line[k] += self.col_sep + fmt = self.col_head_fmt +- for k in xrange(chl): ++ for k in range(chl): + line[k] += fmt % (chw, col_head[k]) + +- for k in xrange(self.nr_row): ++ for k in range(self.nr_row): + fmt = self.elem_fmt[k] + line[chl + k] += fmt % (chw, elem[k]) + +- max_width = reduce(max, map(len, line)) ++ max_width = reduce(max, list(map(len, line))) + if self.border is not None: +- nr_border = max_width / len(self.border) ++ nr_border = old_div(max_width, len(self.border)) + output.append(self.border * nr_border) + for l in line[:chl]: + output.append(l) + if self.col_head_sep is not None: +- nr_sep = max_width / len(self.col_head_sep) ++ nr_sep = old_div(max_width, len(self.col_head_sep)) + output.append(self.col_head_sep * nr_sep) + for l in line[chl:]: + output.append(l) +--- ./lib/taurus/core/release.py (original) ++++ ./lib/taurus/core/release.py (refactored) +@@ -23,6 +23,7 @@ + ## + ############################################################################# + ++from builtins import str + __docformat__ = "restructuredtext" + + """ +--- ./lib/taurus/core/taurusattribute.py (original) ++++ ./lib/taurus/core/taurusattribute.py (refactored) +@@ -25,6 +25,7 @@ + + """This module contains the base class for a taurus attribute""" + ++from builtins import str + __all__ = ["TaurusAttribute"] + + __docformat__ = "restructuredtext" +--- ./lib/taurus/core/taurusbasetypes.py (original) ++++ ./lib/taurus/core/taurusbasetypes.py (refactored) +@@ -26,6 +26,7 @@ + a misc collection of basic types + ''' + ++from builtins import object + __all__ = ["TaurusSWDevState", "TaurusSWDevHealth", "OperationMode", + "TaurusSerializationMode", "SubscriptionState", "TaurusEventType", + "MatchLevel", "TaurusElementType", "LockStatus", "DataFormat", +@@ -149,7 +150,7 @@ + __PYTHON_TYPE_TO_TAURUS_DATATYPE = { + str: DataType.String, + int: DataType.Integer, +- long: DataType.Integer, ++ int: DataType.Integer, + float: DataType.Float, + bool: DataType.Boolean, + # bytes : DataType.Bytes, # see below... +--- ./lib/taurus/core/taurusconfiguration.py (original) ++++ ./lib/taurus/core/taurusconfiguration.py (refactored) +@@ -27,6 +27,7 @@ + """[DEPRECATED since taurus v4] + This module contains the base class for a taurus attribute configuration""" + ++from builtins import object + __all__ = ["TaurusConfigurationProxy", "TaurusConfiguration"] + + __docformat__ = "restructuredtext" +--- ./lib/taurus/core/taurusdevice.py (original) ++++ ./lib/taurus/core/taurusdevice.py (refactored) +@@ -126,7 +126,7 @@ + # synchronous polling. + if asynch is True: + return 1 +- for attr in attrs.values(): ++ for attr in list(attrs.values()): + attr.poll() + + @property +--- ./lib/taurus/core/taurusexception.py (original) ++++ ./lib/taurus/core/taurusexception.py (refactored) +@@ -25,6 +25,7 @@ + + """This module contains the taurus base exception classes""" + ++from builtins import str + __all__ = ["TaurusException", "DoubleRegistration"] + + __docformat__ = "restructuredtext" +--- ./lib/taurus/core/taurusfactory.py (original) ++++ ./lib/taurus/core/taurusfactory.py (refactored) +@@ -57,6 +57,7 @@ + """ + from __future__ import absolute_import + ++from builtins import object + __all__ = ["TaurusFactory"] + + __docformat__ = "restructuredtext" +@@ -324,14 +325,14 @@ + if not self.isPollingEnabled(): + return + self._polling_enabled = False +- for period, timer in self.polling_timers.iteritems(): ++ for period, timer in self.polling_timers.items(): + timer.stop() + + def enablePolling(self): + """Enable the application tango polling""" + if self.isPollingEnabled(): + return +- for period, timer in self.polling_timers.iteritems(): ++ for period, timer in self.polling_timers.items(): + timer.start() + self._polling_enabled = True + +@@ -354,7 +355,7 @@ + :param attribute: (str) attribute name. + """ + p = None +- for period, timer in self.polling_timers.iteritems(): ++ for period, timer in self.polling_timers.items(): + if timer.containsAttribute(attribute): + timer.removeAttribute(attribute) + if timer.getAttributeCount() == 0: +--- ./lib/taurus/core/taurushelper.py (original) ++++ ./lib/taurus/core/taurushelper.py (refactored) +@@ -26,6 +26,7 @@ + """a list of helper methods""" + from __future__ import print_function + ++from builtins import str + __all__ = ['check_dependencies', 'log_dependencies', 'getSchemeFromName', + 'getValidTypesForName', 'isValidName', 'makeSchemeExplicit', + 'Manager', 'Factory', 'Device', 'Attribute', 'Configuration', +--- ./lib/taurus/core/tauruslistener.py (original) ++++ ./lib/taurus/core/tauruslistener.py (refactored) +@@ -26,6 +26,8 @@ + """This module contains the taurus base listeners classes""" + from __future__ import print_function + ++from builtins import str ++from builtins import object + __all__ = ["TaurusListener", "TaurusExceptionListener"] + + __docformat__ = "restructuredtext" +--- ./lib/taurus/core/taurusmanager.py (original) ++++ ./lib/taurus/core/taurusmanager.py (refactored) +@@ -26,6 +26,7 @@ + """This module contains the taurus base manager class""" + from __future__ import print_function + ++from builtins import range + __all__ = ["TaurusManager"] + + __docformat__ = "restructuredtext" +@@ -346,7 +347,7 @@ + self.debug('Failed to inspect %s' % (full_module_name)) + self.debug('Details:', exc_info=1) + continue +- for s in m.__dict__.values(): ++ for s in list(m.__dict__.values()): + plugin = None + try: + if issubclass(s, TaurusFactory) and \ +@@ -369,7 +370,7 @@ + + def _find_scheme(self, factory_class): + class_name = factory_class.__name__ +- for i in xrange(1, len(class_name)): ++ for i in range(1, len(class_name)): + if class_name[i].isupper(): + return class_name[:i].lower() + +--- ./lib/taurus/core/taurusmodel.py (original) ++++ ./lib/taurus/core/taurusmodel.py (refactored) +@@ -25,6 +25,7 @@ + + """This module contains the base TaurusModel class""" + ++from builtins import object + __all__ = ["TaurusModel"] + + __docformat__ = "restructuredtext" +@@ -219,7 +220,7 @@ + def _getCallableRef(self, listener, cb=None): + # return weakref.ref(listener, self._listenerDied) + meth = getattr(listener, 'eventReceived', None) +- if meth is not None and operator.isCallable(meth): ++ if meth is not None and hasattr(meth, '__call__'): + return weakref.ref(listener, cb) + else: + return CallableRef(listener, cb) +@@ -249,7 +250,7 @@ + return True + + def forceListening(self): +- class __DummyListener: ++ class __DummyListener(object): + + def eventReceived(self, *args): + pass +@@ -292,9 +293,9 @@ + if l is None: + continue + meth = getattr(l, 'eventReceived', None) +- if meth is not None and operator.isCallable(meth): ++ if meth is not None and hasattr(meth, '__call__'): + l.eventReceived(self, event_type, event_value) +- elif operator.isCallable(l): ++ elif hasattr(l, '__call__'): + l(self, event_type, event_value) + + def isWritable(self): +--- ./lib/taurus/core/tauruspollingtimer.py (original) ++++ ./lib/taurus/core/tauruspollingtimer.py (refactored) +@@ -24,7 +24,9 @@ + ############################################################################# + + """This module contains the polling class""" ++from __future__ import division + ++from past.utils import old_div + __all__ = ["TaurusPollingTimer"] + + __docformat__ = "restructuredtext" +@@ -52,7 +54,7 @@ + self.call__init__(Logger, name, parent) + self.dev_dict = {} + self.attr_nb = 0 +- self.timer = Timer(period / 1000.0, self._pollAttributes, self) ++ self.timer = Timer(old_div(period, 1000.0), self._pollAttributes, self) + self.lock = threading.RLock() + + def start(self): +@@ -134,14 +136,14 @@ + when it is time to poll. Do not call this method directly + """ + req_ids = {} +- for dev, attrs in self.dev_dict.items(): ++ for dev, attrs in list(self.dev_dict.items()): + try: + req_id = dev.poll(attrs, asynch=True) + req_ids[dev] = attrs, req_id + except Exception as e: + self.error("poll_asynch error") + self.debug("Details:", exc_info=1) +- for dev, (attrs, req_id) in req_ids.items(): ++ for dev, (attrs, req_id) in list(req_ids.items()): + try: + dev.poll(attrs, req_id=req_id) + except Exception as e: +--- ./lib/taurus/core/epics/test/test_epicsattribute.py (original) ++++ ./lib/taurus/core/epics/test/test_epicsattribute.py (refactored) +@@ -101,7 +101,7 @@ + self.assertTrue(isinstance(read_value, TaurusAttrValue), msg) + + # Test attribute +- for k, exp in expected.iteritems(): ++ for k, exp in expected.items(): + try: + got = getattr(a, k) + except AttributeError: +@@ -113,7 +113,7 @@ + self.__assertValidValue(exp, got, msg) + + # Test attribute value +- for k, exp in expected_attrv.iteritems(): ++ for k, exp in expected_attrv.items(): + try: + got = getattr(read_value, k) + except AttributeError: +--- ./lib/taurus/core/evaluation/evalattribute.py (original) ++++ ./lib/taurus/core/evaluation/evalattribute.py (refactored) +@@ -22,6 +22,7 @@ + ## + ############################################################################# + ++from builtins import str + __all__ = ['EvaluationAttribute'] + + import numpy +@@ -260,7 +261,7 @@ + trstring = v.replaceUnquotedRef(trstring, '{%s}' % r, symbol) + + # validate the expression (look for missing symbols) +- safesymbols = evaluator.getSafe().keys() ++ safesymbols = list(evaluator.getSafe().keys()) + # remove literal text strings from the validation + trimmedstring = re.sub(QUOTED_TEXT_RE, '', trstring) + for s in set(re.findall(PY_VAR_RE, trimmedstring)): +--- ./lib/taurus/core/evaluation/evaldevice.py (original) ++++ ./lib/taurus/core/evaluation/evaldevice.py (refactored) +@@ -22,6 +22,7 @@ + ## + ############################################################################# + ++from builtins import str + __all__ = ['EvaluationDevice'] + + from taurus import Factory +--- ./lib/taurus/core/evaluation/evalvalidator.py (original) ++++ ./lib/taurus/core/evaluation/evalvalidator.py (refactored) +@@ -23,6 +23,7 @@ + ############################################################################# + + from __future__ import absolute_import ++from builtins import zip + __all__ = ['EvaluationDeviceNameValidator', + 'EvaluationAttributeNameValidator'] + +@@ -263,7 +264,7 @@ + + # Substitute each k by its v in the expr (unless they are in + # references) +- for k, v in substmap.iteritems(): ++ for k, v in substmap.items(): + # create a pattern for matching complete word k + # unless it is within between curly brackets + keyPattern = r'(?=1') +- if operator.isMappingType(obj): ++ if isinstance(obj, collections.Mapping): + name = name or 'DICT%02d' % priority + elif type(obj) in (str,) or obj is None: + name, mod = self.__reloadResource(obj) + obj = {} +- for k, v in mod.__dict__.items(): ++ for k, v in list(mod.__dict__.items()): + if not k.startswith('_') and isinstance(v, basestring): + obj[k] = v + else: +@@ -106,7 +108,7 @@ + if pl is None: + self._resource_priority[priority] = pl = [] + pl.append(name) +- self._resource_priority_keys = self._resource_priority.keys() ++ self._resource_priority_keys = list(self._resource_priority.keys()) + self._resource_priority_keys.sort() + return obj + +--- ./lib/taurus/core/resource/resvalidator.py (original) ++++ ./lib/taurus/core/resource/resvalidator.py (refactored) +@@ -22,6 +22,7 @@ + ## + ############################################################################# + ++from builtins import object + __all__ = ['ResDeviceNameValidator', + 'ResAttributeNameValidator'] + +--- ./lib/taurus/core/tango/starter.py (original) ++++ ./lib/taurus/core/tango/starter.py (refactored) +@@ -31,6 +31,8 @@ + """ + from __future__ import print_function + ++from builtins import range ++from builtins import object + __docformat__ = 'restructuredtext' + + +--- ./lib/taurus/core/tango/tangoattribute.py (original) ++++ ./lib/taurus/core/tango/tangoattribute.py (refactored) +@@ -25,6 +25,8 @@ + + """This module contains all taurus tango attribute""" + ++from builtins import str ++from builtins import range + __all__ = ["TangoAttribute", "TangoAttributeEventListener", "TangoAttrValue"] + + __docformat__ = "restructuredtext" +@@ -114,7 +116,7 @@ + if not (numerical or self._attrRef.type == DataType.Boolean): + # generate a nested empty list of given shape + p.value = [] +- for _ in xrange(len(shape) - 1): ++ for _ in range(len(shape) - 1): + p.value = [p.value] + + rvalue = p.value +@@ -378,7 +380,7 @@ + elif PyTango.is_int_type(tgtype): + # changed as a partial workaround to a problem in PyTango + # writing to DevULong64 attributes (see ALBA RT#29793) +- attrvalue = long(magnitude) ++ attrvalue = int(magnitude) + elif tgtype == PyTango.CmdArgType.DevBoolean: + try: + attrvalue = bool(int(magnitude)) +--- ./lib/taurus/core/tango/tangodatabase.py (original) ++++ ./lib/taurus/core/tango/tangodatabase.py (refactored) +@@ -25,7 +25,14 @@ + + """This module contains all taurus tango authority""" + from __future__ import print_function +- ++from __future__ import division ++ ++from builtins import str ++from builtins import map ++from builtins import range ++from past.utils import old_div ++from builtins import object ++import collections + __all__ = ["TangoInfo", "TangoAttrInfo", "TangoDevInfo", "TangoServInfo", + "TangoDevClassInfo", "TangoDatabaseCache", "TangoDatabase", + "TangoAuthority"] +@@ -105,7 +112,7 @@ + def getDeviceNames(self): + if not hasattr(self, "_device_name_list"): + self._device_name_list = sorted(map(TangoDevInfo.name, +- self._devices.values())) ++ list(self._devices.values()))) + return self._device_name_list + + +@@ -122,8 +129,8 @@ + self._alive = None + self._state = None + self._host = host +- self._domain, self._family, self._member = map(str.upper, +- name.split("/", 2)) ++ self._domain, self._family, self._member = list(map(str.upper, ++ name.split("/", 2))) + self._attributes = None + self._alivePending = False + +@@ -245,12 +252,12 @@ + def getDeviceNames(self): + if not hasattr(self, "_device_name_list"): + self._device_name_list = sorted(map(TangoDevInfo.name, +- self._devices.values())) ++ list(self._devices.values()))) + return self._device_name_list + + def getClassNames(self): + if not hasattr(self, "_klass_name_list"): +- klasses = set(map(TangoDevInfo.klass, self._devices.values())) ++ klasses = set(map(TangoDevInfo.klass, list(self._devices.values()))) + self._klass_name_list = sorted(map(TangoDevClassInfo.name, + klasses)) + return self._klass_name_list +@@ -285,7 +292,7 @@ + try: + self._alivePending = True + alive = True +- for d in self.devices().values(): ++ for d in list(self.devices().values()): + alive = d.alive() + if not alive: + break +@@ -327,7 +334,7 @@ + r = db.command_inout("DbMySqlSelect", query) + row_nb, column_nb = r[0][-2:] + data = r[1] +- assert row_nb == len(data) / column_nb ++ assert row_nb == old_div(len(data), column_nb) + else: + # fallback using tango commands (slow but works with sqlite DB) + # see http://sf.net/p/tauruslib/tickets/148/ +@@ -349,7 +356,7 @@ + CD = CaselessDict + dev_dict, serv_dict, klass_dict, alias_dict = CD(), {}, {}, CD() + +- for i in xrange(0, len(data), column_nb): ++ for i in range(0, len(data), column_nb): + name, alias, exported, host, server, klass = data[i:i + column_nb] + if name.count("/") != 2: + continue # invalid/corrupted entry: just ignore it +@@ -423,13 +430,13 @@ + :return: (sequence) a sequence with all registered device names""" + if self._device_name_list is None: + self._device_name_list = sorted( +- map(TangoDevInfo.name, self.devices().values())) ++ map(TangoDevInfo.name, list(self.devices().values()))) + return self._device_name_list + + def getAliasNames(self): + if self._alias_name_list is None: + self._alias_name_list = sorted( +- map(TangoDevInfo.alias, self.aliases().values())) ++ map(TangoDevInfo.alias, list(self.aliases().values()))) + return self._alias_name_list + + def getServerNames(self): +@@ -438,7 +445,7 @@ + :return: (sequence) a sequence with all registered server names""" + if self._server_name_list is None: + self._server_name_list = sorted( +- map(TangoServInfo.name, self.servers().values())) ++ map(TangoServInfo.name, list(self.servers().values()))) + return self._server_name_list + + def getClassNames(self): +@@ -447,7 +454,7 @@ + :return: (sequence) a sequence with all registered device classes""" + if self._klass_name_list is None: + self._klass_name_list = sorted( +- map(TangoDevClassInfo.name, self.klasses().values())) ++ map(TangoDevClassInfo.name, list(self.klasses().values()))) + return self._klass_name_list + + def deviceTree(self): +@@ -474,13 +481,13 @@ + return self._klasses + + def getDeviceDomainNames(self): +- return self._device_tree.keys() ++ return list(self._device_tree.keys()) + + def getDeviceFamilyNames(self, domain): + families = self._device_tree.get(domain) + if families is None: + return [] +- return families.keys() ++ return list(families.keys()) + + def getDeviceMemberNames(self, domain, family): + families = self._device_tree.get(domain) +@@ -489,7 +496,7 @@ + members = families.get(family) + if members is None: + return [] +- return members.keys() ++ return list(members.keys()) + + def getDomainDevices(self, domain): + return self.deviceTree().getDomainDevices(domain) +@@ -511,8 +518,8 @@ + + def _update(self, other): + try: +- if operator.isMappingType(other): +- other = other.values() ++ if isinstance(other, collections.Mapping): ++ other = list(other.values()) + for dev in other: + try: + self.addDevice(dev) +@@ -537,7 +544,7 @@ + def getDomainDevices(self, domain): + """Returns all devices under the given domain. Returns empty list if + the domain doesn't exist or doesn't contain any devices""" +- return self._devices.get(domain, {}).values() ++ return list(self._devices.get(domain, {}).values()) + + def getFamilyDevices(self, domain, family): + """Returns all devices under the given domain/family. Returns empty list if +@@ -545,7 +552,7 @@ + families = self.get(domain) + if families is None: + return +- return families.get(family, {}).values() ++ return list(families.get(family, {}).values()) + + + class TangoServerTree(dict): +@@ -557,8 +564,8 @@ + + def _update(self, other): + try: +- if operator.isMappingType(other): +- other = other.values() ++ if isinstance(other, collections.Mapping): ++ other = list(other.values()) + for serv in other: + try: + self.addServer(serv) +@@ -578,7 +585,7 @@ + def getServerNameInstances(self, serverName): + """Returns all servers under the given serverName. Returns empty list if + the server name doesn't exist or doesn't contain any instances""" +- return self.get(serverName, {}).values() ++ return list(self.get(serverName, {}).values()) + + + def get_home(): +@@ -649,7 +656,7 @@ + # illegal line! + continue + +- key, val = map(str.strip, tup) ++ key, val = list(map(str.strip, tup)) + if key == env_var_name: + return val + +@@ -702,7 +709,7 @@ + serv_name = self.command_inout("DbGetDeviceInfo", dev_name)[1][3] + devs = self.get_device_class_list(serv_name) + dev_name_lower = dev_name.lower() +- for i in xrange(len(devs) / 2): ++ for i in range(old_div(len(devs), 2)): + idx = i * 2 + if devs[idx].lower() == dev_name_lower: + return devs[idx + 1] +--- ./lib/taurus/core/tango/tangodevice.py (original) ++++ ./lib/taurus/core/tango/tangodevice.py (refactored) +@@ -25,6 +25,7 @@ + + """This module defines the TangoDevice object""" + ++from builtins import object + __all__ = ["TangoDevice"] + + __docformat__ = "restructuredtext" +@@ -320,7 +321,7 @@ + + def __pollResult(self, attrs, ts, result, error=False): + if error: +- for attr in attrs.values(): ++ for attr in list(attrs.values()): + attr.poll(single=False, value=None, error=result, time=ts) + return + +@@ -335,7 +336,7 @@ + def __pollAsynch(self, attrs): + ts = time.time() + try: +- req_id = self.read_attributes_asynch(attrs.keys()) ++ req_id = self.read_attributes_asynch(list(attrs.keys())) + except DevFailed as e: + return False, e, ts + return True, req_id, ts +@@ -363,7 +364,7 @@ + error = False + ts = time.time() + try: +- result = self.read_attributes(attrs.keys()) ++ result = self.read_attributes(list(attrs.keys())) + except DevFailed as e: + error = True + result = e +--- ./lib/taurus/core/tango/tangofactory.py (original) ++++ ./lib/taurus/core/tango/tangofactory.py (refactored) +@@ -131,16 +131,16 @@ + def cleanUp(self): + """Cleanup the singleton instance""" + self.trace("[TangoFactory] cleanUp") +- for k, v in self.tango_attrs.items(): ++ for k, v in list(self.tango_attrs.items()): + v.cleanUp() +- for k, v in self.tango_dev_queries.items(): ++ for k, v in list(self.tango_dev_queries.items()): + v.cleanUp() +- for k, v in self.tango_devs.items(): ++ for k, v in list(self.tango_devs.items()): + v.cleanUp() + self.dft_db = None +- for k, v in self.tango_db_queries.items(): ++ for k, v in list(self.tango_db_queries.items()): + v.cleanUp() +- for k, v in self.tango_db.items(): ++ for k, v in list(self.tango_db.items()): + v.cleanUp() + self.reInit() + +@@ -552,14 +552,14 @@ + if not self.isPollingEnabled(): + return + self._polling_enabled = False +- for period, timer in self.polling_timers.iteritems(): ++ for period, timer in self.polling_timers.items(): + timer.stop() + + def enablePolling(self): + """Enable the application tango polling""" + if self.isPollingEnabled(): + return +- for period, timer in self.polling_timers.iteritems(): ++ for period, timer in self.polling_timers.items(): + timer.start() + self._polling_enabled = True + +--- ./lib/taurus/core/tango/img/img.py (original) ++++ ./lib/taurus/core/tango/img/img.py (refactored) +@@ -25,7 +25,9 @@ + + """The img submodule. It contains specific device implementation for CCDs and + 2D detectors""" ++from __future__ import division + ++from past.utils import old_div + __all__ = ['ImageDevice', 'ImageCounterDevice', 'PyImageViewer', 'ImgGrabber', + 'CCDPVCAM', 'ImgBeamAnalyzer', 'Falcon', 'LimaCCDs'] + +@@ -164,9 +166,9 @@ + def getImageData(self, names=None): + data = ImageCounterDevice.getImageData(self, names=names) + if self._color: +- for k, v in data.items(): ++ for k, v in list(data.items()): + s = v[1].value.shape +- v[1].value = v[1].value.reshape((s[0], s[1] / 3, 3)) ++ v[1].value = v[1].value.reshape((s[0], old_div(s[1], 3), 3)) + return data + + +--- ./lib/taurus/core/tango/test/test_tangoattribute.py (original) ++++ ./lib/taurus/core/tango/test/test_tangoattribute.py (refactored) +@@ -27,6 +27,7 @@ + + # __all__ = [] + ++from builtins import map + __docformat__ = 'restructuredtext' + + import numpy +@@ -771,12 +772,12 @@ + got = getattr(attr, cfg) + msg = '%s.%s from Taurus do not mach, expected %s read %s' %\ + (attr_name, cfg, expected, got) +- map(self.__assertValidValue, got, expected, msg) ++ list(map(self.__assertValidValue, got, expected, msg)) + + msg = '%s.%s from Tango do not mach, expected %s read %s' %\ + (attr_name, cfg, expected, got) + tangovalue = self._getDecodePyTangoAttr(attr_name, cfg) +- map(self.__assertValidValue, got, tangovalue, msg) ++ list(map(self.__assertValidValue, got, tangovalue, msg)) + + def write_read_attr(self, attrname=None, setvalue=None, expected=None, + expected_attrv=None, expectedshape=None): +@@ -801,7 +802,7 @@ + self.assertTrue(isinstance(read_value, TangoAttrValue), msg) + + # Test attribute +- for k, exp in expected.iteritems(): ++ for k, exp in expected.items(): + try: + got = getattr(a, k) + except AttributeError: +@@ -813,7 +814,7 @@ + self.__assertValidValue(exp, got, msg) + + # Test attribute value +- for k, exp in expected_attrv.iteritems(): ++ for k, exp in expected_attrv.items(): + try: + got = getattr(read_value, k) + except AttributeError: +--- ./lib/taurus/core/tango/test/tgtestds.py (original) ++++ ./lib/taurus/core/tango/test/tgtestds.py (refactored) +@@ -25,6 +25,7 @@ + + """Module containing base classes for using the TangoSchemeTest DS in tests""" + ++from builtins import object + __all__ = ['TangoSchemeTestLauncher'] + + __docformat__ = 'restructuredtext' +--- ./lib/taurus/core/test/basevalidator.py (original) ++++ ./lib/taurus/core/test/basevalidator.py (refactored) +@@ -27,6 +27,8 @@ + + #__all__ = [] + ++from builtins import str ++from builtins import object + __docformat__ = 'restructuredtext' + + +@@ -49,7 +51,7 @@ + self.assertTrue(self.validator().isValid(name, strict=strict), msg) + if groups is not None: + returned = self.validator().getUriGroups(name, strict=strict) +- for k, v in groups.iteritems(): ++ for k, v in groups.items(): + msg = ('"%s" not in %s.getUriGroups("%s"). Returned %s' % + (k, self.validator.__name__, name, returned)) + self.assertIn(k, returned, msg=msg) +--- ./lib/taurus/core/test/modelequality.py (original) ++++ ./lib/taurus/core/test/modelequality.py (refactored) +@@ -22,6 +22,7 @@ + ## + ############################################################################# + ++from builtins import object + import functools + + from taurus import Device, Attribute # , Authority +--- ./lib/taurus/core/test/test_taurushelper.py (original) ++++ ./lib/taurus/core/test/test_taurushelper.py (refactored) +@@ -212,7 +212,7 @@ + elementType = [elementType] + manager = taurus.Manager() + scheme = manager.getScheme(name) +- supportedSchemes = manager.getPlugins().keys() ++ supportedSchemes = list(manager.getPlugins().keys()) + if scheme not in supportedSchemes: + self.skipTest('"%s" scheme not supported' % scheme) + returned = taurus.isValidName(name, etypes=elementType, strict=strict) +@@ -240,7 +240,7 @@ + klass = TaurusAuthority + manager = taurus.Manager() + scheme = manager.getScheme(name) +- supportedSchemes = manager.getPlugins().keys() ++ supportedSchemes = list(manager.getPlugins().keys()) + if scheme not in supportedSchemes: + self.skipTest('"%s" scheme not supported' % scheme) + a = taurus.Authority(name) +@@ -265,7 +265,7 @@ + klass = TaurusDevice + manager = taurus.Manager() + scheme = manager.getScheme(name) +- supportedSchemes = manager.getPlugins().keys() ++ supportedSchemes = list(manager.getPlugins().keys()) + if scheme not in supportedSchemes: + self.skipTest('"%s" scheme not supported' % scheme) + +@@ -419,7 +419,7 @@ + klass = TaurusAttribute + manager = taurus.Manager() + scheme = manager.getScheme(name) +- supportedSchemes = manager.getPlugins().keys() ++ supportedSchemes = list(manager.getPlugins().keys()) + if scheme not in supportedSchemes: + self.skipTest('"%s" scheme not supported' % scheme) + a = taurus.Attribute(name) +@@ -441,7 +441,7 @@ + msg = ('read() for "%s" did not return a TaurusAttrValue (got a %s)' % + (name, readvalue.__class__.__name__)) + self.assertTrue(isinstance(readvalue, TaurusAttrValue), msg) +- for k, exp in expected.iteritems(): ++ for k, exp in expected.items(): + try: + got = getattr(readvalue, k) + except AttributeError: +--- ./lib/taurus/core/util/codecs.py (original) ++++ ./lib/taurus/core/util/codecs.py (refactored) +@@ -64,6 +64,7 @@ + """ + from __future__ import absolute_import + ++from builtins import str + __all__ = ["Codec", "NullCodec", "ZIPCodec", "BZ2Codec", "JSONCodec", + "FunctionCodec", "PlotCodec", "CodecPipeline", "CodecFactory"] + +@@ -348,7 +349,7 @@ + return format, data + + def _transform_ascii(self, data): +- if isinstance(data, unicode): ++ if isinstance(data, str): + return data.encode('utf-8') + elif isinstance(data, dict): + return self._transform_dict(data) +@@ -364,7 +365,7 @@ + + def _transform_dict(self, dct): + newdict = {} +- for k, v in dct.iteritems(): ++ for k, v in dct.items(): + newdict[self._transform_ascii(k)] = self._transform_ascii(v) + return newdict + +@@ -426,7 +427,7 @@ + return format, data + + def _transform_ascii(self, data): +- if isinstance(data, unicode): ++ if isinstance(data, str): + return data.encode('utf-8') + elif isinstance(data, dict): + return self._transform_dict(data) +@@ -442,7 +443,7 @@ + + def _transform_dict(self, dct): + newdict = {} +- for k, v in dct.iteritems(): ++ for k, v in dct.items(): + newdict[self._transform_ascii(k)] = self._transform_ascii(v) + return newdict + +--- ./lib/taurus/core/util/colors.py (original) ++++ ./lib/taurus/core/util/colors.py (refactored) +@@ -26,6 +26,8 @@ + """This module contains color codes for state and quality""" + from __future__ import print_function + ++from builtins import str ++from builtins import object + __all__ = ["DEVICE_STATE_DATA", "ATTRIBUTE_QUALITY_DATA", "ColorPalette", + "DEVICE_STATE_PALETTE", "ATTRIBUTE_QUALITY_PALETTE"] + +@@ -123,7 +125,7 @@ + return r[0] * 256 * 256 + r[1] * 256 + r[2] + + def __iter__(self): +- return self._rgb_data.keys().__iter__() ++ return list(self._rgb_data.keys()).__iter__() + + def name(self, stoq, fg=False): + """Returns the name of the color.""" +--- ./lib/taurus/core/util/console.py (original) ++++ ./lib/taurus/core/util/console.py (refactored) +@@ -25,6 +25,7 @@ + + """This module contains ANSI color codes""" + ++from builtins import object + __all__ = ["make_color_table", "NoColors", "TermColors", "HTMLColors"] + + __docformat__ = "restructuredtext" +@@ -63,13 +64,13 @@ + setattr(in_class, name, in_class._base % value) + + +-class NoColors: ++class NoColors(object): + NoColor = '' # for color schemes in color-less terminals. + Normal = '' # Reset normal coloring + _base = '' # Template for all other colors + + +-class TermColors: ++class TermColors(object): + """Color escape sequences. + + This class defines the escape sequences for all the standard (ANSI?) +@@ -86,7 +87,7 @@ + _base = '\033[%sm' # Template for all other colors + + +-class HTMLColors: ++class HTMLColors(object): + + NoColor = '' + Normal = '' +--- ./lib/taurus/core/util/constant.py (original) ++++ ./lib/taurus/core/util/constant.py (refactored) +@@ -46,10 +46,11 @@ + consttype.__del__() # Remove all attributes + """ + ++from builtins import object + __docformat__ = "restructuredtext" + + +-class _consttype: ++class _consttype(object): + + class _ConstTypeError(TypeError): + pass +--- ./lib/taurus/core/util/containers.py (original) ++++ ./lib/taurus/core/util/containers.py (refactored) +@@ -29,6 +29,11 @@ + """ + from __future__ import print_function + ++from builtins import zip ++from builtins import str ++from builtins import range ++from past.builtins import basestring ++from builtins import object + __all__ = ["CaselessList", "CaselessDict", "CaselessWeakValueDict", "LoopList", + "CircBuf", "LIFO", "TimedQueue", "self_locked", "ThreadDict", + "defaultdict", "defaultdict_fromkey", "CaselessDefaultDict", +@@ -250,7 +255,7 @@ + if other: + # Doesn't do keyword args + if isinstance(other, dict): +- for k, v in other.items(): ++ for k, v in list(other.items()): + dict.__setitem__(self, k.lower(), v) + else: + for k, v in other: +@@ -279,7 +284,7 @@ + + def update(self, other): + """overwritten from :meth:`dict.update`""" +- for k, v in other.items(): ++ for k, v in list(other.items()): + dict.__setitem__(self, k.lower(), v) + + def fromkeys(self, iterable, value=None): +@@ -303,7 +308,7 @@ + if other: + # Doesn't do keyword args + if isinstance(other, dict): +- for k, v in other.items(): ++ for k, v in list(other.items()): + weakref.WeakValueDictionary.__setitem__(self, k.lower(), v) + else: + for k, v in other: +@@ -334,7 +339,7 @@ + + def update(self, other): + """overwritten from :meth:`weakref.WeakValueDictionary.update`""" +- for k, v in other.items(): ++ for k, v in list(other.items()): + weakref.WeakValueDictionary.__setitem__(self, k.lower(), v) + + def fromkeys(self, iterable, value=None): +@@ -413,7 +418,7 @@ + + def dump(self, fileobj): + if self.format == 'csv': +- csv.writer(fileobj).writerows(self.items()) ++ csv.writer(fileobj).writerows(list(self.items())) + elif self.format == 'json': + json.dump(self, fileobj, separators=(',', ':')) + elif self.format == 'pickle': +@@ -487,7 +492,7 @@ + '''returns the current index''' + return self._index + +- def next(self): ++ def __next__(self): + '''advances one item in the list and returns it''' + self._index += 1 + return self.current() +@@ -897,7 +902,7 @@ + or a callable providing a sorting key algorithm. + """ + import operator +- if operator.isCallable(key): ++ if hasattr(key, '__call__'): + self._keys = sorted(self._keys, key=key) + else: + for k in self._keys: +@@ -913,7 +918,7 @@ + + def update(self, other): + if hasattr(other, 'items'): +- other = other.items() ++ other = list(other.items()) + for k, v in other: + self.__setitem__(k, v) + +@@ -989,7 +994,7 @@ + args = tuple() + else: + args = self.default_factory, +- return type(self), args, None, None, self.items() ++ return type(self), args, None, None, list(self.items()) + + def copy(self): + return self.__copy__() +@@ -1000,7 +1005,7 @@ + def __deepcopy__(self, memo): + import copy + return type(self)(self.default_factory, +- copy.deepcopy(self.items())) ++ copy.deepcopy(list(self.items()))) + + def __repr__(self): + return 'defaultdict(%s, %s)' % (self.default_factory, +@@ -1055,7 +1060,7 @@ + def add_to_level(l, d): + lines = [] + if isinstance(d, dict): +- for k, v in d.items(): ++ for k, v in list(d.items()): + print('with key "%s"' % k) + lines.append([''] * l + [str(k)]) + lines += add_to_level(l + 1, v) +@@ -1128,7 +1133,7 @@ + def __str__(self): + return self.__buffer[:self.__end].__str__() + +- def __nonzero__(self): ++ def __bool__(self): + return self.__buffer[:self.__end].__nonzero__() + + def __setitem__(self, i, x): +@@ -1317,5 +1322,5 @@ + + def chunks(l, n): + '''Generator which yields successive n-sized chunks from l''' +- for i in xrange(0, len(l), n): ++ for i in range(0, len(l), n): + yield l[i:i + n] +--- ./lib/taurus/core/util/enumeration.py (original) ++++ ./lib/taurus/core/util/enumeration.py (refactored) +@@ -33,6 +33,8 @@ + values (specified and unspecified) are unique. Enum values then are attributes + of an Enumeration class (Volkswagen.BEETLE, Volkswagen.PASSAT, etc.).""" + ++from builtins import str ++from builtins import object + __all__ = ["EnumException", "Enumeration"] + + __docformat__ = "restructuredtext" +@@ -95,9 +97,9 @@ + raise EnumException( + "flagable enum does not accept tuple items") + x, i = x +- if not isinstance(x, (str, unicode)): ++ if not isinstance(x, (str, str)): + raise EnumException("enum name is not a string: " + str(x)) +- if not isinstance(i, (int, long)): ++ if not isinstance(i, (int, int)): + raise EnumException( + "enum value is not an integer: " + str(i)) + if x in uniqueNames: +@@ -111,7 +113,7 @@ + reverseLookup[i] = x + for x in enumList: + if not isinstance(x, tuple): +- if not isinstance(x, (str, unicode)): ++ if not isinstance(x, (str, str)): + raise EnumException("enum name is not a string: " + str(x)) + if x in uniqueNames: + raise EnumException("enum name is not unique: " + str(x)) +@@ -143,15 +145,15 @@ + return n + + def __contains__(self, i): +- if isinstance(i, (int, long)): ++ if isinstance(i, (int, int)): + return i in self.reverseLookup +- elif isinstance(i, (str, unicode)): ++ elif isinstance(i, (str, str)): + return i in self.lookup + + def __getitem__(self, i): +- if isinstance(i, (int, long)): ++ if isinstance(i, (int, int)): + return self.whatis(i) +- elif isinstance(i, (str, unicode)): ++ elif isinstance(i, (str, str)): + return self.lookup[i] + + def __getattr__(self, attr): +@@ -193,7 +195,7 @@ + """Returns an iterable containning the valid enumeration keys + :return: an interable containning the valid enumeration keys + :rtype: iter""" +- return self.lookup.keys() ++ return list(self.lookup.keys()) + + def whatis(self, value): + """Returns a string representation of the value in the enumeration. +--- ./lib/taurus/core/util/event.py (original) ++++ ./lib/taurus/core/util/event.py (refactored) +@@ -29,6 +29,10 @@ + from __future__ import print_function + from __future__ import absolute_import + ++from past.builtins import cmp ++from builtins import str ++from builtins import range ++from builtins import object + __all__ = ["BoundMethodWeakref", "CallableRef", "EventGenerator", + "ConfigEventGenerator", "ListEventGenerator", "EventListener", + "AttributeEventWait", "AttributeEventIterator"] +@@ -232,7 +236,7 @@ + try: + self.lock() + aux_list = list(self.cb_list) +- for i in xrange(len(aux_list) - 1, -1, -1): ++ for i in range(len(aux_list) - 1, -1, -1): + pair = self.cb_list[i] + if pair[0] is cb_ref: + del self.cb_list[i] +@@ -446,7 +450,7 @@ + if t and t >= after: + return + else: +- for v, t in s.items(): ++ for v, t in list(s.items()): + if v == val: + continue + if t >= after: +@@ -646,7 +650,7 @@ + retries += 1 + while retries != 0: + if any: +- for v, t in s.items(): ++ for v, t in list(s.items()): + if t >= after: + return + if equal: +@@ -654,7 +658,7 @@ + if (t is not None) and (t >= after): + return + else: +- for v, t in s.items(): ++ for v, t in list(s.items()): + if v == val: + continue + if t >= after: +--- ./lib/taurus/core/util/eventfilters.py (original) ++++ ./lib/taurus/core/util/eventfilters.py (refactored) +@@ -27,6 +27,7 @@ + :meth:`taurus.qt.qtgui.base.TaurusBaseComponent.setFilters`""" + + ++from builtins import object + def IGNORE_ALL(s, t, v): + '''Will discard all events''' + return None +--- ./lib/taurus/core/util/excepthook.py (original) ++++ ./lib/taurus/core/util/excepthook.py (refactored) +@@ -25,6 +25,7 @@ + + """This module contains a base class for exception hooks""" + ++from builtins import object + __all__ = ["BaseExceptHook"] + + __docformat__ = "restructuredtext" +--- ./lib/taurus/core/util/fandango_search.py (original) ++++ ./lib/taurus/core/util/fandango_search.py (refactored) +@@ -31,6 +31,7 @@ + """ + # TODO: tango-centric + ++from builtins import str + import re + import taurus + +@@ -116,8 +117,8 @@ + #all_devs.extend('%s/%s'%(host,d) for d in odb.get_device_name('*','*')) + result = [e for e in expressions if e.lower() in all_devs] + expressions = [extend_regexp(e) for e in expressions if e not in result] +- result.extend(filter(lambda d: any(matchCl(extend_regexp(e), d) +- for e in expressions), all_devs)) ++ result.extend([d for d in all_devs if any(matchCl(extend_regexp(e), d) ++ for e in expressions)]) + return result + + +--- ./lib/taurus/core/util/helper.py (original) ++++ ./lib/taurus/core/util/helper.py (refactored) +@@ -1,6 +1,6 @@ + import sys + if sys.version_info < (3,): +- text_type = unicode ++ text_type = str + binary_type = str + else: + text_type = str +@@ -11,4 +11,4 @@ + return isinstance(element, (text_type, binary_type)) + + def isnumber(element): +- return isinstance(element, (int, long)) ++ return isinstance(element, (int, int)) +--- ./lib/taurus/core/util/init_bkcomp.py (original) ++++ ./lib/taurus/core/util/init_bkcomp.py (refactored) +@@ -78,7 +78,7 @@ + :return: (dict) dictionary built from the given sequence""" + def _pairwise(iterable): + """Utility method used by dictFromSequence""" +- itnext = iter(iterable).next ++ itnext = iter(iterable).__next__ + while True: + yield itnext(), itnext() + return dict(_pairwise(seq)) +--- ./lib/taurus/core/util/init_lightweight.py (original) ++++ ./lib/taurus/core/util/init_lightweight.py (refactored) +@@ -77,7 +77,7 @@ + :return: (dict) dictionary built from the given sequence""" + def _pairwise(iterable): + """Utility method used by dictFromSequence""" +- itnext = iter(iterable).next ++ itnext = iter(iterable).__next__ + while True: + yield itnext(), itnext() + return dict(_pairwise(seq)) +--- ./lib/taurus/core/util/lock.py (original) ++++ ./lib/taurus/core/util/lock.py (refactored) +@@ -26,6 +26,7 @@ + """This module defines a *slow* lock class that provides additional debugging + information""" + ++from builtins import object + __all__ = ["TaurusLock"] + + __docformat__ = 'restructuredtext' +--- ./lib/taurus/core/util/log.py (original) ++++ ./lib/taurus/core/util/log.py (refactored) +@@ -28,6 +28,8 @@ + from __future__ import print_function + from __future__ import absolute_import + ++from builtins import str ++from builtins import object + __all__ = ["LogIt", "TraceIt", "DebugIt", "InfoIt", "WarnIt", "ErrorIt", + "CriticalIt", "MemoryLogHandler", "LogExceptHook", "Logger", + "LogFilter", +@@ -63,14 +65,14 @@ + + def getTotal(self): + c = 0 +- for v in self.itervalues(): ++ for v in self.values(): + c += v + return c + + def pretty(self): + from operator import itemgetter + sorted_items = sorted( +- self.iteritems(), key=itemgetter(1), reverse=True) ++ iter(self.items()), key=itemgetter(1), reverse=True) + ret = '\n'.join(['\t%d * "%s"' % (v, k) for k, v in sorted_items]) + return "< Deprecation Counts (%d):\n%s >" % (self.getTotal(), ret) + +@@ -680,7 +682,7 @@ + :return: (sequence) UIDs of currently shared data. + ''' +- return self.__models.keys() ++ return list(self.__models.keys()) + + def debugReader(self, data): + ''' +@@ -338,6 +338,6 @@ + + def info(self): + s = "" +- for uid, m in sorted(self.__models.iteritems()): ++ for uid, m in sorted(self.__models.items()): + s += m.info() + '\n' + return s +--- ./lib/taurus/qt/qtcore/configuration/configuration.py (original) ++++ ./lib/taurus/qt/qtcore/configuration/configuration.py (refactored) +@@ -27,12 +27,17 @@ + configuration features to the classes that inherit from them""" + from __future__ import print_function + ++from future import standard_library ++standard_library.install_aliases() ++from builtins import str ++from past.builtins import basestring ++from builtins import object + __all__ = ["configurableProperty", "BaseConfigurableClass"] + + __docformat__ = 'restructuredtext' + + +-class configurableProperty: ++class configurableProperty(object): + '''A dummy class used to handle properties with the configuration API + + .. warning:: this class is intended for internal use by the configuration +@@ -66,7 +71,7 @@ + return self.name + + +-class BaseConfigurableClass: ++class BaseConfigurableClass(object): + ''' + A base class defining the API for configurable objects. + +@@ -191,7 +196,7 @@ + # store the configurations for all registered configurable items as + # well + itemcfgs = {} +- for k, v in self.__configurableItems.iteritems(): ++ for k, v in self.__configurableItems.items(): + itemcfgs[k] = v.createConfig(allowUnpickable=allowUnpickable) + configdict["__itemConfigurations__"] = itemcfgs + configdict["__orderedConfigNames__"] = self.__configurableItemNames +@@ -403,7 +408,7 @@ + .. seealso:: :meth:`restoreQConfig` + ''' + from taurus.external.qt import Qt +- import cPickle as pickle ++ import pickle as pickle + configdict = self.createConfig(allowUnpickable=False) + return Qt.QByteArray(pickle.dumps(configdict)) + +@@ -417,7 +422,7 @@ + ''' + if qstate.isNull(): + return +- import cPickle as pickle ++ import pickle as pickle + configdict = pickle.loads(qstate.data()) + self.applyConfig(configdict) + +@@ -428,10 +433,10 @@ + + :return: (str) file name used + """ +- import cPickle as pickle ++ import pickle as pickle + if ofile is None: + from taurus.external.qt import Qt +- ofile = unicode(Qt.QFileDialog.getSaveFileName( ++ ofile = str(Qt.QFileDialog.getSaveFileName( + self, 'Save Configuration', '%s.pck' % self.__class__.__name__, 'Configuration File (*.pck)')) + if not ofile: + return +@@ -449,10 +454,10 @@ + + :return: (str) file name used + """ +- import cPickle as pickle ++ import pickle as pickle + if ifile is None: + from taurus.external.qt import Qt +- ifile = unicode(Qt.QFileDialog.getOpenFileName( ++ ifile = str(Qt.QFileDialog.getOpenFileName( + self, 'Load Configuration', '', 'Configuration File (*.pck)')) + if not ifile: + return +--- ./lib/taurus/qt/qtcore/model/taurusdatabasemodel.py (original) ++++ ./lib/taurus/qt/qtcore/model/taurusdatabasemodel.py (refactored) +@@ -26,6 +26,7 @@ + """This module provides widgets that display the database in a tree format""" + # TODO: tango-centric + ++from builtins import str + __all__ = ["TaurusTreeDevicePartItem", "TaurusTreeDeviceDomainItem", + "TaurusTreeDeviceFamilyItem", "TaurusTreeDeviceMemberItem", "TaurusTreeSimpleDeviceItem", + "TaurusTreeDeviceItem", "TaurusTreeAttributeItem", "TaurusTreeServerNameItem", +@@ -266,7 +267,7 @@ + alarms="[%s, %s]" % (di.alarms.min_alarm, di.alarms.max_alarm), + warnings="[%s, %s]" % (di.alarms.min_warning, di.alarms.max_warning),) + +- for id, value in items.items(): ++ for id, value in list(items.items()): + ret += '%s:%s' % ( + id.capitalize(), value) + ret += '' +@@ -553,15 +554,15 @@ + data = data.deviceTree() + + rootItem = self._rootItem +- for domain in data.keys(): ++ for domain in list(data.keys()): + families = data[domain] + domainItem = TaurusTreeDeviceDomainItem( + self, domain.upper(), rootItem) +- for family in families.keys(): ++ for family in list(families.keys()): + members = families[family] + familyItem = TaurusTreeDeviceFamilyItem( + self, family.upper(), domainItem) +- for member in members.keys(): ++ for member in list(members.keys()): + dev = members[member] + memberItem = TaurusTreeDeviceItem( + self, dev, parent=familyItem) +@@ -586,7 +587,7 @@ + servers = data.servers() + rootItem = self._rootItem + +- for server_name, server in servers.items(): ++ for server_name, server in list(servers.items()): + serverInstanceItem = TaurusTreeFullServerItem( + self, server, rootItem) + rootItem.appendChild(serverInstanceItem) +--- ./lib/taurus/qt/qtcore/model/taurusmodel.py (original) ++++ ./lib/taurus/qt/qtcore/model/taurusmodel.py (refactored) +@@ -25,6 +25,7 @@ + + """This module provides base taurus tree item and a base tree model""" + ++from builtins import object + __all__ = ["TaurusBaseTreeItem", "TaurusBaseModel", "TaurusBaseProxyModel"] + + __docformat__ = 'restructuredtext' +--- ./lib/taurus/qt/qtcore/util/emitter.py (original) ++++ ./lib/taurus/qt/qtcore/util/emitter.py (refactored) +@@ -27,8 +27,17 @@ + emitter.py: This module provides a task scheduler used by TaurusGrid and + TaurusDevTree widgets + """ +- +-from Queue import Queue, Empty ++from __future__ import division ++ ++from future import standard_library ++standard_library.install_aliases() ++from builtins import next ++from builtins import str ++from builtins import map ++from past.builtins import basestring ++from past.utils import old_div ++from builtins import object ++from queue import Queue, Empty + import traceback + from functools import partial + from collections import Iterable +@@ -218,7 +227,7 @@ + self.emitter.doSomething.connect(self._doSomething) + + if not self.refreshTimer: +- self.emitter.somethingDone.connect(self.next) ++ self.emitter.somethingDone.connect(self.__next__) + + def onRefresh(self): + try: +@@ -242,7 +251,7 @@ + def getDone(self): + """ Returns % of done tasks in 0-1 range """ + pending = self.getQueue().qsize() +- return float(self._done) / (self._done + pending) ++ return old_div(float(self._done), (self._done + pending)) + + def clear(self): + while not self.todo.empty(): +@@ -279,12 +288,12 @@ + method(*args) + except: + self.log.error('At TaurusEmitterThread._doSomething(%s): \n%s' +- % (map(str, args), traceback.format_exc())) ++ % (list(map(str, args)), traceback.format_exc())) + self.emitter.somethingDone.emit() + self._done += 1 + return + +- def next(self): ++ def __next__(self): + queue = self.getQueue() + msg = ('At TaurusEmitterThread.next(), %d items remaining.' + % queue.qsize()) +@@ -376,7 +385,7 @@ + """Check all pending subscriptions in the current factory + """ + attrs = [] +- items = self._factory.getExistingAttributes().items() ++ items = list(self._factory.getExistingAttributes().items()) + for name, attr in items: + if attr is None: + continue +@@ -416,7 +425,7 @@ + Logger.cleanUp(self) + + +-class SingletonWorker(): ++class SingletonWorker(object): + """ + SingletonWorker is used to manage TaurusEmitterThread as Singleton objects + +@@ -498,8 +507,8 @@ + return self.thread.getDone() + + def start(self): +- self.thread.emitter.somethingDone.connect(self.next) +- self.thread.emitter.newQueue.connect(self.thread.next) ++ self.thread.emitter.somethingDone.connect(self.__next__) ++ self.thread.emitter.newQueue.connect(self.thread.__next__) + try: + self.thread.start() + except: +@@ -509,8 +518,8 @@ + return + + def stop(self): +- self.thread.emitter.somethingDone.disconnect(self.next) +- self.thread.emitter.newQueue.disconnect(self.thread.next) ++ self.thread.emitter.somethingDone.disconnect(self.__next__) ++ self.thread.emitter.newQueue.disconnect(self.thread.__next__) + self._running = False + return + +--- ./lib/taurus/qt/qtcore/util/properties.py (original) ++++ ./lib/taurus/qt/qtcore/util/properties.py (refactored) +@@ -55,6 +55,8 @@ + + """ + ++from builtins import str ++from builtins import map + from functools import partial + from taurus.external.qt import Qt + from taurus.core.util.fandango_search import isSequence, isDictionary +@@ -81,7 +83,7 @@ + other, dct = sorted((a, b), key=isDictionary) + if not isDictionary(other): + other = dict.fromkeys(other if isSequence(other) else [other, ]) +- for k, v in other.items(): ++ for k, v in list(other.items()): + dct[k] = v if not k in dct else djoin(dct[k], v) + return dct + +--- ./lib/taurus/qt/qtcore/util/signal.py (original) ++++ ./lib/taurus/qt/qtcore/util/signal.py (refactored) +@@ -1,6 +1,7 @@ + """Provide a Signal class for non-QObject objects""" + from __future__ import print_function + ++from builtins import object + __all__ = ['baseSignal'] + + from PyQt4 import Qt +--- ./lib/taurus/qt/qtdesigner/taurusdesigner.py (original) ++++ ./lib/taurus/qt/qtdesigner/taurusdesigner.py (refactored) +@@ -23,6 +23,7 @@ + ## + ############################################################################# + ++from builtins import str + import sys + import os.path + import optparse +--- ./lib/taurus/qt/qtdesigner/tauruspluginplugin.py (original) ++++ ./lib/taurus/qt/qtdesigner/tauruspluginplugin.py (refactored) +@@ -119,7 +119,7 @@ + + def customWidgets(self): + if self._widgets is None: +- self._widgets = [w(self) for w in _plugins.values()] ++ self._widgets = [w(self) for w in list(_plugins.values())] + return self._widgets + + if __name__ != "__main__": +--- ./lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py (original) ++++ ./lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py (refactored) +@@ -38,6 +38,8 @@ + """ + from __future__ import print_function + ++from builtins import str ++from builtins import zip + import inspect + + from taurus.external.qt import Qt +@@ -86,8 +88,8 @@ + if aspec.defaults is None: + kwspec = {} + else: +- kwspec = dict(zip(aspec.args[-len(aspec.defaults):], +- aspec.defaults)) ++ kwspec = dict(list(zip(aspec.args[-len(aspec.defaults):], ++ aspec.defaults))) + args, kwargs = [], {} + if 'designMode' in kwspec: + kwargs['designMode'] = designMode +--- ./lib/taurus/qt/qtgui/application/taurusapplication.py (original) ++++ ./lib/taurus/qt/qtgui/application/taurusapplication.py (refactored) +@@ -26,6 +26,7 @@ + """This module provides the base + :class:`taurus.qt.qtgui.application.TaurusApplication` class.""" + ++from builtins import str + from __future__ import with_statement + + __all__ = ["TaurusApplication"] +--- ./lib/taurus/qt/qtgui/base/taurusbase.py (original) ++++ ./lib/taurus/qt/qtgui/base/taurusbase.py (refactored) +@@ -27,6 +27,8 @@ + """This module provides the set of base classes from which the Qt taurus widgets + should inherit to be considered valid taurus widgets.""" + ++from builtins import str ++from past.builtins import basestring + __all__ = ["TaurusBaseComponent", "TaurusBaseWidget", + "TaurusBaseWritableWidget", "defaultFormatter"] + +@@ -330,7 +332,7 @@ + but it can also be called any time the buffer needs to be flushed + ''' + with self._eventsBufferLock: +- for evt in self._bufferedEvents.values(): ++ for evt in list(self._bufferedEvents.values()): + self.taurusEvent.emit(*evt) + self._bufferedEvents = {} + +--- ./lib/taurus/qt/qtgui/base/tauruscontroller.py (original) ++++ ./lib/taurus/qt/qtgui/base/tauruscontroller.py (refactored) +@@ -26,6 +26,8 @@ + + """This module provides the set of base class taurus controllers.""" + ++from builtins import str ++from builtins import object + __all__ = ["TaurusBaseController", "TaurusAttributeControllerHelper", + "TaurusScalarAttributeControllerHelper", + "TaurusConfigurationControllerHelper", +--- ./lib/taurus/qt/qtgui/button/taurusbutton.py (original) ++++ ./lib/taurus/qt/qtgui/button/taurusbutton.py (refactored) +@@ -27,6 +27,9 @@ + """This module provides a taurus QPushButton based widgets""" + from __future__ import print_function + ++from builtins import map ++from builtins import str ++from past.builtins import basestring + __all__ = ["TaurusLauncherButton", "TaurusCommandButton", "TaurusLockButton"] + + __docformat__ = 'restructuredtext' +@@ -406,7 +409,7 @@ + else: + return parameters + else: +- return map(cast_type, parameters) ++ return list(map(cast_type, parameters)) + + def setCommand(self, commandName): + '''sets the command to be executed when the button is clicked +@@ -638,7 +641,7 @@ + if len(args) == 0: + w = demo() + else: +- models = map(str.lower, args) ++ models = list(map(str.lower, args)) + + w = Qt.QWidget() + layout = Qt.QGridLayout() +--- ./lib/taurus/qt/qtgui/compact/abstractswitcher.py (original) ++++ ./lib/taurus/qt/qtgui/compact/abstractswitcher.py (refactored) +@@ -26,6 +26,7 @@ + """This module provides base classes from which the compact widgets should inherit + """ + ++from past.builtins import basestring + __all__ = ["TaurusReadWriteSwitcher"] + + __docformat__ = 'restructuredtext' +--- ./lib/taurus/qt/qtgui/container/qcontainer.py (original) ++++ ./lib/taurus/qt/qtgui/container/qcontainer.py (refactored) +@@ -25,6 +25,7 @@ + + """This module provides basic pure Qt container widgets""" + ++from builtins import str + __all__ = ["QGroupWidget"] + + __docformat__ = 'restructuredtext' +--- ./lib/taurus/qt/qtgui/container/taurusframe.py (original) ++++ ./lib/taurus/qt/qtgui/container/taurusframe.py (refactored) +@@ -26,6 +26,7 @@ + """This module provides basic taurus container widgets""" + from __future__ import absolute_import + ++from builtins import map + __all__ = ["TaurusFrame"] + + __docformat__ = 'restructuredtext' +@@ -150,7 +151,7 @@ + if len(args) == 0: + w = demo() + else: +- models = map(str.lower, args) ++ models = list(map(str.lower, args)) + + w = Qt.QWidget() + w.setWindowTitle(app.applicationName()) +--- ./lib/taurus/qt/qtgui/container/taurusgroupbox.py (original) ++++ ./lib/taurus/qt/qtgui/container/taurusgroupbox.py (refactored) +@@ -26,6 +26,8 @@ + """This module provides basic taurus group box widget""" + from __future__ import absolute_import + ++from builtins import map ++from builtins import str + __all__ = ["TaurusGroupBox"] + + __docformat__ = 'restructuredtext' +@@ -195,7 +197,7 @@ + if len(args) == 0: + w = demo() + else: +- models = map(str.lower, args) ++ models = list(map(str.lower, args)) + + w = Qt.QWidget() + w.setWindowTitle(app.applicationName()) +--- ./lib/taurus/qt/qtgui/container/taurusgroupwidget.py (original) ++++ ./lib/taurus/qt/qtgui/container/taurusgroupwidget.py (refactored) +@@ -26,6 +26,7 @@ + """This module provides a taurus group widget""" + from __future__ import absolute_import + ++from builtins import map + __all__ = ["TaurusGroupWidget"] + + __docformat__ = 'restructuredtext' +@@ -195,7 +196,7 @@ + if len(args) == 0: + w = demo() + else: +- models = map(str.lower, args) ++ models = list(map(str.lower, args)) + + w = Qt.QWidget() + w.setWindowTitle(app.applicationName()) +--- ./lib/taurus/qt/qtgui/container/taurusmainwindow.py (original) ++++ ./lib/taurus/qt/qtgui/container/taurusmainwindow.py (refactored) +@@ -28,6 +28,9 @@ + """ + from __future__ import absolute_import + ++from builtins import str ++from builtins import range ++from past.builtins import basestring + __all__ = ["TaurusMainWindow"] + + __docformat__ = 'restructuredtext' +@@ -91,7 +94,7 @@ + self.externalAppsPage.setWidgetResizable(True) + self._tabwidget.addTab(self.externalAppsPage, + "External Application Paths") +- label = "Command line for %s" % unicode(extapp.text()) ++ label = "Command line for %s" % str(extapp.text()) + editWidget = CommandArgsLineEdit(extapp, " ".join(extapp.cmdArgs())) + #editWidget = Qt.QLineEdit(" ".join(extapp.cmdArgs())) + self.externalAppsPage.widget().layout().addRow(label, editWidget) +@@ -106,12 +109,12 @@ + ''' + from taurus.external.qt import Qt + layout = self.externalAppsPage.widget().layout() +- for cnt in reversed(range(layout.count())): ++ for cnt in reversed(list(range(layout.count()))): + widget = layout.itemAt(cnt).widget() + if widget is not None: + text = str(widget.text()) # command1 + if isinstance(widget, Qt.QLabel): +- dialog_text = "Command line for %s" % unicode( ++ dialog_text = "Command line for %s" % str( + extapp.text()) + if text == dialog_text: + layout.removeWidget(widget) +@@ -623,7 +626,7 @@ + self.applyQConfig(ba) + except Exception as e: + msg = 'Problem loading configuration from "%s". Some settings may not be restored.\n Details: %s' % ( +- unicode(settings.fileName()), repr(e)) ++ str(settings.fileName()), repr(e)) + self.error(msg) + Qt.QMessageBox.warning( + self, 'Error Loading settings', msg, Qt.QMessageBox.Ok) +@@ -681,7 +684,7 @@ + if not ok: + return + if name in perspectives: +- ans = Qt.QMessageBox.question(self, "Overwrite perspective?", "overwrite existing perspective %s?" % unicode(name), ++ ans = Qt.QMessageBox.question(self, "Overwrite perspective?", "overwrite existing perspective %s?" % str(name), + Qt.QMessageBox.Yes, Qt.QMessageBox.No) + if ans != Qt.QMessageBox.Yes: + return +@@ -759,16 +762,16 @@ + :param fname: (str) name of output file. If None given, a file dialog will be shown. + ''' + if fname is None: +- fname = unicode(Qt.QFileDialog.getSaveFileName(self, 'Choose file where the current settings should be saved', ++ fname = str(Qt.QFileDialog.getSaveFileName(self, 'Choose file where the current settings should be saved', + '', "Ini files (*.ini);;All files (*)")) + if not fname: + return + self.saveSettings() + ok = Qt.QFile.copy(self.getQSettings().fileName(), fname) + if ok: +- self.info('MainWindow settings saved in "%s"' % unicode(fname)) ++ self.info('MainWindow settings saved in "%s"' % str(fname)) + else: +- msg = 'Settings could not be exported to %s' % unicode(fname) ++ msg = 'Settings could not be exported to %s' % str(fname) + Qt.QMessageBox.warning(self, 'Export error', msg) + + def importSettingsFile(self, fname=None): +@@ -779,7 +782,7 @@ + :param fname: (str) name of ini file. If None given, a file dialog will be shown. + ''' + if fname is None: +- fname = unicode(Qt.QFileDialog.getOpenFileName(self, 'Select a ini-format settings file', ++ fname = str(Qt.QFileDialog.getOpenFileName(self, 'Select a ini-format settings file', + '', "Ini files (*.ini);;All files (*)")) + if not fname: + return +@@ -935,8 +938,8 @@ + self.setHelpManualURI(uri) + + def showHelpAbout(self): +- appname = unicode(Qt.qApp.applicationName()) +- appversion = unicode(Qt.qApp.applicationVersion()) ++ appname = str(Qt.qApp.applicationName()) ++ appversion = str(Qt.qApp.applicationVersion()) + from taurus.core import release + abouttext = "%s %s\n\nUsing %s %s" % ( + appname, appversion, release.name, release.version) +@@ -961,7 +964,7 @@ + if key is None: + from taurus.core.util.user import getSystemUserName + username = getSystemUserName() +- appname = unicode(Qt.QApplication.applicationName()) ++ appname = str(Qt.QApplication.applicationName()) + key = "__socket_%s-%s__" % (username, appname) + from taurus.external.qt import QtNetwork + socket = QtNetwork.QLocalSocket(self) +--- ./lib/taurus/qt/qtgui/container/taurusscrollarea.py (original) ++++ ./lib/taurus/qt/qtgui/container/taurusscrollarea.py (refactored) +@@ -26,6 +26,7 @@ + """This module provides basic taurus scroll area widget""" + from __future__ import absolute_import + ++from builtins import map + __all__ = ["TaurusScrollArea"] + + __docformat__ = 'restructuredtext' +@@ -173,7 +174,7 @@ + if len(args) == 0: + w = demo() + else: +- models = map(str.lower, args) ++ models = list(map(str.lower, args)) + + w = Qt.QWidget() + w.setWindowTitle(app.applicationName()) +--- ./lib/taurus/qt/qtgui/dialog/taurusmessagebox.py (original) ++++ ./lib/taurus/qt/qtgui/dialog/taurusmessagebox.py (refactored) +@@ -25,6 +25,9 @@ + + """This module provides a set of dialog based widgets""" + ++from future import standard_library ++standard_library.install_aliases() ++from builtins import object + __all__ = ["TaurusMessageBox", "protectTaurusMessageBox", + "ProtectTaurusMessageBox", "TaurusExceptHookMessageBox"] + +@@ -337,8 +340,8 @@ + except PyTango.DevFailed as df1: + try: + import traceback +- import StringIO +- origin = StringIO.StringIO() ++ import io ++ origin = io.StringIO() + traceback.print_stack(file=origin) + origin.seek(0) + origin = origin.read() +--- ./lib/taurus/qt/qtgui/display/qled.py (original) ++++ ./lib/taurus/qt/qtgui/display/qled.py (refactored) +@@ -25,6 +25,7 @@ + + """A pure Qt led widget""" + ++from builtins import str + __all__ = ["LedColor", "LedStatus", "LedSize", "QLed", "QLedOld"] + + __docformat__ = 'restructuredtext' +--- ./lib/taurus/qt/qtgui/display/qpixmapwidget.py (original) ++++ ./lib/taurus/qt/qtgui/display/qpixmapwidget.py (refactored) +@@ -25,7 +25,9 @@ + + """This module contains a pure Qt widget that displays an image""" + from __future__ import absolute_import +- ++from __future__ import division ++ ++from past.utils import old_div + __all__ = ["QPixmapWidget"] + + __docformat__ = 'restructuredtext' +@@ -80,11 +82,11 @@ + vAlign = align & Qt.Qt.AlignVertical_Mask + x, y = 0, 0 + if hAlign & Qt.Qt.AlignHCenter: +- x = (w - pw) / 2 ++ x = old_div((w - pw), 2) + elif hAlign & Qt.Qt.AlignRight: + x = w - pw + if vAlign & Qt.Qt.AlignVCenter: +- y = (h - ph) / 2 ++ y = old_div((h - ph), 2) + elif vAlign & Qt.Qt.AlignBottom: + y = h - ph + x, y = max(0, x), max(0, y) +--- ./lib/taurus/qt/qtgui/display/qsevensegment.py (original) ++++ ./lib/taurus/qt/qtgui/display/qsevensegment.py (refactored) +@@ -27,7 +27,11 @@ + qsevensegmentdisplay.py + """ + from __future__ import print_function +- ++from __future__ import division ++ ++from builtins import str ++from builtins import range ++from past.utils import old_div + __all__ = ['Q7SegDigit'] + + __docformat__ = 'restructuredtext' +@@ -134,7 +138,7 @@ + + DftWidth = 300 + DftHeight = 300 +- DftAspectRatio = DftWidth / DftHeight ++ DftAspectRatio = old_div(DftWidth, DftHeight) + DftUseFrame = True + + def __init__(self, parent=None, **kwargs): +@@ -202,11 +206,11 @@ + painter.setRenderHint(Qt.QPainter.Antialiasing) + painter.setWindow(0, 0, self.DftWidth, self.DftHeight) + w, h = float(self.width()), float(self.height()) +- aspect = w / h ++ aspect = old_div(w, h) + if aspect > 0.75: + w = h * aspect + else: +- h = w / aspect ++ h = old_div(w, aspect) + painter.setViewport(0, 0, w, h) + self._paintBorder(painter) + self._paintSegment(painter) +@@ -248,7 +252,7 @@ + + pens, brushes = self._pens[idx], self._brushes[idx] + +- for i in xrange(7): ++ for i in range(7): + seg = Qt.QPainterPath() + seg.addPolygon(geom[i]) + painter.setPen(pens[i]) +@@ -506,7 +510,7 @@ + self.setLayout(l) + + self._digits = [] +- for i in xrange(5): ++ for i in range(5): + d = Q7SegDigit() + d.setUseFrame(False) + d.setValue(i) +--- ./lib/taurus/qt/qtgui/display/tauruslabel.py (original) ++++ ./lib/taurus/qt/qtgui/display/tauruslabel.py (refactored) +@@ -26,6 +26,8 @@ + """This module provides a set of basic Taurus widgets based on QLabel""" + from __future__ import absolute_import + ++from builtins import str ++from builtins import object + __all__ = ["TaurusLabel"] + + __docformat__ = 'restructuredtext' +@@ -116,8 +118,8 @@ + toolTip = label.getFormatedToolTip() + if self._trimmedText: + toolTip = u"

Value: %s


%s" %\ +- (unicode(self._text, errors='replace'), +- unicode(str(toolTip), errors='replace')) ++ (str(self._text, errors='replace'), ++ str(str(toolTip), errors='replace')) + label.setToolTip(toolTip) + + _updateBackground = updateLabelBackground +--- ./lib/taurus/qt/qtgui/display/tauruslcd.py (original) ++++ ./lib/taurus/qt/qtgui/display/tauruslcd.py (refactored) +@@ -26,6 +26,9 @@ + """This module provides a Taurus widget based on QLCDNumber""" + from __future__ import absolute_import + ++from builtins import map ++from builtins import str ++from builtins import object + __all__ = ["TaurusLCD"] + + __docformat__ = 'restructuredtext' +@@ -413,7 +416,7 @@ + if len(args) == 0: + w = demo() + else: +- models = map(str.lower, args) ++ models = list(map(str.lower, args)) + + w = Qt.QWidget() + layout = Qt.QGridLayout() +--- ./lib/taurus/qt/qtgui/display/taurusled.py (original) ++++ ./lib/taurus/qt/qtgui/display/taurusled.py (refactored) +@@ -27,6 +27,9 @@ + """This module provides a set of basic Taurus widgets based on QLed""" + from __future__ import absolute_import + ++from builtins import map ++from builtins import str ++from builtins import object + __all__ = ["TaurusLed"] + + __docformat__ = 'restructuredtext' +@@ -478,7 +481,7 @@ + if len(args) == 0: + w = demo() + else: +- models = map(str.lower, args) ++ models = list(map(str.lower, args)) + + w = Qt.QWidget() + layout = Qt.QGridLayout() +--- ./lib/taurus/qt/qtgui/display/test/test_tauruslabel.py (original) ++++ ./lib/taurus/qt/qtgui/display/test/test_tauruslabel.py (refactored) +@@ -25,6 +25,7 @@ + + """Unit tests for Taurus Label""" + ++from builtins import str + import unittest + from taurus.external.qt import Qt + from taurus.test import insertTest +--- ./lib/taurus/qt/qtgui/editor/tauruseditor.py (original) ++++ ./lib/taurus/qt/qtgui/editor/tauruseditor.py (refactored) +@@ -25,6 +25,7 @@ + + """This module contains a taurus text editor widget.""" + ++from builtins import str + __all__ = ["TaurusBaseEditor"] + + __docformat__ = 'restructuredtext' +--- ./lib/taurus/qt/qtgui/extra_guiqwt/curve.py (original) ++++ ./lib/taurus/qt/qtgui/extra_guiqwt/curve.py (refactored) +@@ -26,6 +26,7 @@ + """Extension of :mod:`guiqwt.curve`""" + from __future__ import print_function + ++from builtins import next + __all__ = ["TaurusCurveItem"] + + from taurus.external.qt import Qt +--- ./lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py (original) ++++ ./lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py (refactored) +@@ -27,6 +27,11 @@ + curvesmodel Model and view for new CurveItem configuration + """ + from __future__ import print_function ++from builtins import map ++from builtins import next ++from builtins import str ++from builtins import range ++from builtins import object + __all__ = ['TaurusCurveItemTableModel', 'CurveItemConf', 'CurveItemConfDlg'] + #raise UnimplementedError('Under Construction!') + +@@ -43,7 +48,7 @@ + from taurus.qt.qtgui.extra_guiqwt.styles import TaurusCurveParam + + import guiqwt +-__guiqwt_version = map(int, guiqwt.__version__.split('.')[:3]) ++__guiqwt_version = list(map(int, guiqwt.__version__.split('.')[:3])) + if __guiqwt_version <= [2, 3, 1]: + import taurus.external.qt.Qwt5 as qwt + else: +@@ -55,7 +60,7 @@ + # set some named constants + # columns: + NUMCOLS = 3 +-X, Y, TITLE = range(NUMCOLS) ++X, Y, TITLE = list(range(NUMCOLS)) + SRC_ROLE = Qt.Qt.UserRole + 1 + + +--- ./lib/taurus/qt/qtgui/extra_guiqwt/plot.py (original) ++++ ./lib/taurus/qt/qtgui/extra_guiqwt/plot.py (refactored) +@@ -26,6 +26,9 @@ + """ + Extension of :mod:`guiqwt.plot` + """ ++from builtins import next ++from builtins import str ++from past.builtins import basestring + __all__ = ["TaurusCurveDialog", "TaurusTrendDialog", "TaurusImageDialog"] + + import copy +--- ./lib/taurus/qt/qtgui/extra_guiqwt/scales.py (original) ++++ ./lib/taurus/qt/qtgui/extra_guiqwt/scales.py (refactored) +@@ -27,6 +27,11 @@ + scales.py: Custom scales used by taurus.qt.qtgui.plot module + """ + from __future__ import print_function ++from __future__ import division ++from builtins import map ++from builtins import str ++from builtins import range ++from past.utils import old_div + __all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", + "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", + "FixedLabelsScaleDraw"] +@@ -37,7 +42,7 @@ + from taurus.external.qt import Qt + + import guiqwt +-__guiqwt_version = map(int, guiqwt.__version__.split('.')[:3]) ++__guiqwt_version = list(map(int, guiqwt.__version__.split('.')[:3])) + + if __guiqwt_version <= [2, 3, 1]: + import taurus.external.qt.Qwt5 as qwt +@@ -226,7 +231,7 @@ + + elif dx > 2: # 2s + format = "%H:%M:%S" +- majticks = range(int(x1) + 1, int(x2)) ++ majticks = list(range(int(x1) + 1, int(x2))) + + else: # less than 2s (show microseconds) + scaleDiv = qwt.QwtLinearScaleEngine.divideScale( +@@ -237,7 +242,7 @@ + # make sure to comply with maxMajTicks + L = len(majticks) + if L > maxMajSteps: +- majticks = majticks[::int(numpy.ceil(float(L) / maxMajSteps))] ++ majticks = majticks[::int(numpy.ceil(old_div(float(L), maxMajSteps)))] + + scaleDiv = qwt.QwtScaleDiv(interval, minticks, medticks, majticks) + self.scaleDraw().setDatetimeLabelFormat(format) +@@ -370,7 +375,7 @@ + s = 86400 # 1 day + # calculate a step size that respects the base step (s) and also + # enforces the maxMajSteps +- stepSize = s * int(numpy.ceil(float(d_range // s) / maxMajSteps)) ++ stepSize = s * int(numpy.ceil(old_div(float(d_range // s), maxMajSteps))) + return qwt.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize) + + @staticmethod +--- ./lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py (original) ++++ ./lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py (refactored) +@@ -26,6 +26,7 @@ + """ + taurustrend.py: Generic trend widget for Taurus + """ ++from builtins import str + __all__ = ["TaurusTrend2DDialog"] + + from guiqwt.plot import ImageDialog +--- ./lib/taurus/qt/qtgui/extra_guiqwt/tools.py (original) ++++ ./lib/taurus/qt/qtgui/extra_guiqwt/tools.py (refactored) +@@ -26,6 +26,7 @@ + """Extension of :mod:`guiqwt.tools`""" + + ++from builtins import zip + __docformat__ = 'restructuredtext' + + import weakref +@@ -173,7 +174,7 @@ + + def update_status(self, plot): + active_scale = self._getAxesUseTime(plot) +- for scale_type, scale_action in self.scale_menu.items(): ++ for scale_type, scale_action in list(self.scale_menu.items()): + scale_action.setEnabled(True) + if active_scale == scale_type: + scale_action.setChecked(True) +--- ./lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py (original) ++++ ./lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py (refactored) +@@ -27,6 +27,7 @@ + nexusWidget.py: + """ + ++from builtins import str + __all__ = ["TaurusNexusBrowser"] + + import numpy +@@ -111,7 +112,7 @@ + + def openFile(self, fname=None): + if fname is None: +- fname = unicode(Qt.QFileDialog.getOpenFileName( ++ fname = str(Qt.QFileDialog.getOpenFileName( + self, "Choose NeXus File", "/home/cpascual/local/tmp/scantest.h5")) # @TODO!! + if fname: + self.__nexusFile = self.__fileModel.openFile(fname) +--- ./lib/taurus/qt/qtgui/graphic/taurusgraphic.py (original) ++++ ./lib/taurus/qt/qtgui/graphic/taurusgraphic.py (refactored) +@@ -26,9 +26,17 @@ + taurusgraphic.py: + """ + from __future__ import print_function ++from __future__ import division + + # TODO: Tango-centric + ++from future import standard_library ++standard_library.install_aliases() ++from builtins import str ++from builtins import range ++from past.builtins import basestring ++from builtins import object ++from past.utils import old_div + __all__ = ['SynopticSelectionStyle', + 'parseTangoUri', + 'QEmitter', # TODO: QEmitter should probably be removed (kept priv) +@@ -64,7 +72,7 @@ + import operator + import types + +-import Queue ++import queue + + from taurus import Manager + from taurus.core import AttrQuality, DataType +@@ -373,7 +381,7 @@ + if not target.endswith('$'): + target += '$' + result = [] +- for k in self._itemnames.keys(): ++ for k in list(self._itemnames.keys()): + if re.match(target.lower(), k.lower()): + #self.debug('getItemByName(%s): _itemnames[%s]: %s'%(target,k,self._itemnames[k])) + result.extend(self._itemnames[k]) +@@ -383,7 +391,7 @@ + """ This method will try first with named objects; if failed then with itemAt """ + pos = Qt.QPointF(x, y) + itemsAtPos = [] +- for z, o in sorted((i.zValue(), i) for v in self._itemnames.values() for i in v if i.contains(pos) or i.isUnderMouse()): ++ for z, o in sorted((i.zValue(), i) for v in list(self._itemnames.values()) for i in v if i.contains(pos) or i.isUnderMouse()): + if not hasattr(o, 'getExtensions'): + self.debug( + 'getItemByPosition(%d,%d): adding Qt primitive %s' % (x, y, o)) +@@ -685,7 +693,7 @@ + SelectionMark = picture + SelectionMark.setRect(0, 0, w, h) + SelectionMark.hide() +- elif operator.isCallable(picture): ++ elif hasattr(picture, '__call__'): + SelectionMark = picture() + else: + if isinstance(picture, Qt.QPixmap): +@@ -734,8 +742,8 @@ + if w > MAX_CIRCLE_SIZE[0] or h > MAX_CIRCLE_SIZE[1]: + # Applying correction if the file is too big, half max + # circle size around the center +- x, y = (x + w / 2.) - .5 * \ +- MAX_CIRCLE_SIZE[0], (y + h / 2.) - .5 * \ ++ x, y = (x + old_div(w, 2.)) - .5 * \ ++ MAX_CIRCLE_SIZE[0], (y + old_div(h, 2.)) - .5 * \ + MAX_CIRCLE_SIZE[1], + w, h = [.5 * t for t in MAX_CIRCLE_SIZE] + else: +@@ -831,7 +839,7 @@ + def start(self): + if self.updateThread: + return +- self.updateQueue = Queue.Queue() ++ self.updateQueue = queue.Queue() + self.updateThread = TaurusGraphicsUpdateThread(self) + self.updateThread.start() # Qt.QThread.HighPriority) + +@@ -985,7 +993,7 @@ + path.lineTo(cp[1]) + else: + path.moveTo(cp[0]) +- for i in xrange(1, nb_points - 1, 3): ++ for i in range(1, nb_points - 1, 3): + p1 = cp[i + 0] + p2 = cp[i + 1] + end = cp[i + 2] +@@ -1438,7 +1446,7 @@ + } + + +-class TaurusBaseGraphicsFactory: ++class TaurusBaseGraphicsFactory(object): + + def __init__(self): + pass +@@ -1506,7 +1514,7 @@ + def getGraphicsItem(self, type_, params): + name = params.get(self.getNameParam()) + # applying alias +- for k, v in getattr(self, 'alias', {}).items(): ++ for k, v in list(getattr(self, 'alias', {}).items()): + if k in name: + name = str(name).replace(k, v) + params[self.getNameParam()] = name +--- ./lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py (original) ++++ ./lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py (refactored) +@@ -26,6 +26,8 @@ + """This module contains the graphics factory for the jdraw file format""" + from __future__ import absolute_import + ++from builtins import str ++from builtins import range + __all__ = ["TaurusJDrawGraphicsFactory"] + + __docformat__ = 'restructuredtext' +@@ -181,7 +183,7 @@ + + polygon = Qt.QPolygonF() + p = params.get('summit') +- for i in xrange(0, len(p), 2): ++ for i in range(0, len(p), 2): + polygon.append(Qt.QPointF(p[i], p[i + 1])) + item.setPolygon(polygon) + +@@ -190,7 +192,7 @@ + def getSplineObj(self, params): + item = self.getGraphicsItem('Spline', params) + p = params.get('summit') +- p = [Qt.QPointF(p[i], p[i + 1]) for i in xrange(0, len(p), 2)] ++ p = [Qt.QPointF(p[i], p[i + 1]) for i in range(0, len(p), 2)] + item.setControlPoints(p) + isClosed = params.get('isClosed', True) + item.setClose(isClosed) +@@ -213,8 +215,8 @@ + # it is parsed as a float + vAlignment = int(params.get('vAlignment', 0)) + hAlignment = int(params.get('hAlignment', 0)) +- assert(vAlignment in VALIGNMENT.keys()) +- assert(hAlignment in ALIGNMENT.keys()) ++ assert(vAlignment in list(VALIGNMENT.keys())) ++ assert(hAlignment in list(ALIGNMENT.keys())) + vAlignment = VALIGNMENT[vAlignment] + hAlignment = ALIGNMENT[hAlignment] + item.setAlignment(hAlignment | vAlignment) +@@ -332,7 +334,7 @@ + params.get('extensions')["ignoreRepaint"] = "true" + + if self.alias: +- for k, v in self.alias.items(): ++ for k, v in list(self.alias.items()): + name = str(name).replace(k, v) + + # Forcing not-Taurus items to have a name and be able to trigger events +--- ./lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py (original) ++++ ./lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py (refactored) +@@ -27,6 +27,7 @@ + + from __future__ import absolute_import + ++from builtins import str + __all__ = ["new_parser", "parse"] + + import os +--- ./lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py (original) ++++ ./lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py (refactored) +@@ -26,6 +26,8 @@ + """This module contains the graphics view widget for jdraw files""" + from __future__ import absolute_import + ++from builtins import str ++from past.builtins import basestring + __all__ = ["TaurusJDrawSynopticsView"] + + __docformat__ = 'restructuredtext' +@@ -121,7 +123,7 @@ + self.emitColors() + + def openJDraw(self): +- ifile = unicode(Qt.QFileDialog.getOpenFileName( ++ ifile = str(Qt.QFileDialog.getOpenFileName( + self, 'Load JDraw File', '', 'JDraw File (*.jdw)')) + if not ifile: + return +@@ -139,7 +141,7 @@ + return + + def get_item_list(self): +- return [item._name for item in self.scene().items() if hasattr(item, '_name') and item._name] ++ return [item._name for item in list(self.scene().items()) if hasattr(item, '_name') and item._name] + + def get_device_list(self): + items = [(item, parseTangoUri(item)) for item in self.get_item_list()] +@@ -148,7 +150,7 @@ + def get_item_colors(self, emit=False): + item_colors = {} + try: +- for item in self.scene().items(): ++ for item in list(self.scene().items()): + if not getattr(item, '_name', '') or not getattr(item, '_currBgBrush', None): + continue + item_colors[item._name] = item._currBgBrush.color().name() +@@ -421,7 +423,7 @@ + + def setModels(self): + """ This method triggers item.setModel(item._name) in all internal items. """ +- for item in self.scene().items(): ++ for item in list(self.scene().items()): + if item._name and isinstance(item, TaurusGraphicsItem): + self.debug( + 'TaurusJDrawGraphicsFactory.setModels(): calling item.setModel(%s)' % (item._name)) +--- ./lib/taurus/qt/qtgui/help/assistant.py (original) ++++ ./lib/taurus/qt/qtgui/help/assistant.py (refactored) +@@ -39,13 +39,15 @@ + app.exec_() + """ + ++from builtins import str ++from builtins import object + __all__ = ["Assistant", "Widgets"] + + + from taurus.external.qt import Qt + + +-class Widgets: ++class Widgets(object): + contents = "contents" + index = "index" + bookmarks = "bookmarks" +--- ./lib/taurus/qt/qtgui/icon/catalog.py (original) ++++ ./lib/taurus/qt/qtgui/icon/catalog.py (refactored) +@@ -78,7 +78,7 @@ + pixmaps = {} + choices = [] + row = [] +- for md5, choice in hashes.items(): ++ for md5, choice in list(hashes.items()): + try: + pixmaps[choice] = pixmaps_hashed[md5] + except KeyError: +--- ./lib/taurus/qt/qtgui/icon/icon.py (original) ++++ ./lib/taurus/qt/qtgui/icon/icon.py (refactored) +@@ -25,6 +25,7 @@ + + """This module provides taurus-specific functions related to icons""" + ++from builtins import range + __all__ = [ + 'sanitizePrefix', + 'registerPathFiles', +@@ -68,7 +69,7 @@ + __3DQS = Qt.QSize(3 * __DW, __DH) + + # Indexes for the map below +-__IDX_ELEM_TYPE_ICON, __IDX_ELEM_TYPE_SIZE, __IDX_ELEM_TYPE_TOOLTIP = range(3) ++__IDX_ELEM_TYPE_ICON, __IDX_ELEM_TYPE_SIZE, __IDX_ELEM_TYPE_TOOLTIP = list(range(3)) + + # New default role map + # Elements are: icon theme, preferred size, description/tooltip +@@ -102,7 +103,7 @@ + } + + # Indexes for the map below +-__IDX_STATE_ICON, __IDX_STATE_TOOLTIP = range(2) ++__IDX_STATE_ICON, __IDX_STATE_TOOLTIP = list(range(2)) + + _STATE_MAP = { + TaurusDevState.Ready: ("status:available.svg", "Element ready"), +--- ./lib/taurus/qt/qtgui/input/choicedlg.py (original) ++++ ./lib/taurus/qt/qtgui/input/choicedlg.py (refactored) +@@ -26,6 +26,7 @@ + """This package provides a dialog for graphically choosing a Taurus class""" + from __future__ import print_function + ++from builtins import str + __all__ = ["GraphicalChoiceDlg", "GraphicalChoiceWidget"] + + __docformat__ = 'restructuredtext' +@@ -196,7 +197,7 @@ + + def onClick(self): + '''slot called when a button is clicked''' +- self._chosen = unicode(self.sender().text()) ++ self._chosen = str(self.sender().text()) + self.choiceMade.emit(self._chosen) + + def getChosen(self): +--- ./lib/taurus/qt/qtgui/input/qwheel.py (original) ++++ ./lib/taurus/qt/qtgui/input/qwheel.py (refactored) +@@ -24,7 +24,11 @@ + ############################################################################# + + """This module provides an arrow based widget.""" +- ++from __future__ import division ++ ++from builtins import map ++from builtins import range ++from past.utils import old_div + __all__ = ["QWheelEdit"] + + __docformat__ = 'restructuredtext' +@@ -96,7 +100,7 @@ + class _DigitLabel(Qt.QLabel): + """A private single digit label to be used by QWheelEdit widget""" + +- PixmapKeys = map(str, xrange(10)) + ['blank', 'minus', 'point'] ++ PixmapKeys = list(map(str, range(10))) + ['blank', 'minus', 'point'] + + def __init__(self, lbl, parent=None): + Qt.QLabel.__init__(self, parent) +@@ -223,7 +227,7 @@ + @return (float) the minimum possible value + """ + decmax = 0 +- for i in xrange(self.getDecDigitCount()): ++ for i in range(self.getDecDigitCount()): + decmax += 9 * math.pow(10, -(i + 1)) + return -math.pow(10.0, self.getIntDigitCount()) + 1 - decmax + +@@ -236,7 +240,7 @@ + @return (float) the maximum possible value + """ + decmax = 0 +- for i in xrange(self.getDecDigitCount()): ++ for i in range(self.getDecDigitCount()): + decmax += 9 * math.pow(10, -(i + 1)) + return math.pow(10.0, self.getIntDigitCount()) - 1 + decmax + +@@ -270,7 +274,7 @@ + l.setColumnMinimumWidth(0, _ArrowButton.ButtonSize) + l.setColumnStretch(0, 1) + +- for i in xrange(id): ++ for i in range(id): + col = i + 1 + d = _DigitLabel('0') + up = _UpArrowButton(id - i - 1) +@@ -293,7 +297,7 @@ + self._digitLabels.append(dotLabel) + l.addWidget(dotLabel, 1, id + 1) + +- for i in xrange(id, digits): ++ for i in range(id, digits): + col = i + 1 + if showDot: + col += 1 +@@ -442,7 +446,7 @@ + if len(v_str) > len(self._digitLabels): + # do auto adjust + if '.' in v_str: +- dc = map(len, v_str.split('.')) ++ dc = list(map(len, v_str.split('.'))) + else: + dc = len(v_str), 0 + self._setDigits(*dc) +@@ -767,8 +771,8 @@ + self.setFocus() + + def wheelEvent(self, evt): +- numDegrees = evt.delta() / 8 +- numSteps = numDegrees / 15 ++ numDegrees = old_div(evt.delta(), 8) ++ numSteps = old_div(numDegrees, 15) + #w = Qt.QApplication.focusWidget() + w = self.focusWidget() + if not isinstance(w, _DigitLabel): +--- ./lib/taurus/qt/qtgui/input/tauruscheckbox.py (original) ++++ ./lib/taurus/qt/qtgui/input/tauruscheckbox.py (refactored) +@@ -25,6 +25,7 @@ + + """This module provides a set of basic taurus widgets based on QCheckBox""" + ++from builtins import str + __all__ = ["TaurusValueCheckBox"] + + __docformat__ = 'restructuredtext' +--- ./lib/taurus/qt/qtgui/input/tauruscombobox.py (original) ++++ ./lib/taurus/qt/qtgui/input/tauruscombobox.py (refactored) +@@ -26,6 +26,7 @@ + + """This module provides a set of basic taurus widgets based on QCheckBox""" + ++from builtins import str + __all__ = ["TaurusAttrListComboBox", "TaurusValueComboBox"] + + __docformat__ = 'restructuredtext' +--- ./lib/taurus/qt/qtgui/input/tauruslineedit.py (original) ++++ ./lib/taurus/qt/qtgui/input/tauruslineedit.py (refactored) +@@ -26,7 +26,11 @@ + """ + This module provides a set of basic taurus widgets based on QLineEdit + """ +- ++from __future__ import division ++ ++from builtins import bytes ++from builtins import str ++from past.utils import old_div + import sys + import numpy + from taurus.external.qt import Qt +@@ -176,8 +180,8 @@ + return Qt.QLineEdit.wheelEvent(self, evt) + + evt.accept() +- numDegrees = evt.delta() / 8 +- numSteps = numDegrees / 15 ++ numDegrees = old_div(evt.delta(), 8) ++ numSteps = old_div(numDegrees, 15) + self._stepBy(numSteps) + + def keyPressEvent(self, evt): +--- ./lib/taurus/qt/qtgui/input/taurusspinbox.py (original) ++++ ./lib/taurus/qt/qtgui/input/taurusspinbox.py (refactored) +@@ -28,6 +28,7 @@ + """ + from __future__ import absolute_import + ++from builtins import str + from taurus.external.qt import Qt + + from .tauruslineedit import TaurusValueLineEdit +--- ./lib/taurus/qt/qtgui/model/qbasemodel.py (original) ++++ ./lib/taurus/qt/qtgui/model/qbasemodel.py (refactored) +@@ -236,7 +236,7 @@ + menu = Qt.QMenu("Perspective", b) + b.setMenu(menu) + af = ActionFactory() +- for persp, persp_data in view.KnownPerspectives.items(): ++ for persp, persp_data in list(view.KnownPerspectives.items()): + label = persp_data["label"] + icon = Qt.QIcon.fromTheme(persp_data["icon"]) + tip = persp_data["tooltip"] +--- ./lib/taurus/qt/qtgui/panel/qdataexportdialog.py (original) ++++ ./lib/taurus/qt/qtgui/panel/qdataexportdialog.py (refactored) +@@ -27,6 +27,9 @@ + one or more curves""" + from __future__ import print_function + ++from builtins import zip ++from builtins import str ++from builtins import range + __all__ = ["QDataExportDialog"] + + import os.path +@@ -76,7 +79,7 @@ + self.datadict = datadict + self.dataSetCB.clear() + self.dataSetCB.insertItems(0, sortedNames) +- if len(self.datadict.keys()) > 1: ++ if len(list(self.datadict.keys())) > 1: + self.dataSetCB.insertItems( + 0, [self.allInSingleFile, self.allInMultipleFiles]) + +@@ -152,7 +155,7 @@ + if not outputdir: + return False + preffix = os.path.join(str(outputdir), "set") +- for i, k in zip(range(len(self.datadict)), self.sortedNames): ++ for i, k in zip(list(range(len(self.datadict))), self.sortedNames): + ofile = "%s%03i.dat" % (preffix, i + 1) + try: + self.exportCurrentData( +--- ./lib/taurus/qt/qtgui/panel/qdoublelist.py (original) ++++ ./lib/taurus/qt/qtgui/panel/qdoublelist.py (refactored) +@@ -30,6 +30,8 @@ + """ + from __future__ import print_function + ++from builtins import str ++from builtins import range + __all__ = ["QDoubleListDlg"] + + __docformat__ = 'restructuredtext' +@@ -102,14 +104,14 @@ + + :return: (list) + ''' +- return [unicode(self.ui.list1.item(row).text()) for row in xrange(self.ui.list1.count())] ++ return [str(self.ui.list1.item(row).text()) for row in range(self.ui.list1.count())] + + def getAll2(self): + '''returns a copy the items in the second list + + :return: (list) + ''' +- return [unicode(self.ui.list2.item(row).text()) for row in xrange(self.ui.list2.count())] ++ return [str(self.ui.list2.item(row).text()) for row in range(self.ui.list2.count())] + + # note, for the moment we do not make it available in designer because it does not + # behave well as a widget (only as a dialog) (e.g., it closes if ESC is pressed +--- ./lib/taurus/qt/qtgui/panel/qrawdatachooser.py (original) ++++ ./lib/taurus/qt/qtgui/panel/qrawdatachooser.py (refactored) +@@ -27,6 +27,7 @@ + RawDataChooser.py: widget for importing RawData (from file or from a function) + """ + ++from builtins import str + __all__ = ["QRawDataWidget"] + + import numpy +--- ./lib/taurus/qt/qtgui/panel/taurusconfigeditor.py (original) ++++ ./lib/taurus/qt/qtgui/panel/taurusconfigeditor.py (refactored) +@@ -27,12 +27,15 @@ + taurusconfigeditor.py: + """ + ++from future import standard_library ++standard_library.install_aliases() ++from builtins import str + __all__ = ["QConfigEditor"] + + __docformat__ = 'restructuredtext' + + from taurus.external.qt import Qt +-import cPickle as pickle ++import pickle as pickle + import os + import tempfile + from taurus.qt.qtcore.configuration import BaseConfigurableClass +@@ -77,9 +80,9 @@ + + :param iniFileName: (str) + ''' +- self.originalFile = unicode(iniFileName) ++ self.originalFile = str(iniFileName) + self._file = tempfile.NamedTemporaryFile() +- self._temporaryFile = unicode(self._file.name) ++ self._temporaryFile = str(self._file.name) + + shutil.copyfile(self.originalFile, self._temporaryFile) + +--- ./lib/taurus/qt/qtgui/panel/taurusconfigurationpanel.py (original) ++++ ./lib/taurus/qt/qtgui/panel/taurusconfigurationpanel.py (refactored) +@@ -25,6 +25,7 @@ + + """This module provides a set of basic taurus widgets based on QLineEdit""" + ++from builtins import str + __all__ = ["TaurusConfigurationPanel", "TangoConfigLineEdit", + "TaurusConfigLineEdit"] + +--- ./lib/taurus/qt/qtgui/panel/taurusdemo.py (original) ++++ ./lib/taurus/qt/qtgui/panel/taurusdemo.py (refactored) +@@ -24,6 +24,7 @@ + ############################################################################# + + from __future__ import print_function ++from builtins import str + import sys + import operator + +@@ -55,12 +56,12 @@ + continue + internal_widget_module = sys.modules[internal_widget_module_name] + if hasattr(internal_widget_module, "demo"): +- if operator.isCallable(internal_widget_module.demo): ++ if hasattr(internal_widget_module.demo, '__call__'): + demos[internal_widget_module_name] = internal_widget_module.demo + + groups = set() + +- for demo_name in demos.keys(): ++ for demo_name in list(demos.keys()): + parts = demo_name.split(".") + group = parts[-2] + groups.add(group) +--- ./lib/taurus/qt/qtgui/panel/taurusdevicepanel.py (original) ++++ ./lib/taurus/qt/qtgui/panel/taurusdevicepanel.py (refactored) +@@ -27,6 +27,8 @@ + TaurusDevicePanel.py: + """ + ++from builtins import str ++from past.builtins import basestring + __all__ = ["TaurusDevicePanel", "TaurusDevPanel"] + + __docformat__ = 'restructuredtext' +@@ -72,10 +74,10 @@ + + + def get_regexp_dict(dct, key, default=None): # TODO: Tango-centric +- for k, v in dct.items(): # Trying regular expression match ++ for k, v in list(dct.items()): # Trying regular expression match + if matchCl(k, key): + return v +- for k, v in dct.items(): # If failed, trying if key is contained ++ for k, v in list(dct.items()): # If failed, trying if key is contained + if k.lower() in key.lower(): + return v + if default is not None: +@@ -323,7 +325,7 @@ + font.setPointSize(15) + self._label.setFont(font) + if pixmap is None and self.getIconMap(): +- for k, v in self.getIconMap().items(): ++ for k, v in list(self.getIconMap().items()): + if searchCl(k, model): + pixmap = v + if pixmap is not None: +@@ -348,7 +350,7 @@ + filters = get_regexp_dict( + TaurusDevicePanel._attribute_filter, model, ['.*']) + if hasattr(filters, 'keys'): +- filters = filters.items() # Dictionary! ++ filters = list(filters.items()) # Dictionary! + if filters and isinstance(filters[0], (list, tuple)): # Mapping + self._attrs = [] + for tab, attrs in filters: +@@ -466,7 +468,7 @@ + form.setViewFilters([lambda c: str(c.cmd_name).lower() not in ( + 'state', 'status') and any(searchCl(s[0], str(c.cmd_name)) for s in params)]) + form.setDefaultParameters(dict((k, v) for k, v in ( +- params if not hasattr(params, 'items') else params.items()) if v)) ++ params if not hasattr(params, 'items') else list(params.items())) if v)) + for wid in form._cmdWidgets: + if not hasattr(wid, 'getCommand') or not hasattr(wid, 'setDangerMessage'): + continue +--- ./lib/taurus/qt/qtgui/panel/taurusform.py (original) ++++ ./lib/taurus/qt/qtgui/panel/taurusform.py (refactored) +@@ -27,6 +27,10 @@ + from __future__ import print_function + from __future__ import absolute_import + ++from builtins import zip ++from builtins import filter ++from builtins import str ++from past.builtins import basestring + __all__ = ["TaurusAttrForm", "TaurusCommandsForm", "TaurusForm"] + + __docformat__ = 'restructuredtext' +@@ -207,7 +211,7 @@ + if self.__modelChooserDlg is None: + self.__modelChooserDlg = Qt.QDialog(self) + self.__modelChooserDlg.setWindowTitle( +- "%s - Model Chooser" % unicode(self.windowTitle())) ++ "%s - Model Chooser" % str(self.windowTitle())) + self.__modelChooserDlg.modelChooser = TaurusModelChooser() + layout = Qt.QVBoxLayout() + layout.addWidget(self.__modelChooserDlg.modelChooser) +@@ -653,7 +657,7 @@ + return + + for f in self.getViewFilters(): +- commands = filter(f, commands) ++ commands = list(filter(f, commands)) + + self._clearFrame() + +@@ -739,7 +743,7 @@ + + ''' + self._defaultParameters = dict((k.lower(), v) +- for k, v in params.items()) ++ for k, v in list(params.items())) + self._updateCommandWidgets() + + def setViewFilters(self, filterlist): +@@ -838,7 +842,7 @@ + return + attrlist = sorted(dev.attribute_list_query(), key=self._sortKey) + for f in self.getViewFilters(): +- attrlist = filter(f, attrlist) ++ attrlist = list(filter(f, attrlist)) + attrnames = [] + devname = self.getModelName() + for a in attrlist: +--- ./lib/taurus/qt/qtgui/panel/taurusinputpanel.py (original) ++++ ./lib/taurus/qt/qtgui/panel/taurusinputpanel.py (refactored) +@@ -26,6 +26,9 @@ + """This module provides an Input panel (usually used inside a TaurusDialog)""" + from __future__ import print_function + ++from builtins import map ++from builtins import str ++from builtins import object + __all__ = ["TaurusInputPanel"] + + __docformat__ = 'restructuredtext' +@@ -121,7 +124,7 @@ + self.setText(input_data['prompt']) + + data_type = input_data.get('data_type', 'String') +- is_seq = not isinstance(data_type, (str, unicode)) and \ ++ is_seq = not isinstance(data_type, (str, str)) and \ + isinstance(data_type, collections.Sequence) + if is_seq: + panel, getter = self.create_selection_panel(input_data) +@@ -161,7 +164,7 @@ + self._ui.inputWidget = combobox = Qt.QComboBox() + items = input_data['data_type'] + for item in items: +- is_seq = not isinstance(item, (str, unicode)) and \ ++ is_seq = not isinstance(item, (str, str)) and \ + isinstance(item, collections.Sequence) + if is_seq: + text, userData = item +@@ -183,7 +186,7 @@ + self._ui.inputWidget = buttongroup = Qt.QButtonGroup() + buttongroup.setExclusive(True) + for item in items: +- is_seq = not isinstance(item, (str, unicode)) and \ ++ is_seq = not isinstance(item, (str, str)) and \ + isinstance(item, collections.Sequence) + if is_seq: + text, userData = item +@@ -210,7 +213,7 @@ + default_value = input_data.get('default_value') + if default_value is None: + default_value = () +- dft_is_seq = not isinstance(default_value, (str, unicode)) and \ ++ dft_is_seq = not isinstance(default_value, (str, str)) and \ + isinstance(default_value, collections.Sequence) + if not dft_is_seq: + default_value = default_value, +@@ -219,7 +222,7 @@ + listwidget.setSelectionMode(Qt.QAbstractItemView.MultiSelection) + + for item in items: +- is_seq = not isinstance(item, (str, unicode)) and \ ++ is_seq = not isinstance(item, (str, str)) and \ + isinstance(item, collections.Sequence) + if is_seq: + text, userData = item +--- ./lib/taurus/qt/qtgui/panel/taurusmessagepanel.py (original) ++++ ./lib/taurus/qt/qtgui/panel/taurusmessagepanel.py (refactored) +@@ -25,6 +25,10 @@ + + """This module provides a panel to display taurus messages""" + ++from future import standard_library ++standard_library.install_aliases() ++from builtins import str ++from builtins import object + __all__ = ["TaurusMessagePanel", "TaurusMessageErrorHandler", + "TangoMessageErrorHandler", "MacroServerMessageErrorHandler"] + +@@ -278,7 +282,7 @@ + def _initReportCombo(self): + report_handlers = get_report_handlers() + combo = self.reportComboBox() +- for name, report_handler in report_handlers.items(): ++ for name, report_handler in list(report_handlers.items()): + name = Qt.QVariant(name) + combo.addItem(report_handler.Label, name) + +@@ -504,7 +508,7 @@ + :return: a message box error handler + :rtype: TaurusMessageBoxErrorHandler class object""" + +- for exc, h_klass in klass.ErrorHandlers.items(): ++ for exc, h_klass in list(klass.ErrorHandlers.items()): + if issubclass(err_type, exc): + return h_klass + return TaurusMessageErrorHandler +@@ -589,8 +593,8 @@ + except PyTango.DevFailed as df1: + try: + import traceback +- import StringIO +- origin = StringIO.StringIO() ++ import io ++ origin = io.StringIO() + traceback.print_stack(file=origin) + origin.seek(0) + origin = origin.read() +--- ./lib/taurus/qt/qtgui/panel/taurusmodelchooser.py (original) ++++ ./lib/taurus/qt/qtgui/panel/taurusmodelchooser.py (refactored) +@@ -29,6 +29,7 @@ + from __future__ import print_function + from __future__ import absolute_import + ++from builtins import str + __all__ = ["TaurusModelSelectorTree", "TaurusModelChooser"] + + import sys +--- ./lib/taurus/qt/qtgui/panel/taurusmodellist.py (original) ++++ ./lib/taurus/qt/qtgui/panel/taurusmodellist.py (refactored) +@@ -26,6 +26,10 @@ + """ + itemsmodel Model and view for new CurveItem configuration + """ ++from builtins import str ++from builtins import range ++from past.builtins import basestring ++from builtins import object + __all__ = ['TaurusModelModel', 'TaurusModelItem', 'TaurusModelList'] + #raise UnimplementedError('Under Construction!') + +@@ -172,7 +176,7 @@ + if index.isValid() and (0 <= index.row() < self.rowCount()): + row = index.row() + item = self.items[row] +- value = Qt.from_qvariant(value, unicode) ++ value = Qt.from_qvariant(value, str) + if role == Qt.Qt.EditRole: + item.src = value + elif role == Qt.Qt.DisplayRole: +@@ -188,7 +192,7 @@ + if parentindex is None: + parentindex = Qt.QModelIndex() + if items is None: +- slice = [TaurusModelItem() for i in xrange(rows)] ++ slice = [TaurusModelItem() for i in range(rows)] + else: + slice = list(items) + # note that the rows parameter is ignored if items is passed +@@ -424,7 +428,7 @@ + + .. seealso:: :meth:`getModelItems` + ''' +- return [unicode(s.src) for s in self.getModelItems()] ++ return [str(s.src) for s in self.getModelItems()] + + @classmethod + def getQtDesignerPluginInfo(cls): +--- ./lib/taurus/qt/qtgui/panel/taurusvalue.py (original) ++++ ./lib/taurus/qt/qtgui/panel/taurusvalue.py (refactored) +@@ -27,6 +27,7 @@ + taurusvalue.py: + """ + ++from builtins import str + __all__ = ["TaurusValue", "TaurusValuesFrame", "DefaultTaurusValueCheckBox", + "DefaultUnitsWidget", "TaurusPlotButton", "TaurusArrayEditorButton", + "TaurusValuesTableButton", "TaurusValuesTableButton_W", +--- ./lib/taurus/qt/qtgui/panel/report/albareport.py (original) ++++ ./lib/taurus/qt/qtgui/panel/report/albareport.py (refactored) +@@ -26,6 +26,7 @@ + """This module provides a panel to display taurus messages""" + from __future__ import absolute_import + ++from builtins import str + __all__ = ["TicketReportHandler"] + + __docformat__ = 'restructuredtext' +--- ./lib/taurus/qt/qtgui/panel/report/basicreport.py (original) ++++ ./lib/taurus/qt/qtgui/panel/report/basicreport.py (refactored) +@@ -25,6 +25,7 @@ + + """This module provides a panel to display taurus messages""" + ++from builtins import str + __all__ = ["ClipboardReportHandler", "SMTPReportHandler"] + + __docformat__ = 'restructuredtext' +--- ./lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py (original) ++++ ./lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py (refactored) +@@ -25,6 +25,7 @@ + + """Test for taurus.qt.qtgui.panel.taurusvalue""" + ++from builtins import str + import unittest + from taurus.test import insertTest + from taurus.qt.qtgui.test import BaseWidgetTestCase +--- ./lib/taurus/qt/qtgui/plot/arrayedit.py (original) ++++ ./lib/taurus/qt/qtgui/plot/arrayedit.py (refactored) +@@ -27,8 +27,13 @@ + arrayedit.py: Widget for editing a spectrum/array via control points + """ + from __future__ import absolute_import +- +- ++from __future__ import division ++ ++ ++from builtins import zip ++from builtins import str ++from builtins import range ++from past.utils import old_div + import numpy + from taurus.external.qt import Qt, Qwt5 + from taurus.qt.qtgui.util.ui import UILoadable +@@ -266,7 +271,7 @@ + new_xp = numpy.zeros(table.rowCount()) + new_corrp = numpy.zeros(table.rowCount()) + try: +- for i in xrange(table.rowCount()): ++ for i in range(table.rowCount()): + new_xp[i] = float(table.item(i, 0).text()) + new_corrp[i] = float(table.item(i, 1).text()) + self.setCorrection(new_xp, new_corrp) +@@ -407,7 +412,7 @@ + Qt.QMessageBox.warning( + self, 'Scaling Error', 'The master at this control point is zero-valued. This point cannot be used as reference for scaling') + return +- v = sender.corrSB.value() / (self.yp[index]) ++ v = old_div(sender.corrSB.value(), (self.yp[index])) + for i in range(0, index): + self._controllers[i].corrSB.setValue(v * self.yp[i]) + +@@ -420,7 +425,7 @@ + Qt.QMessageBox.warning( + self, 'Scaling Error', 'The master at this control point is zero-valued. This point cannot be used as reference for scaling') + return +- v = sender.corrSB.value() / (self.yp[index]) ++ v = old_div(sender.corrSB.value(), (self.yp[index])) + for i in range(index + 1, self.xp.size): + self._controllers[i].corrSB.setValue(v * self.yp[i]) + +--- ./lib/taurus/qt/qtgui/plot/curveStatsDlg.py (original) ++++ ./lib/taurus/qt/qtgui/plot/curveStatsDlg.py (refactored) +@@ -28,7 +28,11 @@ + A Qt dialog for choosing plot appearance (symbols and lines) + for a QwtPlot-derived widget (like Taurusplot) + """ +- ++from __future__ import division ++ ++from builtins import zip ++from builtins import range ++from past.utils import old_div + from taurus.external.qt import Qt, Qwt5 + from datetime import datetime + from taurus.qt.qtgui.util.ui import UILoadable +@@ -68,7 +72,7 @@ + + cbs = (self.ui.npointsStatCB, self.ui.minStatCB, self.ui.maxStatCB, + self.ui.meanStatCB, self.ui.stdStatCB, self.ui.rmsStatCB) +- self._checkboxToColMap = dict(zip(cbs, xrange(len(self.statColumns)))) ++ self._checkboxToColMap = dict(list(zip(cbs, range(len(self.statColumns))))) + + self.minPicker = Qwt5.QwtPlotPicker(Qwt5.QwtPlot.xBottom, + Qwt5.QwtPlot.yLeft, +@@ -133,10 +137,10 @@ + + def _timestamptToQDateTime(self, ts): + dt = datetime.fromtimestamp(ts) +- return Qt.QDateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond / 1000) ++ return Qt.QDateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, old_div(dt.microsecond, 1000)) + + def _QDateTimeToTimestamp(self, qdt): +- return qdt.toTime_t() + qdt.time().msec() / 1000. ++ return qdt.toTime_t() + old_div(qdt.time().msec(), 1000.) + + def onSelectMin(self): + '''slot called when the user clicks on the selectMin button''' +@@ -233,7 +237,7 @@ + '''returns a list of row numbers corresponding to the selected rows of the table''' + selected = [] + for rg in self.ui.statsTW.selectedRanges(): +- for row in xrange(rg.topRow(), rg.topRow() + rg.rowCount()): ++ for row in range(rg.topRow(), rg.topRow() + rg.rowCount()): + selected.append(row) + return selected + +@@ -249,21 +253,21 @@ + xmin, xmax = None, None + if self.ui.minCB.isChecked(): + if plot.getXIsTime(): +- xmin = self.ui.minDTE.dateTime().toTime_t() + self.ui.minDTE.time().msec() / \ +- 1000. ++ xmin = self.ui.minDTE.dateTime().toTime_t() + old_div(self.ui.minDTE.time().msec(), \ ++ 1000.) + else: + xmin = self.ui.minSB.value() + if self.ui.maxCB.isChecked(): + if plot.getXIsTime(): +- xmax = self.ui.maxDTE.dateTime().toTime_t() + self.ui.maxDTE.time().msec() / \ +- 1000. ++ xmax = self.ui.maxDTE.dateTime().toTime_t() + old_div(self.ui.maxDTE.time().msec(), \ ++ 1000.) + else: + xmax = self.ui.maxSB.value() + limits = xmin, xmax + + selectedRows = self.getSelectedRows() + if len(selectedRows) == 0: +- selectedRows = range(len(self.curveNames)) ++ selectedRows = list(range(len(self.curveNames))) + selectedCurves = [self.curveNames[i] for i in selectedRows] + statsdict = plot.getCurveStats( + limits=limits, curveNames=selectedCurves) +--- ./lib/taurus/qt/qtgui/plot/curveprops.py (original) ++++ ./lib/taurus/qt/qtgui/plot/curveprops.py (refactored) +@@ -27,6 +27,9 @@ + curveprops: Model and view for curve properties + """ + from __future__ import absolute_import ++from builtins import str ++from builtins import range ++from builtins import object + __all__ = ['CurveConf', 'CurvesTableModel', + 'ExtendedSelectionModel', 'CurvePropertiesView'] + #raise NotImplementedError('Under Construction!') +@@ -50,7 +53,7 @@ + # set some named constants + # columns: + NUMCOLS = 4 +-X, Y, TITLE, VIS = range(NUMCOLS) ++X, Y, TITLE, VIS = list(range(NUMCOLS)) + SRC_ROLE = Qt.Qt.UserRole + 1 + PROPS_ROLE = Qt.Qt.UserRole + 2 + +@@ -74,7 +77,7 @@ + + def processSrc(self, src): + '''returns src,display,icon,ok''' +- src = unicode(src) ++ src = str(src) + # empty + if src == '': + return '', '', Qt.QIcon(), True +@@ -243,7 +246,7 @@ + row, 0), self.index(row, self.ncolumns - 1)) + else: + column = index.column() +- value = Qt.from_qvariant(value, unicode) ++ value = Qt.from_qvariant(value, str) + if column == X: + curve.x.setSrc(value) + elif column == Y: +@@ -357,8 +360,8 @@ + self.loadUi() + + self.ui.sStyleCB.insertItems(0, sorted(NamedSymbolStyles.values())) +- self.ui.lStyleCB.insertItems(0, NamedLineStyles.values()) +- self.ui.cStyleCB.insertItems(0, NamedCurveStyles.values()) ++ self.ui.lStyleCB.insertItems(0, list(NamedLineStyles.values())) ++ self.ui.cStyleCB.insertItems(0, list(NamedCurveStyles.values())) + self.ui.sColorCB.addItem("") + self.ui.lColorCB.addItem("") + for color in NamedColors: +--- ./lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py (original) ++++ ./lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py (refactored) +@@ -30,6 +30,8 @@ + """ + from __future__ import print_function + ++from builtins import str ++from builtins import object + import copy + + from taurus.external.qt import Qt, Qwt5 +@@ -46,7 +48,7 @@ + Qt.Qt.DashDotDotLine: ".._..", + } + ReverseNamedLineStyles = {} +-for k, v in NamedLineStyles.iteritems(): ++for k, v in NamedLineStyles.items(): + ReverseNamedLineStyles[v] = k + + NamedCurveStyles = {None: "", +@@ -57,7 +59,7 @@ + Qwt5.QwtPlotCurve.Dots: "Dots" + } + ReverseNamedCurveStyles = {} +-for k, v in NamedCurveStyles.iteritems(): ++for k, v in NamedCurveStyles.items(): + ReverseNamedCurveStyles[v] = k + + NamedSymbolStyles = { +@@ -81,7 +83,7 @@ + } + + ReverseNamedSymbolStyles = {} +-for k, v in NamedSymbolStyles.iteritems(): ++for k, v in NamedSymbolStyles.items(): + ReverseNamedSymbolStyles[v] = k + + NamedColors = ["Black", "Red", "Blue", "Magenta", +@@ -113,8 +115,8 @@ + self.loadUi() + self.autoApply = autoApply + self.sStyleCB.insertItems(0, sorted(NamedSymbolStyles.values())) +- self.lStyleCB.insertItems(0, NamedLineStyles.values()) +- self.cStyleCB.insertItems(0, NamedCurveStyles.values()) ++ self.lStyleCB.insertItems(0, list(NamedLineStyles.values())) ++ self.cStyleCB.insertItems(0, list(NamedCurveStyles.values())) + self.sColorCB.addItem("") + self.lColorCB.addItem("") + if not showButtons: +@@ -164,7 +166,7 @@ + self._curvePropDictOrig = copy.deepcopy(curvePropDict) + self.curvesLW.clear() + self.__itemsDict = CaselessDict() +- for name, prop in self.curvePropDict.iteritems(): ++ for name, prop in self.curvePropDict.items(): + # create and insert the item + item = Qt.QListWidgetItem(Qt.QString(prop.title), self.curvesLW) + self.__itemsDict[name] = item +@@ -192,7 +194,7 @@ + ''' + if newTitlesDict is None: + return +- for name, title in newTitlesDict.iteritems(): ++ for name, title in newTitlesDict.items(): + self.curvePropDict[name].title = title + self.__itemsDict[name].setText(title) + +--- ./lib/taurus/qt/qtgui/plot/qwtdialog.py (original) ++++ ./lib/taurus/qt/qtgui/plot/qwtdialog.py (refactored) +@@ -28,7 +28,11 @@ + """ + from __future__ import print_function + from __future__ import absolute_import +- ++from __future__ import division ++ ++from builtins import str ++from builtins import range ++from past.utils import old_div + __all__ = ["TaurusPlotConfigDialog"] + + import time +@@ -251,11 +255,11 @@ + elif dt < 120: + return "%g s" % round(dt, 0) + elif dt < 7200: +- return "%g m" % round(dt / 60, 0) ++ return "%g m" % round(old_div(dt, 60), 0) + elif dt < 172800: +- return "%g h" % round(dt / 3600, 0) +- else: +- return "%g d" % round(dt / 86400, 0) ++ return "%g h" % round(old_div(dt, 3600), 0) ++ else: ++ return "%g d" % round(old_div(dt, 86400), 0) + + def str2deltatime(self, strtime): + '''Translates a time string to seconds +@@ -267,7 +271,7 @@ + 24, 'w': 3600 * 24 * 7, 'y': 3600 * 24 * 365} + if strtime.lower() == "now": + return time.time() +- if strtime[-1] in timeunits.keys(): ++ if strtime[-1] in list(timeunits.keys()): + try: + return float(strtime[:-1]) * timeunits[strtime[-1]] + except Exception as e: +--- ./lib/taurus/qt/qtgui/plot/scales.py (original) ++++ ./lib/taurus/qt/qtgui/plot/scales.py (refactored) +@@ -27,6 +27,10 @@ + scales.py: Custom scales used by taurus.qt.qtgui.plot module + """ + from __future__ import print_function ++from __future__ import division ++from builtins import str ++from builtins import range ++from past.utils import old_div + __all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", + "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", + "FixedLabelsScaleDraw"] +@@ -218,7 +222,7 @@ + + elif dx > 2: # 2s + format = "%H:%M:%S" +- majticks = range(int(x1) + 1, int(x2)) ++ majticks = list(range(int(x1) + 1, int(x2))) + + else: # less than 2s (show microseconds) + scaleDiv = Qwt5.QwtLinearScaleEngine.divideScale( +@@ -229,7 +233,7 @@ + # make sure to comply with maxMajTicks + L = len(majticks) + if L > maxMajSteps: +- majticks = majticks[::int(numpy.ceil(float(L) / maxMajSteps))] ++ majticks = majticks[::int(numpy.ceil(old_div(float(L), maxMajSteps)))] + + scaleDiv = Qwt5.QwtScaleDiv(interval, minticks, medticks, majticks) + self.scaleDraw().setDatetimeLabelFormat(format) +@@ -362,7 +366,7 @@ + s = 86400 # 1 day + # calculate a step size that respects the base step (s) and also + # enforces the maxMajSteps +- stepSize = s * int(numpy.ceil(float(d_range // s) / maxMajSteps)) ++ stepSize = s * int(numpy.ceil(old_div(float(d_range // s), maxMajSteps))) + return Qwt5.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize) + + @staticmethod +--- ./lib/taurus/qt/qtgui/plot/taurusarrayedit.py (original) ++++ ./lib/taurus/qt/qtgui/plot/taurusarrayedit.py (refactored) +@@ -25,6 +25,7 @@ + + + from __future__ import absolute_import ++from builtins import str + from taurus.external.qt import Qt + import taurus + import numpy +--- ./lib/taurus/qt/qtgui/plot/taurusplot.py (original) ++++ ./lib/taurus/qt/qtgui/plot/taurusplot.py (refactored) +@@ -28,6 +28,16 @@ + """ + from __future__ import print_function + from __future__ import absolute_import ++from __future__ import division ++from future import standard_library ++standard_library.install_aliases() ++from builtins import zip ++from builtins import next ++from builtins import str ++from builtins import range ++from past.builtins import basestring ++from past.utils import old_div ++from builtins import object + __all__ = ["TaurusCurve", "TaurusCurveMarker", + "TaurusXValues", "TaurusPlot", "isodatestr2float"] + +@@ -144,9 +154,9 @@ + ''' + xmap = self.plot().canvasMap(self.xAxis()) + ymap = self.plot().canvasMap(self.yAxis()) +- xmiddlepoint = xmap.p1() + xmap.pDist() / 2 # p1,p2 are left,right here ++ xmiddlepoint = xmap.p1() + old_div(xmap.pDist(), 2) # p1,p2 are left,right here + # p1,p2 are bottom,top here (and pixel coords start from top!) +- ymiddlepoint = ymap.p2() + ymap.pDist() / 2 ++ ymiddlepoint = ymap.p2() + old_div(ymap.pDist(), 2) + xPaintPos = xmap.transform(self.xValue()) + yPaintPos = ymap.transform(self.yValue()) + +@@ -912,8 +922,8 @@ + if imax is None: + imax = data.size() + +- x = numpy.array([data.x(i) for i in xrange(imin, imax)]) +- y = numpy.array([data.y(i) for i in xrange(imin, imax)]) ++ x = numpy.array([data.x(i) for i in range(imin, imax)]) ++ y = numpy.array([data.y(i) for i in range(imin, imax)]) + + if limits is not None: + xmin, xmax = limits +@@ -1278,7 +1288,7 @@ + + def setFormat(self, format): + """Reimplemented from TaurusBaseComponent""" +- targetCurveNames = self.curves.iterkeys() ++ targetCurveNames = iter(self.curves.keys()) + for name in targetCurveNames: + curve = self.curves.get(name, None) + w = getattr(curve, 'owner', curve) +@@ -1345,7 +1355,7 @@ + if curve is None: + title = None + else: +- title = unicode(curve.title().text()) ++ title = str(curve.title().text()) + finally: + self.curves_lock.release() + return title +@@ -1360,7 +1370,7 @@ + ''' + self.curves_lock.acquire() + try: +- ret = copy.deepcopy(self.curves.keys()) ++ ret = copy.deepcopy(list(self.curves.keys())) + finally: + self.curves_lock.release() + return ret +@@ -1395,7 +1405,7 @@ + try: + if ordered is None: + orderedObjs = sorted( +- self.curves.values(), key=lambda curve: curve.titleText(compiled=True)) ++ list(self.curves.values()), key=lambda curve: curve.titleText(compiled=True)) + else: + #current = self.curves.keys() + # if len(ordered) != len(current) or set(map(str.lower,current)) - set(map(str.lower, ordered)): +@@ -1430,7 +1440,7 @@ + for z in (self._zoomer1, self._zoomer2): + z.setEnabled(z.yAxis() == axis) + self._zoomer = self.getZoomers(axis)[0] +- self.debug('Now Zooming on %s' % unicode(self.getAxisName(axis))) ++ self.debug('Now Zooming on %s' % str(self.getAxisName(axis))) + return self._zoomer.yAxis() + + def getAxisName(self, axis): +@@ -1441,7 +1451,7 @@ + + :return: (unicode) + ''' +- name = unicode(self.axisTitle(axis).text()) ++ name = str(self.axisTitle(axis).text()) + if name == '': + name = self._axesnames[axis] + return name +@@ -1451,7 +1461,7 @@ + + :param paused: (bool) if True, the plot will be paused + ''' +- for c in self.curves.itervalues(): ++ for c in self.curves.values(): + c.setPaused(paused) + self._isPaused = paused + +@@ -1524,7 +1534,7 @@ + If None given, it will be autocalculated + + ''' +- positions, labels = zip(*pos_and_labels) # "unzipping" ++ positions, labels = list(zip(*pos_and_labels)) # "unzipping" + positions = list(positions) + + self.setAxisScaleEngine(axis, FixedLabelsScaleEngine(positions)) +@@ -1662,7 +1672,7 @@ + self.curves_lock.acquire() + try: + self._showMaxPeaks = show +- for curveName in self.curves.iterkeys(): ++ for curveName in self.curves.keys(): + curve = self.curves.get(str(curveName)) + if show: + curve.showMaxPeak(True) +@@ -1683,7 +1693,7 @@ + self.curves_lock.acquire() + try: + self._showMinPeaks = show +- for curveName in self.curves.iterkeys(): ++ for curveName in self.curves.keys(): + curve = self.curves.get(str(curveName)) + if show: + curve.showMinPeak(True) +@@ -1749,7 +1759,7 @@ + try: + # get the key in the self.curves directory + curveName = None +- for curveName, c in self.curves.iteritems(): ++ for curveName, c in self.curves.items(): + if c is curve: + break + axis = curve.yAxis() +@@ -1930,7 +1940,7 @@ + """ + self.curves_lock.acquire() + try: +- names = [name for name in self.curves.keys() if self.curves[ ++ names = [name for name in list(self.curves.keys()) if self.curves[ + name].isRawData] + finally: + self.curves_lock.release() +@@ -1951,8 +1961,8 @@ + try: + if curvename in self.curves: + data = self.curves[curvename].data() +- x = [data.x(i) for i in xrange(data.size())] +- y = [data.y(i) for i in xrange(data.size())] ++ x = [data.x(i) for i in range(data.size())] ++ y = [data.y(i) for i in range(data.size())] + else: + self.error("Curve '%s' not found" % curvename) + raise KeyError() +@@ -1988,7 +1998,7 @@ + xnames.append(xname) + ynames.append(yname) + +- del_curves = [name for name in self.curves.keys() ++ del_curves = [name for name in list(self.curves.keys()) + if name not in ynames] + + # if all curves were removed, reset the color palette +@@ -2101,7 +2111,7 @@ + '''See :meth:`TaurusBaseComponent.parentModelChanged`''' + self.curves_lock.acquire() + try: +- for curve in self.curves.values(): ++ for curve in list(self.curves.values()): + curve.setModelCheck(curve.getModel(), False) + finally: + self.curves_lock.release() +@@ -2260,7 +2270,7 @@ + self.curves_lock.acquire() + try: + propdict = {} +- for name, curve in self.curves.iteritems(): ++ for name, curve in self.curves.items(): + propdict[name] = copy.deepcopy(curve.getAppearanceProperties()) + finally: + self.curves_lock.release() +@@ -2278,7 +2288,7 @@ + """ + self.curves_lock.acquire() + try: +- for name, prop in propDict.iteritems(): ++ for name, prop in propDict.items(): + c = self.curves[name] + c.setAppearanceProperties(copy.deepcopy(prop)) + visible = getattr(prop, 'visible', True) +@@ -2327,7 +2337,7 @@ + miscdict = {'defaultCurvesTitle': self.getDefaultCurvesTitle(), + 'canvasBackground': self.canvasBackground(), + 'orderedCurveNames': self.getCurveNamesSorted(), +- 'plotTitle': unicode(self.title().text()), ++ 'plotTitle': str(self.title().text()), + 'formatter': self.getFormat()} + if self.isWindow(): + miscdict["Geometry"] = self.saveGeometry() +@@ -2397,7 +2407,7 @@ + self.curves_lock.acquire() + try: + if curvenames is None: +- curvenames = self.curves.keys() ++ curvenames = list(self.curves.keys()) + curvenames = self._lowerIfInsensitive(curvenames) + for name in curvenames: + curve = self.curves.get(name) +@@ -2429,11 +2439,11 @@ + if not self.checkConfigVersion(configdict): + return + # attach the curves +- for rd in configdict["RawData"].values(): ++ for rd in list(configdict["RawData"].values()): + self.attachRawData(rd) + # for backwards compatibility, if the ordered list of models is not + # stored, it uses the unsorted dict values +- models = configdict.get("model", configdict["TangoCurves"].values()) ++ models = configdict.get("model", list(configdict["TangoCurves"].values())) + self.addModels(models) + # set curve properties + self.setCurveAppearanceProperties(configdict["CurveProp"]) +@@ -2486,7 +2496,7 @@ + + :return: (str) file name used + """ +- import cPickle as pickle ++ import pickle as pickle + if ofile is None: + ofile = str(Qt.QFileDialog.getSaveFileName(self, 'Save Taurusplot Configuration', + 'TaurusplotConfig.pck', 'TaurusPlot Curve Properties File (*.pck)')) +@@ -2506,7 +2516,7 @@ + + :return: (str) file name used + """ +- import cPickle as pickle ++ import pickle as pickle + if ifile is None: + ifile = str(Qt.QFileDialog.getOpenFileName( + self, 'Load Taurusplot Configuration', '', 'TaurusPlot Curve Properties File (*.pck)')) +@@ -2523,7 +2533,7 @@ + See :meth:`TaurusBaseComponent.setEventFilters` + ''' + if curvenames is None: +- curvenames = self.curves.keys() ++ curvenames = list(self.curves.keys()) + self.curves_lock.acquire() + try: + for name in curvenames: +@@ -2551,7 +2561,7 @@ + originalXRange = self.getXAxisRange() + self.curves_lock.acquire() + try: +- for c in self.curves.values(): ++ for c in list(self.curves.values()): + if c.minXValue() < minX: + minX = c.minXValue() + if c.maxXValue() > maxX: +@@ -2670,7 +2680,7 @@ + '''call safeSetData again on all curves to force a refiltering in case the scale changed its type''' + self.curves_lock.acquire() + try: +- for c in self.curves.itervalues(): ++ for c in self.curves.values(): + c.safeSetData() + finally: + self.curves_lock.release() +@@ -2801,7 +2811,7 @@ + else: + rawdata["x"] = M[:, xcol] + +- for col in xrange(M.shape[1]): ++ for col in range(M.shape[1]): + if col == xcol: + continue # ignore the xcol (it has already been set) + rawdata["y"] = M[:, col] +@@ -2926,7 +2936,7 @@ + try: + # get a list of *unique* axes with visible curves attached + axes = list( +- set([curve.yAxis() for curve in self.curves.itervalues() if curve.isVisible()])) ++ set([curve.yAxis() for curve in self.curves.values() if curve.isVisible()])) + + n = len(axes) + if n == 0: +@@ -2985,7 +2995,7 @@ + self.curves_lock.acquire() + try: + if targetCurveNames is None: +- targetCurveNames = self.curves.iterkeys() ++ targetCurveNames = iter(self.curves.keys()) + for name in targetCurveNames: + curve = self.curves.get(name, None) + if curve is None: +@@ -2993,7 +3003,7 @@ + if not curve.isVisible(): + continue + data = curve.data() +- for i in xrange(data.size()): ++ for i in range(data.size()): + point = Qt.QPoint(self.transform(curve.xAxis(), data.x( + i)), self.transform(curve.yAxis(), data.y(i))) + if scopeRect.contains(point): +@@ -3186,7 +3196,7 @@ + for name in curveNames: + curve = self.curves.get(name, None) + stats[name] = curve.getStats(limits=limits) +- stats[name]['title'] = unicode(curve.title().text()) ++ stats[name]['title'] = str(curve.title().text()) + finally: + self.curves_lock.release() + return stats +@@ -3359,7 +3369,7 @@ + + self.curves_lock.acquire() + try: +- for curve in self.curves.values(): ++ for curve in list(self.curves.values()): + curve.setUseParentModel(yesno) + finally: + self.curves_lock.release() +@@ -3459,7 +3469,7 @@ + try: + if curveNamesList is None: + curveNamesList = [ +- n for n, c in self.curves.iteritems() if not c.isRawData] ++ n for n, c in self.curves.items() if not c.isRawData] + newTitlesDict = CaselessDict() + for curveName in curveNamesList: + curve = self.curves.get(curveName) +@@ -3626,7 +3636,7 @@ + self._optimizationEnabled = enable + # make sure that already-created curves are also optimized + try: +- for curveName in self.curves.iterkeys(): ++ for curveName in self.curves.keys(): + curve = self.curves.get(str(curveName)) + curve.setPaintAttribute(curve.PaintFiltered, enable) + curve.setPaintAttribute(curve.ClipPolygons, enable) +@@ -3728,7 +3738,7 @@ + w.setModel(models) + + if options.export_file is not None: +- curves = dict.fromkeys(w.trendSets.keys(), 0) ++ curves = dict.fromkeys(list(w.trendSets.keys()), 0) + + def exportIfAllCurves(curve, trend=w, counters=curves): + curve = str(curve) +@@ -3743,7 +3753,7 @@ + if not curves: + w.close() + else: +- for ts in w.trendSets.values(): ++ for ts in list(w.trendSets.values()): + ts.dataChanged.connect(exportIfAllCurves) + sys.exit(app.exec_()) # exit without showing the widget + +--- ./lib/taurus/qt/qtgui/plot/taurustrend.py (original) ++++ ./lib/taurus/qt/qtgui/plot/taurustrend.py (refactored) +@@ -27,6 +27,11 @@ + taurustrend.py: Generic trend widget for Taurus + """ + from __future__ import print_function ++from __future__ import division ++from builtins import zip ++from builtins import str ++from builtins import range ++from past.utils import old_div + __all__ = ["ScanTrendsSet", "TaurusTrend", "TaurusTrendsSet"] + + from datetime import datetime +@@ -113,7 +118,7 @@ + self._orderedCurveNames = [] + else: + self._curves = curves +- self._orderedCurveNames = curves.keys() ++ self._orderedCurveNames = list(curves.keys()) + self._titleText = None + self.setModel(name) + +@@ -184,7 +189,7 @@ + ntrends = len(self._curves) + if '' in basetitle: + ret = [basetitle.replace('', "%i" % i) +- for i in xrange(ntrends)] ++ for i in range(ntrends)] + else: + ret = [basetitle] * ntrends + return ret +@@ -472,7 +477,7 @@ + # them to the TrendSet + name = self.getModelName() + rawdata = {'x': numpy.zeros(0), 'y': numpy.zeros(0)} +- for i in xrange(ntrends): ++ for i in range(ntrends): + subname = "%s[%i]" % (name, i) + self.parent().attachRawData(rawdata, id=subname) + self.addCurve(subname, self.parent().curves[subname]) +@@ -830,7 +835,7 @@ + # if autoclear is False we have to work directly with each curve (and + # cannot buffer) + else: +- for n, v in recordData.items(): ++ for n, v in list(recordData.items()): + c = self._curves.get(n, None) + if c is None: + continue +@@ -1124,7 +1129,7 @@ + not remove the models, it simply removes all stored data)''' + self.curves_lock.acquire() + try: +- for ts in self.trendSets.itervalues(): ++ for ts in self.trendSets.values(): + ts.clearTrends(replot=False) + finally: + self.curves_lock.release() +@@ -1158,7 +1163,7 @@ + try: + # For it to work properly, 'names' must be a CaselessList, just as + # self.trendSets is a CaselessDict +- del_sets = [name for name in self.trendSets.keys() ++ del_sets = [name for name in list(self.trendSets.keys()) + if name not in names] + + # if all trends were removed, reset the color palette +@@ -1276,7 +1281,7 @@ + index = 0 + else: + return tset.compiledTitle +- title = unicode(tset[index].title().text()) ++ title = str(tset[index].title().text()) + finally: + self.curves_lock.release() + return title +@@ -1325,7 +1330,7 @@ + newTitlesDict = CaselessDict() + for curveName in curveNamesList: + curvetitle = titletext +- for ts in self.trendSets.itervalues(): ++ for ts in self.trendSets.values(): + if curveName in ts: + curvetitle = ts.compileBaseTitle(curvetitle) + curvetitle = curvetitle.replace( +@@ -1426,7 +1431,7 @@ + # calling setInterval only when really needed. + self._replotTimer.setInterval(plot_refresh) + self.debug('New replot period is %1.2f seconds', +- (plot_refresh / 1000.)) ++ (old_div(plot_refresh, 1000.))) + + else: + self.warning( +@@ -1437,7 +1442,7 @@ + + .. seealso:: :meth:`TaurusBaseComponent.setPaused` + ''' +- for ts in self.trendSets.itervalues(): ++ for ts in self.trendSets.values(): + ts.setPaused(paused) + self._isPaused = paused + +@@ -1475,7 +1480,7 @@ + miscdict["MaxBufferSize"] = self.getMaxDataBufferSize() + self.curves_lock.acquire() + try: +- for tsname, ts in self.trendSets.iteritems(): ++ for tsname, ts in self.trendSets.items(): + if tsname in tsnames: + # store a dict containing just model names (key and value + # are the same) +@@ -1506,11 +1511,11 @@ + if maxBufferSize is not None: + self.setMaxDataBufferSize(maxBufferSize) + # attach the curves +- for rd in configdict["RawData"].values(): ++ for rd in list(configdict["RawData"].values()): + self.attachRawData(rd) + # for backwards compatibility, if the ordered list of models is not + # stored, it uses the unsorted dict values +- models = configdict.get("model", configdict["TrendSets"].values()) ++ models = configdict.get("model", list(configdict["TrendSets"].values())) + self.addModels(models) + for m in models: + tset = self.trendSets[m] +@@ -1686,7 +1691,7 @@ + + self.curves_lock.acquire() + try: +- for n, ts in self.trendSets.iteritems(): ++ for n, ts in self.trendSets.items(): + try: + ts.setMaxDataBufferSize(maxSize) + except ValueError: +@@ -1923,7 +1928,7 @@ + w.setModel(models) + # export option + if options.export_file is not None: +- curves = dict.fromkeys(w.trendSets.keys(), 0) ++ curves = dict.fromkeys(list(w.trendSets.keys()), 0) + + def exportIfAllCurves(curve, trend=w, counters=curves): + curve = str(curve) +@@ -1938,7 +1943,7 @@ + if not curves: + w.close() + else: +- for ts in w.trendSets.values(): ++ for ts in list(w.trendSets.values()): + ts.dataChanged.connect(exportIfAllCurves) + sys.exit(app.exec_()) # exit without showing the widget + +--- ./lib/taurus/qt/qtgui/table/qdictionary.py (original) ++++ ./lib/taurus/qt/qtgui/table/qdictionary.py (refactored) +@@ -26,6 +26,9 @@ + """This module provides basic python dictionary/list editor widgets""" + from __future__ import print_function + ++from builtins import str ++from builtins import range ++from past.builtins import basestring + __all__ = ["QDictionaryEditor", "QListEditor"] + + __docformat__ = 'restructuredtext' +@@ -87,8 +90,8 @@ + + def expand(d, level): # ,nrows=nrows,ncols=ncols): + # self.debug('\texpand(%s(%s),%s)'%(type(d),d,level)) +- items = d.items() if isinstance(d, SortedDict) else sorted( +- d.items() if hasattr(d, 'items') else d) ++ items = list(d.items()) if isinstance(d, SortedDict) else sorted( ++ list(d.items()) if hasattr(d, 'items') else d) + for k, v in items: + zero = data['nrows'] + data[(data['nrows'], level)] = k +@@ -106,7 +109,7 @@ + [table.append([]) for r in range(data.pop('nrows'))] + [table[r].append(None) for c in range(data.pop('ncols')) + for r in range(len(table))] +- for coord, value in data.items(): ++ for coord, value in list(data.items()): + table[coord[0]][coord[1]] = value + return table + +--- ./lib/taurus/qt/qtgui/table/qlogtable.py (original) ++++ ./lib/taurus/qt/qtgui/table/qlogtable.py (refactored) +@@ -27,6 +27,10 @@ + python :mod:`logging` module""" + from __future__ import absolute_import + ++from past.builtins import cmp ++from builtins import map ++from builtins import str ++from builtins import range + __all__ = ["QLoggingTableModel", "QLoggingTable", "QLoggingWidget", + "QRemoteLoggingTableModel"] + +@@ -50,7 +54,7 @@ + + from .qtable import QBaseTableWidget + +-LEVEL, TIME, MSG, NAME, ORIGIN = range(5) ++LEVEL, TIME, MSG, NAME, ORIGIN = list(range(5)) + HORIZ_HEADER = 'Level', 'Time', 'Message', 'By', 'Origin' + + __LEVEL_BRUSH = { +@@ -77,7 +81,7 @@ + elevel = taurus.Error + elif level <= taurus.Critical: + elevel = taurus.Critical +- f, g = map(Qt.QBrush, __LEVEL_BRUSH[elevel]) ++ f, g = list(map(Qt.QBrush, __LEVEL_BRUSH[elevel])) + return f, g + + +@@ -120,7 +124,7 @@ + host, procName, procID, threadName, threadID = _get_record_origin(rec) + pathname, filename, modulename, funcname, lineno = _get_record_trace(rec) + timestamp = str(datetime.datetime.fromtimestamp(rec.created)) +- bgcolor, fgcolor = map(Qt.QBrush.color, getBrushForLevel(rec.levelno)) ++ bgcolor, fgcolor = list(map(Qt.QBrush.color, getBrushForLevel(rec.levelno))) + bgcolor = "#%02x%02x%02x" % ( + bgcolor.red(), bgcolor.green(), bgcolor.blue()) + fgcolor = "#%02x%02x%02x" % ( +@@ -346,7 +350,7 @@ + """Overwrite of slot rows inserted to do proper resize and scroll to + bottom if desired""" + Qt.QTableView.rowsInserted(self, index, start, end) +- for i in xrange(start, end + 1): ++ for i in range(start, end + 1): + self.resizeRowToContents(i) + if start == 0: + self.resizeColumnsToContents() +@@ -563,7 +567,7 @@ + import time + import random + +- for i in xrange(10): ++ for i in range(10): + taurus.info("Hello world %04d" % i) + + loggers = ["Object%02d" % (i + 1) for i in range(10)] +--- ./lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py (original) ++++ ./lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py (refactored) +@@ -30,6 +30,8 @@ + + # todo: tango-centric + ++from builtins import str ++from builtins import range + __all__ = ["TaurusPropTable"] + + from taurus.external.qt import Qt, QtCore, QtGui +@@ -230,7 +232,7 @@ + text, ok = QtGui.QInputDialog.getText( + self, 'New Property', 'Property name:') + if ok: +- text1 = unicode(text) ++ text1 = str(text) + new_prop_name = str(text1) + new_prop_value = '0' + dict1 = {new_prop_name: [new_prop_value]} +@@ -269,7 +271,7 @@ + new_text, ok = QtGui.QInputDialog.getText( + self, 'Rename', 'Write new name of property:') + if ok: +- new_text = unicode(new_text) ++ new_text = str(new_text) + new_text = str(new_text) + list = [prop_name] + dict = {new_text: [prop_value]} +@@ -289,7 +291,7 @@ + self.setNewPropertyValue(new_text) + + def setNewPropertyValue(self, new_text): +- new_text = unicode(new_text) ++ new_text = str(new_text) + new_text = str(new_text) + values = {self.prop_name2: new_text.replace('\r', '').split('\n')} + self.db.put_device_property(self.dev_name, values) +--- ./lib/taurus/qt/qtgui/table/taurusgrid.py (original) ++++ ./lib/taurus/qt/qtgui/table/taurusgrid.py (refactored) +@@ -34,6 +34,12 @@ + # This module needs a total cleanup. Both re. code conventions and algorithms. + # --cpascual 20140827 + ++from future import standard_library ++standard_library.install_aliases() ++from builtins import zip ++from builtins import next ++from builtins import str ++from builtins import range + __all__ = ["TaurusGrid"] + + __docformat__ = 'restructuredtext' +@@ -41,7 +47,7 @@ + import re + import operator + import traceback +-import Queue ++import queue + from functools import partial + + from taurus.external.qt import Qt, QtGui, QtCore +@@ -275,7 +281,7 @@ + self.hideLabels = False + + self.defineStyle() +- self.modelsQueue = Queue.Queue() ++ self.modelsQueue = queue.Queue() + self.__modelsThread = None + if not designMode: + self.modelsThread +@@ -660,12 +666,12 @@ + self.row_labels = sorted( + list(set(m.split('/')[0].upper() for m in models if + m.count('/') >= 2))) +- self.row_labels = zip(self.row_labels, self.row_labels) ++ self.row_labels = list(zip(self.row_labels, self.row_labels)) + if not self.column_labels: # Families used by default + self.column_labels = sorted( + list(set(m.split('/')[1].upper() for m in models if + m.count('/') >= 2))) +- self.column_labels = zip(self.column_labels, self.column_labels) ++ self.column_labels = list(zip(self.column_labels, self.column_labels)) + + # for m in models: + # if m.count('/')<2: +--- ./lib/taurus/qt/qtgui/table/taurusvaluestable.py (original) ++++ ./lib/taurus/qt/qtgui/table/taurusvaluestable.py (refactored) +@@ -23,6 +23,7 @@ + ## + ############################################################################# + ++from builtins import str + __all__ = ["TaurusValuesTable"] + + __docformat__ = 'restructuredtext' +@@ -58,7 +59,7 @@ + + class TaurusValuesIOTableModel(Qt.QAbstractTableModel): + typeCastingMap = {'f': float, 'b': bool, +- 'u': int, 'i': int, 'S': str, 'U': unicode} ++ 'u': int, 'i': int, 'S': str, 'U': str} + # Need to have an array + + dataChanged = Qt.pyqtSignal('QModelIndex', 'QModelIndex') +@@ -265,11 +266,11 @@ + kind = table.dtype.kind + if kind in 'SU': + table = table.tolist() # we want to allow the strings to be larger than the original ones +- for (r, c), v in self._modifiedDict.items(): ++ for (r, c), v in list(self._modifiedDict.items()): + table[r][c] = Qt.from_qvariant(v, str) + table = numpy.array(table, dtype=str) + else: +- for k, v in self._modifiedDict.items(): ++ for k, v in list(self._modifiedDict.items()): + if kind in ['f', 'i', 'u']: + units = self._parent.getCurrentUnits() + q = _value2Quantity(v, units) +--- ./lib/taurus/qt/qtgui/taurusgui/PermanentCustomPanelsDlg.py (original) ++++ ./lib/taurus/qt/qtgui/taurusgui/PermanentCustomPanelsDlg.py (refactored) +@@ -28,6 +28,7 @@ + PermanentCustomPanelDlg.py: + """ + ++from builtins import object + from taurus.external.qt import Qt + + +--- ./lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py (original) ++++ ./lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py (refactored) +@@ -34,6 +34,8 @@ + """ + from __future__ import print_function + ++from builtins import str ++from builtins import range + __all__ = ["AppSettingsWizard", "ExternalAppEditor"] + + import os +@@ -230,14 +232,14 @@ + self._projectDirBT.clicked.connect(self.onSelectDir) + + def onSelectDir(self): +- dirname = unicode(Qt.QFileDialog.getExistingDirectory( ++ dirname = str(Qt.QFileDialog.getExistingDirectory( + self, 'Choose the project directory', self._projectDirLE.text())) + if not dirname: + return + self._projectDirLE.setText(dirname) + + def validatePage(self): +- dirname = unicode(self._projectDirLE.text()) ++ dirname = str(self._projectDirLE.text()) + + if not os.path.exists(dirname): + try: +@@ -280,7 +282,7 @@ + return True + + def _getProjectDir(self): +- return unicode(self._projectDirLE.text()) ++ return str(self._projectDirLE.text()) + + + class GeneralSettings(BasePage): +@@ -579,7 +581,7 @@ + fileNames = Qt.QFileDialog.getOpenFileNames(self, self.tr( + "Open File"), pdir, self.tr("JDW (*.jdw );; All files (*)")) + for fileName in fileNames: +- fileName = unicode(fileName) ++ fileName = str(fileName) + if fileName not in self._synoptics: + self._synoptics.append(fileName) + self._refreshSynopticList() +@@ -1328,8 +1330,8 @@ + datetime.datetime.now().isoformat()) + # copy files + for i in range(self._substTable.rowCount()): +- src = unicode(self._substTable.item(i, 0).text()) +- dst = os.path.join(install_dir, unicode( ++ src = str(self._substTable.item(i, 0).text()) ++ dst = os.path.join(install_dir, str( + self._substTable.item(i, 1).text())) + if os.path.normpath(src) != os.path.normpath(dst): + shutil.copy(src, dst) +@@ -1338,7 +1340,7 @@ + xmlcfgfilename = os.path.join(install_dir, + self.wizard().getXmlConfigFileName()) + f = open(xmlcfgfilename, 'w') +- f.write(unicode(self._xml.toPlainText())) ++ f.write(str(self._xml.toPlainText())) + f.close() + logfile.write('XML Config file created: "%s"\n' % xmlcfgfilename) + # write python config file +@@ -1391,8 +1393,8 @@ + warnings = self.wizard().getProjectWarnings() + if warnings: + msg += '\n\nHowever, some fine-tuning may be needed. Please check the details:\n' +- for short, long in warnings: +- details += '- %s: %s\n\n' % (short, long) ++ for short, int in warnings: ++ details += '- %s: %s\n\n' % (short, int) + logfile.write(msg + details) + logfile.close() + dlg = Qt.QMessageBox(Qt.QMessageBox.Information, +@@ -1482,7 +1484,7 @@ + root = etree.fromstring(xml) + + # print self.Pages +- for pageNumber in range(len(self.Pages.keys())): ++ for pageNumber in range(len(list(self.Pages.keys()))): + self.page(pageNumber).fromXml(root) + + def getXml(self): +@@ -1625,7 +1627,7 @@ + long = ('The synoptic file "%s" references a file that ' + 'has been copied to the project dir in order to make the project portable. ' + 'Please edit "%s" and replace "%s" by "%s"') % (dst, dst, ref, refdst) +- self._projectWarnings.append((short, long)) ++ self._projectWarnings.append((short, int)) + + # macroserver page + if self.SARDANA_INSTALLED and self.__getitem__("macroServerName"): +--- ./lib/taurus/qt/qtgui/taurusgui/macrolistener.py (original) ++++ ./lib/taurus/qt/qtgui/taurusgui/macrolistener.py (refactored) +@@ -37,6 +37,7 @@ + + # TODO: move to sardana.taurus + ++from builtins import object + __all__ = ['MacroBroker', 'DynamicPlotManager'] + __docformat__ = 'restructuredtext' + +@@ -145,7 +146,7 @@ + plots1d = {} + images = {} + +- for chname, chdata in channels.items(): ++ for chname, chdata in list(channels.items()): + ptype = chdata['plot_type'] + if ptype == PlotType.No: + continue +@@ -195,7 +196,7 @@ + ''' + from taurus.qt.qtgui.plot import TaurusTrend + newpanels = [] +- for axes, plotables in trends1d.items(): ++ for axes, plotables in list(trends1d.items()): + if not axes: + continue + if axes not in self._trends1d: +@@ -250,7 +251,7 @@ + raise + return + +- for axes, plotables in trends2d.items(): ++ for axes, plotables in list(trends2d.items()): + for chname in plotables: + pname = u'Trend2D - %s' % chname + if pname in self._trends2d: +@@ -306,7 +307,7 @@ + given (default), all the panels are removed. + ''' + if names is None: +- names = self._trends1d.values() + self._trends2d.values() ++ names = list(self._trends1d.values()) + list(self._trends2d.values()) + # TODO: do the same for other temporary panels + for pname in names: + self.removePanel(pname) +@@ -552,7 +553,7 @@ + door.command_inout('abort') + # send stop/abort to all pools + pools = door.macro_server.getElementsOfType('Pool') +- for pool in pools.values(): ++ for pool in list(pools.values()): + self.info('Sending %s command to %s' % (cmd, pool.getFullName())) + try: + pool.getObj().command_inout(cmd) +--- ./lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py (original) ++++ ./lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py (refactored) +@@ -24,6 +24,9 @@ + ########################################################################### + + from __future__ import print_function ++from builtins import str ++from builtins import zip ++from builtins import range + __all__ = ["PanelDescriptionWizard"] + """ + paneldescriptionwizard.py: +@@ -222,7 +225,7 @@ + Qt.QWizardPage.__init__(self, parent) + TaurusBaseWidget.__init__(self, 'WidgetPage') + if extraWidgets: +- customWidgets, customWidgetScreenshots = zip(*extraWidgets) ++ customWidgets, customWidgetScreenshots = list(zip(*extraWidgets)) + pixmaps = {} + for k, s in extraWidgets: + if s is None: +@@ -462,7 +465,7 @@ + + class CommTableModel(Qt.QAbstractTableModel): + NUMCOLS = 3 +- UID, R, W = range(NUMCOLS) ++ UID, R, W = list(range(NUMCOLS)) + + dataChanged = Qt.pyqtSignal(int, int) + +@@ -555,7 +558,7 @@ + + class CommItemDelegate(Qt.QStyledItemDelegate): + NUMCOLS = 3 +- UID, R, W = range(NUMCOLS) ++ UID, R, W = list(range(NUMCOLS)) + + def __init__(self, parent=None, widget=None, sdm=None): + super(CommItemDelegate, self).__init__(parent) +--- ./lib/taurus/qt/qtgui/taurusgui/taurusgui.py (original) ++++ ./lib/taurus/qt/qtgui/taurusgui/taurusgui.py (refactored) +@@ -25,6 +25,8 @@ + + """This package provides the TaurusGui class""" + ++from builtins import str ++from past.builtins import basestring + __all__ = ["DockWidgetPanel", "TaurusGui"] + + __docformat__ = 'restructuredtext' +@@ -91,7 +93,7 @@ + self.onInstrumentChanged(self.ui.instrumentCB.currentText()) + + def onInstrumentChanged(self, instrumentname): +- instrumentname = unicode(instrumentname) ++ instrumentname = str(instrumentname) + panelname = self.associations.get(instrumentname) + if panelname is None: + self.ui.panelCB.setCurrentIndex(0) +@@ -104,10 +106,10 @@ + role = self.ui.buttonBox.buttonRole(button) + if role in (Qt.QDialogButtonBox.AcceptRole, Qt.QDialogButtonBox.ApplyRole): + if self.ui.panelCB.currentIndex() > 0: +- panelname = unicode(self.ui.panelCB.currentText()) ++ panelname = str(self.ui.panelCB.currentText()) + else: + panelname = None +- instrumentname = unicode(self.ui.instrumentCB.currentText()) ++ instrumentname = str(self.ui.instrumentCB.currentText()) + self.associations[instrumentname] = panelname + self.parent().setInstrumentAssociation(instrumentname, panelname) + +@@ -128,7 +130,7 @@ + self.setWidget(widget) + # self._widget = self.widget() #keep a pointer that may change if the + # widget changes +- name = unicode(name) ++ name = str(name) + self.setWindowTitle(name) + self.setObjectName(name) + self._custom = False +@@ -342,7 +344,7 @@ + except: + pass + TaurusMainWindow.closeEvent(self, event) +- for n, panel in self.__panels.items(): ++ for n, panel in list(self.__panels.items()): + panel.closeEvent(event) + panel.widget().closeEvent(event) + if not event.isAccepted(): +@@ -361,7 +363,7 @@ + permanent = (panelsmenu == self.__permPanelsMenu) + panelsmenu.clear() + panelnames = sorted( +- [n for n, p in self.__panels.items() if (p.isPermanent() == permanent)]) ++ [n for n, p in list(self.__panels.items()) if (p.isPermanent() == permanent)]) + for name in panelnames: + panelsmenu.addAction(self.__panels[name].toggleViewAction()) + +@@ -500,7 +502,7 @@ + removed + If None given, the user will be prompted + ''' +- apps = self.__external_app.keys() + self.__permanent_ext_apps ++ apps = list(self.__external_app.keys()) + self.__permanent_ext_apps + if name is None: + items = sorted(apps) + msg1 = "Remove External application" +@@ -510,13 +512,13 @@ + False) + if not ok: + return +- name = unicode(name) ++ name = str(name) + if name not in apps: + msg = ('Cannot remove the external application "%s"' + ' (not found)' % name) + self.debug(msg) + return +- if name in self.__external_app.keys(): ++ if name in list(self.__external_app.keys()): + self.__external_app.pop(name) + else: + self.__permanent_ext_apps.remove(name) +@@ -570,12 +572,12 @@ + ''' + if name is None: + items = sorted( +- [n for n, p in self.__panels.iteritems() if p.isCustom()]) ++ [n for n, p in self.__panels.items() if p.isCustom()]) + name, ok = Qt.QInputDialog.getItem(self, "Remove Panel", + "Panel to be removed (only custom panels can be removed).\n Important: you may want to save the perspective afterwards,\n and maybe remove the panel from other perspectives as well", items, 0, False) + if not ok: + return +- name = unicode(name) ++ name = str(name) + if name not in self.__panels: + self.debug('Cannot remove panel "%s" (not found)' % name) + return +@@ -626,7 +628,7 @@ + 'Deprecation warning: please note that the "area" argument is deprecated. See TaurusGui.createPanel doc') + floating = not(floating) + +- name = unicode(name) ++ name = str(name) + if name in self.__panels: + self.info('Panel with name "%s" already exists. Reusing.' % name) + return self.__panels[name] +@@ -636,7 +638,7 @@ + # we will only place panels in this area + self.addDockWidget(Qt.Qt.TopDockWidgetArea, panel) + if len(self.__panels) != 0: +- self.tabifyDockWidget(self.__panels.values()[-1], panel) ++ self.tabifyDockWidget(list(self.__panels.values())[-1], panel) + + panel.setFloating(floating) + +@@ -674,14 +676,14 @@ + + :return: (DockWidgetPanel) + ''' +- return self.__panels[unicode(name)] ++ return self.__panels[str(name)] + + def getPanelNames(self): + '''returns the names of existing panels + + :return: (list) + ''' +- return copy.deepcopy(self.__panels.keys()) ++ return copy.deepcopy(list(self.__panels.keys())) + + def _setPermanentExternalApps(self, permExternalApps): + '''creates empty panels for restoring custom panels. +@@ -717,7 +719,7 @@ + + :return: (list) + ''' +- return [n for n, p in self.__panels.iteritems() if (p.isCustom() and p.isPermanent())] ++ return [n for n, p in self.__panels.items() if (p.isCustom() and p.isPermanent())] + + def updatePermanentCustomPanels(self, showAlways=True): + ''' +@@ -729,7 +731,7 @@ + # check if there are some newly created panels that may be made + # permanent + perm = self._getPermanentCustomPanels() +- temp = [n for n, p in self.__panels.iteritems() if ( ++ temp = [n for n, p in self.__panels.items() if ( + p.isCustom() and not p.isPermanent())] + if len(temp) > 0 or showAlways: + dlg = QDoubleListDlg(winTitle='Stored panels', +@@ -765,7 +767,7 @@ + mainLabel=msg, + label1='Temporary (to be discarded)', + label2='Permanent (to be stored)', +- list1=self.__external_app.keys(), ++ list1=list(self.__external_app.keys()), + list2=self.__permanent_ext_apps) + result = dlg.exec_() + if result == Qt.QDialog.Accepted: +@@ -888,7 +890,7 @@ + if result == Qt.QMessageBox.Abort: + sys.exit() + return [] +- for i in instruments.values(): ++ for i in list(instruments.values()): + i_name = i.full_name + #i_name, i_unknown, i_type, i_pools = i.split() + i_view = PanelDescription( +@@ -896,12 +898,12 @@ + instrument_dict[i_name] = i_view + + from operator import attrgetter +- pool_elements = sorted(ms.getElementsWithInterface( +- 'Moveable').values(), key=attrgetter('name')) +- pool_elements += sorted(ms.getElementsWithInterface( +- 'ExpChannel').values(), key=attrgetter('name')) +- pool_elements += sorted(ms.getElementsWithInterface( +- 'IORegister').values(), key=attrgetter('name')) ++ pool_elements = sorted(list(ms.getElementsWithInterface( ++ 'Moveable').values()), key=attrgetter('name')) ++ pool_elements += sorted(list(ms.getElementsWithInterface( ++ 'ExpChannel').values()), key=attrgetter('name')) ++ pool_elements += sorted(list(ms.getElementsWithInterface( ++ 'IORegister').values()), key=attrgetter('name')) + for elem in pool_elements: + instrument = elem.instrument + if instrument: +@@ -915,7 +917,7 @@ + # ----------------------------------------------------------- + instrument_dict[i_name].model.append(e_name) + # filter out empty panels +- ret = [instrument for instrument in instrument_dict.values() ++ ret = [instrument for instrument in list(instrument_dict.values()) + if len(instrument.model) > 0] + return ret + +@@ -1332,7 +1334,7 @@ + dwfeat = Qt.QDockWidget.AllDockWidgetFeatures + else: + dwfeat = Qt.QDockWidget.NoDockWidgetFeatures +- for panel in self.__panels.values(): ++ for panel in list(self.__panels.values()): + panel.toggleViewAction().setEnabled(modifiable) + panel.setFeatures(dwfeat) + for action in (self.newPanelAction, self.showAllPanelsAction, +@@ -1355,12 +1357,12 @@ + + def hideAllPanels(self): + '''hides all current panels''' +- for panel in self.__panels.itervalues(): ++ for panel in self.__panels.values(): + panel.hide() + + def showAllPanels(self): + '''shows all current panels''' +- for panel in self.__panels.itervalues(): ++ for panel in self.__panels.values(): + panel.show() + + def onShowAssociationDialog(self): +@@ -1391,7 +1393,7 @@ + panel or None to remove the association + for this instrument. + ''' +- instrumentname = unicode(instrumentname) ++ instrumentname = str(instrumentname) + # remove a previous association if it exists + oldpanelname = self.__instrumentToPanelMap.get(instrumentname, None) + self.__panelToInstrumentMap.pop(oldpanelname, None) +@@ -1426,12 +1428,12 @@ + else: + self.__instrumentToPanelMap.update(copy.deepcopy(associationsdict)) + self.__panelToInstrumentMap = {} +- for k, v in self.__instrumentToPanelMap.iteritems(): ++ for k, v in self.__instrumentToPanelMap.items(): + self.__panelToInstrumentMap[v] = k + + def _onPanelVisibilityChanged(self, visible): + if visible: +- panelname = unicode(self.sender().objectName()) ++ panelname = str(self.sender().objectName()) + instrumentname = self.__panelToInstrumentMap.get(panelname) + if instrumentname is not None: + self.SelectedInstrument.emit(instrumentname) +@@ -1442,7 +1444,7 @@ + + :param instrumentname: (str) The name that identifies the instrument. + ''' +- instrumentname = unicode(instrumentname) ++ instrumentname = str(instrumentname) + panelname = self.getInstrumentAssociation(instrumentname) + self.setFocusToPanel(panelname) + +@@ -1452,7 +1454,7 @@ + :param panelname: (str) The name that identifies the panel. + This name must be unique within the panels in the GUI. + ''' +- panelname = unicode(panelname) ++ panelname = str(panelname) + try: + panel = self.__panels[panelname] + panel.show() +@@ -1490,9 +1492,9 @@ + raise DeprecationWarning( + 'findPanelsInArea is no longer supported (now all panels reside in the same DockWidget Area)') + if area == 'FLOATING': +- return [p for p in self.__panels.values() if p.isFloating()] ++ return [p for p in list(self.__panels.values()) if p.isFloating()] + else: +- return [p for p in self.__panels.values() if self.dockWidgetArea(p) == area] ++ return [p for p in list(self.__panels.values()) if self.dockWidgetArea(p) == area] + + @classmethod + def getQtDesignerPluginInfo(cls): +@@ -1530,7 +1532,7 @@ + dlg = QDoubleListDlg(winTitle='Export Panels to XML', + mainLabel='Select which of the custom panels you want to export as xml configuration', + label1='Not Exported', label2='Exported', +- list1=[n for n, p in self.__panels.iteritems() if p.isCustom()], list2=[]) ++ list1=[n for n, p in self.__panels.items() if p.isCustom()], list2=[]) + result = dlg.exec_() + if result != Qt.QDialog.Accepted: + return +--- ./lib/taurus/qt/qtgui/taurusgui/utils.py (original) ++++ ./lib/taurus/qt/qtgui/taurusgui/utils.py (refactored) +@@ -26,6 +26,9 @@ + """This configuration contains base modules and classes that may be used + by specific TaurusGui-based GUIs""" + ++from builtins import str ++from past.builtins import basestring ++from builtins import object + __docformat__ = 'restructuredtext' + + import os +@@ -38,7 +41,7 @@ + # this is here only for backwards compatibility. It should not be used at all + + +-class Qt_Qt: ++class Qt_Qt(object): + LeftDockWidgetArea = 1 + RightDockWidgetArea = 2 + BottomDockWidgetArea = 3 +@@ -223,9 +226,9 @@ + w.setModel(self.model) + # connect (if an sdm is given) + if sdm is not None: +- for dataUID, signalname in self.sharedDataWrite.iteritems(): ++ for dataUID, signalname in self.sharedDataWrite.items(): + sdm.connectWriter(dataUID, w, signalname) +- for dataUID, slotname in self.sharedDataRead.iteritems(): ++ for dataUID, slotname in self.sharedDataRead.items(): + sdm.connectReader(dataUID, getattr(w, slotname)) + # set the name + w.name = self.name +@@ -250,12 +253,12 @@ + floating.text = str(self._floating) + + sharedDataWrite = etree.SubElement(root, "sharedDataWrite") +- for k, v in self._sharedDataWrite.iteritems(): ++ for k, v in self._sharedDataWrite.items(): + item = etree.SubElement( + sharedDataWrite, "item", datauid=k, signalName=v) + + sharedDataRead = etree.SubElement(root, "sharedDataRead") +- for k, v in self._sharedDataRead.iteritems(): ++ for k, v in self._sharedDataRead.items(): + item = etree.SubElement( + sharedDataRead, "item", datauid=k, slotName=v) + +--- ./lib/taurus/qt/qtgui/test/base.py (original) ++++ ./lib/taurus/qt/qtgui/test/base.py (refactored) +@@ -25,6 +25,9 @@ + + """Utilities for creating generic tests for Taurus widgets""" + ++from builtins import zip ++from builtins import range ++from builtins import object + import time + import taurus.core + import unittest +@@ -84,7 +87,7 @@ + self.assertTrue(deps <= maximum, msg) + + def processEvents(self, repetitions=1, sleep=0): +- for i in xrange(repetitions): ++ for i in range(repetitions): + time.sleep(sleep) + self._app.processEvents() + +--- ./lib/taurus/qt/qtgui/tree/qtree.py (original) ++++ ./lib/taurus/qt/qtgui/tree/qtree.py (refactored) +@@ -25,6 +25,7 @@ + + """This module provides base tree widget""" + ++from builtins import range + __all__ = ["QBaseTreeWidget"] + + __docformat__ = 'restructuredtext' +--- ./lib/taurus/qt/qtgui/tree/taurusdevicetree.py (original) ++++ ./lib/taurus/qt/qtgui/tree/taurusdevicetree.py (refactored) +@@ -34,6 +34,11 @@ + # Taurusdbtree + + # ,"SearchEdit"] #"TaurusTreeNode"] ++from builtins import next ++from builtins import str ++from builtins import range ++from past.builtins import basestring ++from builtins import object + __all__ = ["TaurusDevTree", "TaurusSearchTree", "TaurusDevTreeOptions"] + + import time +@@ -194,11 +199,11 @@ + node = self.getNode() + try: + name, url = self.getNodeText(node), '' +- for k, v in self.getIconMap().items(): ++ for k, v in list(self.getIconMap().items()): + if re.match(k.lower(), name.lower()): + url = v + if not url: +- for k, v in self.getIconMap().items(): ++ for k, v in list(self.getIconMap().items()): + if k.lower() in name.lower(): + url = v + # if name.count('/')==2: +@@ -640,10 +645,10 @@ + dct = self.getTangoDict(filters) + else: # if isMap(filters): + self.setWindowTitle('TaurusDevTree:%s' % +- ','.join(filters.keys())) ++ ','.join(list(filters.keys()))) + + def expand_dict(d): +- return [x for v in d.values() for x in (expand_dict(v) if hasattr(v, 'values') else (v,))] ++ return [x for v in list(d.values()) for x in (expand_dict(v) if hasattr(v, 'values') else (v,))] + targets = [t.upper() for t in get_matching_devices( + ['*%s*' % f if '*' not in f else f for f in expand_dict(filters)])] + +@@ -651,7 +656,7 @@ + return dict.fromkeys(t for t in targets if matchCl(f, t)) + + def expand_filter(f): +- return dict((k, expand_filter(v) if hasattr(v, 'values') else get_devs(v)) for k, v in f.items() if v) ++ return dict((k, expand_filter(v) if hasattr(v, 'values') else get_devs(v)) for k, v in list(f.items()) if v) + dct = expand_filter(filters) + # self.Loader.next([self.setTree,dct,True]) + self.setTree(dct, clear=True) +@@ -800,7 +805,7 @@ + if alias: + self.trace('Got aliases for %s: %s' % (aname, alias)) + [setattr(natt, 'AttributeAlias', v) +- for k, v in alias.items() if k in aname.lower()] ++ for k, v in list(alias.items()) if k in aname.lower()] + else: + natt.AttributeAlias = aname.split()[0].strip() + node.setExpanded(True) +@@ -825,7 +830,7 @@ + return self.item_index[key] + + def getNodeList(self): +- return self.item_index.keys() ++ return list(self.item_index.keys()) + + def getMatchingNodes(self, regexp, limit=0, all=False, exclude=None): + """ It returns all nodes matching the given expression. """ +@@ -838,7 +843,7 @@ + if node is not None: + return [node] + regexp = re.compile(extend_regexp(regexp)) +- for k, node in self.item_index.iteritems(): ++ for k, node in self.item_index.items(): + nname = self.getNodeText(node, full=True).lower() + if (regexp.match(k) or regexp.match(nname)) and \ + (not exclude or not any(re.match(x.lower(), y) for x in exclude for y in (k.lower(), nname))): +@@ -869,7 +874,7 @@ + def unpackChildren(self): + """ removes all nodes from the tree and returns them in a list, used for resorting """ + allChildren = [] +- nodes = self.getAllNodes().values() ++ nodes = list(self.getAllNodes().values()) + + for node in nodes: + allChildren.extend(node.takeChildren()) +@@ -1021,7 +1026,7 @@ + + sorter = lambda k, ks=[re.compile(c) for c in order]: str( + next((i for i, r in enumerate(ks) if r.match(k.lower())))) + str(k) +- for c, it in sorted(allChildren.items(), key=lambda k: sorter(k[0])): ++ for c, it in sorted(list(allChildren.items()), key=lambda k: sorter(k[0])): + self.debug('tree.sortCustom(%s): %s inserted at %d' % + (order, it.text(0), self.topLevelItemCount())) + self.insertTopLevelItem(self.topLevelItemCount(), it) +@@ -1062,12 +1067,12 @@ + if not isinstance(dct, dict): + dct = dict.fromkeys(dct, '') + nodes = self.getAllNodes() +- for name, node in nodes.iteritems(): ++ for name, node in nodes.items(): + name = str(name).split()[0] + if node.isHidden(): + continue + if regexps: +- matches = [v for k, v in dct.items() if re.match( ++ matches = [v for k, v in list(dct.items()) if re.match( + k.lower(), name.lower())] + if matches: + update_node(node, name, {name: matches[0]}) +@@ -1286,7 +1291,7 @@ + + if hasattr(node, 'ContextMenu'): + last_was_separator = True +- for t in (type(node.ContextMenu) is dict and node.ContextMenu.items() or node.ContextMenu): ++ for t in (type(node.ContextMenu) is dict and list(node.ContextMenu.items()) or node.ContextMenu): + try: + k, action = t + if k: +@@ -1307,7 +1312,7 @@ + expert = menu.addMenu('Expert') + # expert.addSeparator() + last_was_separator = True +- for t in (type(node.ContextMenu) is dict and node.ExpertMenu.items() or node.ExpertMenu): ++ for t in (type(node.ContextMenu) is dict and list(node.ExpertMenu.items()) or node.ExpertMenu): + try: + k, action = t + if k: +@@ -1660,7 +1665,7 @@ + self.layout().addWidget(self.tree) + self.registerConfigDelegate(self.tree) + # Slot forwarding ... +- for k in TaurusDevTree.__dict__.keys(): ++ for k in list(TaurusDevTree.__dict__.keys()): + # if k in ['__init__','defineStyle']: continue + if k not in self.__slots__: + continue +--- ./lib/taurus/qt/qtgui/util/taurusaction.py (original) ++++ ./lib/taurus/qt/qtgui/util/taurusaction.py (refactored) +@@ -26,6 +26,8 @@ + """This module is designed to provide a library of taurus Qt actions""" + from __future__ import absolute_import + ++from builtins import str ++from past.builtins import basestring + __all__ = ["ExternalAppAction", + "TaurusMenu", + "TaurusAction", +@@ -131,10 +133,10 @@ + else: + return False + except OSError: +- err = "Error launching %s" % unicode(self.text()) ++ err = "Error launching %s" % str(self.text()) + msg = "Cannot launch application:\n" + \ + " ".join(self.__cmdargs) + \ +- "\nHint: Check that %s is installed and in the path" % unicode( ++ "\nHint: Check that %s is installed and in the path" % str( + self.text()) + if self.interactive: + Qt.QMessageBox.warning(self.parentWidget(), err, msg) +--- ./lib/taurus/qt/qtgui/util/taurusactionfactory.py (original) ++++ ./lib/taurus/qt/qtgui/util/taurusactionfactory.py (refactored) +@@ -130,7 +130,7 @@ + action.toggled.connect(toggled) + action.setCheckable(True) + if icon is not None: +- if isinstance(icon, (str, unicode)): ++ if isinstance(icon, (str, str)): + icon = Qt.QIcon.fromTheme(icon) + action.setIcon(icon) + if shortcut is not None: +--- ./lib/taurus/qt/qtgui/util/tauruswidgetfactory.py (original) ++++ ./lib/taurus/qt/qtgui/util/tauruswidgetfactory.py (refactored) +@@ -194,19 +194,19 @@ + return self._taurus_widgets + + def getWidgetClassNames(self): +- return self._qt_widgets.keys() ++ return list(self._qt_widgets.keys()) + + def getWidgetClasses(self): +- return [klass for mod_name, klass in self._qt_widgets.values()] ++ return [klass for mod_name, klass in list(self._qt_widgets.values())] + + def getWidgetClass(self, name): + return self._qt_widgets[name][1] + + def getTaurusWidgetClassNames(self): +- return self._taurus_widgets.keys() ++ return list(self._taurus_widgets.keys()) + + def getTaurusWidgetClasses(self): +- return [klass for mod_name, klass in self._taurus_widgets.values()] ++ return [klass for mod_name, klass in list(self._taurus_widgets.values())] + + def getTaurusWidgetClass(self, name): + return self._taurus_widgets.get(name)[1] +--- ./lib/taurus/qt/qtgui/util/tauruswidgettree.py (original) ++++ ./lib/taurus/qt/qtgui/util/tauruswidgettree.py (refactored) +@@ -26,6 +26,7 @@ + """ + """ + ++from builtins import str + __all__ = ["QObjectRepresentation", "get_qobject_tree", "get_qobject_tree_str", + "TreeQObjectModel", "TreeQObjectWidget"] + +--- ./lib/taurus/qt/qtgui/util/ui.py (original) ++++ ./lib/taurus/qt/qtgui/util/ui.py (refactored) +@@ -25,6 +25,7 @@ + + """utilities to load ui files for widgets""" + ++from builtins import object + __all__ = ["loadUi", + "UILoadable", + ] +--- ./lib/taurus/test/base.py (original) ++++ ./lib/taurus/test/base.py (refactored) +@@ -100,7 +100,7 @@ + + if test_method_doc is None: + argsrep = ', '.join(['%s=%s' % (k, repr(v)) +- for k, v in helper_kwargs.items()]) ++ for k, v in list(helper_kwargs.items())]) + if tested_name: + test_method_doc = 'Testing %s with %s(%s)' % (tested_name, + helper_name, argsrep) +--- ./lib/taurus/test/fuzzytest.py (original) ++++ ./lib/taurus/test/fuzzytest.py (refactored) +@@ -25,8 +25,10 @@ + + '''Utility functions to deal with non-ideal (fuzzy) tests''' + from __future__ import print_function ++from __future__ import division + + ++from past.utils import old_div + def loopTest(testname, maxtries=100, maxfails=10): + '''Run a test `maxtries` times or until it fails `maxfails` times and + report the number of tries and failures. +@@ -107,11 +109,11 @@ + else: + tries, fails = loopSubprocess(test, maxtries=maxtries, + maxfails=maxfails, **kwargs) +- r = float(fails) / tries +- dr = numpy.sqrt(fails) / tries ++ r = old_div(float(fails), tries) ++ dr = old_div(numpy.sqrt(fails), tries) + print('Failure rate = %g +/- %g (%i/%i)' % (r, dr, fails, tries)) + # calculating n using p-value=1% and failure rate with -1 sigma +- n = numpy.ceil(numpy.log(.01) / numpy.log(1 - (r - dr))) ++ n = numpy.ceil(old_div(numpy.log(.01), numpy.log(1 - (r - dr)))) + print(('Number of consecutive times that the test should be passed ' + + 'to have a confidence>99%% that the bug is fixed: %g') % n) + return r, dr, n +--- ./lib/taurus/test/moduleexplorer.py (original) ++++ ./lib/taurus/test/moduleexplorer.py (refactored) +@@ -27,6 +27,7 @@ + '''Utility code for returning info about a module''' + from __future__ import print_function + ++from builtins import object + import sys + import os + import inspect +@@ -175,7 +176,7 @@ + ret = [(mname, el) for el in info[key]] + except KeyError: + return [] +- for sminfo in info['submodules'].itervalues(): ++ for sminfo in info['submodules'].values(): + ret += ModuleExplorer.getAll(sminfo, key) + return ret + +--- ./lib/taurus/test/test_import.py (original) ++++ ./lib/taurus/test/test_import.py (refactored) +@@ -26,6 +26,7 @@ + """Taurus import tests""" + from __future__ import absolute_import + ++from builtins import zip + import unittest + + diff --git a/lib/taurus/__init__.py b/lib/taurus/__init__.py index 6b71d42ee..bfaac2459 100644 --- a/lib/taurus/__init__.py +++ b/lib/taurus/__init__.py @@ -26,13 +26,14 @@ """The main taurus module. It contains a reduced set of wrappers around the real taurus model classes and information regarding the current release.""" +from builtins import object from .core import release as __R -class Release: +class Release(object): pass -for key, value in __R.__dict__.items(): +for key, value in list(__R.__dict__.items()): setattr(Release, key, value) Release.__doc__ = __R.__doc__ diff --git a/lib/taurus/console/list.py b/lib/taurus/console/list.py index 56af151b5..e5f008ad8 100644 --- a/lib/taurus/console/list.py +++ b/lib/taurus/console/list.py @@ -26,6 +26,8 @@ """ """ from __future__ import absolute_import +from builtins import map +from builtins import range __all__ = ["List"] __docformat__ = "restructuredtext" @@ -62,7 +64,7 @@ def __init__(self, header, header_separator=HeaderSeparator, self.append(header) def setHeaderSeparator(self, header_separator): - if isinstance(header_separator, (str, unicode)): + if isinstance(header_separator, (str, str)): header_separator = self.col_nb * [header_separator] self.HeaderSeparator = header_separator @@ -72,7 +74,7 @@ def getHeaderSeparator(self): header_separator = property(getHeaderSeparator, setHeaderSeparator) def setRowSeparator(self, row_separator): - if isinstance(row_separator, (str, unicode)): + if isinstance(row_separator, (str, str)): row_separator = self.col_nb * [row_separator] self.RowSeparator = row_separator @@ -104,7 +106,7 @@ def getTextAlignment(self): text_alignment = property(getTextAlignment, setTextAlignment) def _transform_row(self, row): - return map(str, row[:self.col_nb]) + return list(map(str, row[:self.col_nb])) def __setitem__(self, i, row): return list.__setitem__(self, i, self._transform_row(row)) diff --git a/lib/taurus/console/table.py b/lib/taurus/console/table.py index 48bfbd0f3..0a2493c70 100644 --- a/lib/taurus/console/table.py +++ b/lib/taurus/console/table.py @@ -24,6 +24,11 @@ ############################################################################# """ """ +from __future__ import division +from builtins import map +from builtins import range +from builtins import object +from past.utils import old_div from functools import reduce __all__ = ["Table"] @@ -31,7 +36,7 @@ __docformat__ = "restructuredtext" -class Table: +class Table(object): DefTermWidth = 80 @@ -58,7 +63,7 @@ def __init__(self, elem_list, elem_fmt=None, term_width=None, self.col_head_sep = col_head_sep self.border = border - max_len_fn = lambda x: reduce(max, map(len, x)) + max_len_fn = lambda x: reduce(max, list(map(len, x))) self.row_head_str = row_head_str self.row_head_fmt = row_head_fmt @@ -81,7 +86,7 @@ def __init__(self, elem_list, elem_fmt=None, term_width=None, raise ValueError(msg) if col_head_width is None: if col_head_str is not None: - col_head_width = reduce(max, map(max_len_fn, col_head_str)) + col_head_width = reduce(max, list(map(max_len_fn, col_head_str))) else: col_head_width = 10 self.col_head_width = col_head_width @@ -107,7 +112,7 @@ def genOutput(self, term_width=None): width = term_width - chw # At least one disp column! if rhw > 0: width -= rhw + lcs - disp_cols = width / (chw + lcs) + 1 + disp_cols = old_div(width, (chw + lcs)) + 1 tot_width = chw + (disp_cols - 1) * (chw + lcs) tot_rows = chl + self.nr_row if rhw > 0: @@ -124,36 +129,36 @@ def genOutput(self, term_width=None): else: row_head = [''] * tot_rows - for i in xrange(0, self.nr_col, disp_cols): + for i in range(0, self.nr_col, disp_cols): if i > 0: - nr_sep = tot_width / len(self.row_sep) + nr_sep = old_div(tot_width, len(self.row_sep)) output.append(self.row_sep * nr_sep) row_end = min(i + disp_cols, self.nr_col) line = list(row_head) - for j in xrange(i, row_end): + for j in range(i, row_end): elem = self.elem_list[j] if chl: col_head = self.col_head_str[j] if j > i: - for k in xrange(tot_rows): + for k in range(tot_rows): line[k] += self.col_sep fmt = self.col_head_fmt - for k in xrange(chl): + for k in range(chl): line[k] += fmt % (chw, col_head[k]) - for k in xrange(self.nr_row): + for k in range(self.nr_row): fmt = self.elem_fmt[k] line[chl + k] += fmt % (chw, elem[k]) - max_width = reduce(max, map(len, line)) + max_width = reduce(max, list(map(len, line))) if self.border is not None: - nr_border = max_width / len(self.border) + nr_border = old_div(max_width, len(self.border)) output.append(self.border * nr_border) for l in line[:chl]: output.append(l) if self.col_head_sep is not None: - nr_sep = max_width / len(self.col_head_sep) + nr_sep = old_div(max_width, len(self.col_head_sep)) output.append(self.col_head_sep * nr_sep) for l in line[chl:]: output.append(l) diff --git a/lib/taurus/core/epics/test/test_epicsattribute.py b/lib/taurus/core/epics/test/test_epicsattribute.py index 3e50a025a..3a32c91f3 100755 --- a/lib/taurus/core/epics/test/test_epicsattribute.py +++ b/lib/taurus/core/epics/test/test_epicsattribute.py @@ -101,7 +101,7 @@ def write_read_attr(self, attrname=None, setvalue=None, expected=None, self.assertTrue(isinstance(read_value, TaurusAttrValue), msg) # Test attribute - for k, exp in expected.iteritems(): + for k, exp in expected.items(): try: got = getattr(a, k) except AttributeError: @@ -113,7 +113,7 @@ def write_read_attr(self, attrname=None, setvalue=None, expected=None, self.__assertValidValue(exp, got, msg) # Test attribute value - for k, exp in expected_attrv.iteritems(): + for k, exp in expected_attrv.items(): try: got = getattr(read_value, k) except AttributeError: diff --git a/lib/taurus/core/evaluation/evalattribute.py b/lib/taurus/core/evaluation/evalattribute.py index 6e3129096..bd41ee568 100644 --- a/lib/taurus/core/evaluation/evalattribute.py +++ b/lib/taurus/core/evaluation/evalattribute.py @@ -22,6 +22,7 @@ ## ############################################################################# +from builtins import str __all__ = ['EvaluationAttribute'] import numpy @@ -260,7 +261,7 @@ def preProcessTransformation(self, trstring): trstring = v.replaceUnquotedRef(trstring, '{%s}' % r, symbol) # validate the expression (look for missing symbols) - safesymbols = evaluator.getSafe().keys() + safesymbols = list(evaluator.getSafe().keys()) # remove literal text strings from the validation trimmedstring = re.sub(QUOTED_TEXT_RE, '', trstring) for s in set(re.findall(PY_VAR_RE, trimmedstring)): diff --git a/lib/taurus/core/evaluation/evaldevice.py b/lib/taurus/core/evaluation/evaldevice.py index 74eac3fae..0a3ebfb4a 100644 --- a/lib/taurus/core/evaluation/evaldevice.py +++ b/lib/taurus/core/evaluation/evaldevice.py @@ -22,6 +22,7 @@ ## ############################################################################# +from builtins import str __all__ = ['EvaluationDevice'] from taurus import Factory diff --git a/lib/taurus/core/evaluation/evalvalidator.py b/lib/taurus/core/evaluation/evalvalidator.py index 3227df52c..569a1eb35 100644 --- a/lib/taurus/core/evaluation/evalvalidator.py +++ b/lib/taurus/core/evaluation/evalvalidator.py @@ -23,6 +23,7 @@ ############################################################################# from __future__ import absolute_import +from builtins import zip __all__ = ['EvaluationDeviceNameValidator', 'EvaluationAttributeNameValidator'] @@ -263,7 +264,7 @@ def expandExpr(expr, substmap): # Substitute each k by its v in the expr (unless they are in # references) - for k, v in substmap.iteritems(): + for k, v in substmap.items(): # create a pattern for matching complete word k # unless it is within between curly brackets keyPattern = r'(?=1') - if operator.isMappingType(obj): + if isinstance(obj, collections.Mapping): name = name or 'DICT%02d' % priority elif type(obj) in (str,) or obj is None: name, mod = self.__reloadResource(obj) obj = {} - for k, v in mod.__dict__.items(): + for k, v in list(mod.__dict__.items()): if not k.startswith('_') and isinstance(v, basestring): obj[k] = v else: @@ -106,7 +108,7 @@ def reloadResource(self, obj=None, priority=1, name=None): if pl is None: self._resource_priority[priority] = pl = [] pl.append(name) - self._resource_priority_keys = self._resource_priority.keys() + self._resource_priority_keys = list(self._resource_priority.keys()) self._resource_priority_keys.sort() return obj diff --git a/lib/taurus/core/resource/resvalidator.py b/lib/taurus/core/resource/resvalidator.py index 3eeed3da0..85cc92b96 100644 --- a/lib/taurus/core/resource/resvalidator.py +++ b/lib/taurus/core/resource/resvalidator.py @@ -22,6 +22,7 @@ ## ############################################################################# +from builtins import object __all__ = ['ResDeviceNameValidator', 'ResAttributeNameValidator'] diff --git a/lib/taurus/core/tango/img/img.py b/lib/taurus/core/tango/img/img.py index 03915fa1d..8d7374780 100644 --- a/lib/taurus/core/tango/img/img.py +++ b/lib/taurus/core/tango/img/img.py @@ -25,7 +25,9 @@ """The img submodule. It contains specific device implementation for CCDs and 2D detectors""" +from __future__ import division +from past.utils import old_div __all__ = ['ImageDevice', 'ImageCounterDevice', 'PyImageViewer', 'ImgGrabber', 'CCDPVCAM', 'ImgBeamAnalyzer', 'Falcon', 'LimaCCDs'] @@ -164,9 +166,9 @@ def eventReceived(self, evt_src, evt_type, evt_value): def getImageData(self, names=None): data = ImageCounterDevice.getImageData(self, names=names) if self._color: - for k, v in data.items(): + for k, v in list(data.items()): s = v[1].value.shape - v[1].value = v[1].value.reshape((s[0], s[1] / 3, 3)) + v[1].value = v[1].value.reshape((s[0], old_div(s[1], 3), 3)) return data diff --git a/lib/taurus/core/tango/starter.py b/lib/taurus/core/tango/starter.py index 7e8eb577f..0c50488e1 100644 --- a/lib/taurus/core/tango/starter.py +++ b/lib/taurus/core/tango/starter.py @@ -31,6 +31,8 @@ """ from __future__ import print_function +from builtins import range +from builtins import object __docformat__ = 'restructuredtext' diff --git a/lib/taurus/core/tango/tangoattribute.py b/lib/taurus/core/tango/tangoattribute.py index 208c8f5e7..60248a6e3 100755 --- a/lib/taurus/core/tango/tangoattribute.py +++ b/lib/taurus/core/tango/tangoattribute.py @@ -25,6 +25,8 @@ """This module contains all taurus tango attribute""" +from builtins import str +from builtins import range __all__ = ["TangoAttribute", "TangoAttributeEventListener", "TangoAttrValue"] __docformat__ = "restructuredtext" @@ -114,7 +116,7 @@ def __init__(self, attr=None, pytango_dev_attr=None, config=None): if not (numerical or self._attrRef.type == DataType.Boolean): # generate a nested empty list of given shape p.value = [] - for _ in xrange(len(shape) - 1): + for _ in range(len(shape) - 1): p.value = [p.value] rvalue = p.value @@ -378,7 +380,7 @@ def encode(self, value): elif PyTango.is_int_type(tgtype): # changed as a partial workaround to a problem in PyTango # writing to DevULong64 attributes (see ALBA RT#29793) - attrvalue = long(magnitude) + attrvalue = int(magnitude) elif tgtype == PyTango.CmdArgType.DevBoolean: try: attrvalue = bool(int(magnitude)) diff --git a/lib/taurus/core/tango/tangodatabase.py b/lib/taurus/core/tango/tangodatabase.py index 6abaa65b0..03413ea38 100644 --- a/lib/taurus/core/tango/tangodatabase.py +++ b/lib/taurus/core/tango/tangodatabase.py @@ -25,7 +25,14 @@ """This module contains all taurus tango authority""" from __future__ import print_function - +from __future__ import division + +from builtins import str +from builtins import map +from builtins import range +from past.utils import old_div +from builtins import object +import collections __all__ = ["TangoInfo", "TangoAttrInfo", "TangoDevInfo", "TangoServInfo", "TangoDevClassInfo", "TangoDatabaseCache", "TangoDatabase", "TangoAuthority"] @@ -105,7 +112,7 @@ def addDevice(self, dev): def getDeviceNames(self): if not hasattr(self, "_device_name_list"): self._device_name_list = sorted(map(TangoDevInfo.name, - self._devices.values())) + list(self._devices.values()))) return self._device_name_list @@ -122,8 +129,8 @@ def __init__(self, container, name=None, full_name=None, alias=None, self._alive = None self._state = None self._host = host - self._domain, self._family, self._member = map(str.upper, - name.split("/", 2)) + self._domain, self._family, self._member = list(map(str.upper, + name.split("/", 2))) self._attributes = None self._alivePending = False @@ -245,12 +252,12 @@ def devices(self): def getDeviceNames(self): if not hasattr(self, "_device_name_list"): self._device_name_list = sorted(map(TangoDevInfo.name, - self._devices.values())) + list(self._devices.values()))) return self._device_name_list def getClassNames(self): if not hasattr(self, "_klass_name_list"): - klasses = set(map(TangoDevInfo.klass, self._devices.values())) + klasses = set(map(TangoDevInfo.klass, list(self._devices.values()))) self._klass_name_list = sorted(map(TangoDevClassInfo.name, klasses)) return self._klass_name_list @@ -285,7 +292,7 @@ def alive(self): try: self._alivePending = True alive = True - for d in self.devices().values(): + for d in list(self.devices().values()): alive = d.alive() if not alive: break @@ -327,7 +334,7 @@ def refresh(self): r = db.command_inout("DbMySqlSelect", query) row_nb, column_nb = r[0][-2:] data = r[1] - assert row_nb == len(data) / column_nb + assert row_nb == old_div(len(data), column_nb) else: # fallback using tango commands (slow but works with sqlite DB) # see http://sf.net/p/tauruslib/tickets/148/ @@ -349,7 +356,7 @@ def refresh(self): CD = CaselessDict dev_dict, serv_dict, klass_dict, alias_dict = CD(), {}, {}, CD() - for i in xrange(0, len(data), column_nb): + for i in range(0, len(data), column_nb): name, alias, exported, host, server, klass = data[i:i + column_nb] if name.count("/") != 2: continue # invalid/corrupted entry: just ignore it @@ -423,13 +430,13 @@ def getDeviceNames(self): :return: (sequence) a sequence with all registered device names""" if self._device_name_list is None: self._device_name_list = sorted( - map(TangoDevInfo.name, self.devices().values())) + map(TangoDevInfo.name, list(self.devices().values()))) return self._device_name_list def getAliasNames(self): if self._alias_name_list is None: self._alias_name_list = sorted( - map(TangoDevInfo.alias, self.aliases().values())) + map(TangoDevInfo.alias, list(self.aliases().values()))) return self._alias_name_list def getServerNames(self): @@ -438,7 +445,7 @@ def getServerNames(self): :return: (sequence) a sequence with all registered server names""" if self._server_name_list is None: self._server_name_list = sorted( - map(TangoServInfo.name, self.servers().values())) + map(TangoServInfo.name, list(self.servers().values()))) return self._server_name_list def getClassNames(self): @@ -447,7 +454,7 @@ def getClassNames(self): :return: (sequence) a sequence with all registered device classes""" if self._klass_name_list is None: self._klass_name_list = sorted( - map(TangoDevClassInfo.name, self.klasses().values())) + map(TangoDevClassInfo.name, list(self.klasses().values()))) return self._klass_name_list def deviceTree(self): @@ -474,13 +481,13 @@ def klasses(self): return self._klasses def getDeviceDomainNames(self): - return self._device_tree.keys() + return list(self._device_tree.keys()) def getDeviceFamilyNames(self, domain): families = self._device_tree.get(domain) if families is None: return [] - return families.keys() + return list(families.keys()) def getDeviceMemberNames(self, domain, family): families = self._device_tree.get(domain) @@ -489,7 +496,7 @@ def getDeviceMemberNames(self, domain, family): members = families.get(family) if members is None: return [] - return members.keys() + return list(members.keys()) def getDomainDevices(self, domain): return self.deviceTree().getDomainDevices(domain) @@ -511,8 +518,8 @@ def __init__(self, other=None): def _update(self, other): try: - if operator.isMappingType(other): - other = other.values() + if isinstance(other, collections.Mapping): + other = list(other.values()) for dev in other: try: self.addDevice(dev) @@ -537,7 +544,7 @@ def addDevice(self, dev_info): def getDomainDevices(self, domain): """Returns all devices under the given domain. Returns empty list if the domain doesn't exist or doesn't contain any devices""" - return self._devices.get(domain, {}).values() + return list(self._devices.get(domain, {}).values()) def getFamilyDevices(self, domain, family): """Returns all devices under the given domain/family. Returns empty list if @@ -545,7 +552,7 @@ def getFamilyDevices(self, domain, family): families = self.get(domain) if families is None: return - return families.get(family, {}).values() + return list(families.get(family, {}).values()) class TangoServerTree(dict): @@ -557,8 +564,8 @@ def __init__(self, other=None): def _update(self, other): try: - if operator.isMappingType(other): - other = other.values() + if isinstance(other, collections.Mapping): + other = list(other.values()) for serv in other: try: self.addServer(serv) @@ -578,7 +585,7 @@ def addServer(self, serv_info): def getServerNameInstances(self, serverName): """Returns all servers under the given serverName. Returns empty list if the server name doesn't exist or doesn't contain any instances""" - return self.get(serverName, {}).values() + return list(self.get(serverName, {}).values()) def get_home(): @@ -649,7 +656,7 @@ def get_env_var(env_var_name): # illegal line! continue - key, val = map(str.strip, tup) + key, val = list(map(str.strip, tup)) if key == env_var_name: return val @@ -702,7 +709,7 @@ def __get_class_for_device(self, dev_name): serv_name = self.command_inout("DbGetDeviceInfo", dev_name)[1][3] devs = self.get_device_class_list(serv_name) dev_name_lower = dev_name.lower() - for i in xrange(len(devs) / 2): + for i in range(old_div(len(devs), 2)): idx = i * 2 if devs[idx].lower() == dev_name_lower: return devs[idx + 1] diff --git a/lib/taurus/core/tango/tangodevice.py b/lib/taurus/core/tango/tangodevice.py index bd88a1b70..310477e87 100755 --- a/lib/taurus/core/tango/tangodevice.py +++ b/lib/taurus/core/tango/tangodevice.py @@ -25,6 +25,7 @@ """This module defines the TangoDevice object""" +from builtins import object __all__ = ["TangoDevice"] __docformat__ = "restructuredtext" @@ -320,7 +321,7 @@ def __decode(self, event_value): def __pollResult(self, attrs, ts, result, error=False): if error: - for attr in attrs.values(): + for attr in list(attrs.values()): attr.poll(single=False, value=None, error=result, time=ts) return @@ -335,7 +336,7 @@ def __pollResult(self, attrs, ts, result, error=False): def __pollAsynch(self, attrs): ts = time.time() try: - req_id = self.read_attributes_asynch(attrs.keys()) + req_id = self.read_attributes_asynch(list(attrs.keys())) except DevFailed as e: return False, e, ts return True, req_id, ts @@ -363,7 +364,7 @@ def poll(self, attrs, asynch=False, req_id=None): error = False ts = time.time() try: - result = self.read_attributes(attrs.keys()) + result = self.read_attributes(list(attrs.keys())) except DevFailed as e: error = True result = e diff --git a/lib/taurus/core/tango/tangofactory.py b/lib/taurus/core/tango/tangofactory.py index ef8996e30..bcf29c655 100644 --- a/lib/taurus/core/tango/tangofactory.py +++ b/lib/taurus/core/tango/tangofactory.py @@ -131,16 +131,16 @@ def reInit(self): def cleanUp(self): """Cleanup the singleton instance""" self.trace("[TangoFactory] cleanUp") - for k, v in self.tango_attrs.items(): + for k, v in list(self.tango_attrs.items()): v.cleanUp() - for k, v in self.tango_dev_queries.items(): + for k, v in list(self.tango_dev_queries.items()): v.cleanUp() - for k, v in self.tango_devs.items(): + for k, v in list(self.tango_devs.items()): v.cleanUp() self.dft_db = None - for k, v in self.tango_db_queries.items(): + for k, v in list(self.tango_db_queries.items()): v.cleanUp() - for k, v in self.tango_db.items(): + for k, v in list(self.tango_db.items()): v.cleanUp() self.reInit() @@ -552,14 +552,14 @@ def disablePolling(self): if not self.isPollingEnabled(): return self._polling_enabled = False - for period, timer in self.polling_timers.iteritems(): + for period, timer in self.polling_timers.items(): timer.stop() def enablePolling(self): """Enable the application tango polling""" if self.isPollingEnabled(): return - for period, timer in self.polling_timers.iteritems(): + for period, timer in self.polling_timers.items(): timer.start() self._polling_enabled = True diff --git a/lib/taurus/core/tango/test/test_tangoattribute.py b/lib/taurus/core/tango/test/test_tangoattribute.py index 3e3fa12f5..19c878a50 100644 --- a/lib/taurus/core/tango/test/test_tangoattribute.py +++ b/lib/taurus/core/tango/test/test_tangoattribute.py @@ -27,6 +27,7 @@ # __all__ = [] +from builtins import map __docformat__ = 'restructuredtext' import numpy @@ -771,12 +772,12 @@ def write_read_conf(self, attr_name, cfg, value, expected): got = getattr(attr, cfg) msg = '%s.%s from Taurus do not mach, expected %s read %s' %\ (attr_name, cfg, expected, got) - map(self.__assertValidValue, got, expected, msg) + list(map(self.__assertValidValue, got, expected, msg)) msg = '%s.%s from Tango do not mach, expected %s read %s' %\ (attr_name, cfg, expected, got) tangovalue = self._getDecodePyTangoAttr(attr_name, cfg) - map(self.__assertValidValue, got, tangovalue, msg) + list(map(self.__assertValidValue, got, tangovalue, msg)) def write_read_attr(self, attrname=None, setvalue=None, expected=None, expected_attrv=None, expectedshape=None): @@ -801,7 +802,7 @@ def write_read_attr(self, attrname=None, setvalue=None, expected=None, self.assertTrue(isinstance(read_value, TangoAttrValue), msg) # Test attribute - for k, exp in expected.iteritems(): + for k, exp in expected.items(): try: got = getattr(a, k) except AttributeError: @@ -813,7 +814,7 @@ def write_read_attr(self, attrname=None, setvalue=None, expected=None, self.__assertValidValue(exp, got, msg) # Test attribute value - for k, exp in expected_attrv.iteritems(): + for k, exp in expected_attrv.items(): try: got = getattr(read_value, k) except AttributeError: diff --git a/lib/taurus/core/tango/test/tgtestds.py b/lib/taurus/core/tango/test/tgtestds.py index 42fa70335..73372c413 100644 --- a/lib/taurus/core/tango/test/tgtestds.py +++ b/lib/taurus/core/tango/test/tgtestds.py @@ -25,6 +25,7 @@ """Module containing base classes for using the TangoSchemeTest DS in tests""" +from builtins import object __all__ = ['TangoSchemeTestLauncher'] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/core/taurusattribute.py b/lib/taurus/core/taurusattribute.py index 73e485568..fc7e9d916 100644 --- a/lib/taurus/core/taurusattribute.py +++ b/lib/taurus/core/taurusattribute.py @@ -25,6 +25,7 @@ """This module contains the base class for a taurus attribute""" +from builtins import str __all__ = ["TaurusAttribute"] __docformat__ = "restructuredtext" diff --git a/lib/taurus/core/taurusbasetypes.py b/lib/taurus/core/taurusbasetypes.py index b94454a62..cabef10c2 100644 --- a/lib/taurus/core/taurusbasetypes.py +++ b/lib/taurus/core/taurusbasetypes.py @@ -26,6 +26,7 @@ a misc collection of basic types ''' +from builtins import object __all__ = ["TaurusSWDevState", "TaurusSWDevHealth", "OperationMode", "TaurusSerializationMode", "SubscriptionState", "TaurusEventType", "MatchLevel", "TaurusElementType", "LockStatus", "DataFormat", @@ -149,7 +150,7 @@ class TaurusDevState(IntEnum): __PYTHON_TYPE_TO_TAURUS_DATATYPE = { str: DataType.String, int: DataType.Integer, - long: DataType.Integer, + int: DataType.Integer, float: DataType.Float, bool: DataType.Boolean, # bytes : DataType.Bytes, # see below... diff --git a/lib/taurus/core/taurusconfiguration.py b/lib/taurus/core/taurusconfiguration.py index 164be13c3..545189d60 100644 --- a/lib/taurus/core/taurusconfiguration.py +++ b/lib/taurus/core/taurusconfiguration.py @@ -27,6 +27,7 @@ """[DEPRECATED since taurus v4] This module contains the base class for a taurus attribute configuration""" +from builtins import object __all__ = ["TaurusConfigurationProxy", "TaurusConfiguration"] __docformat__ = "restructuredtext" diff --git a/lib/taurus/core/taurusdevice.py b/lib/taurus/core/taurusdevice.py index af4e909e7..a6979df82 100755 --- a/lib/taurus/core/taurusdevice.py +++ b/lib/taurus/core/taurusdevice.py @@ -126,7 +126,7 @@ def poll(self, attrs, asynch=False, req_id=None): # synchronous polling. if asynch is True: return 1 - for attr in attrs.values(): + for attr in list(attrs.values()): attr.poll() @property diff --git a/lib/taurus/core/taurusexception.py b/lib/taurus/core/taurusexception.py index 0af114379..1730d3d54 100644 --- a/lib/taurus/core/taurusexception.py +++ b/lib/taurus/core/taurusexception.py @@ -25,6 +25,7 @@ """This module contains the taurus base exception classes""" +from builtins import str __all__ = ["TaurusException", "DoubleRegistration"] __docformat__ = "restructuredtext" diff --git a/lib/taurus/core/taurusfactory.py b/lib/taurus/core/taurusfactory.py index a371ff31c..99561c264 100644 --- a/lib/taurus/core/taurusfactory.py +++ b/lib/taurus/core/taurusfactory.py @@ -57,6 +57,7 @@ """ from __future__ import absolute_import +from builtins import object __all__ = ["TaurusFactory"] __docformat__ = "restructuredtext" @@ -324,14 +325,14 @@ def disablePolling(self): if not self.isPollingEnabled(): return self._polling_enabled = False - for period, timer in self.polling_timers.iteritems(): + for period, timer in self.polling_timers.items(): timer.stop() def enablePolling(self): """Enable the application tango polling""" if self.isPollingEnabled(): return - for period, timer in self.polling_timers.iteritems(): + for period, timer in self.polling_timers.items(): timer.start() self._polling_enabled = True @@ -354,7 +355,7 @@ def removeAttributeFromPolling(self, attribute): :param attribute: (str) attribute name. """ p = None - for period, timer in self.polling_timers.iteritems(): + for period, timer in self.polling_timers.items(): if timer.containsAttribute(attribute): timer.removeAttribute(attribute) if timer.getAttributeCount() == 0: diff --git a/lib/taurus/core/taurushelper.py b/lib/taurus/core/taurushelper.py index 011bbb9c2..cd2451129 100644 --- a/lib/taurus/core/taurushelper.py +++ b/lib/taurus/core/taurushelper.py @@ -26,6 +26,7 @@ """a list of helper methods""" from __future__ import print_function +from builtins import str __all__ = ['check_dependencies', 'log_dependencies', 'getSchemeFromName', 'getValidTypesForName', 'isValidName', 'makeSchemeExplicit', 'Manager', 'Factory', 'Device', 'Attribute', 'Configuration', diff --git a/lib/taurus/core/tauruslistener.py b/lib/taurus/core/tauruslistener.py index 469bd6311..0dff5a33a 100644 --- a/lib/taurus/core/tauruslistener.py +++ b/lib/taurus/core/tauruslistener.py @@ -26,6 +26,8 @@ """This module contains the taurus base listeners classes""" from __future__ import print_function +from builtins import str +from builtins import object __all__ = ["TaurusListener", "TaurusExceptionListener"] __docformat__ = "restructuredtext" diff --git a/lib/taurus/core/taurusmanager.py b/lib/taurus/core/taurusmanager.py index 1779b1ec3..b0b2e57a8 100644 --- a/lib/taurus/core/taurusmanager.py +++ b/lib/taurus/core/taurusmanager.py @@ -26,6 +26,7 @@ """This module contains the taurus base manager class""" from __future__ import print_function +from builtins import range __all__ = ["TaurusManager"] __docformat__ = "restructuredtext" @@ -346,7 +347,7 @@ def _get_plugin_classes(self): self.debug('Failed to inspect %s' % (full_module_name)) self.debug('Details:', exc_info=1) continue - for s in m.__dict__.values(): + for s in list(m.__dict__.values()): plugin = None try: if issubclass(s, TaurusFactory) and \ @@ -369,7 +370,7 @@ def _get_plugin_classes(self): def _find_scheme(self, factory_class): class_name = factory_class.__name__ - for i in xrange(1, len(class_name)): + for i in range(1, len(class_name)): if class_name[i].isupper(): return class_name[:i].lower() diff --git a/lib/taurus/core/taurusmodel.py b/lib/taurus/core/taurusmodel.py index 0eb7dfa17..1bd261f7e 100644 --- a/lib/taurus/core/taurusmodel.py +++ b/lib/taurus/core/taurusmodel.py @@ -25,6 +25,7 @@ """This module contains the base TaurusModel class""" +from builtins import object __all__ = ["TaurusModel"] __docformat__ = "restructuredtext" @@ -219,7 +220,7 @@ def _listenerDied(self, weak_listener): def _getCallableRef(self, listener, cb=None): # return weakref.ref(listener, self._listenerDied) meth = getattr(listener, 'eventReceived', None) - if meth is not None and operator.isCallable(meth): + if meth is not None and hasattr(meth, '__call__'): return weakref.ref(listener, cb) else: return CallableRef(listener, cb) @@ -249,7 +250,7 @@ def removeListener(self, listener): return True def forceListening(self): - class __DummyListener: + class __DummyListener(object): def eventReceived(self, *args): pass @@ -292,9 +293,9 @@ def fireEvent(self, event_type, event_value, listeners=None): if l is None: continue meth = getattr(l, 'eventReceived', None) - if meth is not None and operator.isCallable(meth): + if meth is not None and hasattr(meth, '__call__'): l.eventReceived(self, event_type, event_value) - elif operator.isCallable(l): + elif hasattr(l, '__call__'): l(self, event_type, event_value) def isWritable(self): diff --git a/lib/taurus/core/tauruspollingtimer.py b/lib/taurus/core/tauruspollingtimer.py index b465b9610..6d6295b9f 100644 --- a/lib/taurus/core/tauruspollingtimer.py +++ b/lib/taurus/core/tauruspollingtimer.py @@ -24,7 +24,9 @@ ############################################################################# """This module contains the polling class""" +from __future__ import division +from past.utils import old_div __all__ = ["TaurusPollingTimer"] __docformat__ = "restructuredtext" @@ -52,7 +54,7 @@ def __init__(self, period, parent=None): self.call__init__(Logger, name, parent) self.dev_dict = {} self.attr_nb = 0 - self.timer = Timer(period / 1000.0, self._pollAttributes, self) + self.timer = Timer(old_div(period, 1000.0), self._pollAttributes, self) self.lock = threading.RLock() def start(self): @@ -134,14 +136,14 @@ def _pollAttributes(self): when it is time to poll. Do not call this method directly """ req_ids = {} - for dev, attrs in self.dev_dict.items(): + for dev, attrs in list(self.dev_dict.items()): try: req_id = dev.poll(attrs, asynch=True) req_ids[dev] = attrs, req_id except Exception as e: self.error("poll_asynch error") self.debug("Details:", exc_info=1) - for dev, (attrs, req_id) in req_ids.items(): + for dev, (attrs, req_id) in list(req_ids.items()): try: dev.poll(attrs, req_id=req_id) except Exception as e: diff --git a/lib/taurus/core/test/basevalidator.py b/lib/taurus/core/test/basevalidator.py index 06f2af10f..61bec9c33 100644 --- a/lib/taurus/core/test/basevalidator.py +++ b/lib/taurus/core/test/basevalidator.py @@ -27,6 +27,8 @@ #__all__ = [] +from builtins import str +from builtins import object __docformat__ = 'restructuredtext' @@ -49,7 +51,7 @@ def isValid(self, name=None, groups=None, strict=True): self.assertTrue(self.validator().isValid(name, strict=strict), msg) if groups is not None: returned = self.validator().getUriGroups(name, strict=strict) - for k, v in groups.iteritems(): + for k, v in groups.items(): msg = ('"%s" not in %s.getUriGroups("%s"). Returned %s' % (k, self.validator.__name__, name, returned)) self.assertIn(k, returned, msg=msg) diff --git a/lib/taurus/core/test/modelequality.py b/lib/taurus/core/test/modelequality.py index 6f57e3f96..dca36283b 100644 --- a/lib/taurus/core/test/modelequality.py +++ b/lib/taurus/core/test/modelequality.py @@ -22,6 +22,7 @@ ## ############################################################################# +from builtins import object import functools from taurus import Device, Attribute # , Authority diff --git a/lib/taurus/core/test/test_taurushelper.py b/lib/taurus/core/test/test_taurushelper.py index 49a096dfd..03a038c2f 100644 --- a/lib/taurus/core/test/test_taurushelper.py +++ b/lib/taurus/core/test/test_taurushelper.py @@ -212,7 +212,7 @@ def isValid(self, name=None, expected=True, elementType=None, elementType = [elementType] manager = taurus.Manager() scheme = manager.getScheme(name) - supportedSchemes = manager.getPlugins().keys() + supportedSchemes = list(manager.getPlugins().keys()) if scheme not in supportedSchemes: self.skipTest('"%s" scheme not supported' % scheme) returned = taurus.isValidName(name, etypes=elementType, strict=strict) @@ -240,7 +240,7 @@ def get_object(self, name=None, klass=None): klass = TaurusAuthority manager = taurus.Manager() scheme = manager.getScheme(name) - supportedSchemes = manager.getPlugins().keys() + supportedSchemes = list(manager.getPlugins().keys()) if scheme not in supportedSchemes: self.skipTest('"%s" scheme not supported' % scheme) a = taurus.Authority(name) @@ -265,7 +265,7 @@ def get_object(self, name=None, klass=None): klass = TaurusDevice manager = taurus.Manager() scheme = manager.getScheme(name) - supportedSchemes = manager.getPlugins().keys() + supportedSchemes = list(manager.getPlugins().keys()) if scheme not in supportedSchemes: self.skipTest('"%s" scheme not supported' % scheme) @@ -419,7 +419,7 @@ def get_object(self, name=None, klass=None): klass = TaurusAttribute manager = taurus.Manager() scheme = manager.getScheme(name) - supportedSchemes = manager.getPlugins().keys() + supportedSchemes = list(manager.getPlugins().keys()) if scheme not in supportedSchemes: self.skipTest('"%s" scheme not supported' % scheme) a = taurus.Attribute(name) @@ -441,7 +441,7 @@ def read_attr(self, name=None, expected=None, skip=False, msg = ('read() for "%s" did not return a TaurusAttrValue (got a %s)' % (name, readvalue.__class__.__name__)) self.assertTrue(isinstance(readvalue, TaurusAttrValue), msg) - for k, exp in expected.iteritems(): + for k, exp in expected.items(): try: got = getattr(readvalue, k) except AttributeError: diff --git a/lib/taurus/core/util/argparse/taurusargparse.py b/lib/taurus/core/util/argparse/taurusargparse.py index 3f684ca2c..9207d49d4 100644 --- a/lib/taurus/core/util/argparse/taurusargparse.py +++ b/lib/taurus/core/util/argparse/taurusargparse.py @@ -78,6 +78,7 @@ def main(): sys.exit(app.exec_()) """ +from builtins import str __all__ = ["get_taurus_parser", "init_taurus_args", "parse_taurus_args", "split_taurus_args"] diff --git a/lib/taurus/core/util/codecs.py b/lib/taurus/core/util/codecs.py index 8ccf6bf41..fd5a96420 100644 --- a/lib/taurus/core/util/codecs.py +++ b/lib/taurus/core/util/codecs.py @@ -64,6 +64,7 @@ """ from __future__ import absolute_import +from builtins import str __all__ = ["Codec", "NullCodec", "ZIPCodec", "BZ2Codec", "JSONCodec", "FunctionCodec", "PlotCodec", "CodecPipeline", "CodecFactory"] @@ -348,7 +349,7 @@ def decode(self, data, *args, **kwargs): return format, data def _transform_ascii(self, data): - if isinstance(data, unicode): + if isinstance(data, str): return data.encode('utf-8') elif isinstance(data, dict): return self._transform_dict(data) @@ -364,7 +365,7 @@ def _transform_list(self, lst): def _transform_dict(self, dct): newdict = {} - for k, v in dct.iteritems(): + for k, v in dct.items(): newdict[self._transform_ascii(k)] = self._transform_ascii(v) return newdict @@ -426,7 +427,7 @@ def decode(self, data, *args, **kwargs): return format, data def _transform_ascii(self, data): - if isinstance(data, unicode): + if isinstance(data, str): return data.encode('utf-8') elif isinstance(data, dict): return self._transform_dict(data) @@ -442,7 +443,7 @@ def _transform_list(self, lst): def _transform_dict(self, dct): newdict = {} - for k, v in dct.iteritems(): + for k, v in dct.items(): newdict[self._transform_ascii(k)] = self._transform_ascii(v) return newdict diff --git a/lib/taurus/core/util/colors.py b/lib/taurus/core/util/colors.py index c0c83410c..c5ea6b15d 100644 --- a/lib/taurus/core/util/colors.py +++ b/lib/taurus/core/util/colors.py @@ -26,6 +26,8 @@ """This module contains color codes for state and quality""" from __future__ import print_function +from builtins import str +from builtins import object __all__ = ["DEVICE_STATE_DATA", "ATTRIBUTE_QUALITY_DATA", "ColorPalette", "DEVICE_STATE_PALETTE", "ATTRIBUTE_QUALITY_PALETTE"] @@ -123,7 +125,7 @@ def number(self, stoq, fg=False): return r[0] * 256 * 256 + r[1] * 256 + r[2] def __iter__(self): - return self._rgb_data.keys().__iter__() + return list(self._rgb_data.keys()).__iter__() def name(self, stoq, fg=False): """Returns the name of the color.""" diff --git a/lib/taurus/core/util/console.py b/lib/taurus/core/util/console.py index dcece967c..193eef4fe 100644 --- a/lib/taurus/core/util/console.py +++ b/lib/taurus/core/util/console.py @@ -25,6 +25,7 @@ """This module contains ANSI color codes""" +from builtins import object __all__ = ["make_color_table", "NoColors", "TermColors", "HTMLColors"] __docformat__ = "restructuredtext" @@ -63,13 +64,13 @@ def make_color_table(in_class, use_name=False, fake=False): setattr(in_class, name, in_class._base % value) -class NoColors: +class NoColors(object): NoColor = '' # for color schemes in color-less terminals. Normal = '' # Reset normal coloring _base = '' # Template for all other colors -class TermColors: +class TermColors(object): """Color escape sequences. This class defines the escape sequences for all the standard (ANSI?) @@ -86,7 +87,7 @@ class TermColors: _base = '\033[%sm' # Template for all other colors -class HTMLColors: +class HTMLColors(object): NoColor = '' Normal = '' diff --git a/lib/taurus/core/util/constant.py b/lib/taurus/core/util/constant.py index 6120cccd4..829513640 100644 --- a/lib/taurus/core/util/constant.py +++ b/lib/taurus/core/util/constant.py @@ -46,10 +46,11 @@ consttype.__del__() # Remove all attributes """ +from builtins import object __docformat__ = "restructuredtext" -class _consttype: +class _consttype(object): class _ConstTypeError(TypeError): pass diff --git a/lib/taurus/core/util/containers.py b/lib/taurus/core/util/containers.py index 1e0c7c407..e47044787 100644 --- a/lib/taurus/core/util/containers.py +++ b/lib/taurus/core/util/containers.py @@ -29,6 +29,11 @@ """ from __future__ import print_function +from builtins import zip +from builtins import str +from builtins import range +from past.builtins import basestring +from builtins import object __all__ = ["CaselessList", "CaselessDict", "CaselessWeakValueDict", "LoopList", "CircBuf", "LIFO", "TimedQueue", "self_locked", "ThreadDict", "defaultdict", "defaultdict_fromkey", "CaselessDefaultDict", @@ -250,7 +255,7 @@ def __init__(self, other=None): if other: # Doesn't do keyword args if isinstance(other, dict): - for k, v in other.items(): + for k, v in list(other.items()): dict.__setitem__(self, k.lower(), v) else: for k, v in other: @@ -279,7 +284,7 @@ def setdefault(self, key, def_val=None): def update(self, other): """overwritten from :meth:`dict.update`""" - for k, v in other.items(): + for k, v in list(other.items()): dict.__setitem__(self, k.lower(), v) def fromkeys(self, iterable, value=None): @@ -303,7 +308,7 @@ def __init__(self, other=None): if other: # Doesn't do keyword args if isinstance(other, dict): - for k, v in other.items(): + for k, v in list(other.items()): weakref.WeakValueDictionary.__setitem__(self, k.lower(), v) else: for k, v in other: @@ -334,7 +339,7 @@ def setdefault(self, key, def_val=None): def update(self, other): """overwritten from :meth:`weakref.WeakValueDictionary.update`""" - for k, v in other.items(): + for k, v in list(other.items()): weakref.WeakValueDictionary.__setitem__(self, k.lower(), v) def fromkeys(self, iterable, value=None): @@ -413,7 +418,7 @@ def __exit__(self, *exc_info): def dump(self, fileobj): if self.format == 'csv': - csv.writer(fileobj).writerows(self.items()) + csv.writer(fileobj).writerows(list(self.items())) elif self.format == 'json': json.dump(self, fileobj, separators=(',', ':')) elif self.format == 'pickle': @@ -487,7 +492,7 @@ def getCurrentIndex(self): '''returns the current index''' return self._index - def next(self): + def __next__(self): '''advances one item in the list and returns it''' self._index += 1 return self.current() @@ -897,7 +902,7 @@ def sort(self, key): or a callable providing a sorting key algorithm. """ import operator - if operator.isCallable(key): + if hasattr(key, '__call__'): self._keys = sorted(self._keys, key=key) else: for k in self._keys: @@ -913,7 +918,7 @@ def __setitem__(self, k, v): def update(self, other): if hasattr(other, 'items'): - other = other.items() + other = list(other.items()) for k, v in other: self.__setitem__(k, v) @@ -989,7 +994,7 @@ def __reduce__(self): args = tuple() else: args = self.default_factory, - return type(self), args, None, None, self.items() + return type(self), args, None, None, list(self.items()) def copy(self): return self.__copy__() @@ -1000,7 +1005,7 @@ def __copy__(self): def __deepcopy__(self, memo): import copy return type(self)(self.default_factory, - copy.deepcopy(self.items())) + copy.deepcopy(list(self.items()))) def __repr__(self): return 'defaultdict(%s, %s)' % (self.default_factory, @@ -1055,7 +1060,7 @@ def getDictAsTree(dct): def add_to_level(l, d): lines = [] if isinstance(d, dict): - for k, v in d.items(): + for k, v in list(d.items()): print('with key "%s"' % k) lines.append([''] * l + [str(k)]) lines += add_to_level(l + 1, v) @@ -1128,7 +1133,7 @@ def __repr__(self): def __str__(self): return self.__buffer[:self.__end].__str__() - def __nonzero__(self): + def __bool__(self): return self.__buffer[:self.__end].__nonzero__() def __setitem__(self, i, x): @@ -1317,5 +1322,5 @@ def remainingSize(self): def chunks(l, n): '''Generator which yields successive n-sized chunks from l''' - for i in xrange(0, len(l), n): + for i in range(0, len(l), n): yield l[i:i + n] diff --git a/lib/taurus/core/util/decorator/memoize.py b/lib/taurus/core/util/decorator/memoize.py index d4a4129be..7c65cf785 100644 --- a/lib/taurus/core/util/decorator/memoize.py +++ b/lib/taurus/core/util/decorator/memoize.py @@ -23,6 +23,7 @@ ## ############################################################################# +from builtins import object import functools diff --git a/lib/taurus/core/util/decorator/typecheck.py b/lib/taurus/core/util/decorator/typecheck.py index 2a1c27a0b..36f22e920 100644 --- a/lib/taurus/core/util/decorator/typecheck.py +++ b/lib/taurus/core/util/decorator/typecheck.py @@ -64,6 +64,8 @@ """ from __future__ import print_function +from builtins import str +from builtins import map __all__ = ["accepts", "returns"] __docformat__ = "restructuredtext" diff --git a/lib/taurus/core/util/enumeration.py b/lib/taurus/core/util/enumeration.py index 45876a76e..1c8c4e99b 100644 --- a/lib/taurus/core/util/enumeration.py +++ b/lib/taurus/core/util/enumeration.py @@ -33,6 +33,8 @@ values (specified and unspecified) are unique. Enum values then are attributes of an Enumeration class (Volkswagen.BEETLE, Volkswagen.PASSAT, etc.).""" +from builtins import str +from builtins import object __all__ = ["EnumException", "Enumeration"] __docformat__ = "restructuredtext" @@ -95,9 +97,9 @@ def __init__(self, name, enumList, flaggable=False, no_doc=False): raise EnumException( "flagable enum does not accept tuple items") x, i = x - if not isinstance(x, (str, unicode)): + if not isinstance(x, (str, str)): raise EnumException("enum name is not a string: " + str(x)) - if not isinstance(i, (int, long)): + if not isinstance(i, (int, int)): raise EnumException( "enum value is not an integer: " + str(i)) if x in uniqueNames: @@ -111,7 +113,7 @@ def __init__(self, name, enumList, flaggable=False, no_doc=False): reverseLookup[i] = x for x in enumList: if not isinstance(x, tuple): - if not isinstance(x, (str, unicode)): + if not isinstance(x, (str, str)): raise EnumException("enum name is not a string: " + str(x)) if x in uniqueNames: raise EnumException("enum name is not unique: " + str(x)) @@ -143,15 +145,15 @@ def _generateUniqueId(self): return n def __contains__(self, i): - if isinstance(i, (int, long)): + if isinstance(i, (int, int)): return i in self.reverseLookup - elif isinstance(i, (str, unicode)): + elif isinstance(i, (str, str)): return i in self.lookup def __getitem__(self, i): - if isinstance(i, (int, long)): + if isinstance(i, (int, int)): return self.whatis(i) - elif isinstance(i, (str, unicode)): + elif isinstance(i, (str, str)): return self.lookup[i] def __getattr__(self, attr): @@ -193,7 +195,7 @@ def keys(self): """Returns an iterable containning the valid enumeration keys :return: an interable containning the valid enumeration keys :rtype: iter""" - return self.lookup.keys() + return list(self.lookup.keys()) def whatis(self, value): """Returns a string representation of the value in the enumeration. diff --git a/lib/taurus/core/util/event.py b/lib/taurus/core/util/event.py index b39142205..045af7ef4 100644 --- a/lib/taurus/core/util/event.py +++ b/lib/taurus/core/util/event.py @@ -29,6 +29,10 @@ from __future__ import print_function from __future__ import absolute_import +from past.builtins import cmp +from builtins import str +from builtins import range +from builtins import object __all__ = ["BoundMethodWeakref", "CallableRef", "EventGenerator", "ConfigEventGenerator", "ListEventGenerator", "EventListener", "AttributeEventWait", "AttributeEventIterator"] @@ -232,7 +236,7 @@ def unsubscribeDeletedEvent(self, cb_ref): try: self.lock() aux_list = list(self.cb_list) - for i in xrange(len(aux_list) - 1, -1, -1): + for i in range(len(aux_list) - 1, -1, -1): pair = self.cb_list[i] if pair[0] is cb_ref: del self.cb_list[i] @@ -446,7 +450,7 @@ class MyEvtListener(EventListener): if t and t >= after: return else: - for v, t in s.items(): + for v, t in list(s.items()): if v == val: continue if t >= after: @@ -646,7 +650,7 @@ def waitEvent(self, val, after=0, equal=True, timeout=None, retries=-1, retries += 1 while retries != 0: if any: - for v, t in s.items(): + for v, t in list(s.items()): if t >= after: return if equal: @@ -654,7 +658,7 @@ def waitEvent(self, val, after=0, equal=True, timeout=None, retries=-1, if (t is not None) and (t >= after): return else: - for v, t in s.items(): + for v, t in list(s.items()): if v == val: continue if t >= after: diff --git a/lib/taurus/core/util/eventfilters.py b/lib/taurus/core/util/eventfilters.py index 165679255..bc5c2bb63 100644 --- a/lib/taurus/core/util/eventfilters.py +++ b/lib/taurus/core/util/eventfilters.py @@ -27,6 +27,7 @@ :meth:`taurus.qt.qtgui.base.TaurusBaseComponent.setFilters`""" +from builtins import object def IGNORE_ALL(s, t, v): '''Will discard all events''' return None diff --git a/lib/taurus/core/util/excepthook.py b/lib/taurus/core/util/excepthook.py index 7ba8967d6..2a48cedd9 100644 --- a/lib/taurus/core/util/excepthook.py +++ b/lib/taurus/core/util/excepthook.py @@ -25,6 +25,7 @@ """This module contains a base class for exception hooks""" +from builtins import object __all__ = ["BaseExceptHook"] __docformat__ = "restructuredtext" diff --git a/lib/taurus/core/util/fandango_search.py b/lib/taurus/core/util/fandango_search.py index fda760188..fda8eb91f 100644 --- a/lib/taurus/core/util/fandango_search.py +++ b/lib/taurus/core/util/fandango_search.py @@ -31,6 +31,7 @@ """ # TODO: tango-centric +from builtins import str import re import taurus @@ -116,8 +117,8 @@ def get_matching_devices(expressions, limit=0, exported=False): #all_devs.extend('%s/%s'%(host,d) for d in odb.get_device_name('*','*')) result = [e for e in expressions if e.lower() in all_devs] expressions = [extend_regexp(e) for e in expressions if e not in result] - result.extend(filter(lambda d: any(matchCl(extend_regexp(e), d) - for e in expressions), all_devs)) + result.extend([d for d in all_devs if any(matchCl(extend_regexp(e), d) + for e in expressions)]) return result diff --git a/lib/taurus/core/util/init_bkcomp.py b/lib/taurus/core/util/init_bkcomp.py index 4cccf0a9e..9a559b5b9 100644 --- a/lib/taurus/core/util/init_bkcomp.py +++ b/lib/taurus/core/util/init_bkcomp.py @@ -78,7 +78,7 @@ def dictFromSequence(seq): :return: (dict) dictionary built from the given sequence""" def _pairwise(iterable): """Utility method used by dictFromSequence""" - itnext = iter(iterable).next + itnext = iter(iterable).__next__ while True: yield itnext(), itnext() return dict(_pairwise(seq)) diff --git a/lib/taurus/core/util/init_lightweight.py b/lib/taurus/core/util/init_lightweight.py index 6ce866347..22e20c6d7 100644 --- a/lib/taurus/core/util/init_lightweight.py +++ b/lib/taurus/core/util/init_lightweight.py @@ -77,7 +77,7 @@ def dictFromSequence(seq): :return: (dict) dictionary built from the given sequence""" def _pairwise(iterable): """Utility method used by dictFromSequence""" - itnext = iter(iterable).next + itnext = iter(iterable).__next__ while True: yield itnext(), itnext() return dict(_pairwise(seq)) diff --git a/lib/taurus/core/util/lock.py b/lib/taurus/core/util/lock.py index 66b97f9e7..6306d1847 100644 --- a/lib/taurus/core/util/lock.py +++ b/lib/taurus/core/util/lock.py @@ -26,6 +26,7 @@ """This module defines a *slow* lock class that provides additional debugging information""" +from builtins import object __all__ = ["TaurusLock"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/core/util/log.py b/lib/taurus/core/util/log.py index 2d3e956ba..31a1c2090 100644 --- a/lib/taurus/core/util/log.py +++ b/lib/taurus/core/util/log.py @@ -28,6 +28,8 @@ from __future__ import print_function from __future__ import absolute_import +from builtins import str +from builtins import object __all__ = ["LogIt", "TraceIt", "DebugIt", "InfoIt", "WarnIt", "ErrorIt", "CriticalIt", "MemoryLogHandler", "LogExceptHook", "Logger", "LogFilter", @@ -63,14 +65,14 @@ def __init__(self): def getTotal(self): c = 0 - for v in self.itervalues(): + for v in self.values(): c += v return c def pretty(self): from operator import itemgetter sorted_items = sorted( - self.iteritems(), key=itemgetter(1), reverse=True) + iter(self.items()), key=itemgetter(1), reverse=True) ret = '\n'.join(['\t%d * "%s"' % (v, k) for k, v in sorted_items]) return "< Deprecation Counts (%d):\n%s >" % (self.getTotal(), ret) @@ -680,7 +682,7 @@ def getChildren(self): :return: (sequence) UIDs of currently shared data. ''' - return self.__models.keys() + return list(self.__models.keys()) def debugReader(self, data): ''' @@ -338,6 +338,6 @@ def debugReader(self, data): def info(self): s = "" - for uid, m in sorted(self.__models.iteritems()): + for uid, m in sorted(self.__models.items()): s += m.info() + '\n' return s diff --git a/lib/taurus/qt/qtcore/configuration/configuration.py b/lib/taurus/qt/qtcore/configuration/configuration.py index 0706787ab..9ef21e2f6 100644 --- a/lib/taurus/qt/qtcore/configuration/configuration.py +++ b/lib/taurus/qt/qtcore/configuration/configuration.py @@ -27,12 +27,17 @@ configuration features to the classes that inherit from them""" from __future__ import print_function +from future import standard_library +standard_library.install_aliases() +from builtins import str +from past.builtins import basestring +from builtins import object __all__ = ["configurableProperty", "BaseConfigurableClass"] __docformat__ = 'restructuredtext' -class configurableProperty: +class configurableProperty(object): '''A dummy class used to handle properties with the configuration API .. warning:: this class is intended for internal use by the configuration @@ -66,7 +71,7 @@ def objectName(self): return self.name -class BaseConfigurableClass: +class BaseConfigurableClass(object): ''' A base class defining the API for configurable objects. @@ -191,7 +196,7 @@ def createConfig(self, allowUnpickable=False): # store the configurations for all registered configurable items as # well itemcfgs = {} - for k, v in self.__configurableItems.iteritems(): + for k, v in self.__configurableItems.items(): itemcfgs[k] = v.createConfig(allowUnpickable=allowUnpickable) configdict["__itemConfigurations__"] = itemcfgs configdict["__orderedConfigNames__"] = self.__configurableItemNames @@ -403,7 +408,7 @@ def createQConfig(self): .. seealso:: :meth:`restoreQConfig` ''' from taurus.external.qt import Qt - import cPickle as pickle + import pickle as pickle configdict = self.createConfig(allowUnpickable=False) return Qt.QByteArray(pickle.dumps(configdict)) @@ -417,7 +422,7 @@ def applyQConfig(self, qstate): ''' if qstate.isNull(): return - import cPickle as pickle + import pickle as pickle configdict = pickle.loads(qstate.data()) self.applyConfig(configdict) @@ -428,10 +433,10 @@ def saveConfigFile(self, ofile=None): :return: (str) file name used """ - import cPickle as pickle + import pickle as pickle if ofile is None: from taurus.external.qt import Qt - ofile = unicode(Qt.QFileDialog.getSaveFileName( + ofile = str(Qt.QFileDialog.getSaveFileName( self, 'Save Configuration', '%s.pck' % self.__class__.__name__, 'Configuration File (*.pck)')) if not ofile: return @@ -449,10 +454,10 @@ def loadConfigFile(self, ifile=None): :return: (str) file name used """ - import cPickle as pickle + import pickle as pickle if ifile is None: from taurus.external.qt import Qt - ifile = unicode(Qt.QFileDialog.getOpenFileName( + ifile = str(Qt.QFileDialog.getOpenFileName( self, 'Load Configuration', '', 'Configuration File (*.pck)')) if not ifile: return diff --git a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py index 4347da3d3..78af505aa 100644 --- a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py +++ b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py @@ -26,6 +26,7 @@ """This module provides widgets that display the database in a tree format""" # TODO: tango-centric +from builtins import str __all__ = ["TaurusTreeDevicePartItem", "TaurusTreeDeviceDomainItem", "TaurusTreeDeviceFamilyItem", "TaurusTreeDeviceMemberItem", "TaurusTreeSimpleDeviceItem", "TaurusTreeDeviceItem", "TaurusTreeAttributeItem", "TaurusTreeServerNameItem", @@ -266,7 +267,7 @@ def toolTip(self, index): alarms="[%s, %s]" % (di.alarms.min_alarm, di.alarms.max_alarm), warnings="[%s, %s]" % (di.alarms.min_warning, di.alarms.max_warning),) - for id, value in items.items(): + for id, value in list(items.items()): ret += '%s:%s' % ( id.capitalize(), value) ret += '' @@ -553,15 +554,15 @@ def setupModelData(self, data): data = data.deviceTree() rootItem = self._rootItem - for domain in data.keys(): + for domain in list(data.keys()): families = data[domain] domainItem = TaurusTreeDeviceDomainItem( self, domain.upper(), rootItem) - for family in families.keys(): + for family in list(families.keys()): members = families[family] familyItem = TaurusTreeDeviceFamilyItem( self, family.upper(), domainItem) - for member in members.keys(): + for member in list(members.keys()): dev = members[member] memberItem = TaurusTreeDeviceItem( self, dev, parent=familyItem) @@ -586,7 +587,7 @@ def setupModelData(self, data): servers = data.servers() rootItem = self._rootItem - for server_name, server in servers.items(): + for server_name, server in list(servers.items()): serverInstanceItem = TaurusTreeFullServerItem( self, server, rootItem) rootItem.appendChild(serverInstanceItem) diff --git a/lib/taurus/qt/qtcore/model/taurusmodel.py b/lib/taurus/qt/qtcore/model/taurusmodel.py index 5bd663daf..2e2591ebe 100644 --- a/lib/taurus/qt/qtcore/model/taurusmodel.py +++ b/lib/taurus/qt/qtcore/model/taurusmodel.py @@ -25,6 +25,7 @@ """This module provides base taurus tree item and a base tree model""" +from builtins import object __all__ = ["TaurusBaseTreeItem", "TaurusBaseModel", "TaurusBaseProxyModel"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtcore/util/emitter.py b/lib/taurus/qt/qtcore/util/emitter.py index e6b04e11a..4419f97d3 100644 --- a/lib/taurus/qt/qtcore/util/emitter.py +++ b/lib/taurus/qt/qtcore/util/emitter.py @@ -27,8 +27,17 @@ emitter.py: This module provides a task scheduler used by TaurusGrid and TaurusDevTree widgets """ - -from Queue import Queue, Empty +from __future__ import division + +from future import standard_library +standard_library.install_aliases() +from builtins import next +from builtins import str +from builtins import map +from past.builtins import basestring +from past.utils import old_div +from builtins import object +from queue import Queue, Empty import traceback from functools import partial from collections import Iterable @@ -218,7 +227,7 @@ def __init__(self, parent=None, name='', queue=None, method=None, self.emitter.doSomething.connect(self._doSomething) if not self.refreshTimer: - self.emitter.somethingDone.connect(self.next) + self.emitter.somethingDone.connect(self.__next__) def onRefresh(self): try: @@ -242,7 +251,7 @@ def getQueue(self): def getDone(self): """ Returns % of done tasks in 0-1 range """ pending = self.getQueue().qsize() - return float(self._done) / (self._done + pending) + return old_div(float(self._done), (self._done + pending)) def clear(self): while not self.todo.empty(): @@ -279,12 +288,12 @@ def _doSomething(self, params): method(*args) except: self.log.error('At TaurusEmitterThread._doSomething(%s): \n%s' - % (map(str, args), traceback.format_exc())) + % (list(map(str, args)), traceback.format_exc())) self.emitter.somethingDone.emit() self._done += 1 return - def next(self): + def __next__(self): queue = self.getQueue() msg = ('At TaurusEmitterThread.next(), %d items remaining.' % queue.qsize()) @@ -376,7 +385,7 @@ def getUnsubscribedAttributes(self): """Check all pending subscriptions in the current factory """ attrs = [] - items = self._factory.getExistingAttributes().items() + items = list(self._factory.getExistingAttributes().items()) for name, attr in items: if attr is None: continue @@ -416,7 +425,7 @@ def cleanUp(self): Logger.cleanUp(self) -class SingletonWorker(): +class SingletonWorker(object): """ SingletonWorker is used to manage TaurusEmitterThread as Singleton objects @@ -498,8 +507,8 @@ def getDone(self): return self.thread.getDone() def start(self): - self.thread.emitter.somethingDone.connect(self.next) - self.thread.emitter.newQueue.connect(self.thread.next) + self.thread.emitter.somethingDone.connect(self.__next__) + self.thread.emitter.newQueue.connect(self.thread.__next__) try: self.thread.start() except: @@ -509,8 +518,8 @@ def start(self): return def stop(self): - self.thread.emitter.somethingDone.disconnect(self.next) - self.thread.emitter.newQueue.disconnect(self.thread.next) + self.thread.emitter.somethingDone.disconnect(self.__next__) + self.thread.emitter.newQueue.disconnect(self.thread.__next__) self._running = False return diff --git a/lib/taurus/qt/qtcore/util/properties.py b/lib/taurus/qt/qtcore/util/properties.py index db292eed9..524351556 100644 --- a/lib/taurus/qt/qtcore/util/properties.py +++ b/lib/taurus/qt/qtcore/util/properties.py @@ -55,6 +55,8 @@ def resetFilters(self): """ +from builtins import str +from builtins import map from functools import partial from taurus.external.qt import Qt from taurus.core.util.fandango_search import isSequence, isDictionary @@ -81,7 +83,7 @@ def djoin(a, b): other, dct = sorted((a, b), key=isDictionary) if not isDictionary(other): other = dict.fromkeys(other if isSequence(other) else [other, ]) - for k, v in other.items(): + for k, v in list(other.items()): dct[k] = v if not k in dct else djoin(dct[k], v) return dct diff --git a/lib/taurus/qt/qtcore/util/signal.py b/lib/taurus/qt/qtcore/util/signal.py index c24fa0412..20bdcd509 100644 --- a/lib/taurus/qt/qtcore/util/signal.py +++ b/lib/taurus/qt/qtcore/util/signal.py @@ -1,6 +1,7 @@ """Provide a Signal class for non-QObject objects""" from __future__ import print_function +from builtins import object __all__ = ['baseSignal'] from PyQt4 import Qt diff --git a/lib/taurus/qt/qtdesigner/taurusdesigner.py b/lib/taurus/qt/qtdesigner/taurusdesigner.py index b559144de..75c430d3d 100644 --- a/lib/taurus/qt/qtdesigner/taurusdesigner.py +++ b/lib/taurus/qt/qtdesigner/taurusdesigner.py @@ -23,6 +23,7 @@ ## ############################################################################# +from builtins import str import sys import os.path import optparse diff --git a/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py b/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py index 2287f0ac7..9659b6720 100644 --- a/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py +++ b/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py @@ -38,6 +38,8 @@ """ from __future__ import print_function +from builtins import str +from builtins import zip import inspect from taurus.external.qt import Qt @@ -86,8 +88,8 @@ def __getWidgetArgs(self, klass=None, designMode=True, parent=None): if aspec.defaults is None: kwspec = {} else: - kwspec = dict(zip(aspec.args[-len(aspec.defaults):], - aspec.defaults)) + kwspec = dict(list(zip(aspec.args[-len(aspec.defaults):], + aspec.defaults))) args, kwargs = [], {} if 'designMode' in kwspec: kwargs['designMode'] = designMode diff --git a/lib/taurus/qt/qtdesigner/tauruspluginplugin.py b/lib/taurus/qt/qtdesigner/tauruspluginplugin.py index 2abb98f93..86744cfa8 100644 --- a/lib/taurus/qt/qtdesigner/tauruspluginplugin.py +++ b/lib/taurus/qt/qtdesigner/tauruspluginplugin.py @@ -119,7 +119,7 @@ def __init__(self, parent=None): def customWidgets(self): if self._widgets is None: - self._widgets = [w(self) for w in _plugins.values()] + self._widgets = [w(self) for w in list(_plugins.values())] return self._widgets if __name__ != "__main__": diff --git a/lib/taurus/qt/qtgui/application/taurusapplication.py b/lib/taurus/qt/qtgui/application/taurusapplication.py index dcd0c78b5..3d2d63d69 100644 --- a/lib/taurus/qt/qtgui/application/taurusapplication.py +++ b/lib/taurus/qt/qtgui/application/taurusapplication.py @@ -26,6 +26,7 @@ """This module provides the base :class:`taurus.qt.qtgui.application.TaurusApplication` class.""" +from builtins import str from __future__ import with_statement __all__ = ["TaurusApplication"] diff --git a/lib/taurus/qt/qtgui/base/taurusbase.py b/lib/taurus/qt/qtgui/base/taurusbase.py index ebd8b6228..f38f205fa 100644 --- a/lib/taurus/qt/qtgui/base/taurusbase.py +++ b/lib/taurus/qt/qtgui/base/taurusbase.py @@ -27,6 +27,8 @@ """This module provides the set of base classes from which the Qt taurus widgets should inherit to be considered valid taurus widgets.""" +from builtins import str +from past.builtins import basestring __all__ = ["TaurusBaseComponent", "TaurusBaseWidget", "TaurusBaseWritableWidget", "defaultFormatter"] @@ -330,7 +332,7 @@ def fireBufferedEvents(self): but it can also be called any time the buffer needs to be flushed ''' with self._eventsBufferLock: - for evt in self._bufferedEvents.values(): + for evt in list(self._bufferedEvents.values()): self.taurusEvent.emit(*evt) self._bufferedEvents = {} diff --git a/lib/taurus/qt/qtgui/base/tauruscontroller.py b/lib/taurus/qt/qtgui/base/tauruscontroller.py index 60e21418a..fd536cb85 100644 --- a/lib/taurus/qt/qtgui/base/tauruscontroller.py +++ b/lib/taurus/qt/qtgui/base/tauruscontroller.py @@ -26,6 +26,8 @@ """This module provides the set of base class taurus controllers.""" +from builtins import str +from builtins import object __all__ = ["TaurusBaseController", "TaurusAttributeControllerHelper", "TaurusScalarAttributeControllerHelper", "TaurusConfigurationControllerHelper", diff --git a/lib/taurus/qt/qtgui/button/taurusbutton.py b/lib/taurus/qt/qtgui/button/taurusbutton.py index bd2eac735..2575d1922 100644 --- a/lib/taurus/qt/qtgui/button/taurusbutton.py +++ b/lib/taurus/qt/qtgui/button/taurusbutton.py @@ -27,6 +27,9 @@ """This module provides a taurus QPushButton based widgets""" from __future__ import print_function +from builtins import map +from builtins import str +from past.builtins import basestring __all__ = ["TaurusLauncherButton", "TaurusCommandButton", "TaurusLockButton"] __docformat__ = 'restructuredtext' @@ -406,7 +409,7 @@ def _castParameters(self, parameters=None, command=None, dev=None): else: return parameters else: - return map(cast_type, parameters) + return list(map(cast_type, parameters)) def setCommand(self, commandName): '''sets the command to be executed when the button is clicked @@ -638,7 +641,7 @@ def lockButtonMain(): if len(args) == 0: w = demo() else: - models = map(str.lower, args) + models = list(map(str.lower, args)) w = Qt.QWidget() layout = Qt.QGridLayout() diff --git a/lib/taurus/qt/qtgui/compact/abstractswitcher.py b/lib/taurus/qt/qtgui/compact/abstractswitcher.py index 88ff6f442..03e1a2893 100644 --- a/lib/taurus/qt/qtgui/compact/abstractswitcher.py +++ b/lib/taurus/qt/qtgui/compact/abstractswitcher.py @@ -26,6 +26,7 @@ """This module provides base classes from which the compact widgets should inherit """ +from past.builtins import basestring __all__ = ["TaurusReadWriteSwitcher"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/container/qcontainer.py b/lib/taurus/qt/qtgui/container/qcontainer.py index 817299474..6e2035501 100644 --- a/lib/taurus/qt/qtgui/container/qcontainer.py +++ b/lib/taurus/qt/qtgui/container/qcontainer.py @@ -25,6 +25,7 @@ """This module provides basic pure Qt container widgets""" +from builtins import str __all__ = ["QGroupWidget"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/container/taurusframe.py b/lib/taurus/qt/qtgui/container/taurusframe.py index d12b679e8..79438bc2e 100644 --- a/lib/taurus/qt/qtgui/container/taurusframe.py +++ b/lib/taurus/qt/qtgui/container/taurusframe.py @@ -26,6 +26,7 @@ """This module provides basic taurus container widgets""" from __future__ import absolute_import +from builtins import map __all__ = ["TaurusFrame"] __docformat__ = 'restructuredtext' @@ -150,7 +151,7 @@ def main(): if len(args) == 0: w = demo() else: - models = map(str.lower, args) + models = list(map(str.lower, args)) w = Qt.QWidget() w.setWindowTitle(app.applicationName()) diff --git a/lib/taurus/qt/qtgui/container/taurusgroupbox.py b/lib/taurus/qt/qtgui/container/taurusgroupbox.py index ec4e9c7b8..fc775038c 100644 --- a/lib/taurus/qt/qtgui/container/taurusgroupbox.py +++ b/lib/taurus/qt/qtgui/container/taurusgroupbox.py @@ -26,6 +26,8 @@ """This module provides basic taurus group box widget""" from __future__ import absolute_import +from builtins import map +from builtins import str __all__ = ["TaurusGroupBox"] __docformat__ = 'restructuredtext' @@ -195,7 +197,7 @@ def main(): if len(args) == 0: w = demo() else: - models = map(str.lower, args) + models = list(map(str.lower, args)) w = Qt.QWidget() w.setWindowTitle(app.applicationName()) diff --git a/lib/taurus/qt/qtgui/container/taurusgroupwidget.py b/lib/taurus/qt/qtgui/container/taurusgroupwidget.py index 9e4add722..d904f7bea 100644 --- a/lib/taurus/qt/qtgui/container/taurusgroupwidget.py +++ b/lib/taurus/qt/qtgui/container/taurusgroupwidget.py @@ -26,6 +26,7 @@ """This module provides a taurus group widget""" from __future__ import absolute_import +from builtins import map __all__ = ["TaurusGroupWidget"] __docformat__ = 'restructuredtext' @@ -195,7 +196,7 @@ def main(): if len(args) == 0: w = demo() else: - models = map(str.lower, args) + models = list(map(str.lower, args)) w = Qt.QWidget() w.setWindowTitle(app.applicationName()) diff --git a/lib/taurus/qt/qtgui/container/taurusmainwindow.py b/lib/taurus/qt/qtgui/container/taurusmainwindow.py index 934341ca5..91b25fd3e 100644 --- a/lib/taurus/qt/qtgui/container/taurusmainwindow.py +++ b/lib/taurus/qt/qtgui/container/taurusmainwindow.py @@ -28,6 +28,9 @@ """ from __future__ import absolute_import +from builtins import str +from builtins import range +from past.builtins import basestring __all__ = ["TaurusMainWindow"] __docformat__ = 'restructuredtext' @@ -91,7 +94,7 @@ def addExternalAppConfig(self, extapp): self.externalAppsPage.setWidgetResizable(True) self._tabwidget.addTab(self.externalAppsPage, "External Application Paths") - label = "Command line for %s" % unicode(extapp.text()) + label = "Command line for %s" % str(extapp.text()) editWidget = CommandArgsLineEdit(extapp, " ".join(extapp.cmdArgs())) #editWidget = Qt.QLineEdit(" ".join(extapp.cmdArgs())) self.externalAppsPage.widget().layout().addRow(label, editWidget) @@ -106,12 +109,12 @@ def deleteExternalAppConfig(self, extapp): ''' from taurus.external.qt import Qt layout = self.externalAppsPage.widget().layout() - for cnt in reversed(range(layout.count())): + for cnt in reversed(list(range(layout.count()))): widget = layout.itemAt(cnt).widget() if widget is not None: text = str(widget.text()) # command1 if isinstance(widget, Qt.QLabel): - dialog_text = "Command line for %s" % unicode( + dialog_text = "Command line for %s" % str( extapp.text()) if text == dialog_text: layout.removeWidget(widget) @@ -623,7 +626,7 @@ def loadSettings(self, settings=None, group=None, ignoreGeometry=False, factoryS self.applyQConfig(ba) except Exception as e: msg = 'Problem loading configuration from "%s". Some settings may not be restored.\n Details: %s' % ( - unicode(settings.fileName()), repr(e)) + str(settings.fileName()), repr(e)) self.error(msg) Qt.QMessageBox.warning( self, 'Error Loading settings', msg, Qt.QMessageBox.Ok) @@ -681,7 +684,7 @@ def savePerspective(self, name=None): if not ok: return if name in perspectives: - ans = Qt.QMessageBox.question(self, "Overwrite perspective?", "overwrite existing perspective %s?" % unicode(name), + ans = Qt.QMessageBox.question(self, "Overwrite perspective?", "overwrite existing perspective %s?" % str(name), Qt.QMessageBox.Yes, Qt.QMessageBox.No) if ans != Qt.QMessageBox.Yes: return @@ -759,16 +762,16 @@ def exportSettingsFile(self, fname=None): :param fname: (str) name of output file. If None given, a file dialog will be shown. ''' if fname is None: - fname = unicode(Qt.QFileDialog.getSaveFileName(self, 'Choose file where the current settings should be saved', + fname = str(Qt.QFileDialog.getSaveFileName(self, 'Choose file where the current settings should be saved', '', "Ini files (*.ini);;All files (*)")) if not fname: return self.saveSettings() ok = Qt.QFile.copy(self.getQSettings().fileName(), fname) if ok: - self.info('MainWindow settings saved in "%s"' % unicode(fname)) + self.info('MainWindow settings saved in "%s"' % str(fname)) else: - msg = 'Settings could not be exported to %s' % unicode(fname) + msg = 'Settings could not be exported to %s' % str(fname) Qt.QMessageBox.warning(self, 'Export error', msg) def importSettingsFile(self, fname=None): @@ -779,7 +782,7 @@ def importSettingsFile(self, fname=None): :param fname: (str) name of ini file. If None given, a file dialog will be shown. ''' if fname is None: - fname = unicode(Qt.QFileDialog.getOpenFileName(self, 'Select a ini-format settings file', + fname = str(Qt.QFileDialog.getOpenFileName(self, 'Select a ini-format settings file', '', "Ini files (*.ini);;All files (*)")) if not fname: return @@ -935,8 +938,8 @@ def resetHelpManualURI(self): self.setHelpManualURI(uri) def showHelpAbout(self): - appname = unicode(Qt.qApp.applicationName()) - appversion = unicode(Qt.qApp.applicationVersion()) + appname = str(Qt.qApp.applicationName()) + appversion = str(Qt.qApp.applicationVersion()) from taurus.core import release abouttext = "%s %s\n\nUsing %s %s" % ( appname, appversion, release.name, release.version) @@ -961,7 +964,7 @@ def checkSingleInstance(self, key=None): if key is None: from taurus.core.util.user import getSystemUserName username = getSystemUserName() - appname = unicode(Qt.QApplication.applicationName()) + appname = str(Qt.QApplication.applicationName()) key = "__socket_%s-%s__" % (username, appname) from taurus.external.qt import QtNetwork socket = QtNetwork.QLocalSocket(self) diff --git a/lib/taurus/qt/qtgui/container/taurusscrollarea.py b/lib/taurus/qt/qtgui/container/taurusscrollarea.py index c9db150d8..ea4691922 100644 --- a/lib/taurus/qt/qtgui/container/taurusscrollarea.py +++ b/lib/taurus/qt/qtgui/container/taurusscrollarea.py @@ -26,6 +26,7 @@ """This module provides basic taurus scroll area widget""" from __future__ import absolute_import +from builtins import map __all__ = ["TaurusScrollArea"] __docformat__ = 'restructuredtext' @@ -173,7 +174,7 @@ def main(): if len(args) == 0: w = demo() else: - models = map(str.lower, args) + models = list(map(str.lower, args)) w = Qt.QWidget() w.setWindowTitle(app.applicationName()) diff --git a/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py b/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py index 371246e5c..a3361688d 100644 --- a/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py +++ b/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py @@ -25,6 +25,9 @@ """This module provides a set of dialog based widgets""" +from future import standard_library +standard_library.install_aliases() +from builtins import object __all__ = ["TaurusMessageBox", "protectTaurusMessageBox", "ProtectTaurusMessageBox", "TaurusExceptHookMessageBox"] @@ -337,8 +340,8 @@ def py_tg_serv_exc(): except PyTango.DevFailed as df1: try: import traceback - import StringIO - origin = StringIO.StringIO() + import io + origin = io.StringIO() traceback.print_stack(file=origin) origin.seek(0) origin = origin.read() diff --git a/lib/taurus/qt/qtgui/display/qled.py b/lib/taurus/qt/qtgui/display/qled.py index 0cb1e040f..0163119be 100644 --- a/lib/taurus/qt/qtgui/display/qled.py +++ b/lib/taurus/qt/qtgui/display/qled.py @@ -25,6 +25,7 @@ """A pure Qt led widget""" +from builtins import str __all__ = ["LedColor", "LedStatus", "LedSize", "QLed", "QLedOld"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/display/qpixmapwidget.py b/lib/taurus/qt/qtgui/display/qpixmapwidget.py index f2d7f32a4..860e6c8d0 100644 --- a/lib/taurus/qt/qtgui/display/qpixmapwidget.py +++ b/lib/taurus/qt/qtgui/display/qpixmapwidget.py @@ -25,7 +25,9 @@ """This module contains a pure Qt widget that displays an image""" from __future__ import absolute_import +from __future__ import division +from past.utils import old_div __all__ = ["QPixmapWidget"] __docformat__ = 'restructuredtext' @@ -80,11 +82,11 @@ def paintEvent(self, paintEvent): vAlign = align & Qt.Qt.AlignVertical_Mask x, y = 0, 0 if hAlign & Qt.Qt.AlignHCenter: - x = (w - pw) / 2 + x = old_div((w - pw), 2) elif hAlign & Qt.Qt.AlignRight: x = w - pw if vAlign & Qt.Qt.AlignVCenter: - y = (h - ph) / 2 + y = old_div((h - ph), 2) elif vAlign & Qt.Qt.AlignBottom: y = h - ph x, y = max(0, x), max(0, y) diff --git a/lib/taurus/qt/qtgui/display/qsevensegment.py b/lib/taurus/qt/qtgui/display/qsevensegment.py index 999dc5ffb..fd44b94c3 100644 --- a/lib/taurus/qt/qtgui/display/qsevensegment.py +++ b/lib/taurus/qt/qtgui/display/qsevensegment.py @@ -27,7 +27,11 @@ qsevensegmentdisplay.py """ from __future__ import print_function +from __future__ import division +from builtins import str +from builtins import range +from past.utils import old_div __all__ = ['Q7SegDigit'] __docformat__ = 'restructuredtext' @@ -134,7 +138,7 @@ class Q7SegDigit(Qt.QWidget): DftWidth = 300 DftHeight = 300 - DftAspectRatio = DftWidth / DftHeight + DftAspectRatio = old_div(DftWidth, DftHeight) DftUseFrame = True def __init__(self, parent=None, **kwargs): @@ -202,11 +206,11 @@ def paintEvent(self, evt): painter.setRenderHint(Qt.QPainter.Antialiasing) painter.setWindow(0, 0, self.DftWidth, self.DftHeight) w, h = float(self.width()), float(self.height()) - aspect = w / h + aspect = old_div(w, h) if aspect > 0.75: w = h * aspect else: - h = w / aspect + h = old_div(w, aspect) painter.setViewport(0, 0, w, h) self._paintBorder(painter) self._paintSegment(painter) @@ -248,7 +252,7 @@ def _paintSegment(self, painter): pens, brushes = self._pens[idx], self._brushes[idx] - for i in xrange(7): + for i in range(7): seg = Qt.QPainterPath() seg.addPolygon(geom[i]) painter.setPen(pens[i]) @@ -506,7 +510,7 @@ def __init(self): self.setLayout(l) self._digits = [] - for i in xrange(5): + for i in range(5): d = Q7SegDigit() d.setUseFrame(False) d.setValue(i) diff --git a/lib/taurus/qt/qtgui/display/tauruslabel.py b/lib/taurus/qt/qtgui/display/tauruslabel.py index 7d97e4882..3902ee5fa 100644 --- a/lib/taurus/qt/qtgui/display/tauruslabel.py +++ b/lib/taurus/qt/qtgui/display/tauruslabel.py @@ -26,6 +26,8 @@ """This module provides a set of basic Taurus widgets based on QLabel""" from __future__ import absolute_import +from builtins import str +from builtins import object __all__ = ["TaurusLabel"] __docformat__ = 'restructuredtext' @@ -116,8 +118,8 @@ def _updateToolTip(self, label): toolTip = label.getFormatedToolTip() if self._trimmedText: toolTip = u"

Value: %s


%s" %\ - (unicode(self._text, errors='replace'), - unicode(str(toolTip), errors='replace')) + (str(self._text, errors='replace'), + str(str(toolTip), errors='replace')) label.setToolTip(toolTip) _updateBackground = updateLabelBackground diff --git a/lib/taurus/qt/qtgui/display/tauruslcd.py b/lib/taurus/qt/qtgui/display/tauruslcd.py index cf9b91021..b607aaad7 100644 --- a/lib/taurus/qt/qtgui/display/tauruslcd.py +++ b/lib/taurus/qt/qtgui/display/tauruslcd.py @@ -26,6 +26,9 @@ """This module provides a Taurus widget based on QLCDNumber""" from __future__ import absolute_import +from builtins import map +from builtins import str +from builtins import object __all__ = ["TaurusLCD"] __docformat__ = 'restructuredtext' @@ -413,7 +416,7 @@ def main(): if len(args) == 0: w = demo() else: - models = map(str.lower, args) + models = list(map(str.lower, args)) w = Qt.QWidget() layout = Qt.QGridLayout() diff --git a/lib/taurus/qt/qtgui/display/taurusled.py b/lib/taurus/qt/qtgui/display/taurusled.py index 6a58241bf..70e35e73f 100644 --- a/lib/taurus/qt/qtgui/display/taurusled.py +++ b/lib/taurus/qt/qtgui/display/taurusled.py @@ -27,6 +27,9 @@ """This module provides a set of basic Taurus widgets based on QLed""" from __future__ import absolute_import +from builtins import map +from builtins import str +from builtins import object __all__ = ["TaurusLed"] __docformat__ = 'restructuredtext' @@ -478,7 +481,7 @@ def main(): if len(args) == 0: w = demo() else: - models = map(str.lower, args) + models = list(map(str.lower, args)) w = Qt.QWidget() layout = Qt.QGridLayout() diff --git a/lib/taurus/qt/qtgui/display/test/test_tauruslabel.py b/lib/taurus/qt/qtgui/display/test/test_tauruslabel.py index ea0bbfbee..70ffff635 100644 --- a/lib/taurus/qt/qtgui/display/test/test_tauruslabel.py +++ b/lib/taurus/qt/qtgui/display/test/test_tauruslabel.py @@ -25,6 +25,7 @@ """Unit tests for Taurus Label""" +from builtins import str import unittest from taurus.external.qt import Qt from taurus.test import insertTest diff --git a/lib/taurus/qt/qtgui/editor/tauruseditor.py b/lib/taurus/qt/qtgui/editor/tauruseditor.py index bc472974b..3dadedaf8 100644 --- a/lib/taurus/qt/qtgui/editor/tauruseditor.py +++ b/lib/taurus/qt/qtgui/editor/tauruseditor.py @@ -25,6 +25,7 @@ """This module contains a taurus text editor widget.""" +from builtins import str __all__ = ["TaurusBaseEditor"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/curve.py b/lib/taurus/qt/qtgui/extra_guiqwt/curve.py index 8ddf2b927..e30c80c69 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/curve.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/curve.py @@ -26,6 +26,7 @@ """Extension of :mod:`guiqwt.curve`""" from __future__ import print_function +from builtins import next __all__ = ["TaurusCurveItem"] from taurus.external.qt import Qt diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py index deb30cd14..b3a4697ea 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py @@ -27,6 +27,11 @@ curvesmodel Model and view for new CurveItem configuration """ from __future__ import print_function +from builtins import map +from builtins import next +from builtins import str +from builtins import range +from builtins import object __all__ = ['TaurusCurveItemTableModel', 'CurveItemConf', 'CurveItemConfDlg'] #raise UnimplementedError('Under Construction!') @@ -43,7 +48,7 @@ from taurus.qt.qtgui.extra_guiqwt.styles import TaurusCurveParam import guiqwt -__guiqwt_version = map(int, guiqwt.__version__.split('.')[:3]) +__guiqwt_version = list(map(int, guiqwt.__version__.split('.')[:3])) if __guiqwt_version <= [2, 3, 1]: import taurus.external.qt.Qwt5 as qwt else: @@ -55,7 +60,7 @@ # set some named constants # columns: NUMCOLS = 3 -X, Y, TITLE = range(NUMCOLS) +X, Y, TITLE = list(range(NUMCOLS)) SRC_ROLE = Qt.Qt.UserRole + 1 diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py index c68e4cb43..77a3d6906 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py @@ -26,6 +26,9 @@ """ Extension of :mod:`guiqwt.plot` """ +from builtins import next +from builtins import str +from past.builtins import basestring __all__ = ["TaurusCurveDialog", "TaurusTrendDialog", "TaurusImageDialog"] import copy diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/scales.py b/lib/taurus/qt/qtgui/extra_guiqwt/scales.py index ab3216cd0..e0532299e 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/scales.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/scales.py @@ -27,6 +27,11 @@ scales.py: Custom scales used by taurus.qt.qtgui.plot module """ from __future__ import print_function +from __future__ import division +from builtins import map +from builtins import str +from builtins import range +from past.utils import old_div __all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", "FixedLabelsScaleDraw"] @@ -37,7 +42,7 @@ from taurus.external.qt import Qt import guiqwt -__guiqwt_version = map(int, guiqwt.__version__.split('.')[:3]) +__guiqwt_version = list(map(int, guiqwt.__version__.split('.')[:3])) if __guiqwt_version <= [2, 3, 1]: import taurus.external.qt.Qwt5 as qwt @@ -226,7 +231,7 @@ def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize): elif dx > 2: # 2s format = "%H:%M:%S" - majticks = range(int(x1) + 1, int(x2)) + majticks = list(range(int(x1) + 1, int(x2))) else: # less than 2s (show microseconds) scaleDiv = qwt.QwtLinearScaleEngine.divideScale( @@ -237,7 +242,7 @@ def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize): # make sure to comply with maxMajTicks L = len(majticks) if L > maxMajSteps: - majticks = majticks[::int(numpy.ceil(float(L) / maxMajSteps))] + majticks = majticks[::int(numpy.ceil(old_div(float(L), maxMajSteps)))] scaleDiv = qwt.QwtScaleDiv(interval, minticks, medticks, majticks) self.scaleDraw().setDatetimeLabelFormat(format) @@ -370,7 +375,7 @@ def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize): s = 86400 # 1 day # calculate a step size that respects the base step (s) and also # enforces the maxMajSteps - stepSize = s * int(numpy.ceil(float(d_range // s) / maxMajSteps)) + stepSize = s * int(numpy.ceil(old_div(float(d_range // s), maxMajSteps))) return qwt.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize) @staticmethod diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py b/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py index af5649057..03b7a85ae 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py @@ -26,6 +26,7 @@ """ taurustrend.py: Generic trend widget for Taurus """ +from builtins import str __all__ = ["TaurusTrend2DDialog"] from guiqwt.plot import ImageDialog diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/tools.py b/lib/taurus/qt/qtgui/extra_guiqwt/tools.py index 25920c4f4..a861c3dc2 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/tools.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/tools.py @@ -26,6 +26,7 @@ """Extension of :mod:`guiqwt.tools`""" +from builtins import zip __docformat__ = 'restructuredtext' import weakref @@ -173,7 +174,7 @@ def _getAxesUseTime(self, plot): def update_status(self, plot): active_scale = self._getAxesUseTime(plot) - for scale_type, scale_action in self.scale_menu.items(): + for scale_type, scale_action in list(self.scale_menu.items()): scale_action.setEnabled(True) if active_scale == scale_type: scale_action.setChecked(True) diff --git a/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py b/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py index 69e862afe..782a3e626 100644 --- a/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py +++ b/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py @@ -27,6 +27,7 @@ nexusWidget.py: """ +from builtins import str __all__ = ["TaurusNexusBrowser"] import numpy @@ -111,7 +112,7 @@ def __init__(self, *args, **kwargs): def openFile(self, fname=None): if fname is None: - fname = unicode(Qt.QFileDialog.getOpenFileName( + fname = str(Qt.QFileDialog.getOpenFileName( self, "Choose NeXus File", "/home/cpascual/local/tmp/scantest.h5")) # @TODO!! if fname: self.__nexusFile = self.__fileModel.openFile(fname) diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py index dfa2fef84..70734e162 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py @@ -26,6 +26,8 @@ """This module contains the graphics factory for the jdraw file format""" from __future__ import absolute_import +from builtins import str +from builtins import range __all__ = ["TaurusJDrawGraphicsFactory"] __docformat__ = 'restructuredtext' @@ -181,7 +183,7 @@ def getPolylineObj(self, params): polygon = Qt.QPolygonF() p = params.get('summit') - for i in xrange(0, len(p), 2): + for i in range(0, len(p), 2): polygon.append(Qt.QPointF(p[i], p[i + 1])) item.setPolygon(polygon) @@ -190,7 +192,7 @@ def getPolylineObj(self, params): def getSplineObj(self, params): item = self.getGraphicsItem('Spline', params) p = params.get('summit') - p = [Qt.QPointF(p[i], p[i + 1]) for i in xrange(0, len(p), 2)] + p = [Qt.QPointF(p[i], p[i + 1]) for i in range(0, len(p), 2)] item.setControlPoints(p) isClosed = params.get('isClosed', True) item.setClose(isClosed) @@ -213,8 +215,8 @@ def readLabelObj(self, item, params): # it is parsed as a float vAlignment = int(params.get('vAlignment', 0)) hAlignment = int(params.get('hAlignment', 0)) - assert(vAlignment in VALIGNMENT.keys()) - assert(hAlignment in ALIGNMENT.keys()) + assert(vAlignment in list(VALIGNMENT.keys())) + assert(hAlignment in list(ALIGNMENT.keys())) vAlignment = VALIGNMENT[vAlignment] hAlignment = ALIGNMENT[hAlignment] item.setAlignment(hAlignment | vAlignment) @@ -332,7 +334,7 @@ def set_common_params(self, item, params): params.get('extensions')["ignoreRepaint"] = "true" if self.alias: - for k, v in self.alias.items(): + for k, v in list(self.alias.items()): name = str(name).replace(k, v) # Forcing not-Taurus items to have a name and be able to trigger events diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py index 3611a48fe..eb6069b3c 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py @@ -27,6 +27,7 @@ from __future__ import absolute_import +from builtins import str __all__ = ["new_parser", "parse"] import os diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py index e7bc1792b..c00d97bb6 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py @@ -26,6 +26,8 @@ """This module contains the graphics view widget for jdraw files""" from __future__ import absolute_import +from builtins import str +from past.builtins import basestring __all__ = ["TaurusJDrawSynopticsView"] __docformat__ = 'restructuredtext' @@ -121,7 +123,7 @@ def update(self): self.emitColors() def openJDraw(self): - ifile = unicode(Qt.QFileDialog.getOpenFileName( + ifile = str(Qt.QFileDialog.getOpenFileName( self, 'Load JDraw File', '', 'JDraw File (*.jdw)')) if not ifile: return @@ -139,7 +141,7 @@ def setAlias(self, alias): return def get_item_list(self): - return [item._name for item in self.scene().items() if hasattr(item, '_name') and item._name] + return [item._name for item in list(self.scene().items()) if hasattr(item, '_name') and item._name] def get_device_list(self): items = [(item, parseTangoUri(item)) for item in self.get_item_list()] @@ -148,7 +150,7 @@ def get_device_list(self): def get_item_colors(self, emit=False): item_colors = {} try: - for item in self.scene().items(): + for item in list(self.scene().items()): if not getattr(item, '_name', '') or not getattr(item, '_currBgBrush', None): continue item_colors[item._name] = item._currBgBrush.color().name() @@ -421,7 +423,7 @@ def closeEvent(self, event=None): def setModels(self): """ This method triggers item.setModel(item._name) in all internal items. """ - for item in self.scene().items(): + for item in list(self.scene().items()): if item._name and isinstance(item, TaurusGraphicsItem): self.debug( 'TaurusJDrawGraphicsFactory.setModels(): calling item.setModel(%s)' % (item._name)) diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py index ec70f3861..a087f4f41 100755 --- a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py +++ b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py @@ -26,9 +26,17 @@ taurusgraphic.py: """ from __future__ import print_function +from __future__ import division # TODO: Tango-centric +from future import standard_library +standard_library.install_aliases() +from builtins import str +from builtins import range +from past.builtins import basestring +from builtins import object +from past.utils import old_div __all__ = ['SynopticSelectionStyle', 'parseTangoUri', 'QEmitter', # TODO: QEmitter should probably be removed (kept priv) @@ -64,7 +72,7 @@ import operator import types -import Queue +import queue from taurus import Manager from taurus.core import AttrQuality, DataType @@ -373,7 +381,7 @@ def getItemByName(self, item_name, strict=None): if not target.endswith('$'): target += '$' result = [] - for k in self._itemnames.keys(): + for k in list(self._itemnames.keys()): if re.match(target.lower(), k.lower()): #self.debug('getItemByName(%s): _itemnames[%s]: %s'%(target,k,self._itemnames[k])) result.extend(self._itemnames[k]) @@ -383,7 +391,7 @@ def getItemByPosition(self, x, y): """ This method will try first with named objects; if failed then with itemAt """ pos = Qt.QPointF(x, y) itemsAtPos = [] - for z, o in sorted((i.zValue(), i) for v in self._itemnames.values() for i in v if i.contains(pos) or i.isUnderMouse()): + for z, o in sorted((i.zValue(), i) for v in list(self._itemnames.values()) for i in v if i.contains(pos) or i.isUnderMouse()): if not hasattr(o, 'getExtensions'): self.debug( 'getItemByPosition(%d,%d): adding Qt primitive %s' % (x, y, o)) @@ -685,7 +693,7 @@ def getSelectionMark(self, picture=None, w=10, h=10): SelectionMark = picture SelectionMark.setRect(0, 0, w, h) SelectionMark.hide() - elif operator.isCallable(picture): + elif hasattr(picture, '__call__'): SelectionMark = picture() else: if isinstance(picture, Qt.QPixmap): @@ -734,8 +742,8 @@ def bound(coords, bounds=LIMITS): if w > MAX_CIRCLE_SIZE[0] or h > MAX_CIRCLE_SIZE[1]: # Applying correction if the file is too big, half max # circle size around the center - x, y = (x + w / 2.) - .5 * \ - MAX_CIRCLE_SIZE[0], (y + h / 2.) - .5 * \ + x, y = (x + old_div(w, 2.)) - .5 * \ + MAX_CIRCLE_SIZE[0], (y + old_div(h, 2.)) - .5 * \ MAX_CIRCLE_SIZE[1], w, h = [.5 * t for t in MAX_CIRCLE_SIZE] else: @@ -831,7 +839,7 @@ def getAllChildren(self, item, klass=None): def start(self): if self.updateThread: return - self.updateQueue = Queue.Queue() + self.updateQueue = queue.Queue() self.updateThread = TaurusGraphicsUpdateThread(self) self.updateThread.start() # Qt.QThread.HighPriority) @@ -985,7 +993,7 @@ def updateSplinePath(self): path.lineTo(cp[1]) else: path.moveTo(cp[0]) - for i in xrange(1, nb_points - 1, 3): + for i in range(1, nb_points - 1, 3): p1 = cp[i + 0] p2 = cp[i + 1] end = cp[i + 2] @@ -1438,7 +1446,7 @@ def paint(self, painter, option, widget): } -class TaurusBaseGraphicsFactory: +class TaurusBaseGraphicsFactory(object): def __init__(self): pass @@ -1506,7 +1514,7 @@ def getGraphicsClassItem(self, cls, type_): def getGraphicsItem(self, type_, params): name = params.get(self.getNameParam()) # applying alias - for k, v in getattr(self, 'alias', {}).items(): + for k, v in list(getattr(self, 'alias', {}).items()): if k in name: name = str(name).replace(k, v) params[self.getNameParam()] = name diff --git a/lib/taurus/qt/qtgui/help/assistant.py b/lib/taurus/qt/qtgui/help/assistant.py index dbcc055de..cb901aec4 100644 --- a/lib/taurus/qt/qtgui/help/assistant.py +++ b/lib/taurus/qt/qtgui/help/assistant.py @@ -39,13 +39,15 @@ app.exec_() """ +from builtins import str +from builtins import object __all__ = ["Assistant", "Widgets"] from taurus.external.qt import Qt -class Widgets: +class Widgets(object): contents = "contents" index = "index" bookmarks = "bookmarks" diff --git a/lib/taurus/qt/qtgui/icon/catalog.py b/lib/taurus/qt/qtgui/icon/catalog.py index b57e2c064..c97183977 100644 --- a/lib/taurus/qt/qtgui/icon/catalog.py +++ b/lib/taurus/qt/qtgui/icon/catalog.py @@ -78,7 +78,7 @@ def __build_catalog(self, prefix, columns=10): pixmaps = {} choices = [] row = [] - for md5, choice in hashes.items(): + for md5, choice in list(hashes.items()): try: pixmaps[choice] = pixmaps_hashed[md5] except KeyError: diff --git a/lib/taurus/qt/qtgui/icon/icon.py b/lib/taurus/qt/qtgui/icon/icon.py index 250676d8c..13896c24b 100644 --- a/lib/taurus/qt/qtgui/icon/icon.py +++ b/lib/taurus/qt/qtgui/icon/icon.py @@ -25,6 +25,7 @@ """This module provides taurus-specific functions related to icons""" +from builtins import range __all__ = [ 'sanitizePrefix', 'registerPathFiles', @@ -68,7 +69,7 @@ __3DQS = Qt.QSize(3 * __DW, __DH) # Indexes for the map below -__IDX_ELEM_TYPE_ICON, __IDX_ELEM_TYPE_SIZE, __IDX_ELEM_TYPE_TOOLTIP = range(3) +__IDX_ELEM_TYPE_ICON, __IDX_ELEM_TYPE_SIZE, __IDX_ELEM_TYPE_TOOLTIP = list(range(3)) # New default role map # Elements are: icon theme, preferred size, description/tooltip @@ -102,7 +103,7 @@ } # Indexes for the map below -__IDX_STATE_ICON, __IDX_STATE_TOOLTIP = range(2) +__IDX_STATE_ICON, __IDX_STATE_TOOLTIP = list(range(2)) _STATE_MAP = { TaurusDevState.Ready: ("status:available.svg", "Element ready"), diff --git a/lib/taurus/qt/qtgui/input/choicedlg.py b/lib/taurus/qt/qtgui/input/choicedlg.py index e07cd69a6..fc391d577 100644 --- a/lib/taurus/qt/qtgui/input/choicedlg.py +++ b/lib/taurus/qt/qtgui/input/choicedlg.py @@ -26,6 +26,7 @@ """This package provides a dialog for graphically choosing a Taurus class""" from __future__ import print_function +from builtins import str __all__ = ["GraphicalChoiceDlg", "GraphicalChoiceWidget"] __docformat__ = 'restructuredtext' @@ -196,7 +197,7 @@ def setChoice(self, row, col, text, pixmap=None, tooltip=None): def onClick(self): '''slot called when a button is clicked''' - self._chosen = unicode(self.sender().text()) + self._chosen = str(self.sender().text()) self.choiceMade.emit(self._chosen) def getChosen(self): diff --git a/lib/taurus/qt/qtgui/input/qwheel.py b/lib/taurus/qt/qtgui/input/qwheel.py index b71db84f8..3c32a9fe9 100755 --- a/lib/taurus/qt/qtgui/input/qwheel.py +++ b/lib/taurus/qt/qtgui/input/qwheel.py @@ -24,7 +24,11 @@ ############################################################################# """This module provides an arrow based widget.""" +from __future__ import division +from builtins import map +from builtins import range +from past.utils import old_div __all__ = ["QWheelEdit"] __docformat__ = 'restructuredtext' @@ -96,7 +100,7 @@ def getPixmap(self): class _DigitLabel(Qt.QLabel): """A private single digit label to be used by QWheelEdit widget""" - PixmapKeys = map(str, xrange(10)) + ['blank', 'minus', 'point'] + PixmapKeys = list(map(str, range(10))) + ['blank', 'minus', 'point'] def __init__(self, lbl, parent=None): Qt.QLabel.__init__(self, parent) @@ -223,7 +227,7 @@ def _getMinPossibleValue(self): @return (float) the minimum possible value """ decmax = 0 - for i in xrange(self.getDecDigitCount()): + for i in range(self.getDecDigitCount()): decmax += 9 * math.pow(10, -(i + 1)) return -math.pow(10.0, self.getIntDigitCount()) + 1 - decmax @@ -236,7 +240,7 @@ def _getMaxPossibleValue(self): @return (float) the maximum possible value """ decmax = 0 - for i in xrange(self.getDecDigitCount()): + for i in range(self.getDecDigitCount()): decmax += 9 * math.pow(10, -(i + 1)) return math.pow(10.0, self.getIntDigitCount()) - 1 + decmax @@ -270,7 +274,7 @@ def _build(self): l.setColumnMinimumWidth(0, _ArrowButton.ButtonSize) l.setColumnStretch(0, 1) - for i in xrange(id): + for i in range(id): col = i + 1 d = _DigitLabel('0') up = _UpArrowButton(id - i - 1) @@ -293,7 +297,7 @@ def _build(self): self._digitLabels.append(dotLabel) l.addWidget(dotLabel, 1, id + 1) - for i in xrange(id, digits): + for i in range(id, digits): col = i + 1 if showDot: col += 1 @@ -442,7 +446,7 @@ def _updateValue(self, trigValueChanged=True, trigValueEdited=True): if len(v_str) > len(self._digitLabels): # do auto adjust if '.' in v_str: - dc = map(len, v_str.split('.')) + dc = list(map(len, v_str.split('.'))) else: dc = len(v_str), 0 self._setDigits(*dc) @@ -767,8 +771,8 @@ def hideEditWidget(self): self.setFocus() def wheelEvent(self, evt): - numDegrees = evt.delta() / 8 - numSteps = numDegrees / 15 + numDegrees = old_div(evt.delta(), 8) + numSteps = old_div(numDegrees, 15) #w = Qt.QApplication.focusWidget() w = self.focusWidget() if not isinstance(w, _DigitLabel): diff --git a/lib/taurus/qt/qtgui/input/tauruscheckbox.py b/lib/taurus/qt/qtgui/input/tauruscheckbox.py index 923100c00..52777a9c2 100644 --- a/lib/taurus/qt/qtgui/input/tauruscheckbox.py +++ b/lib/taurus/qt/qtgui/input/tauruscheckbox.py @@ -25,6 +25,7 @@ """This module provides a set of basic taurus widgets based on QCheckBox""" +from builtins import str __all__ = ["TaurusValueCheckBox"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/input/tauruscombobox.py b/lib/taurus/qt/qtgui/input/tauruscombobox.py index 9baebcbca..9777af511 100644 --- a/lib/taurus/qt/qtgui/input/tauruscombobox.py +++ b/lib/taurus/qt/qtgui/input/tauruscombobox.py @@ -26,6 +26,7 @@ """This module provides a set of basic taurus widgets based on QCheckBox""" +from builtins import str __all__ = ["TaurusAttrListComboBox", "TaurusValueComboBox"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/input/tauruslineedit.py b/lib/taurus/qt/qtgui/input/tauruslineedit.py index ca5aad229..c4b63df37 100755 --- a/lib/taurus/qt/qtgui/input/tauruslineedit.py +++ b/lib/taurus/qt/qtgui/input/tauruslineedit.py @@ -26,7 +26,11 @@ """ This module provides a set of basic taurus widgets based on QLineEdit """ +from __future__ import division +from builtins import bytes +from builtins import str +from past.utils import old_div import sys import numpy from taurus.external.qt import Qt @@ -176,8 +180,8 @@ def wheelEvent(self, evt): return Qt.QLineEdit.wheelEvent(self, evt) evt.accept() - numDegrees = evt.delta() / 8 - numSteps = numDegrees / 15 + numDegrees = old_div(evt.delta(), 8) + numSteps = old_div(numDegrees, 15) self._stepBy(numSteps) def keyPressEvent(self, evt): diff --git a/lib/taurus/qt/qtgui/input/taurusspinbox.py b/lib/taurus/qt/qtgui/input/taurusspinbox.py index 9700ef46e..ab6c502c4 100644 --- a/lib/taurus/qt/qtgui/input/taurusspinbox.py +++ b/lib/taurus/qt/qtgui/input/taurusspinbox.py @@ -28,6 +28,7 @@ """ from __future__ import absolute_import +from builtins import str from taurus.external.qt import Qt from .tauruslineedit import TaurusValueLineEdit diff --git a/lib/taurus/qt/qtgui/model/qbasemodel.py b/lib/taurus/qt/qtgui/model/qbasemodel.py index 9b8c2da52..12a8cb114 100644 --- a/lib/taurus/qt/qtgui/model/qbasemodel.py +++ b/lib/taurus/qt/qtgui/model/qbasemodel.py @@ -236,7 +236,7 @@ def __init__(self, perspective, view=None, parent=None, designMode=False): menu = Qt.QMenu("Perspective", b) b.setMenu(menu) af = ActionFactory() - for persp, persp_data in view.KnownPerspectives.items(): + for persp, persp_data in list(view.KnownPerspectives.items()): label = persp_data["label"] icon = Qt.QIcon.fromTheme(persp_data["icon"]) tip = persp_data["tooltip"] diff --git a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py index 1f59b5612..fbb3c5b8f 100755 --- a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py +++ b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py @@ -27,6 +27,9 @@ one or more curves""" from __future__ import print_function +from builtins import zip +from builtins import str +from builtins import range __all__ = ["QDataExportDialog"] import os.path @@ -76,7 +79,7 @@ def setDataSets(self, datadict, sortedNames=None): self.datadict = datadict self.dataSetCB.clear() self.dataSetCB.insertItems(0, sortedNames) - if len(self.datadict.keys()) > 1: + if len(list(self.datadict.keys())) > 1: self.dataSetCB.insertItems( 0, [self.allInSingleFile, self.allInMultipleFiles]) @@ -152,7 +155,7 @@ def exportAllData(self, preffix=None): if not outputdir: return False preffix = os.path.join(str(outputdir), "set") - for i, k in zip(range(len(self.datadict)), self.sortedNames): + for i, k in zip(list(range(len(self.datadict))), self.sortedNames): ofile = "%s%03i.dat" % (preffix, i + 1) try: self.exportCurrentData( diff --git a/lib/taurus/qt/qtgui/panel/qdoublelist.py b/lib/taurus/qt/qtgui/panel/qdoublelist.py index 1f6c25cc9..87baa056f 100644 --- a/lib/taurus/qt/qtgui/panel/qdoublelist.py +++ b/lib/taurus/qt/qtgui/panel/qdoublelist.py @@ -30,6 +30,8 @@ """ from __future__ import print_function +from builtins import str +from builtins import range __all__ = ["QDoubleListDlg"] __docformat__ = 'restructuredtext' @@ -102,14 +104,14 @@ def getAll1(self): :return: (list) ''' - return [unicode(self.ui.list1.item(row).text()) for row in xrange(self.ui.list1.count())] + return [str(self.ui.list1.item(row).text()) for row in range(self.ui.list1.count())] def getAll2(self): '''returns a copy the items in the second list :return: (list) ''' - return [unicode(self.ui.list2.item(row).text()) for row in xrange(self.ui.list2.count())] + return [str(self.ui.list2.item(row).text()) for row in range(self.ui.list2.count())] # note, for the moment we do not make it available in designer because it does not # behave well as a widget (only as a dialog) (e.g., it closes if ESC is pressed diff --git a/lib/taurus/qt/qtgui/panel/qrawdatachooser.py b/lib/taurus/qt/qtgui/panel/qrawdatachooser.py index 90fe1fb50..0b970acc6 100644 --- a/lib/taurus/qt/qtgui/panel/qrawdatachooser.py +++ b/lib/taurus/qt/qtgui/panel/qrawdatachooser.py @@ -27,6 +27,7 @@ RawDataChooser.py: widget for importing RawData (from file or from a function) """ +from builtins import str __all__ = ["QRawDataWidget"] import numpy diff --git a/lib/taurus/qt/qtgui/panel/report/albareport.py b/lib/taurus/qt/qtgui/panel/report/albareport.py index 4490aacff..86857eeff 100644 --- a/lib/taurus/qt/qtgui/panel/report/albareport.py +++ b/lib/taurus/qt/qtgui/panel/report/albareport.py @@ -26,6 +26,7 @@ """This module provides a panel to display taurus messages""" from __future__ import absolute_import +from builtins import str __all__ = ["TicketReportHandler"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/panel/report/basicreport.py b/lib/taurus/qt/qtgui/panel/report/basicreport.py index 0bb51dc78..82fec5661 100644 --- a/lib/taurus/qt/qtgui/panel/report/basicreport.py +++ b/lib/taurus/qt/qtgui/panel/report/basicreport.py @@ -25,6 +25,7 @@ """This module provides a panel to display taurus messages""" +from builtins import str __all__ = ["ClipboardReportHandler", "SMTPReportHandler"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py index c01a680ed..127cc41c5 100644 --- a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py +++ b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py @@ -27,12 +27,15 @@ taurusconfigeditor.py: """ +from future import standard_library +standard_library.install_aliases() +from builtins import str __all__ = ["QConfigEditor"] __docformat__ = 'restructuredtext' from taurus.external.qt import Qt -import cPickle as pickle +import pickle as pickle import os import tempfile from taurus.qt.qtcore.configuration import BaseConfigurableClass @@ -77,9 +80,9 @@ def loadFile(self, iniFileName): :param iniFileName: (str) ''' - self.originalFile = unicode(iniFileName) + self.originalFile = str(iniFileName) self._file = tempfile.NamedTemporaryFile() - self._temporaryFile = unicode(self._file.name) + self._temporaryFile = str(self._file.name) shutil.copyfile(self.originalFile, self._temporaryFile) diff --git a/lib/taurus/qt/qtgui/panel/taurusconfigurationpanel.py b/lib/taurus/qt/qtgui/panel/taurusconfigurationpanel.py index 06c8226ba..01392457b 100755 --- a/lib/taurus/qt/qtgui/panel/taurusconfigurationpanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusconfigurationpanel.py @@ -25,6 +25,7 @@ """This module provides a set of basic taurus widgets based on QLineEdit""" +from builtins import str __all__ = ["TaurusConfigurationPanel", "TangoConfigLineEdit", "TaurusConfigLineEdit"] diff --git a/lib/taurus/qt/qtgui/panel/taurusdemo.py b/lib/taurus/qt/qtgui/panel/taurusdemo.py index dd7da5032..ea0f2583d 100644 --- a/lib/taurus/qt/qtgui/panel/taurusdemo.py +++ b/lib/taurus/qt/qtgui/panel/taurusdemo.py @@ -24,6 +24,7 @@ ############################################################################# from __future__ import print_function +from builtins import str import sys import operator @@ -55,12 +56,12 @@ def __init__(self, parent=None): continue internal_widget_module = sys.modules[internal_widget_module_name] if hasattr(internal_widget_module, "demo"): - if operator.isCallable(internal_widget_module.demo): + if hasattr(internal_widget_module.demo, '__call__'): demos[internal_widget_module_name] = internal_widget_module.demo groups = set() - for demo_name in demos.keys(): + for demo_name in list(demos.keys()): parts = demo_name.split(".") group = parts[-2] groups.add(group) diff --git a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py index bd19f7b76..07b2895c2 100644 --- a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py @@ -27,6 +27,8 @@ TaurusDevicePanel.py: """ +from builtins import str +from past.builtins import basestring __all__ = ["TaurusDevicePanel", "TaurusDevPanel"] __docformat__ = 'restructuredtext' @@ -72,10 +74,10 @@ def searchCl(m, k): # TODO: Tango-centric def get_regexp_dict(dct, key, default=None): # TODO: Tango-centric - for k, v in dct.items(): # Trying regular expression match + for k, v in list(dct.items()): # Trying regular expression match if matchCl(k, key): return v - for k, v in dct.items(): # If failed, trying if key is contained + for k, v in list(dct.items()): # If failed, trying if key is contained if k.lower() in key.lower(): return v if default is not None: @@ -323,7 +325,7 @@ def setModel(self, model, pixmap=None): font.setPointSize(15) self._label.setFont(font) if pixmap is None and self.getIconMap(): - for k, v in self.getIconMap().items(): + for k, v in list(self.getIconMap().items()): if searchCl(k, model): pixmap = v if pixmap is not None: @@ -348,7 +350,7 @@ def setModel(self, model, pixmap=None): filters = get_regexp_dict( TaurusDevicePanel._attribute_filter, model, ['.*']) if hasattr(filters, 'keys'): - filters = filters.items() # Dictionary! + filters = list(filters.items()) # Dictionary! if filters and isinstance(filters[0], (list, tuple)): # Mapping self._attrs = [] for tab, attrs in filters: @@ -466,7 +468,7 @@ def get_comms_form(self, device, form=None, parent=None): form.setViewFilters([lambda c: str(c.cmd_name).lower() not in ( 'state', 'status') and any(searchCl(s[0], str(c.cmd_name)) for s in params)]) form.setDefaultParameters(dict((k, v) for k, v in ( - params if not hasattr(params, 'items') else params.items()) if v)) + params if not hasattr(params, 'items') else list(params.items())) if v)) for wid in form._cmdWidgets: if not hasattr(wid, 'getCommand') or not hasattr(wid, 'setDangerMessage'): continue diff --git a/lib/taurus/qt/qtgui/panel/taurusform.py b/lib/taurus/qt/qtgui/panel/taurusform.py index 23a99ad48..b7b95da61 100644 --- a/lib/taurus/qt/qtgui/panel/taurusform.py +++ b/lib/taurus/qt/qtgui/panel/taurusform.py @@ -27,6 +27,10 @@ from __future__ import print_function from __future__ import absolute_import +from builtins import zip +from builtins import filter +from builtins import str +from past.builtins import basestring __all__ = ["TaurusAttrForm", "TaurusCommandsForm", "TaurusForm"] __docformat__ = 'restructuredtext' @@ -207,7 +211,7 @@ def chooseModels(self): if self.__modelChooserDlg is None: self.__modelChooserDlg = Qt.QDialog(self) self.__modelChooserDlg.setWindowTitle( - "%s - Model Chooser" % unicode(self.windowTitle())) + "%s - Model Chooser" % str(self.windowTitle())) self.__modelChooserDlg.modelChooser = TaurusModelChooser() layout = Qt.QVBoxLayout() layout.addWidget(self.__modelChooserDlg.modelChooser) @@ -653,7 +657,7 @@ def _updateCommandWidgets(self, *args): return for f in self.getViewFilters(): - commands = filter(f, commands) + commands = list(filter(f, commands)) self._clearFrame() @@ -739,7 +743,7 @@ def setDefaultParameters(self, params): ''' self._defaultParameters = dict((k.lower(), v) - for k, v in params.items()) + for k, v in list(params.items())) self._updateCommandWidgets() def setViewFilters(self, filterlist): @@ -838,7 +842,7 @@ def _updateAttrWidgets(self): return attrlist = sorted(dev.attribute_list_query(), key=self._sortKey) for f in self.getViewFilters(): - attrlist = filter(f, attrlist) + attrlist = list(filter(f, attrlist)) attrnames = [] devname = self.getModelName() for a in attrlist: diff --git a/lib/taurus/qt/qtgui/panel/taurusinputpanel.py b/lib/taurus/qt/qtgui/panel/taurusinputpanel.py index a82c0a9eb..9366ab062 100644 --- a/lib/taurus/qt/qtgui/panel/taurusinputpanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusinputpanel.py @@ -26,6 +26,9 @@ """This module provides an Input panel (usually used inside a TaurusDialog)""" from __future__ import print_function +from builtins import map +from builtins import str +from builtins import object __all__ = ["TaurusInputPanel"] __docformat__ = 'restructuredtext' @@ -121,7 +124,7 @@ def create_single_input_panel(self, input_data): self.setText(input_data['prompt']) data_type = input_data.get('data_type', 'String') - is_seq = not isinstance(data_type, (str, unicode)) and \ + is_seq = not isinstance(data_type, (str, str)) and \ isinstance(data_type, collections.Sequence) if is_seq: panel, getter = self.create_selection_panel(input_data) @@ -161,7 +164,7 @@ def _create_combobox_panel(self, input_data): self._ui.inputWidget = combobox = Qt.QComboBox() items = input_data['data_type'] for item in items: - is_seq = not isinstance(item, (str, unicode)) and \ + is_seq = not isinstance(item, (str, str)) and \ isinstance(item, collections.Sequence) if is_seq: text, userData = item @@ -183,7 +186,7 @@ def _create_radiobutton_panel(self, input_data): self._ui.inputWidget = buttongroup = Qt.QButtonGroup() buttongroup.setExclusive(True) for item in items: - is_seq = not isinstance(item, (str, unicode)) and \ + is_seq = not isinstance(item, (str, str)) and \ isinstance(item, collections.Sequence) if is_seq: text, userData = item @@ -210,7 +213,7 @@ def _create_multi_selection_panel(self, input_data): default_value = input_data.get('default_value') if default_value is None: default_value = () - dft_is_seq = not isinstance(default_value, (str, unicode)) and \ + dft_is_seq = not isinstance(default_value, (str, str)) and \ isinstance(default_value, collections.Sequence) if not dft_is_seq: default_value = default_value, @@ -219,7 +222,7 @@ def _create_multi_selection_panel(self, input_data): listwidget.setSelectionMode(Qt.QAbstractItemView.MultiSelection) for item in items: - is_seq = not isinstance(item, (str, unicode)) and \ + is_seq = not isinstance(item, (str, str)) and \ isinstance(item, collections.Sequence) if is_seq: text, userData = item diff --git a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py index c768e05f5..ad42ee1fd 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py @@ -25,6 +25,10 @@ """This module provides a panel to display taurus messages""" +from future import standard_library +standard_library.install_aliases() +from builtins import str +from builtins import object __all__ = ["TaurusMessagePanel", "TaurusMessageErrorHandler", "TangoMessageErrorHandler", "MacroServerMessageErrorHandler"] @@ -278,7 +282,7 @@ def __init__(self, err_type=None, err_value=None, err_traceback=None, parent=Non def _initReportCombo(self): report_handlers = get_report_handlers() combo = self.reportComboBox() - for name, report_handler in report_handlers.items(): + for name, report_handler in list(report_handlers.items()): name = Qt.QVariant(name) combo.addItem(report_handler.Label, name) @@ -504,7 +508,7 @@ def findErrorHandler(klass, err_type): :return: a message box error handler :rtype: TaurusMessageBoxErrorHandler class object""" - for exc, h_klass in klass.ErrorHandlers.items(): + for exc, h_klass in list(klass.ErrorHandlers.items()): if issubclass(err_type, exc): return h_klass return TaurusMessageErrorHandler @@ -589,8 +593,8 @@ def py_tg_serv_exc(): except PyTango.DevFailed as df1: try: import traceback - import StringIO - origin = StringIO.StringIO() + import io + origin = io.StringIO() traceback.print_stack(file=origin) origin.seek(0) origin = origin.read() diff --git a/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py b/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py index 4e04aa3b2..2ee172f50 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py +++ b/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py @@ -29,6 +29,7 @@ from __future__ import print_function from __future__ import absolute_import +from builtins import str __all__ = ["TaurusModelSelectorTree", "TaurusModelChooser"] import sys diff --git a/lib/taurus/qt/qtgui/panel/taurusmodellist.py b/lib/taurus/qt/qtgui/panel/taurusmodellist.py index b1369fbce..2c24f5210 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmodellist.py +++ b/lib/taurus/qt/qtgui/panel/taurusmodellist.py @@ -26,6 +26,10 @@ """ itemsmodel Model and view for new CurveItem configuration """ +from builtins import str +from builtins import range +from past.builtins import basestring +from builtins import object __all__ = ['TaurusModelModel', 'TaurusModelItem', 'TaurusModelList'] #raise UnimplementedError('Under Construction!') @@ -172,7 +176,7 @@ def setData(self, index, value=None, role=Qt.Qt.EditRole): if index.isValid() and (0 <= index.row() < self.rowCount()): row = index.row() item = self.items[row] - value = Qt.from_qvariant(value, unicode) + value = Qt.from_qvariant(value, str) if role == Qt.Qt.EditRole: item.src = value elif role == Qt.Qt.DisplayRole: @@ -188,7 +192,7 @@ def insertRows(self, position=None, rows=1, parentindex=None, items=None): if parentindex is None: parentindex = Qt.QModelIndex() if items is None: - slice = [TaurusModelItem() for i in xrange(rows)] + slice = [TaurusModelItem() for i in range(rows)] else: slice = list(items) # note that the rows parameter is ignored if items is passed @@ -424,7 +428,7 @@ def getModelList(self): .. seealso:: :meth:`getModelItems` ''' - return [unicode(s.src) for s in self.getModelItems()] + return [str(s.src) for s in self.getModelItems()] @classmethod def getQtDesignerPluginInfo(cls): diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py index a7da1e2ac..4f5c31dab 100644 --- a/lib/taurus/qt/qtgui/panel/taurusvalue.py +++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py @@ -27,6 +27,7 @@ taurusvalue.py: """ +from builtins import str __all__ = ["TaurusValue", "TaurusValuesFrame", "DefaultTaurusValueCheckBox", "DefaultUnitsWidget", "TaurusPlotButton", "TaurusArrayEditorButton", "TaurusValuesTableButton", "TaurusValuesTableButton_W", diff --git a/lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py b/lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py index 7ec66e6e1..6755955d7 100644 --- a/lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py +++ b/lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py @@ -25,6 +25,7 @@ """Test for taurus.qt.qtgui.panel.taurusvalue""" +from builtins import str import unittest from taurus.test import insertTest from taurus.qt.qtgui.test import BaseWidgetTestCase diff --git a/lib/taurus/qt/qtgui/plot/arrayedit.py b/lib/taurus/qt/qtgui/plot/arrayedit.py index 9d48d5e07..61fd3a7d7 100644 --- a/lib/taurus/qt/qtgui/plot/arrayedit.py +++ b/lib/taurus/qt/qtgui/plot/arrayedit.py @@ -27,8 +27,13 @@ arrayedit.py: Widget for editing a spectrum/array via control points """ from __future__ import absolute_import +from __future__ import division +from builtins import zip +from builtins import str +from builtins import range +from past.utils import old_div import numpy from taurus.external.qt import Qt, Qwt5 from taurus.qt.qtgui.util.ui import UILoadable @@ -266,7 +271,7 @@ def showEditCPointsDialog(self): new_xp = numpy.zeros(table.rowCount()) new_corrp = numpy.zeros(table.rowCount()) try: - for i in xrange(table.rowCount()): + for i in range(table.rowCount()): new_xp[i] = float(table.item(i, 0).text()) new_corrp[i] = float(table.item(i, 1).text()) self.setCorrection(new_xp, new_corrp) @@ -407,7 +412,7 @@ def onLScale(self, checked): Qt.QMessageBox.warning( self, 'Scaling Error', 'The master at this control point is zero-valued. This point cannot be used as reference for scaling') return - v = sender.corrSB.value() / (self.yp[index]) + v = old_div(sender.corrSB.value(), (self.yp[index])) for i in range(0, index): self._controllers[i].corrSB.setValue(v * self.yp[i]) @@ -420,7 +425,7 @@ def onRScale(self, checked): Qt.QMessageBox.warning( self, 'Scaling Error', 'The master at this control point is zero-valued. This point cannot be used as reference for scaling') return - v = sender.corrSB.value() / (self.yp[index]) + v = old_div(sender.corrSB.value(), (self.yp[index])) for i in range(index + 1, self.xp.size): self._controllers[i].corrSB.setValue(v * self.yp[i]) diff --git a/lib/taurus/qt/qtgui/plot/curveStatsDlg.py b/lib/taurus/qt/qtgui/plot/curveStatsDlg.py index 86d2a6bdc..4896382f6 100644 --- a/lib/taurus/qt/qtgui/plot/curveStatsDlg.py +++ b/lib/taurus/qt/qtgui/plot/curveStatsDlg.py @@ -28,7 +28,11 @@ A Qt dialog for choosing plot appearance (symbols and lines) for a QwtPlot-derived widget (like Taurusplot) """ +from __future__ import division +from builtins import zip +from builtins import range +from past.utils import old_div from taurus.external.qt import Qt, Qwt5 from datetime import datetime from taurus.qt.qtgui.util.ui import UILoadable @@ -68,7 +72,7 @@ def __init__(self, parent=None): cbs = (self.ui.npointsStatCB, self.ui.minStatCB, self.ui.maxStatCB, self.ui.meanStatCB, self.ui.stdStatCB, self.ui.rmsStatCB) - self._checkboxToColMap = dict(zip(cbs, xrange(len(self.statColumns)))) + self._checkboxToColMap = dict(list(zip(cbs, range(len(self.statColumns))))) self.minPicker = Qwt5.QwtPlotPicker(Qwt5.QwtPlot.xBottom, Qwt5.QwtPlot.yLeft, @@ -133,10 +137,10 @@ def __init__(self, parent=None): def _timestamptToQDateTime(self, ts): dt = datetime.fromtimestamp(ts) - return Qt.QDateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond / 1000) + return Qt.QDateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, old_div(dt.microsecond, 1000)) def _QDateTimeToTimestamp(self, qdt): - return qdt.toTime_t() + qdt.time().msec() / 1000. + return qdt.toTime_t() + old_div(qdt.time().msec(), 1000.) def onSelectMin(self): '''slot called when the user clicks on the selectMin button''' @@ -233,7 +237,7 @@ def getSelectedRows(self): '''returns a list of row numbers corresponding to the selected rows of the table''' selected = [] for rg in self.ui.statsTW.selectedRanges(): - for row in xrange(rg.topRow(), rg.topRow() + rg.rowCount()): + for row in range(rg.topRow(), rg.topRow() + rg.rowCount()): selected.append(row) return selected @@ -249,21 +253,21 @@ def onCalculate(self): xmin, xmax = None, None if self.ui.minCB.isChecked(): if plot.getXIsTime(): - xmin = self.ui.minDTE.dateTime().toTime_t() + self.ui.minDTE.time().msec() / \ - 1000. + xmin = self.ui.minDTE.dateTime().toTime_t() + old_div(self.ui.minDTE.time().msec(), \ + 1000.) else: xmin = self.ui.minSB.value() if self.ui.maxCB.isChecked(): if plot.getXIsTime(): - xmax = self.ui.maxDTE.dateTime().toTime_t() + self.ui.maxDTE.time().msec() / \ - 1000. + xmax = self.ui.maxDTE.dateTime().toTime_t() + old_div(self.ui.maxDTE.time().msec(), \ + 1000.) else: xmax = self.ui.maxSB.value() limits = xmin, xmax selectedRows = self.getSelectedRows() if len(selectedRows) == 0: - selectedRows = range(len(self.curveNames)) + selectedRows = list(range(len(self.curveNames))) selectedCurves = [self.curveNames[i] for i in selectedRows] statsdict = plot.getCurveStats( limits=limits, curveNames=selectedCurves) diff --git a/lib/taurus/qt/qtgui/plot/curveprops.py b/lib/taurus/qt/qtgui/plot/curveprops.py index 253ea1fe9..59c4f3359 100755 --- a/lib/taurus/qt/qtgui/plot/curveprops.py +++ b/lib/taurus/qt/qtgui/plot/curveprops.py @@ -27,6 +27,9 @@ curveprops: Model and view for curve properties """ from __future__ import absolute_import +from builtins import str +from builtins import range +from builtins import object __all__ = ['CurveConf', 'CurvesTableModel', 'ExtendedSelectionModel', 'CurvePropertiesView'] #raise NotImplementedError('Under Construction!') @@ -50,7 +53,7 @@ # set some named constants # columns: NUMCOLS = 4 -X, Y, TITLE, VIS = range(NUMCOLS) +X, Y, TITLE, VIS = list(range(NUMCOLS)) SRC_ROLE = Qt.Qt.UserRole + 1 PROPS_ROLE = Qt.Qt.UserRole + 2 @@ -74,7 +77,7 @@ def setSrc(self, src): def processSrc(self, src): '''returns src,display,icon,ok''' - src = unicode(src) + src = str(src) # empty if src == '': return '', '', Qt.QIcon(), True @@ -243,7 +246,7 @@ def setData(self, index, value=None, role=Qt.Qt.EditRole): row, 0), self.index(row, self.ncolumns - 1)) else: column = index.column() - value = Qt.from_qvariant(value, unicode) + value = Qt.from_qvariant(value, str) if column == X: curve.x.setSrc(value) elif column == Y: @@ -357,8 +360,8 @@ def __init__(self, parent=None, designMode=False): self.loadUi() self.ui.sStyleCB.insertItems(0, sorted(NamedSymbolStyles.values())) - self.ui.lStyleCB.insertItems(0, NamedLineStyles.values()) - self.ui.cStyleCB.insertItems(0, NamedCurveStyles.values()) + self.ui.lStyleCB.insertItems(0, list(NamedLineStyles.values())) + self.ui.cStyleCB.insertItems(0, list(NamedCurveStyles.values())) self.ui.sColorCB.addItem("") self.ui.lColorCB.addItem("") for color in NamedColors: diff --git a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py index 0abb8f4ca..acb93654c 100644 --- a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py +++ b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py @@ -30,6 +30,8 @@ """ from __future__ import print_function +from builtins import str +from builtins import object import copy from taurus.external.qt import Qt, Qwt5 @@ -46,7 +48,7 @@ Qt.Qt.DashDotDotLine: ".._..", } ReverseNamedLineStyles = {} -for k, v in NamedLineStyles.iteritems(): +for k, v in NamedLineStyles.items(): ReverseNamedLineStyles[v] = k NamedCurveStyles = {None: "", @@ -57,7 +59,7 @@ Qwt5.QwtPlotCurve.Dots: "Dots" } ReverseNamedCurveStyles = {} -for k, v in NamedCurveStyles.iteritems(): +for k, v in NamedCurveStyles.items(): ReverseNamedCurveStyles[v] = k NamedSymbolStyles = { @@ -81,7 +83,7 @@ } ReverseNamedSymbolStyles = {} -for k, v in NamedSymbolStyles.iteritems(): +for k, v in NamedSymbolStyles.items(): ReverseNamedSymbolStyles[v] = k NamedColors = ["Black", "Red", "Blue", "Magenta", @@ -113,8 +115,8 @@ def __init__(self, parent=None, curvePropDict={}, showButtons=False, autoApply=F self.loadUi() self.autoApply = autoApply self.sStyleCB.insertItems(0, sorted(NamedSymbolStyles.values())) - self.lStyleCB.insertItems(0, NamedLineStyles.values()) - self.cStyleCB.insertItems(0, NamedCurveStyles.values()) + self.lStyleCB.insertItems(0, list(NamedLineStyles.values())) + self.cStyleCB.insertItems(0, list(NamedCurveStyles.values())) self.sColorCB.addItem("") self.lColorCB.addItem("") if not showButtons: @@ -164,7 +166,7 @@ def setCurves(self, curvePropDict): self._curvePropDictOrig = copy.deepcopy(curvePropDict) self.curvesLW.clear() self.__itemsDict = CaselessDict() - for name, prop in self.curvePropDict.iteritems(): + for name, prop in self.curvePropDict.items(): # create and insert the item item = Qt.QListWidgetItem(Qt.QString(prop.title), self.curvesLW) self.__itemsDict[name] = item @@ -192,7 +194,7 @@ def updateTitles(self, newTitlesDict=None): ''' if newTitlesDict is None: return - for name, title in newTitlesDict.iteritems(): + for name, title in newTitlesDict.items(): self.curvePropDict[name].title = title self.__itemsDict[name].setText(title) diff --git a/lib/taurus/qt/qtgui/plot/qwtdialog.py b/lib/taurus/qt/qtgui/plot/qwtdialog.py index e58be927f..4c39e7b60 100644 --- a/lib/taurus/qt/qtgui/plot/qwtdialog.py +++ b/lib/taurus/qt/qtgui/plot/qwtdialog.py @@ -28,7 +28,11 @@ """ from __future__ import print_function from __future__ import absolute_import +from __future__ import division +from builtins import str +from builtins import range +from past.utils import old_div __all__ = ["TaurusPlotConfigDialog"] import time @@ -251,11 +255,11 @@ def deltatime2str(self, dt, fuzzy=False): elif dt < 120: return "%g s" % round(dt, 0) elif dt < 7200: - return "%g m" % round(dt / 60, 0) + return "%g m" % round(old_div(dt, 60), 0) elif dt < 172800: - return "%g h" % round(dt / 3600, 0) + return "%g h" % round(old_div(dt, 3600), 0) else: - return "%g d" % round(dt / 86400, 0) + return "%g d" % round(old_div(dt, 86400), 0) def str2deltatime(self, strtime): '''Translates a time string to seconds @@ -267,7 +271,7 @@ def str2deltatime(self, strtime): 24, 'w': 3600 * 24 * 7, 'y': 3600 * 24 * 365} if strtime.lower() == "now": return time.time() - if strtime[-1] in timeunits.keys(): + if strtime[-1] in list(timeunits.keys()): try: return float(strtime[:-1]) * timeunits[strtime[-1]] except Exception as e: diff --git a/lib/taurus/qt/qtgui/plot/scales.py b/lib/taurus/qt/qtgui/plot/scales.py index 6d7460ea9..dd8ae0efb 100644 --- a/lib/taurus/qt/qtgui/plot/scales.py +++ b/lib/taurus/qt/qtgui/plot/scales.py @@ -27,6 +27,10 @@ scales.py: Custom scales used by taurus.qt.qtgui.plot module """ from __future__ import print_function +from __future__ import division +from builtins import str +from builtins import range +from past.utils import old_div __all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", "FixedLabelsScaleDraw"] @@ -218,7 +222,7 @@ def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize): elif dx > 2: # 2s format = "%H:%M:%S" - majticks = range(int(x1) + 1, int(x2)) + majticks = list(range(int(x1) + 1, int(x2))) else: # less than 2s (show microseconds) scaleDiv = Qwt5.QwtLinearScaleEngine.divideScale( @@ -229,7 +233,7 @@ def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize): # make sure to comply with maxMajTicks L = len(majticks) if L > maxMajSteps: - majticks = majticks[::int(numpy.ceil(float(L) / maxMajSteps))] + majticks = majticks[::int(numpy.ceil(old_div(float(L), maxMajSteps)))] scaleDiv = Qwt5.QwtScaleDiv(interval, minticks, medticks, majticks) self.scaleDraw().setDatetimeLabelFormat(format) @@ -362,7 +366,7 @@ def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize): s = 86400 # 1 day # calculate a step size that respects the base step (s) and also # enforces the maxMajSteps - stepSize = s * int(numpy.ceil(float(d_range // s) / maxMajSteps)) + stepSize = s * int(numpy.ceil(old_div(float(d_range // s), maxMajSteps))) return Qwt5.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize) @staticmethod diff --git a/lib/taurus/qt/qtgui/plot/taurusarrayedit.py b/lib/taurus/qt/qtgui/plot/taurusarrayedit.py index a42db4d51..f82b7b25b 100644 --- a/lib/taurus/qt/qtgui/plot/taurusarrayedit.py +++ b/lib/taurus/qt/qtgui/plot/taurusarrayedit.py @@ -25,6 +25,7 @@ from __future__ import absolute_import +from builtins import str from taurus.external.qt import Qt import taurus import numpy diff --git a/lib/taurus/qt/qtgui/plot/taurusplot.py b/lib/taurus/qt/qtgui/plot/taurusplot.py index 74b6a42e2..dcf4ea970 100644 --- a/lib/taurus/qt/qtgui/plot/taurusplot.py +++ b/lib/taurus/qt/qtgui/plot/taurusplot.py @@ -28,6 +28,16 @@ """ from __future__ import print_function from __future__ import absolute_import +from __future__ import division +from future import standard_library +standard_library.install_aliases() +from builtins import zip +from builtins import next +from builtins import str +from builtins import range +from past.builtins import basestring +from past.utils import old_div +from builtins import object __all__ = ["TaurusCurve", "TaurusCurveMarker", "TaurusXValues", "TaurusPlot", "isodatestr2float"] @@ -144,9 +154,9 @@ def alignLabel(self): ''' xmap = self.plot().canvasMap(self.xAxis()) ymap = self.plot().canvasMap(self.yAxis()) - xmiddlepoint = xmap.p1() + xmap.pDist() / 2 # p1,p2 are left,right here + xmiddlepoint = xmap.p1() + old_div(xmap.pDist(), 2) # p1,p2 are left,right here # p1,p2 are bottom,top here (and pixel coords start from top!) - ymiddlepoint = ymap.p2() + ymap.pDist() / 2 + ymiddlepoint = ymap.p2() + old_div(ymap.pDist(), 2) xPaintPos = xmap.transform(self.xValue()) yPaintPos = ymap.transform(self.yValue()) @@ -912,8 +922,8 @@ def getStats(self, limits=None, inclusive=(True, True), imin=None, imax=None, ig if imax is None: imax = data.size() - x = numpy.array([data.x(i) for i in xrange(imin, imax)]) - y = numpy.array([data.y(i) for i in xrange(imin, imax)]) + x = numpy.array([data.x(i) for i in range(imin, imax)]) + y = numpy.array([data.y(i) for i in range(imin, imax)]) if limits is not None: xmin, xmax = limits @@ -1278,7 +1288,7 @@ def __initActions(self): def setFormat(self, format): """Reimplemented from TaurusBaseComponent""" - targetCurveNames = self.curves.iterkeys() + targetCurveNames = iter(self.curves.keys()) for name in targetCurveNames: curve = self.curves.get(name, None) w = getattr(curve, 'owner', curve) @@ -1345,7 +1355,7 @@ def getCurveTitle(self, curvename): if curve is None: title = None else: - title = unicode(curve.title().text()) + title = str(curve.title().text()) finally: self.curves_lock.release() return title @@ -1360,7 +1370,7 @@ def getCurveNames(self): ''' self.curves_lock.acquire() try: - ret = copy.deepcopy(self.curves.keys()) + ret = copy.deepcopy(list(self.curves.keys())) finally: self.curves_lock.release() return ret @@ -1395,7 +1405,7 @@ def sortCurves(self, ordered=None): try: if ordered is None: orderedObjs = sorted( - self.curves.values(), key=lambda curve: curve.titleText(compiled=True)) + list(self.curves.values()), key=lambda curve: curve.titleText(compiled=True)) else: #current = self.curves.keys() # if len(ordered) != len(current) or set(map(str.lower,current)) - set(map(str.lower, ordered)): @@ -1430,7 +1440,7 @@ def toggleZoomer(self, axis=None): for z in (self._zoomer1, self._zoomer2): z.setEnabled(z.yAxis() == axis) self._zoomer = self.getZoomers(axis)[0] - self.debug('Now Zooming on %s' % unicode(self.getAxisName(axis))) + self.debug('Now Zooming on %s' % str(self.getAxisName(axis))) return self._zoomer.yAxis() def getAxisName(self, axis): @@ -1441,7 +1451,7 @@ def getAxisName(self, axis): :return: (unicode) ''' - name = unicode(self.axisTitle(axis).text()) + name = str(self.axisTitle(axis).text()) if name == '': name = self._axesnames[axis] return name @@ -1451,7 +1461,7 @@ def setPaused(self, paused=True): :param paused: (bool) if True, the plot will be paused ''' - for c in self.curves.itervalues(): + for c in self.curves.values(): c.setPaused(paused) self._isPaused = paused @@ -1524,7 +1534,7 @@ def setAxisCustomLabels(self, axis, pos_and_labels, rotation=0, alignment=None): If None given, it will be autocalculated ''' - positions, labels = zip(*pos_and_labels) # "unzipping" + positions, labels = list(zip(*pos_and_labels)) # "unzipping" positions = list(positions) self.setAxisScaleEngine(axis, FixedLabelsScaleEngine(positions)) @@ -1662,7 +1672,7 @@ def showMaxPeaks(self, show): self.curves_lock.acquire() try: self._showMaxPeaks = show - for curveName in self.curves.iterkeys(): + for curveName in self.curves.keys(): curve = self.curves.get(str(curveName)) if show: curve.showMaxPeak(True) @@ -1683,7 +1693,7 @@ def showMinPeaks(self, show): self.curves_lock.acquire() try: self._showMinPeaks = show - for curveName in self.curves.iterkeys(): + for curveName in self.curves.keys(): curve = self.curves.get(str(curveName)) if show: curve.showMinPeak(True) @@ -1749,7 +1759,7 @@ def toggleCurveState(self, curve): try: # get the key in the self.curves directory curveName = None - for curveName, c in self.curves.iteritems(): + for curveName, c in self.curves.items(): if c is curve: break axis = curve.yAxis() @@ -1930,7 +1940,7 @@ def clearAllRawData(self): """ self.curves_lock.acquire() try: - names = [name for name in self.curves.keys() if self.curves[ + names = [name for name in list(self.curves.keys()) if self.curves[ name].isRawData] finally: self.curves_lock.release() @@ -1951,8 +1961,8 @@ def getCurveData(self, curvename, numpy=False): try: if curvename in self.curves: data = self.curves[curvename].data() - x = [data.x(i) for i in xrange(data.size())] - y = [data.y(i) for i in xrange(data.size())] + x = [data.x(i) for i in range(data.size())] + y = [data.y(i) for i in range(data.size())] else: self.error("Curve '%s' not found" % curvename) raise KeyError() @@ -1988,7 +1998,7 @@ def updateCurves(self, names): xnames.append(xname) ynames.append(yname) - del_curves = [name for name in self.curves.keys() + del_curves = [name for name in list(self.curves.keys()) if name not in ynames] # if all curves were removed, reset the color palette @@ -2101,7 +2111,7 @@ def parentModelChanged(self, parentmodel_name): '''See :meth:`TaurusBaseComponent.parentModelChanged`''' self.curves_lock.acquire() try: - for curve in self.curves.values(): + for curve in list(self.curves.values()): curve.setModelCheck(curve.getModel(), False) finally: self.curves_lock.release() @@ -2260,7 +2270,7 @@ def getCurveAppearancePropertiesDict(self): self.curves_lock.acquire() try: propdict = {} - for name, curve in self.curves.iteritems(): + for name, curve in self.curves.items(): propdict[name] = copy.deepcopy(curve.getAppearanceProperties()) finally: self.curves_lock.release() @@ -2278,7 +2288,7 @@ def setCurveAppearanceProperties(self, propDict): """ self.curves_lock.acquire() try: - for name, prop in propDict.iteritems(): + for name, prop in propDict.items(): c = self.curves[name] c.setAppearanceProperties(copy.deepcopy(prop)) visible = getattr(prop, 'visible', True) @@ -2327,7 +2337,7 @@ def _createMiscDict(self): miscdict = {'defaultCurvesTitle': self.getDefaultCurvesTitle(), 'canvasBackground': self.canvasBackground(), 'orderedCurveNames': self.getCurveNamesSorted(), - 'plotTitle': unicode(self.title().text()), + 'plotTitle': str(self.title().text()), 'formatter': self.getFormat()} if self.isWindow(): miscdict["Geometry"] = self.saveGeometry() @@ -2397,7 +2407,7 @@ def createConfig(self, allowUnpickable=False, curvenames=None, **kwargs): self.curves_lock.acquire() try: if curvenames is None: - curvenames = self.curves.keys() + curvenames = list(self.curves.keys()) curvenames = self._lowerIfInsensitive(curvenames) for name in curvenames: curve = self.curves.get(name) @@ -2429,11 +2439,11 @@ def applyConfig(self, configdict, **kwargs): if not self.checkConfigVersion(configdict): return # attach the curves - for rd in configdict["RawData"].values(): + for rd in list(configdict["RawData"].values()): self.attachRawData(rd) # for backwards compatibility, if the ordered list of models is not # stored, it uses the unsorted dict values - models = configdict.get("model", configdict["TangoCurves"].values()) + models = configdict.get("model", list(configdict["TangoCurves"].values())) self.addModels(models) # set curve properties self.setCurveAppearanceProperties(configdict["CurveProp"]) @@ -2486,7 +2496,7 @@ def saveConfig(self, ofile=None, curvenames=None): :return: (str) file name used """ - import cPickle as pickle + import pickle as pickle if ofile is None: ofile = str(Qt.QFileDialog.getSaveFileName(self, 'Save Taurusplot Configuration', 'TaurusplotConfig.pck', 'TaurusPlot Curve Properties File (*.pck)')) @@ -2506,7 +2516,7 @@ def loadConfig(self, ifile=None): :return: (str) file name used """ - import cPickle as pickle + import pickle as pickle if ifile is None: ifile = str(Qt.QFileDialog.getOpenFileName( self, 'Load Taurusplot Configuration', '', 'TaurusPlot Curve Properties File (*.pck)')) @@ -2523,7 +2533,7 @@ def setEventFilters(self, filters=None, curvenames=None, preqt=False): See :meth:`TaurusBaseComponent.setEventFilters` ''' if curvenames is None: - curvenames = self.curves.keys() + curvenames = list(self.curves.keys()) self.curves_lock.acquire() try: for name in curvenames: @@ -2551,7 +2561,7 @@ def autoScaleAllAxes(self): originalXRange = self.getXAxisRange() self.curves_lock.acquire() try: - for c in self.curves.values(): + for c in list(self.curves.values()): if c.minXValue() < minX: minX = c.minXValue() if c.maxXValue() > maxX: @@ -2670,7 +2680,7 @@ def __updateCurvesData(self): '''call safeSetData again on all curves to force a refiltering in case the scale changed its type''' self.curves_lock.acquire() try: - for c in self.curves.itervalues(): + for c in self.curves.values(): c.safeSetData() finally: self.curves_lock.release() @@ -2801,7 +2811,7 @@ def importAscii(self, filenames=None, xcol=None, **kwargs): else: rawdata["x"] = M[:, xcol] - for col in xrange(M.shape[1]): + for col in range(M.shape[1]): if col == xcol: continue # ignore the xcol (it has already been set) rawdata["y"] = M[:, col] @@ -2926,7 +2936,7 @@ def autoShowYAxes(self): try: # get a list of *unique* axes with visible curves attached axes = list( - set([curve.yAxis() for curve in self.curves.itervalues() if curve.isVisible()])) + set([curve.yAxis() for curve in self.curves.values() if curve.isVisible()])) n = len(axes) if n == 0: @@ -2985,7 +2995,7 @@ def pickDataPoint(self, pos, scope=20, showMarker=True, targetCurveNames=None): self.curves_lock.acquire() try: if targetCurveNames is None: - targetCurveNames = self.curves.iterkeys() + targetCurveNames = iter(self.curves.keys()) for name in targetCurveNames: curve = self.curves.get(name, None) if curve is None: @@ -2993,7 +3003,7 @@ def pickDataPoint(self, pos, scope=20, showMarker=True, targetCurveNames=None): if not curve.isVisible(): continue data = curve.data() - for i in xrange(data.size()): + for i in range(data.size()): point = Qt.QPoint(self.transform(curve.xAxis(), data.x( i)), self.transform(curve.yAxis(), data.y(i))) if scopeRect.contains(point): @@ -3186,7 +3196,7 @@ def getCurveStats(self, limits=None, curveNames=None): for name in curveNames: curve = self.curves.get(name, None) stats[name] = curve.getStats(limits=limits) - stats[name]['title'] = unicode(curve.title().text()) + stats[name]['title'] = str(curve.title().text()) finally: self.curves_lock.release() return stats @@ -3359,7 +3369,7 @@ def setUseParentModel(self, yesno): self.curves_lock.acquire() try: - for curve in self.curves.values(): + for curve in list(self.curves.values()): curve.setUseParentModel(yesno) finally: self.curves_lock.release() @@ -3459,7 +3469,7 @@ def setCurvesTitle(self, titletext, curveNamesList=None): try: if curveNamesList is None: curveNamesList = [ - n for n, c in self.curves.iteritems() if not c.isRawData] + n for n, c in self.curves.items() if not c.isRawData] newTitlesDict = CaselessDict() for curveName in curveNamesList: curve = self.curves.get(curveName) @@ -3626,7 +3636,7 @@ def setOptimizationEnabled(self, enable): self._optimizationEnabled = enable # make sure that already-created curves are also optimized try: - for curveName in self.curves.iterkeys(): + for curveName in self.curves.keys(): curve = self.curves.get(str(curveName)) curve.setPaintAttribute(curve.PaintFiltered, enable) curve.setPaintAttribute(curve.ClipPolygons, enable) @@ -3728,7 +3738,7 @@ def main(): w.setModel(models) if options.export_file is not None: - curves = dict.fromkeys(w.trendSets.keys(), 0) + curves = dict.fromkeys(list(w.trendSets.keys()), 0) def exportIfAllCurves(curve, trend=w, counters=curves): curve = str(curve) @@ -3743,7 +3753,7 @@ def exportIfAllCurves(curve, trend=w, counters=curves): if not curves: w.close() else: - for ts in w.trendSets.values(): + for ts in list(w.trendSets.values()): ts.dataChanged.connect(exportIfAllCurves) sys.exit(app.exec_()) # exit without showing the widget diff --git a/lib/taurus/qt/qtgui/plot/taurustrend.py b/lib/taurus/qt/qtgui/plot/taurustrend.py index cefd98789..4766c00e1 100644 --- a/lib/taurus/qt/qtgui/plot/taurustrend.py +++ b/lib/taurus/qt/qtgui/plot/taurustrend.py @@ -27,6 +27,11 @@ taurustrend.py: Generic trend widget for Taurus """ from __future__ import print_function +from __future__ import division +from builtins import zip +from builtins import str +from builtins import range +from past.utils import old_div __all__ = ["ScanTrendsSet", "TaurusTrend", "TaurusTrendsSet"] from datetime import datetime @@ -113,7 +118,7 @@ def __init__(self, name, parent=None, curves=None): self._orderedCurveNames = [] else: self._curves = curves - self._orderedCurveNames = curves.keys() + self._orderedCurveNames = list(curves.keys()) self._titleText = None self.setModel(name) @@ -184,7 +189,7 @@ def compileTitles(self, basetitle): ntrends = len(self._curves) if '' in basetitle: ret = [basetitle.replace('', "%i" % i) - for i in xrange(ntrends)] + for i in range(ntrends)] else: ret = [basetitle] * ntrends return ret @@ -472,7 +477,7 @@ def _checkDataDimensions(self, value): # them to the TrendSet name = self.getModelName() rawdata = {'x': numpy.zeros(0), 'y': numpy.zeros(0)} - for i in xrange(ntrends): + for i in range(ntrends): subname = "%s[%i]" % (name, i) self.parent().attachRawData(rawdata, id=subname) self.addCurve(subname, self.parent().curves[subname]) @@ -830,7 +835,7 @@ def _scanLineReceived(self, recordData): # if autoclear is False we have to work directly with each curve (and # cannot buffer) else: - for n, v in recordData.items(): + for n, v in list(recordData.items()): c = self._curves.get(n, None) if c is None: continue @@ -1124,7 +1129,7 @@ def clearBuffers(self): not remove the models, it simply removes all stored data)''' self.curves_lock.acquire() try: - for ts in self.trendSets.itervalues(): + for ts in self.trendSets.values(): ts.clearTrends(replot=False) finally: self.curves_lock.release() @@ -1158,7 +1163,7 @@ def updateCurves(self, names): try: # For it to work properly, 'names' must be a CaselessList, just as # self.trendSets is a CaselessDict - del_sets = [name for name in self.trendSets.keys() + del_sets = [name for name in list(self.trendSets.keys()) if name not in names] # if all trends were removed, reset the color palette @@ -1276,7 +1281,7 @@ def getCurveTitle(self, name, index=None): index = 0 else: return tset.compiledTitle - title = unicode(tset[index].title().text()) + title = str(tset[index].title().text()) finally: self.curves_lock.release() return title @@ -1325,7 +1330,7 @@ def changeCurvesTitlesDialog(self, curveNamesList=None): newTitlesDict = CaselessDict() for curveName in curveNamesList: curvetitle = titletext - for ts in self.trendSets.itervalues(): + for ts in self.trendSets.values(): if curveName in ts: curvetitle = ts.compileBaseTitle(curvetitle) curvetitle = curvetitle.replace( @@ -1426,7 +1431,7 @@ def rescheduleReplot(self, axis=Qwt5.QwtPlot.xBottom, width=1080): # calling setInterval only when really needed. self._replotTimer.setInterval(plot_refresh) self.debug('New replot period is %1.2f seconds', - (plot_refresh / 1000.)) + (old_div(plot_refresh, 1000.))) else: self.warning( @@ -1437,7 +1442,7 @@ def setPaused(self, paused=True): .. seealso:: :meth:`TaurusBaseComponent.setPaused` ''' - for ts in self.trendSets.itervalues(): + for ts in self.trendSets.values(): ts.setPaused(paused) self._isPaused = paused @@ -1475,7 +1480,7 @@ def createConfig(self, tsnames=None, **kwargs): miscdict["MaxBufferSize"] = self.getMaxDataBufferSize() self.curves_lock.acquire() try: - for tsname, ts in self.trendSets.iteritems(): + for tsname, ts in self.trendSets.items(): if tsname in tsnames: # store a dict containing just model names (key and value # are the same) @@ -1506,11 +1511,11 @@ def applyConfig(self, configdict, **kwargs): if maxBufferSize is not None: self.setMaxDataBufferSize(maxBufferSize) # attach the curves - for rd in configdict["RawData"].values(): + for rd in list(configdict["RawData"].values()): self.attachRawData(rd) # for backwards compatibility, if the ordered list of models is not # stored, it uses the unsorted dict values - models = configdict.get("model", configdict["TrendSets"].values()) + models = configdict.get("model", list(configdict["TrendSets"].values())) self.addModels(models) for m in models: tset = self.trendSets[m] @@ -1686,7 +1691,7 @@ def setMaxDataBufferSize(self, maxSize=None): self.curves_lock.acquire() try: - for n, ts in self.trendSets.iteritems(): + for n, ts in self.trendSets.items(): try: ts.setMaxDataBufferSize(maxSize) except ValueError: @@ -1923,7 +1928,7 @@ def main(): w.setModel(models) # export option if options.export_file is not None: - curves = dict.fromkeys(w.trendSets.keys(), 0) + curves = dict.fromkeys(list(w.trendSets.keys()), 0) def exportIfAllCurves(curve, trend=w, counters=curves): curve = str(curve) @@ -1938,7 +1943,7 @@ def exportIfAllCurves(curve, trend=w, counters=curves): if not curves: w.close() else: - for ts in w.trendSets.values(): + for ts in list(w.trendSets.values()): ts.dataChanged.connect(exportIfAllCurves) sys.exit(app.exec_()) # exit without showing the widget diff --git a/lib/taurus/qt/qtgui/table/qdictionary.py b/lib/taurus/qt/qtgui/table/qdictionary.py index 91c94b55d..2f18f40c8 100644 --- a/lib/taurus/qt/qtgui/table/qdictionary.py +++ b/lib/taurus/qt/qtgui/table/qdictionary.py @@ -26,6 +26,9 @@ """This module provides basic python dictionary/list editor widgets""" from __future__ import print_function +from builtins import str +from builtins import range +from past.builtins import basestring __all__ = ["QDictionaryEditor", "QListEditor"] __docformat__ = 'restructuredtext' @@ -87,8 +90,8 @@ def dict2array(dct): def expand(d, level): # ,nrows=nrows,ncols=ncols): # self.debug('\texpand(%s(%s),%s)'%(type(d),d,level)) - items = d.items() if isinstance(d, SortedDict) else sorted( - d.items() if hasattr(d, 'items') else d) + items = list(d.items()) if isinstance(d, SortedDict) else sorted( + list(d.items()) if hasattr(d, 'items') else d) for k, v in items: zero = data['nrows'] data[(data['nrows'], level)] = k @@ -106,7 +109,7 @@ def expand(d, level): # ,nrows=nrows,ncols=ncols): [table.append([]) for r in range(data.pop('nrows'))] [table[r].append(None) for c in range(data.pop('ncols')) for r in range(len(table))] - for coord, value in data.items(): + for coord, value in list(data.items()): table[coord[0]][coord[1]] = value return table diff --git a/lib/taurus/qt/qtgui/table/qlogtable.py b/lib/taurus/qt/qtgui/table/qlogtable.py index eb3919db7..c2ac27ace 100644 --- a/lib/taurus/qt/qtgui/table/qlogtable.py +++ b/lib/taurus/qt/qtgui/table/qlogtable.py @@ -27,6 +27,10 @@ python :mod:`logging` module""" from __future__ import absolute_import +from past.builtins import cmp +from builtins import map +from builtins import str +from builtins import range __all__ = ["QLoggingTableModel", "QLoggingTable", "QLoggingWidget", "QRemoteLoggingTableModel"] @@ -50,7 +54,7 @@ from .qtable import QBaseTableWidget -LEVEL, TIME, MSG, NAME, ORIGIN = range(5) +LEVEL, TIME, MSG, NAME, ORIGIN = list(range(5)) HORIZ_HEADER = 'Level', 'Time', 'Message', 'By', 'Origin' __LEVEL_BRUSH = { @@ -77,7 +81,7 @@ def getBrushForLevel(level): elevel = taurus.Error elif level <= taurus.Critical: elevel = taurus.Critical - f, g = map(Qt.QBrush, __LEVEL_BRUSH[elevel]) + f, g = list(map(Qt.QBrush, __LEVEL_BRUSH[elevel])) return f, g @@ -120,7 +124,7 @@ def _get_record_origin_tooltip(rec): host, procName, procID, threadName, threadID = _get_record_origin(rec) pathname, filename, modulename, funcname, lineno = _get_record_trace(rec) timestamp = str(datetime.datetime.fromtimestamp(rec.created)) - bgcolor, fgcolor = map(Qt.QBrush.color, getBrushForLevel(rec.levelno)) + bgcolor, fgcolor = list(map(Qt.QBrush.color, getBrushForLevel(rec.levelno))) bgcolor = "#%02x%02x%02x" % ( bgcolor.red(), bgcolor.green(), bgcolor.blue()) fgcolor = "#%02x%02x%02x" % ( @@ -346,7 +350,7 @@ def rowsInserted(self, index, start, end): """Overwrite of slot rows inserted to do proper resize and scroll to bottom if desired""" Qt.QTableView.rowsInserted(self, index, start, end) - for i in xrange(start, end + 1): + for i in range(start, end + 1): self.resizeRowToContents(i) if start == 0: self.resizeColumnsToContents() @@ -563,7 +567,7 @@ def fill_log(): import time import random - for i in xrange(10): + for i in range(10): taurus.info("Hello world %04d" % i) loggers = ["Object%02d" % (i + 1) for i in range(10)] diff --git a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py index 3f4f145d1..0e4cd7241 100755 --- a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py +++ b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py @@ -30,6 +30,8 @@ # todo: tango-centric +from builtins import str +from builtins import range __all__ = ["TaurusPropTable"] from taurus.external.qt import Qt, QtCore, QtGui @@ -230,7 +232,7 @@ def addProperty(self): text, ok = QtGui.QInputDialog.getText( self, 'New Property', 'Property name:') if ok: - text1 = unicode(text) + text1 = str(text) new_prop_name = str(text1) new_prop_value = '0' dict1 = {new_prop_name: [new_prop_value]} @@ -269,7 +271,7 @@ def editProperty(self): new_text, ok = QtGui.QInputDialog.getText( self, 'Rename', 'Write new name of property:') if ok: - new_text = unicode(new_text) + new_text = str(new_text) new_text = str(new_text) list = [prop_name] dict = {new_text: [prop_value]} @@ -289,7 +291,7 @@ def editProperty(self): self.setNewPropertyValue(new_text) def setNewPropertyValue(self, new_text): - new_text = unicode(new_text) + new_text = str(new_text) new_text = str(new_text) values = {self.prop_name2: new_text.replace('\r', '').split('\n')} self.db.put_device_property(self.dev_name, values) diff --git a/lib/taurus/qt/qtgui/table/taurusgrid.py b/lib/taurus/qt/qtgui/table/taurusgrid.py index 1994670b0..00d2cdac6 100644 --- a/lib/taurus/qt/qtgui/table/taurusgrid.py +++ b/lib/taurus/qt/qtgui/table/taurusgrid.py @@ -34,6 +34,12 @@ # This module needs a total cleanup. Both re. code conventions and algorithms. # --cpascual 20140827 +from future import standard_library +standard_library.install_aliases() +from builtins import zip +from builtins import next +from builtins import str +from builtins import range __all__ = ["TaurusGrid"] __docformat__ = 'restructuredtext' @@ -41,7 +47,7 @@ import re import operator import traceback -import Queue +import queue from functools import partial from taurus.external.qt import Qt, QtGui, QtCore @@ -275,7 +281,7 @@ def __init__(self, parent=None, designMode=False): self.hideLabels = False self.defineStyle() - self.modelsQueue = Queue.Queue() + self.modelsQueue = queue.Queue() self.__modelsThread = None if not designMode: self.modelsThread @@ -660,12 +666,12 @@ def create_widgets_dict(self, models): self.row_labels = sorted( list(set(m.split('/')[0].upper() for m in models if m.count('/') >= 2))) - self.row_labels = zip(self.row_labels, self.row_labels) + self.row_labels = list(zip(self.row_labels, self.row_labels)) if not self.column_labels: # Families used by default self.column_labels = sorted( list(set(m.split('/')[1].upper() for m in models if m.count('/') >= 2))) - self.column_labels = zip(self.column_labels, self.column_labels) + self.column_labels = list(zip(self.column_labels, self.column_labels)) # for m in models: # if m.count('/')<2: diff --git a/lib/taurus/qt/qtgui/table/taurusvaluestable.py b/lib/taurus/qt/qtgui/table/taurusvaluestable.py index 2994b4a4c..e01a8bffa 100755 --- a/lib/taurus/qt/qtgui/table/taurusvaluestable.py +++ b/lib/taurus/qt/qtgui/table/taurusvaluestable.py @@ -23,6 +23,7 @@ ## ############################################################################# +from builtins import str __all__ = ["TaurusValuesTable"] __docformat__ = 'restructuredtext' @@ -58,7 +59,7 @@ def _value2Quantity(value, units): class TaurusValuesIOTableModel(Qt.QAbstractTableModel): typeCastingMap = {'f': float, 'b': bool, - 'u': int, 'i': int, 'S': str, 'U': unicode} + 'u': int, 'i': int, 'S': str, 'U': str} # Need to have an array dataChanged = Qt.pyqtSignal('QModelIndex', 'QModelIndex') @@ -265,11 +266,11 @@ def getModifiedWriteData(self): kind = table.dtype.kind if kind in 'SU': table = table.tolist() # we want to allow the strings to be larger than the original ones - for (r, c), v in self._modifiedDict.items(): + for (r, c), v in list(self._modifiedDict.items()): table[r][c] = Qt.from_qvariant(v, str) table = numpy.array(table, dtype=str) else: - for k, v in self._modifiedDict.items(): + for k, v in list(self._modifiedDict.items()): if kind in ['f', 'i', 'u']: units = self._parent.getCurrentUnits() q = _value2Quantity(v, units) diff --git a/lib/taurus/qt/qtgui/taurusgui/PermanentCustomPanelsDlg.py b/lib/taurus/qt/qtgui/taurusgui/PermanentCustomPanelsDlg.py index 59210b00a..972e97766 100644 --- a/lib/taurus/qt/qtgui/taurusgui/PermanentCustomPanelsDlg.py +++ b/lib/taurus/qt/qtgui/taurusgui/PermanentCustomPanelsDlg.py @@ -28,6 +28,7 @@ PermanentCustomPanelDlg.py: """ +from builtins import object from taurus.external.qt import Qt diff --git a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py index 73052b9a5..3251b4ae3 100644 --- a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py +++ b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py @@ -34,6 +34,8 @@ """ from __future__ import print_function +from builtins import str +from builtins import range __all__ = ["AppSettingsWizard", "ExternalAppEditor"] import os @@ -230,14 +232,14 @@ def _setupUI(self): self._projectDirBT.clicked.connect(self.onSelectDir) def onSelectDir(self): - dirname = unicode(Qt.QFileDialog.getExistingDirectory( + dirname = str(Qt.QFileDialog.getExistingDirectory( self, 'Choose the project directory', self._projectDirLE.text())) if not dirname: return self._projectDirLE.setText(dirname) def validatePage(self): - dirname = unicode(self._projectDirLE.text()) + dirname = str(self._projectDirLE.text()) if not os.path.exists(dirname): try: @@ -280,7 +282,7 @@ def validatePage(self): return True def _getProjectDir(self): - return unicode(self._projectDirLE.text()) + return str(self._projectDirLE.text()) class GeneralSettings(BasePage): @@ -579,7 +581,7 @@ def _addSynoptic(self): fileNames = Qt.QFileDialog.getOpenFileNames(self, self.tr( "Open File"), pdir, self.tr("JDW (*.jdw );; All files (*)")) for fileName in fileNames: - fileName = unicode(fileName) + fileName = str(fileName) if fileName not in self._synoptics: self._synoptics.append(fileName) self._refreshSynopticList() @@ -1328,8 +1330,8 @@ def createProject(self): datetime.datetime.now().isoformat()) # copy files for i in range(self._substTable.rowCount()): - src = unicode(self._substTable.item(i, 0).text()) - dst = os.path.join(install_dir, unicode( + src = str(self._substTable.item(i, 0).text()) + dst = os.path.join(install_dir, str( self._substTable.item(i, 1).text())) if os.path.normpath(src) != os.path.normpath(dst): shutil.copy(src, dst) @@ -1338,7 +1340,7 @@ def createProject(self): xmlcfgfilename = os.path.join(install_dir, self.wizard().getXmlConfigFileName()) f = open(xmlcfgfilename, 'w') - f.write(unicode(self._xml.toPlainText())) + f.write(str(self._xml.toPlainText())) f.close() logfile.write('XML Config file created: "%s"\n' % xmlcfgfilename) # write python config file @@ -1391,8 +1393,8 @@ def createProject(self): warnings = self.wizard().getProjectWarnings() if warnings: msg += '\n\nHowever, some fine-tuning may be needed. Please check the details:\n' - for short, long in warnings: - details += '- %s: %s\n\n' % (short, long) + for short, int in warnings: + details += '- %s: %s\n\n' % (short, int) logfile.write(msg + details) logfile.close() dlg = Qt.QMessageBox(Qt.QMessageBox.Information, @@ -1482,7 +1484,7 @@ def loadXml(self, fname): root = etree.fromstring(xml) # print self.Pages - for pageNumber in range(len(self.Pages.keys())): + for pageNumber in range(len(list(self.Pages.keys()))): self.page(pageNumber).fromXml(root) def getXml(self): @@ -1625,7 +1627,7 @@ def generateXml(self): long = ('The synoptic file "%s" references a file that ' 'has been copied to the project dir in order to make the project portable. ' 'Please edit "%s" and replace "%s" by "%s"') % (dst, dst, ref, refdst) - self._projectWarnings.append((short, long)) + self._projectWarnings.append((short, int)) # macroserver page if self.SARDANA_INSTALLED and self.__getitem__("macroServerName"): diff --git a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py index 13142b9ad..02adbd384 100644 --- a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py +++ b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py @@ -37,6 +37,7 @@ # TODO: move to sardana.taurus +from builtins import object __all__ = ['MacroBroker', 'DynamicPlotManager'] __docformat__ = 'restructuredtext' @@ -145,7 +146,7 @@ def onExpConfChanged(self, expconf): plots1d = {} images = {} - for chname, chdata in channels.items(): + for chname, chdata in list(channels.items()): ptype = chdata['plot_type'] if ptype == PlotType.No: continue @@ -195,7 +196,7 @@ def _updateTemporaryTrends1D(self, trends1d): ''' from taurus.qt.qtgui.plot import TaurusTrend newpanels = [] - for axes, plotables in trends1d.items(): + for axes, plotables in list(trends1d.items()): if not axes: continue if axes not in self._trends1d: @@ -250,7 +251,7 @@ def _updateTemporaryTrends2D(self, trends2d): raise return - for axes, plotables in trends2d.items(): + for axes, plotables in list(trends2d.items()): for chname in plotables: pname = u'Trend2D - %s' % chname if pname in self._trends2d: @@ -306,7 +307,7 @@ def removePanels(self, names=None): given (default), all the panels are removed. ''' if names is None: - names = self._trends1d.values() + self._trends2d.values() + names = list(self._trends1d.values()) + list(self._trends2d.values()) # TODO: do the same for other temporary panels for pname in names: self.removePanel(pname) @@ -552,7 +553,7 @@ def __onDoorAbort(self): door.command_inout('abort') # send stop/abort to all pools pools = door.macro_server.getElementsOfType('Pool') - for pool in pools.values(): + for pool in list(pools.values()): self.info('Sending %s command to %s' % (cmd, pool.getFullName())) try: pool.getObj().command_inout(cmd) diff --git a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py index b6837c7dc..d204d4877 100644 --- a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py +++ b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py @@ -24,6 +24,9 @@ ########################################################################### from __future__ import print_function +from builtins import str +from builtins import zip +from builtins import range __all__ = ["PanelDescriptionWizard"] """ paneldescriptionwizard.py: @@ -222,7 +225,7 @@ def __init__(self, parent=None, designMode=False, extraWidgets=None): Qt.QWizardPage.__init__(self, parent) TaurusBaseWidget.__init__(self, 'WidgetPage') if extraWidgets: - customWidgets, customWidgetScreenshots = zip(*extraWidgets) + customWidgets, customWidgetScreenshots = list(zip(*extraWidgets)) pixmaps = {} for k, s in extraWidgets: if s is None: @@ -462,7 +465,7 @@ def validatePage(self): class CommTableModel(Qt.QAbstractTableModel): NUMCOLS = 3 - UID, R, W = range(NUMCOLS) + UID, R, W = list(range(NUMCOLS)) dataChanged = Qt.pyqtSignal(int, int) @@ -555,7 +558,7 @@ def rowModel(uid='', slot='', signal=''): class CommItemDelegate(Qt.QStyledItemDelegate): NUMCOLS = 3 - UID, R, W = range(NUMCOLS) + UID, R, W = list(range(NUMCOLS)) def __init__(self, parent=None, widget=None, sdm=None): super(CommItemDelegate, self).__init__(parent) diff --git a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py index ac5820ea2..ffbefb7f6 100644 --- a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py +++ b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py @@ -25,6 +25,8 @@ """This package provides the TaurusGui class""" +from builtins import str +from past.builtins import basestring __all__ = ["DockWidgetPanel", "TaurusGui"] __docformat__ = 'restructuredtext' @@ -91,7 +93,7 @@ def refresh(self): self.onInstrumentChanged(self.ui.instrumentCB.currentText()) def onInstrumentChanged(self, instrumentname): - instrumentname = unicode(instrumentname) + instrumentname = str(instrumentname) panelname = self.associations.get(instrumentname) if panelname is None: self.ui.panelCB.setCurrentIndex(0) @@ -104,10 +106,10 @@ def onDialogButtonClicked(self, button): role = self.ui.buttonBox.buttonRole(button) if role in (Qt.QDialogButtonBox.AcceptRole, Qt.QDialogButtonBox.ApplyRole): if self.ui.panelCB.currentIndex() > 0: - panelname = unicode(self.ui.panelCB.currentText()) + panelname = str(self.ui.panelCB.currentText()) else: panelname = None - instrumentname = unicode(self.ui.instrumentCB.currentText()) + instrumentname = str(self.ui.instrumentCB.currentText()) self.associations[instrumentname] = panelname self.parent().setInstrumentAssociation(instrumentname, panelname) @@ -128,7 +130,7 @@ def __init__(self, parent, widget, name, mainwindow): self.setWidget(widget) # self._widget = self.widget() #keep a pointer that may change if the # widget changes - name = unicode(name) + name = str(name) self.setWindowTitle(name) self.setObjectName(name) self._custom = False @@ -342,7 +344,7 @@ def closeEvent(self, event): except: pass TaurusMainWindow.closeEvent(self, event) - for n, panel in self.__panels.items(): + for n, panel in list(self.__panels.items()): panel.closeEvent(event) panel.widget().closeEvent(event) if not event.isAccepted(): @@ -361,7 +363,7 @@ def __updatePanelsMenu(self): permanent = (panelsmenu == self.__permPanelsMenu) panelsmenu.clear() panelnames = sorted( - [n for n, p in self.__panels.items() if (p.isPermanent() == permanent)]) + [n for n, p in list(self.__panels.items()) if (p.isPermanent() == permanent)]) for name in panelnames: panelsmenu.addAction(self.__panels[name].toggleViewAction()) @@ -500,7 +502,7 @@ def removeExternalApp(self, name=None): removed If None given, the user will be prompted ''' - apps = self.__external_app.keys() + self.__permanent_ext_apps + apps = list(self.__external_app.keys()) + self.__permanent_ext_apps if name is None: items = sorted(apps) msg1 = "Remove External application" @@ -510,13 +512,13 @@ def removeExternalApp(self, name=None): False) if not ok: return - name = unicode(name) + name = str(name) if name not in apps: msg = ('Cannot remove the external application "%s"' ' (not found)' % name) self.debug(msg) return - if name in self.__external_app.keys(): + if name in list(self.__external_app.keys()): self.__external_app.pop(name) else: self.__permanent_ext_apps.remove(name) @@ -570,12 +572,12 @@ def removePanel(self, name=None): ''' if name is None: items = sorted( - [n for n, p in self.__panels.iteritems() if p.isCustom()]) + [n for n, p in self.__panels.items() if p.isCustom()]) name, ok = Qt.QInputDialog.getItem(self, "Remove Panel", "Panel to be removed (only custom panels can be removed).\n Important: you may want to save the perspective afterwards,\n and maybe remove the panel from other perspectives as well", items, 0, False) if not ok: return - name = unicode(name) + name = str(name) if name not in self.__panels: self.debug('Cannot remove panel "%s" (not found)' % name) return @@ -626,7 +628,7 @@ def createPanel(self, widget, name, floating=False, registerconfig=True, custom= 'Deprecation warning: please note that the "area" argument is deprecated. See TaurusGui.createPanel doc') floating = not(floating) - name = unicode(name) + name = str(name) if name in self.__panels: self.info('Panel with name "%s" already exists. Reusing.' % name) return self.__panels[name] @@ -636,7 +638,7 @@ def createPanel(self, widget, name, floating=False, registerconfig=True, custom= # we will only place panels in this area self.addDockWidget(Qt.Qt.TopDockWidgetArea, panel) if len(self.__panels) != 0: - self.tabifyDockWidget(self.__panels.values()[-1], panel) + self.tabifyDockWidget(list(self.__panels.values())[-1], panel) panel.setFloating(floating) @@ -674,14 +676,14 @@ def getPanel(self, name): :return: (DockWidgetPanel) ''' - return self.__panels[unicode(name)] + return self.__panels[str(name)] def getPanelNames(self): '''returns the names of existing panels :return: (list) ''' - return copy.deepcopy(self.__panels.keys()) + return copy.deepcopy(list(self.__panels.keys())) def _setPermanentExternalApps(self, permExternalApps): '''creates empty panels for restoring custom panels. @@ -717,7 +719,7 @@ def _getPermanentCustomPanels(self): :return: (list) ''' - return [n for n, p in self.__panels.iteritems() if (p.isCustom() and p.isPermanent())] + return [n for n, p in self.__panels.items() if (p.isCustom() and p.isPermanent())] def updatePermanentCustomPanels(self, showAlways=True): ''' @@ -729,7 +731,7 @@ def updatePermanentCustomPanels(self, showAlways=True): # check if there are some newly created panels that may be made # permanent perm = self._getPermanentCustomPanels() - temp = [n for n, p in self.__panels.iteritems() if ( + temp = [n for n, p in self.__panels.items() if ( p.isCustom() and not p.isPermanent())] if len(temp) > 0 or showAlways: dlg = QDoubleListDlg(winTitle='Stored panels', @@ -765,7 +767,7 @@ def updatePermanentExternalApplications(self, showAlways=True): mainLabel=msg, label1='Temporary (to be discarded)', label2='Permanent (to be stored)', - list1=self.__external_app.keys(), + list1=list(self.__external_app.keys()), list2=self.__permanent_ext_apps) result = dlg.exec_() if result == Qt.QDialog.Accepted: @@ -888,7 +890,7 @@ def createInstrumentsFromPool(self, macroservername): if result == Qt.QMessageBox.Abort: sys.exit() return [] - for i in instruments.values(): + for i in list(instruments.values()): i_name = i.full_name #i_name, i_unknown, i_type, i_pools = i.split() i_view = PanelDescription( @@ -896,12 +898,12 @@ def createInstrumentsFromPool(self, macroservername): instrument_dict[i_name] = i_view from operator import attrgetter - pool_elements = sorted(ms.getElementsWithInterface( - 'Moveable').values(), key=attrgetter('name')) - pool_elements += sorted(ms.getElementsWithInterface( - 'ExpChannel').values(), key=attrgetter('name')) - pool_elements += sorted(ms.getElementsWithInterface( - 'IORegister').values(), key=attrgetter('name')) + pool_elements = sorted(list(ms.getElementsWithInterface( + 'Moveable').values()), key=attrgetter('name')) + pool_elements += sorted(list(ms.getElementsWithInterface( + 'ExpChannel').values()), key=attrgetter('name')) + pool_elements += sorted(list(ms.getElementsWithInterface( + 'IORegister').values()), key=attrgetter('name')) for elem in pool_elements: instrument = elem.instrument if instrument: @@ -915,7 +917,7 @@ def createInstrumentsFromPool(self, macroservername): # ----------------------------------------------------------- instrument_dict[i_name].model.append(e_name) # filter out empty panels - ret = [instrument for instrument in instrument_dict.values() + ret = [instrument for instrument in list(instrument_dict.values()) if len(instrument.model) > 0] return ret @@ -1332,7 +1334,7 @@ def setModifiableByUser(self, modifiable): dwfeat = Qt.QDockWidget.AllDockWidgetFeatures else: dwfeat = Qt.QDockWidget.NoDockWidgetFeatures - for panel in self.__panels.values(): + for panel in list(self.__panels.values()): panel.toggleViewAction().setEnabled(modifiable) panel.setFeatures(dwfeat) for action in (self.newPanelAction, self.showAllPanelsAction, @@ -1355,12 +1357,12 @@ def onShortMessage(self, msg): def hideAllPanels(self): '''hides all current panels''' - for panel in self.__panels.itervalues(): + for panel in self.__panels.values(): panel.hide() def showAllPanels(self): '''shows all current panels''' - for panel in self.__panels.itervalues(): + for panel in self.__panels.values(): panel.show() def onShowAssociationDialog(self): @@ -1391,7 +1393,7 @@ def setInstrumentAssociation(self, instrumentname, panelname): panel or None to remove the association for this instrument. ''' - instrumentname = unicode(instrumentname) + instrumentname = str(instrumentname) # remove a previous association if it exists oldpanelname = self.__instrumentToPanelMap.get(instrumentname, None) self.__panelToInstrumentMap.pop(oldpanelname, None) @@ -1426,12 +1428,12 @@ def setAllInstrumentAssociations(self, associationsdict, clearExisting=False): else: self.__instrumentToPanelMap.update(copy.deepcopy(associationsdict)) self.__panelToInstrumentMap = {} - for k, v in self.__instrumentToPanelMap.iteritems(): + for k, v in self.__instrumentToPanelMap.items(): self.__panelToInstrumentMap[v] = k def _onPanelVisibilityChanged(self, visible): if visible: - panelname = unicode(self.sender().objectName()) + panelname = str(self.sender().objectName()) instrumentname = self.__panelToInstrumentMap.get(panelname) if instrumentname is not None: self.SelectedInstrument.emit(instrumentname) @@ -1442,7 +1444,7 @@ def onSelectedInstrument(self, instrumentname): :param instrumentname: (str) The name that identifies the instrument. ''' - instrumentname = unicode(instrumentname) + instrumentname = str(instrumentname) panelname = self.getInstrumentAssociation(instrumentname) self.setFocusToPanel(panelname) @@ -1452,7 +1454,7 @@ def setFocusToPanel(self, panelname): :param panelname: (str) The name that identifies the panel. This name must be unique within the panels in the GUI. ''' - panelname = unicode(panelname) + panelname = str(panelname) try: panel = self.__panels[panelname] panel.show() @@ -1490,9 +1492,9 @@ def findPanelsInArea(self, area): raise DeprecationWarning( 'findPanelsInArea is no longer supported (now all panels reside in the same DockWidget Area)') if area == 'FLOATING': - return [p for p in self.__panels.values() if p.isFloating()] + return [p for p in list(self.__panels.values()) if p.isFloating()] else: - return [p for p in self.__panels.values() if self.dockWidgetArea(p) == area] + return [p for p in list(self.__panels.values()) if self.dockWidgetArea(p) == area] @classmethod def getQtDesignerPluginInfo(cls): @@ -1530,7 +1532,7 @@ def onExportCurrentPanelConfiguration(self, fname=None): dlg = QDoubleListDlg(winTitle='Export Panels to XML', mainLabel='Select which of the custom panels you want to export as xml configuration', label1='Not Exported', label2='Exported', - list1=[n for n, p in self.__panels.iteritems() if p.isCustom()], list2=[]) + list1=[n for n, p in self.__panels.items() if p.isCustom()], list2=[]) result = dlg.exec_() if result != Qt.QDialog.Accepted: return diff --git a/lib/taurus/qt/qtgui/taurusgui/utils.py b/lib/taurus/qt/qtgui/taurusgui/utils.py index 94fa0e4d5..457476c71 100644 --- a/lib/taurus/qt/qtgui/taurusgui/utils.py +++ b/lib/taurus/qt/qtgui/taurusgui/utils.py @@ -26,6 +26,9 @@ """This configuration contains base modules and classes that may be used by specific TaurusGui-based GUIs""" +from builtins import str +from past.builtins import basestring +from builtins import object __docformat__ = 'restructuredtext' import os @@ -38,7 +41,7 @@ # this is here only for backwards compatibility. It should not be used at all -class Qt_Qt: +class Qt_Qt(object): LeftDockWidgetArea = 1 RightDockWidgetArea = 2 BottomDockWidgetArea = 3 @@ -223,9 +226,9 @@ def getWidget(self, sdm=None, setModel=True): w.setModel(self.model) # connect (if an sdm is given) if sdm is not None: - for dataUID, signalname in self.sharedDataWrite.iteritems(): + for dataUID, signalname in self.sharedDataWrite.items(): sdm.connectWriter(dataUID, w, signalname) - for dataUID, slotname in self.sharedDataRead.iteritems(): + for dataUID, slotname in self.sharedDataRead.items(): sdm.connectReader(dataUID, getattr(w, slotname)) # set the name w.name = self.name @@ -250,12 +253,12 @@ def toXml(self): floating.text = str(self._floating) sharedDataWrite = etree.SubElement(root, "sharedDataWrite") - for k, v in self._sharedDataWrite.iteritems(): + for k, v in self._sharedDataWrite.items(): item = etree.SubElement( sharedDataWrite, "item", datauid=k, signalName=v) sharedDataRead = etree.SubElement(root, "sharedDataRead") - for k, v in self._sharedDataRead.iteritems(): + for k, v in self._sharedDataRead.items(): item = etree.SubElement( sharedDataRead, "item", datauid=k, slotName=v) diff --git a/lib/taurus/qt/qtgui/test/base.py b/lib/taurus/qt/qtgui/test/base.py index 576577546..642fe92ab 100644 --- a/lib/taurus/qt/qtgui/test/base.py +++ b/lib/taurus/qt/qtgui/test/base.py @@ -25,6 +25,9 @@ """Utilities for creating generic tests for Taurus widgets""" +from builtins import zip +from builtins import range +from builtins import object import time import taurus.core import unittest @@ -84,7 +87,7 @@ def assertMaxDeprecations(self, maximum, msg=None): self.assertTrue(deps <= maximum, msg) def processEvents(self, repetitions=1, sleep=0): - for i in xrange(repetitions): + for i in range(repetitions): time.sleep(sleep) self._app.processEvents() diff --git a/lib/taurus/qt/qtgui/tree/qtree.py b/lib/taurus/qt/qtgui/tree/qtree.py index 919e44995..c488b57e8 100644 --- a/lib/taurus/qt/qtgui/tree/qtree.py +++ b/lib/taurus/qt/qtgui/tree/qtree.py @@ -25,6 +25,7 @@ """This module provides base tree widget""" +from builtins import range __all__ = ["QBaseTreeWidget"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py index 2d7773205..a3722d502 100644 --- a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py +++ b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py @@ -34,6 +34,11 @@ # Taurusdbtree # ,"SearchEdit"] #"TaurusTreeNode"] +from builtins import next +from builtins import str +from builtins import range +from past.builtins import basestring +from builtins import object __all__ = ["TaurusDevTree", "TaurusSearchTree", "TaurusDevTreeOptions"] import time @@ -194,11 +199,11 @@ def getNodeIcon(self, node=None): node = self.getNode() try: name, url = self.getNodeText(node), '' - for k, v in self.getIconMap().items(): + for k, v in list(self.getIconMap().items()): if re.match(k.lower(), name.lower()): url = v if not url: - for k, v in self.getIconMap().items(): + for k, v in list(self.getIconMap().items()): if k.lower() in name.lower(): url = v # if name.count('/')==2: @@ -640,10 +645,10 @@ def loadTree(self, filters): dct = self.getTangoDict(filters) else: # if isMap(filters): self.setWindowTitle('TaurusDevTree:%s' % - ','.join(filters.keys())) + ','.join(list(filters.keys()))) def expand_dict(d): - return [x for v in d.values() for x in (expand_dict(v) if hasattr(v, 'values') else (v,))] + return [x for v in list(d.values()) for x in (expand_dict(v) if hasattr(v, 'values') else (v,))] targets = [t.upper() for t in get_matching_devices( ['*%s*' % f if '*' not in f else f for f in expand_dict(filters)])] @@ -651,7 +656,7 @@ def get_devs(f): return dict.fromkeys(t for t in targets if matchCl(f, t)) def expand_filter(f): - return dict((k, expand_filter(v) if hasattr(v, 'values') else get_devs(v)) for k, v in f.items() if v) + return dict((k, expand_filter(v) if hasattr(v, 'values') else get_devs(v)) for k, v in list(f.items()) if v) dct = expand_filter(filters) # self.Loader.next([self.setTree,dct,True]) self.setTree(dct, clear=True) @@ -800,7 +805,7 @@ def addAttrToNode(self, node=None, full=False): if alias: self.trace('Got aliases for %s: %s' % (aname, alias)) [setattr(natt, 'AttributeAlias', v) - for k, v in alias.items() if k in aname.lower()] + for k, v in list(alias.items()) if k in aname.lower()] else: natt.AttributeAlias = aname.split()[0].strip() node.setExpanded(True) @@ -825,7 +830,7 @@ def getNodeByName(self, key): return self.item_index[key] def getNodeList(self): - return self.item_index.keys() + return list(self.item_index.keys()) def getMatchingNodes(self, regexp, limit=0, all=False, exclude=None): """ It returns all nodes matching the given expression. """ @@ -838,7 +843,7 @@ def getMatchingNodes(self, regexp, limit=0, all=False, exclude=None): if node is not None: return [node] regexp = re.compile(extend_regexp(regexp)) - for k, node in self.item_index.iteritems(): + for k, node in self.item_index.items(): nname = self.getNodeText(node, full=True).lower() if (regexp.match(k) or regexp.match(nname)) and \ (not exclude or not any(re.match(x.lower(), y) for x in exclude for y in (k.lower(), nname))): @@ -869,7 +874,7 @@ def get_child_nodes(dct, node, fun=None): def unpackChildren(self): """ removes all nodes from the tree and returns them in a list, used for resorting """ allChildren = [] - nodes = self.getAllNodes().values() + nodes = list(self.getAllNodes().values()) for node in nodes: allChildren.extend(node.takeChildren()) @@ -1021,7 +1026,7 @@ def sortCustom(self, order): sorter = lambda k, ks=[re.compile(c) for c in order]: str( next((i for i, r in enumerate(ks) if r.match(k.lower())))) + str(k) - for c, it in sorted(allChildren.items(), key=lambda k: sorter(k[0])): + for c, it in sorted(list(allChildren.items()), key=lambda k: sorter(k[0])): self.debug('tree.sortCustom(%s): %s inserted at %d' % (order, it.text(0), self.topLevelItemCount())) self.insertTopLevelItem(self.topLevelItemCount(), it) @@ -1062,12 +1067,12 @@ def update_node(node, key, dct): if not isinstance(dct, dict): dct = dict.fromkeys(dct, '') nodes = self.getAllNodes() - for name, node in nodes.iteritems(): + for name, node in nodes.items(): name = str(name).split()[0] if node.isHidden(): continue if regexps: - matches = [v for k, v in dct.items() if re.match( + matches = [v for k, v in list(dct.items()) if re.match( k.lower(), name.lower())] if matches: update_node(node, name, {name: matches[0]}) @@ -1286,7 +1291,7 @@ def test_device(): if hasattr(node, 'ContextMenu'): last_was_separator = True - for t in (type(node.ContextMenu) is dict and node.ContextMenu.items() or node.ContextMenu): + for t in (type(node.ContextMenu) is dict and list(node.ContextMenu.items()) or node.ContextMenu): try: k, action = t if k: @@ -1307,7 +1312,7 @@ def test_device(): expert = menu.addMenu('Expert') # expert.addSeparator() last_was_separator = True - for t in (type(node.ContextMenu) is dict and node.ExpertMenu.items() or node.ExpertMenu): + for t in (type(node.ContextMenu) is dict and list(node.ExpertMenu.items()) or node.ExpertMenu): try: k, action = t if k: @@ -1660,7 +1665,7 @@ def defineStyle(self): self.layout().addWidget(self.tree) self.registerConfigDelegate(self.tree) # Slot forwarding ... - for k in TaurusDevTree.__dict__.keys(): + for k in list(TaurusDevTree.__dict__.keys()): # if k in ['__init__','defineStyle']: continue if k not in self.__slots__: continue diff --git a/lib/taurus/qt/qtgui/util/taurusaction.py b/lib/taurus/qt/qtgui/util/taurusaction.py index 6395a1af1..0fd82fa18 100644 --- a/lib/taurus/qt/qtgui/util/taurusaction.py +++ b/lib/taurus/qt/qtgui/util/taurusaction.py @@ -26,6 +26,8 @@ """This module is designed to provide a library of taurus Qt actions""" from __future__ import absolute_import +from builtins import str +from past.builtins import basestring __all__ = ["ExternalAppAction", "TaurusMenu", "TaurusAction", @@ -131,10 +133,10 @@ def actionTriggered(self, args=None): else: return False except OSError: - err = "Error launching %s" % unicode(self.text()) + err = "Error launching %s" % str(self.text()) msg = "Cannot launch application:\n" + \ " ".join(self.__cmdargs) + \ - "\nHint: Check that %s is installed and in the path" % unicode( + "\nHint: Check that %s is installed and in the path" % str( self.text()) if self.interactive: Qt.QMessageBox.warning(self.parentWidget(), err, msg) diff --git a/lib/taurus/qt/qtgui/util/taurusactionfactory.py b/lib/taurus/qt/qtgui/util/taurusactionfactory.py index bf1cb1993..e3c6f7aac 100644 --- a/lib/taurus/qt/qtgui/util/taurusactionfactory.py +++ b/lib/taurus/qt/qtgui/util/taurusactionfactory.py @@ -130,7 +130,7 @@ def createAction(self, parent, text, shortcut=None, icon=None, tip=None, action.toggled.connect(toggled) action.setCheckable(True) if icon is not None: - if isinstance(icon, (str, unicode)): + if isinstance(icon, (str, str)): icon = Qt.QIcon.fromTheme(icon) action.setIcon(icon) if shortcut is not None: diff --git a/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py b/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py index fde5a57a6..9f7081a66 100644 --- a/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py +++ b/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py @@ -194,19 +194,19 @@ def getTaurusWidgets(self): return self._taurus_widgets def getWidgetClassNames(self): - return self._qt_widgets.keys() + return list(self._qt_widgets.keys()) def getWidgetClasses(self): - return [klass for mod_name, klass in self._qt_widgets.values()] + return [klass for mod_name, klass in list(self._qt_widgets.values())] def getWidgetClass(self, name): return self._qt_widgets[name][1] def getTaurusWidgetClassNames(self): - return self._taurus_widgets.keys() + return list(self._taurus_widgets.keys()) def getTaurusWidgetClasses(self): - return [klass for mod_name, klass in self._taurus_widgets.values()] + return [klass for mod_name, klass in list(self._taurus_widgets.values())] def getTaurusWidgetClass(self, name): return self._taurus_widgets.get(name)[1] diff --git a/lib/taurus/qt/qtgui/util/tauruswidgettree.py b/lib/taurus/qt/qtgui/util/tauruswidgettree.py index 77948d8a7..50df72b03 100644 --- a/lib/taurus/qt/qtgui/util/tauruswidgettree.py +++ b/lib/taurus/qt/qtgui/util/tauruswidgettree.py @@ -26,6 +26,7 @@ """ """ +from builtins import str __all__ = ["QObjectRepresentation", "get_qobject_tree", "get_qobject_tree_str", "TreeQObjectModel", "TreeQObjectWidget"] diff --git a/lib/taurus/qt/qtgui/util/ui.py b/lib/taurus/qt/qtgui/util/ui.py index d22ef8d18..3f8492005 100644 --- a/lib/taurus/qt/qtgui/util/ui.py +++ b/lib/taurus/qt/qtgui/util/ui.py @@ -25,6 +25,7 @@ """utilities to load ui files for widgets""" +from builtins import object __all__ = ["loadUi", "UILoadable", ] diff --git a/lib/taurus/test/base.py b/lib/taurus/test/base.py index e0111eca9..0755fb6fb 100644 --- a/lib/taurus/test/base.py +++ b/lib/taurus/test/base.py @@ -100,7 +100,7 @@ def isPositive(self, x): if test_method_doc is None: argsrep = ', '.join(['%s=%s' % (k, repr(v)) - for k, v in helper_kwargs.items()]) + for k, v in list(helper_kwargs.items())]) if tested_name: test_method_doc = 'Testing %s with %s(%s)' % (tested_name, helper_name, argsrep) diff --git a/lib/taurus/test/fuzzytest.py b/lib/taurus/test/fuzzytest.py index 145fef489..4b1119b94 100644 --- a/lib/taurus/test/fuzzytest.py +++ b/lib/taurus/test/fuzzytest.py @@ -25,8 +25,10 @@ '''Utility functions to deal with non-ideal (fuzzy) tests''' from __future__ import print_function +from __future__ import division +from past.utils import old_div def loopTest(testname, maxtries=100, maxfails=10): '''Run a test `maxtries` times or until it fails `maxfails` times and report the number of tries and failures. @@ -107,11 +109,11 @@ def calculateTestFuzziness(test, maxtries=100, maxfails=10, **kwargs): else: tries, fails = loopSubprocess(test, maxtries=maxtries, maxfails=maxfails, **kwargs) - r = float(fails) / tries - dr = numpy.sqrt(fails) / tries + r = old_div(float(fails), tries) + dr = old_div(numpy.sqrt(fails), tries) print('Failure rate = %g +/- %g (%i/%i)' % (r, dr, fails, tries)) # calculating n using p-value=1% and failure rate with -1 sigma - n = numpy.ceil(numpy.log(.01) / numpy.log(1 - (r - dr))) + n = numpy.ceil(old_div(numpy.log(.01), numpy.log(1 - (r - dr)))) print(('Number of consecutive times that the test should be passed ' + 'to have a confidence>99%% that the bug is fixed: %g') % n) return r, dr, n diff --git a/lib/taurus/test/moduleexplorer.py b/lib/taurus/test/moduleexplorer.py index af86ab1e6..922191555 100644 --- a/lib/taurus/test/moduleexplorer.py +++ b/lib/taurus/test/moduleexplorer.py @@ -27,6 +27,7 @@ '''Utility code for returning info about a module''' from __future__ import print_function +from builtins import object import sys import os import inspect @@ -175,7 +176,7 @@ def getAll(info, key): ret = [(mname, el) for el in info[key]] except KeyError: return [] - for sminfo in info['submodules'].itervalues(): + for sminfo in info['submodules'].values(): ret += ModuleExplorer.getAll(sminfo, key) return ret diff --git a/lib/taurus/test/test_import.py b/lib/taurus/test/test_import.py index 23b321385..24c9e00dc 100644 --- a/lib/taurus/test/test_import.py +++ b/lib/taurus/test/test_import.py @@ -26,6 +26,7 @@ """Taurus import tests""" from __future__ import absolute_import +from builtins import zip import unittest From 0c0e454043e5e89aaa332be3c18e93a5cd291ce3 Mon Sep 17 00:00:00 2001 From: Piergiorgio Pancino Date: Mon, 9 Jul 2018 05:26:36 +0200 Subject: [PATCH 018/252] fix findCaller missing stack_info --- lib/taurus/core/util/log.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/taurus/core/util/log.py b/lib/taurus/core/util/log.py index 31a1c2090..d3c150597 100644 --- a/lib/taurus/core/util/log.py +++ b/lib/taurus/core/util/log.py @@ -414,7 +414,7 @@ def report(self, *exc_info): class _Logger(logging.Logger): - def findCaller(self): + def findCaller(self, stack_info=False): """ Find the stack frame of the caller so that we can note the source file name, line number and function name. @@ -424,14 +424,14 @@ def findCaller(self): # IronPython isn't run with -X:Frames. if f is not None: f = f.f_back - rv = "(unknown file)", 0, "(unknown function)" + rv = "(unknown file)", 0, "(unknown function)", stack_info while hasattr(f, "f_code"): co = f.f_code filename = os.path.normcase(co.co_filename) if filename in (_srcfile, logging._srcfile): f = f.f_back continue - rv = (co.co_filename, f.f_lineno, co.co_name) + rv = (co.co_filename, f.f_lineno, co.co_name, stack_info) break return rv From 2ec7834ebf4e627df2842e602049377c2e5c4b1b Mon Sep 17 00:00:00 2001 From: Piergiorgio Pancino Date: Mon, 9 Jul 2018 05:38:53 +0200 Subject: [PATCH 019/252] fix unpacking _callerinfo --- lib/taurus/core/util/log.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/core/util/log.py b/lib/taurus/core/util/log.py index d3c150597..b87b28f31 100644 --- a/lib/taurus/core/util/log.py +++ b/lib/taurus/core/util/log.py @@ -890,7 +890,7 @@ def deprecated(self, msg=None, dep=None, alt=None, rel=None, dbg_msg=None, if _callerinfo is None: _callerinfo = self.log_obj.findCaller() - filename, lineno, _ = _callerinfo + filename, lineno, _, _ = _callerinfo depr_msg = warnings.formatwarning( msg, DeprecationWarning, filename, lineno) self.log_obj.warning(depr_msg, **kw) From ae55d9c7302e9e662fadc881e86c85cc7ea1a176 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Mon, 9 Jul 2018 12:08:05 +0700 Subject: [PATCH 020/252] Fixes _Logger.findCaller. It should return 4-element tuple (filename, line number, function name, stack info or None). --- lib/taurus/core/util/log.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/taurus/core/util/log.py b/lib/taurus/core/util/log.py index b87b28f31..1674057e8 100644 --- a/lib/taurus/core/util/log.py +++ b/lib/taurus/core/util/log.py @@ -39,6 +39,7 @@ __docformat__ = "restructuredtext" +import io import os import sys import logging.handlers @@ -414,6 +415,7 @@ def report(self, *exc_info): class _Logger(logging.Logger): + def findCaller(self, stack_info=False): """ Find the stack frame of the caller so that we can note the source @@ -424,13 +426,21 @@ def findCaller(self, stack_info=False): # IronPython isn't run with -X:Frames. if f is not None: f = f.f_back - rv = "(unknown file)", 0, "(unknown function)", stack_info + rv = "(unknown file)", 0, "(unknown function)", None while hasattr(f, "f_code"): co = f.f_code filename = os.path.normcase(co.co_filename) if filename in (_srcfile, logging._srcfile): f = f.f_back continue + if stack_info: + sio = io.StringIO() + sio.write('Stack (most recent call last):\n') + traceback.print_stack(f, file=sio) + sinfo = sio.getvalue() + if sinfo[-1] == '\n': + sinfo = sinfo[:-1] + sio.close() rv = (co.co_filename, f.f_lineno, co.co_name, stack_info) break return rv @@ -890,7 +900,7 @@ def deprecated(self, msg=None, dep=None, alt=None, rel=None, dbg_msg=None, if _callerinfo is None: _callerinfo = self.log_obj.findCaller() - filename, lineno, _, _ = _callerinfo + filename, lineno, fname, sinfo = _callerinfo depr_msg = warnings.formatwarning( msg, DeprecationWarning, filename, lineno) self.log_obj.warning(depr_msg, **kw) From a4d436a27cd62e0f0d79b9437425d3412345c905 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Mon, 9 Jul 2018 12:20:29 +0700 Subject: [PATCH 021/252] Fixes 'mappingproxy' object has no attribute 'update' --- lib/taurus/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/taurus/__init__.py b/lib/taurus/__init__.py index bfaac2459..bb8c42f74 100644 --- a/lib/taurus/__init__.py +++ b/lib/taurus/__init__.py @@ -33,8 +33,9 @@ class Release(object): pass -for key, value in list(__R.__dict__.items()): - setattr(Release, key, value) +for attr, value in __R.__dict__.items(): + setattr(Release, attr, value) + Release.__doc__ = __R.__doc__ from .core.taurushelper import * From 2ae043581a95d5b827e734e3dd83b7f1dcf0b229 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Mon, 9 Jul 2018 13:44:17 +0700 Subject: [PATCH 022/252] Gitignore updated. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a561cc564..b9cda105c 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ doc/~thumbnails.zip /lib/taurus.egg-info *.bak *.swp +*.orig From 0d49089264e84f0dcb026ee62eb473740ef23b67 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Mon, 9 Jul 2018 14:11:04 +0700 Subject: [PATCH 023/252] Replaces "six.moves.queue" with "queue'. --- lib/taurus/qt/qtcore/util/emitter.py | 2 +- lib/taurus/qt/qtgui/graphic/taurusgraphic.py | 4 ++-- lib/taurus/qt/qtgui/table/taurusgrid.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/taurus/qt/qtcore/util/emitter.py b/lib/taurus/qt/qtcore/util/emitter.py index 4419f97d3..dabeb0631 100644 --- a/lib/taurus/qt/qtcore/util/emitter.py +++ b/lib/taurus/qt/qtcore/util/emitter.py @@ -153,7 +153,7 @@ class TaurusEmitterThread(Qt.QThread): .. code-block:: python #Applying TaurusEmitterThread to an existing class: - from Queue import Queue + from queue import Queue from functools import partial def modelSetter(args): diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py index a087f4f41..6350978c2 100755 --- a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py +++ b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py @@ -72,7 +72,7 @@ import operator import types -import queue +from six.moves.queue import Queue from taurus import Manager from taurus.core import AttrQuality, DataType @@ -839,7 +839,7 @@ def getAllChildren(self, item, klass=None): def start(self): if self.updateThread: return - self.updateQueue = queue.Queue() + self.updateQueue = Queue() self.updateThread = TaurusGraphicsUpdateThread(self) self.updateThread.start() # Qt.QThread.HighPriority) diff --git a/lib/taurus/qt/qtgui/table/taurusgrid.py b/lib/taurus/qt/qtgui/table/taurusgrid.py index 00d2cdac6..8a685b7f1 100644 --- a/lib/taurus/qt/qtgui/table/taurusgrid.py +++ b/lib/taurus/qt/qtgui/table/taurusgrid.py @@ -47,7 +47,7 @@ import re import operator import traceback -import queue +from queue import Queue from functools import partial from taurus.external.qt import Qt, QtGui, QtCore @@ -281,7 +281,7 @@ def __init__(self, parent=None, designMode=False): self.hideLabels = False self.defineStyle() - self.modelsQueue = queue.Queue() + self.modelsQueue = Queue() self.__modelsThread = None if not designMode: self.modelsThread From 238bfd4367dcd721994704ca8a69dda77da5f0eb Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Mon, 9 Jul 2018 14:17:19 +0700 Subject: [PATCH 024/252] Adds .eggs to .gitignore. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b9cda105c..95e02ca2d 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ doc/~thumbnails.zip *.bak *.swp *.orig +.eggs/ From f419b036d761dc4c86294c9eb3f52bd21d27e009 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Mon, 9 Jul 2018 16:21:06 +0700 Subject: [PATCH 025/252] Replaces isinstance(obj,(str, unicode)) and isinstance(obj, basestring) with from future.utils import string_types isinstance(obj, string_types) --- lib/taurus/console/list.py | 6 +++-- lib/taurus/core/resource/resfactory.py | 2 ++ lib/taurus/core/util/containers.py | 22 ++++++++++--------- lib/taurus/core/util/enumeration.py | 12 +++++----- lib/taurus/external/qt/QtCore.py | 3 ++- .../qt/qtcore/configuration/configuration.py | 8 ++++--- lib/taurus/qt/qtcore/util/emitter.py | 4 +++- lib/taurus/qt/qtgui/base/taurusbase.py | 7 +++--- lib/taurus/qt/qtgui/button/taurusbutton.py | 4 +++- .../qt/qtgui/compact/abstractswitcher.py | 4 +++- .../qt/qtgui/container/taurusmainwindow.py | 4 +++- lib/taurus/qt/qtgui/extra_guiqwt/plot.py | 5 +++-- .../qt/qtgui/graphic/jdraw/jdraw_view.py | 5 ++++- lib/taurus/qt/qtgui/graphic/taurusgraphic.py | 5 +++-- .../qt/qtgui/panel/taurusdevicepanel.py | 4 +++- lib/taurus/qt/qtgui/panel/taurusform.py | 4 +++- lib/taurus/qt/qtgui/panel/taurusinputpanel.py | 12 +++++----- lib/taurus/qt/qtgui/panel/taurusmodellist.py | 4 +++- lib/taurus/qt/qtgui/plot/taurusplot.py | 5 ++++- lib/taurus/qt/qtgui/table/qdictionary.py | 5 ++++- lib/taurus/qt/qtgui/taurusgui/taurusgui.py | 3 ++- lib/taurus/qt/qtgui/taurusgui/utils.py | 5 ++++- lib/taurus/qt/qtgui/tree/taurusdevicetree.py | 4 +++- lib/taurus/qt/qtgui/util/taurusaction.py | 10 +++++---- .../qt/qtgui/util/taurusactionfactory.py | 4 +++- 25 files changed, 100 insertions(+), 51 deletions(-) diff --git a/lib/taurus/console/list.py b/lib/taurus/console/list.py index e5f008ad8..f31256dbe 100644 --- a/lib/taurus/console/list.py +++ b/lib/taurus/console/list.py @@ -36,6 +36,8 @@ import collections import operator +from future.utils import string_types + from .enums import Alignment @@ -64,7 +66,7 @@ def __init__(self, header, header_separator=HeaderSeparator, self.append(header) def setHeaderSeparator(self, header_separator): - if isinstance(header_separator, (str, str)): + if isinstance(header_separator, string_types): header_separator = self.col_nb * [header_separator] self.HeaderSeparator = header_separator @@ -74,7 +76,7 @@ def getHeaderSeparator(self): header_separator = property(getHeaderSeparator, setHeaderSeparator) def setRowSeparator(self, row_separator): - if isinstance(row_separator, (str, str)): + if isinstance(row_separator, string_types): row_separator = self.col_nb * [row_separator] self.RowSeparator = row_separator diff --git a/lib/taurus/core/resource/resfactory.py b/lib/taurus/core/resource/resfactory.py index ada9b865f..65097b254 100644 --- a/lib/taurus/core/resource/resfactory.py +++ b/lib/taurus/core/resource/resfactory.py @@ -34,6 +34,8 @@ import operator import types +from future.utils import string_types + from taurus.core.taurushelper import Manager from taurus.core.util.singleton import Singleton from taurus.core.util.log import Logger diff --git a/lib/taurus/core/util/containers.py b/lib/taurus/core/util/containers.py index e47044787..31f0dec37 100644 --- a/lib/taurus/core/util/containers.py +++ b/lib/taurus/core/util/containers.py @@ -41,6 +41,8 @@ __docformat__ = "restructuredtext" +from future.utils import string_types + import copy import collections import time @@ -65,7 +67,7 @@ class CaselessList(list): def __init__(self, inlist=[]): list.__init__(self) for entry in inlist: - if not isinstance(entry, basestring): + if not isinstance(entry, string_types): raise TypeError('Members of this object must be strings. ' 'You supplied \"%s\" which is \"%s\"' % (entry, type(entry))) @@ -79,7 +81,7 @@ def __lowerstreq(self, a, b): def findentry(self, item): """A caseless way of checking if an item is in the list or not. It returns None or the entry.""" - if not isinstance(item, basestring): + if not isinstance(item, string_types): raise TypeError('Members of this object must be strings. ' 'You supplied \"%s\"' % type(item)) for entry in self: @@ -116,7 +118,7 @@ def lowercopy(self): def append(self, item): """Adds an item to the list and checks it's a string.""" - if not isinstance(item, basestring): + if not isinstance(item, string_types): raise TypeError('Members of this object must be strings. ' 'You supplied \"%s\"' % type(item)) list.append(self, item) @@ -128,7 +130,7 @@ def extend(self, item): raise TypeError('You can only extend lists with lists. ' 'You supplied \"%s\"' % type(item)) for entry in item: - if not isinstance(entry, basestring): + if not isinstance(entry, string_types): raise TypeError('Members of this object must be strings. ' 'You supplied \"%s\"' % type(entry)) list.append(self, entry) @@ -136,7 +138,7 @@ def extend(self, item): def count(self, item): """Counts references to 'item' in a caseless manner. If item is not a string it will always return 0.""" - if not isinstance(item, basestring): + if not isinstance(item, string_types): return 0 count = 0 for entry in self: @@ -155,7 +157,7 @@ def index(self, item, minindex=0, maxindex=None): maxindex = len(self) minindex = max(0, minindex) - 1 maxindex = min(len(self), maxindex) - if not isinstance(item, basestring): + if not isinstance(item, string_types): raise TypeError('Members of this object must be strings. ' 'You supplied \"%s\"' % type(item)) index = minindex @@ -168,7 +170,7 @@ def index(self, item, minindex=0, maxindex=None): def insert(self, i, x): """s.insert(i, x) same as s[i:i] = [x] Raises TypeError if x isn't a string.""" - if not isinstance(x, basestring): + if not isinstance(x, string_types): raise TypeError('Members of this object must be strings. ' 'You supplied \"%s\"' % type(x)) list.insert(self, i, x) @@ -182,7 +184,7 @@ def __setitem__(self, index, value): the same length as the slice object requires. """ if isinstance(index, int): - if not isinstance(value, basestring): + if not isinstance(value, string_types): raise TypeError('Members of this object must be strings. ' 'You supplied \"%s\"' % type(value)) list.__setitem__(self, index, value) @@ -191,7 +193,7 @@ def __setitem__(self, index, value): raise TypeError( 'Value given to set slice is not a sequence object.') for entry in value: - if not isinstance(entry, basestring): + if not isinstance(entry, string_types): raise TypeError('Members of this object must be strings. ' 'You supplied \"%s\"' % type(entry)) list.__setitem__(self, index, value) @@ -201,7 +203,7 @@ def __setitem__(self, index, value): def __setslice__(self, i, j, sequence): """Called to implement assignment to self[i:j].""" for entry in sequence: - if not isinstance(entry, basestring): + if not isinstance(entry, string_types): raise TypeError('Members of this object must be strings. ' 'You supplied \"%s\"' % type(entry)) list.__setslice__(self, i, j, sequence) diff --git a/lib/taurus/core/util/enumeration.py b/lib/taurus/core/util/enumeration.py index 1c8c4e99b..02ba6d554 100644 --- a/lib/taurus/core/util/enumeration.py +++ b/lib/taurus/core/util/enumeration.py @@ -39,6 +39,8 @@ __docformat__ = "restructuredtext" +from future.utils import string_types + class EnumException(Exception): """Exception thrown by :class:`Enumeration` when trying to declare an @@ -97,7 +99,7 @@ def __init__(self, name, enumList, flaggable=False, no_doc=False): raise EnumException( "flagable enum does not accept tuple items") x, i = x - if not isinstance(x, (str, str)): + if not isinstance(x, string_types): raise EnumException("enum name is not a string: " + str(x)) if not isinstance(i, (int, int)): raise EnumException( @@ -113,7 +115,7 @@ def __init__(self, name, enumList, flaggable=False, no_doc=False): reverseLookup[i] = x for x in enumList: if not isinstance(x, tuple): - if not isinstance(x, (str, str)): + if not isinstance(x, string_types): raise EnumException("enum name is not a string: " + str(x)) if x in uniqueNames: raise EnumException("enum name is not unique: " + str(x)) @@ -145,15 +147,15 @@ def _generateUniqueId(self): return n def __contains__(self, i): - if isinstance(i, (int, int)): + if isinstance(i, (int, long)): return i in self.reverseLookup - elif isinstance(i, (str, str)): + elif isinstance(i, string_types): return i in self.lookup def __getitem__(self, i): if isinstance(i, (int, int)): return self.whatis(i) - elif isinstance(i, (str, str)): + elif isinstance(i, string_types): return self.lookup[i] def __getattr__(self, attr): diff --git a/lib/taurus/external/qt/QtCore.py b/lib/taurus/external/qt/QtCore.py index 40cf3c8a8..d1449939a 100644 --- a/lib/taurus/external/qt/QtCore.py +++ b/lib/taurus/external/qt/QtCore.py @@ -26,6 +26,7 @@ """This module exposes QtCore module""" from builtins import object +from future.utils import string_types from taurus.external.qt import API_NAME __backend = API_NAME @@ -66,7 +67,7 @@ def __from_qvariant_1(qobj=None, convfunc=None): return qobj.toInt()[0] elif convfunc is float: return qobj.toDouble()[0] - elif isinstance(convfunc, (str, str)): + elif isinstance(convfunc, string_types): return getattr(qobj, convfunc)() diff --git a/lib/taurus/qt/qtcore/configuration/configuration.py b/lib/taurus/qt/qtcore/configuration/configuration.py index 9ef21e2f6..aadf627c0 100644 --- a/lib/taurus/qt/qtcore/configuration/configuration.py +++ b/lib/taurus/qt/qtcore/configuration/configuration.py @@ -36,6 +36,8 @@ __docformat__ = 'restructuredtext' +from future.utils import string_types + class configurableProperty(object): '''A dummy class used to handle properties with the configuration API @@ -53,7 +55,7 @@ def __init__(self, name, fget, fset, obj=None): def createConfig(self, allowUnpickable=False): '''returns value returned by the fget function of this property. the allowUnpickable parameter is ignored''' - if isinstance(self.fget, basestring): # fget is not a method but a method name... + if isinstance(self.fget, string_types): # fget is not a method but a method name... result = getattr(self._obj, self.fget)() else: result = self.fget() @@ -61,7 +63,7 @@ def createConfig(self, allowUnpickable=False): def applyConfig(self, value, depth=-1): '''calls the fset function for this property with the given value. The depth parameter is ignored''' - if isinstance(self.fget, basestring): # fget is not a method but a method name... + if isinstance(self.fget, string_types): # fget is not a method but a method name... getattr(self._obj, self.fset)(value) else: self.fset(value) @@ -353,7 +355,7 @@ def unregisterConfigurableItem(self, item, raiseOnError=True): .. seealso:: :meth:`registerConfigProperty`, :meth:`registerConfigDelegate` ''' - if isinstance(item, basestring): + if isinstance(item, string_types): name = str(item) else: name = str(item.objectName()) diff --git a/lib/taurus/qt/qtcore/util/emitter.py b/lib/taurus/qt/qtcore/util/emitter.py index dabeb0631..a1abb7898 100644 --- a/lib/taurus/qt/qtcore/util/emitter.py +++ b/lib/taurus/qt/qtcore/util/emitter.py @@ -42,6 +42,8 @@ from functools import partial from collections import Iterable +from future.utils import string_types + import taurus from taurus.external.qt import Qt from taurus.core.util.log import Logger @@ -55,7 +57,7 @@ def isString(seq): - if isinstance(seq, basestring): + if isinstance(seq, string_types): return True # It matches most python str-like classes if any(s in str(type(seq)).lower() for s in ('vector', 'array', 'list',)): return False diff --git a/lib/taurus/qt/qtgui/base/taurusbase.py b/lib/taurus/qt/qtgui/base/taurusbase.py index f38f205fa..44dad721e 100644 --- a/lib/taurus/qt/qtgui/base/taurusbase.py +++ b/lib/taurus/qt/qtgui/base/taurusbase.py @@ -38,6 +38,7 @@ import threading from types import MethodType +from future.utils import string_types from taurus.external.qt import Qt from enum import Enum @@ -761,7 +762,7 @@ def _updateFormat(self, dtype, **kwargs): :param kwargs: keyword arguments that will be passed to :attribute:`FORMAT` if it is a callable """ - if not isinstance(self.FORMAT, basestring): + if not isinstance(self.FORMAT, string_types): # unbound method to callable if isinstance(self.FORMAT, MethodType): self.FORMAT = self.FORMAT.__func__ @@ -780,7 +781,7 @@ def setFormat(self, format): "full.module.callable" format) """ # Check if the format is a callable string representation - if isinstance(format, basestring): + if isinstance(format, string_types): try: moduleName, formatterName = format.rsplit('.', 1) __import__(moduleName) @@ -797,7 +798,7 @@ def getFormat(self): :return: (str) a string of the current format. It could be a python format string or a callable string representation. """ - if isinstance(self.FORMAT, basestring): + if isinstance(self.FORMAT, string_types): formatter = self.FORMAT else: formatter = '{0}.{1}'.format(self.FORMAT.__module__, diff --git a/lib/taurus/qt/qtgui/button/taurusbutton.py b/lib/taurus/qt/qtgui/button/taurusbutton.py index 2575d1922..208c33253 100644 --- a/lib/taurus/qt/qtgui/button/taurusbutton.py +++ b/lib/taurus/qt/qtgui/button/taurusbutton.py @@ -34,6 +34,8 @@ __docformat__ = 'restructuredtext' +from future.utils import string_types + from taurus.external.qt import Qt from taurus.core.taurusbasetypes import LockStatus, TaurusLockInfo from taurus.core.taurusdevice import TaurusDevice @@ -448,7 +450,7 @@ def setParameters(self, parameters): quotes will be removed and the quoted text will not be splitted. ''' - if isinstance(parameters, (basestring, Qt.QString)): + if isinstance(parameters, string_types+ (Qt.QString,)): parameters = str(parameters).strip() if parameters[0] in ('"', "'") and parameters[0] == parameters[-1]: parameters = [parameters[1:-1]] diff --git a/lib/taurus/qt/qtgui/compact/abstractswitcher.py b/lib/taurus/qt/qtgui/compact/abstractswitcher.py index 03e1a2893..4ba74b742 100644 --- a/lib/taurus/qt/qtgui/compact/abstractswitcher.py +++ b/lib/taurus/qt/qtgui/compact/abstractswitcher.py @@ -31,6 +31,8 @@ __docformat__ = 'restructuredtext' +from future.utils import string_types + from taurus.external.qt import Qt from taurus.qt.qtgui.container import TaurusWidget from taurus.qt.qtgui.base import TaurusBaseWritableWidget @@ -158,7 +160,7 @@ def _classifyTriggers(self, triggers): shortcuts.append(Qt.QKeySequence(e)) elif isinstance(e, Qt.QEvent.Type): eventTypes.append(e) - elif isinstance(e, (basestring, Qt.QString)): + elif isinstance(e, string_types +(Qt.QString,)): signals.append(e) else: raise TypeError('Unsupported trigger type: %s' % repr(type(e))) diff --git a/lib/taurus/qt/qtgui/container/taurusmainwindow.py b/lib/taurus/qt/qtgui/container/taurusmainwindow.py index 91b25fd3e..45ba702ac 100644 --- a/lib/taurus/qt/qtgui/container/taurusmainwindow.py +++ b/lib/taurus/qt/qtgui/container/taurusmainwindow.py @@ -38,6 +38,8 @@ import os import sys +from future.utils import string_types + from taurus import tauruscustomsettings from taurus.core.util import deprecation_decorator from taurus.external.qt import Qt @@ -57,7 +59,7 @@ def __init__(self, extapp, *args): self.textEdited.connect(self.setCmdText) def setCmdText(self, cmdargs): - if not isinstance(cmdargs, (basestring, Qt.QString)): + if not isinstance(cmdargs, string_types + (Qt.QString,)): cmdargs = " ".join(cmdargs) self.setText(cmdargs) self._extapp.setCmdArgs(self.getCmdArgs(), False) diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py index 77a3d6906..750f04f3a 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py @@ -33,6 +33,7 @@ import copy +from future.utils import string_types from guiqwt.plot import ImageDialog, CurveDialog import taurus.core @@ -85,7 +86,7 @@ def getModelClass(self): def _splitModel(self, modelNames): '''convert str to list if needed (commas and whitespace are considered as separators)''' - if isinstance(modelNames, (basestring, Qt.QString)): + if isinstance(modelNames, string_types + (Qt.QString,)): modelNames = str(modelNames).replace(',', ' ') modelNames = modelNames.split() return modelNames @@ -240,7 +241,7 @@ def getTaurusTrendItems(self): def _splitModel(self, modelNames): '''convert str to list if needed (commas and whitespace are considered as separators)''' - if isinstance(modelNames, (basestring, Qt.QString)): + if isinstance(modelNames, strin_types + (Qt.QString,)): modelNames = str(modelNames).replace(',', ' ') modelNames = modelNames.split() return modelNames diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py index c00d97bb6..00296c9b1 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py @@ -34,6 +34,9 @@ import os import traceback + +from future.utils import string_types + import taurus from taurus.external.qt import Qt from taurus.core.taurusbasetypes import TaurusElementType @@ -443,7 +446,7 @@ def getQtDesignerPluginInfo(cls): model = Qt.pyqtProperty("QString", getModel, setModel) def setSelectionStyle(self, selectionStyle): - if isinstance(selectionStyle, (Qt.QString, basestring)): + if isinstance(selectionStyle, (Qt.QString, string_types)): selectionStyle = str(selectionStyle).upper() try: selectionStyle = SynopticSelectionStyle[selectionStyle] diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py index 6350978c2..56eb0e580 100755 --- a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py +++ b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py @@ -72,7 +72,8 @@ import operator import types -from six.moves.queue import Queue +from future.utils import string_types +from queue import Queue from taurus import Manager from taurus.core import AttrQuality, DataType @@ -698,7 +699,7 @@ def getSelectionMark(self, picture=None, w=10, h=10): else: if isinstance(picture, Qt.QPixmap): pixmap = picture - elif isinstance(picture, basestring) or isinstance(picture, Qt.QString): + elif isinstance(picture, string_types) or isinstance(picture, Qt.QString): picture = str(picture) pixmap = Qt.QPixmap(os.path.realpath(picture)) SelectionMark = Qt.QGraphicsPixmapItem() diff --git a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py index 07b2895c2..c9363caf1 100644 --- a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py @@ -36,6 +36,8 @@ import re import traceback +from future.utils import string_types + import taurus from taurus.external.qt import Qt @@ -100,7 +102,7 @@ def str_to_filter(seq): # TODO: Tango-centric f = eval(seq) except: f = seq - if isinstance(f, basestring): + if isinstance(f, string_types): return {'.*': [f]} elif isinstance(f, list): return {'.*': f} diff --git a/lib/taurus/qt/qtgui/panel/taurusform.py b/lib/taurus/qt/qtgui/panel/taurusform.py index b7b95da61..ea3aeb8e3 100644 --- a/lib/taurus/qt/qtgui/panel/taurusform.py +++ b/lib/taurus/qt/qtgui/panel/taurusform.py @@ -37,6 +37,8 @@ from datetime import datetime +from future.utils import string_types + from taurus.external.qt import Qt import taurus.core @@ -169,7 +171,7 @@ def __len__(self): def _splitModel(self, modelNames): '''convert str to list if needed (commas and whitespace are considered as separators)''' - if isinstance(modelNames, (basestring, Qt.QString)): + if isinstance(modelNames, string_types + (Qt.QString,)): modelNames = str(modelNames).replace(',', ' ') modelNames = modelNames.split() return modelNames diff --git a/lib/taurus/qt/qtgui/panel/taurusinputpanel.py b/lib/taurus/qt/qtgui/panel/taurusinputpanel.py index 9366ab062..cfaacb545 100644 --- a/lib/taurus/qt/qtgui/panel/taurusinputpanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusinputpanel.py @@ -36,6 +36,8 @@ import collections import numpy +from future.utils import string_types + from taurus.external.qt import Qt from taurus.qt.qtgui.util.ui import UILoadable @@ -124,7 +126,7 @@ def create_single_input_panel(self, input_data): self.setText(input_data['prompt']) data_type = input_data.get('data_type', 'String') - is_seq = not isinstance(data_type, (str, str)) and \ + is_seq = not isinstance(data_type, string_types) and \ isinstance(data_type, collections.Sequence) if is_seq: panel, getter = self.create_selection_panel(input_data) @@ -164,7 +166,7 @@ def _create_combobox_panel(self, input_data): self._ui.inputWidget = combobox = Qt.QComboBox() items = input_data['data_type'] for item in items: - is_seq = not isinstance(item, (str, str)) and \ + is_seq = not isinstance(item, string_types) and \ isinstance(item, collections.Sequence) if is_seq: text, userData = item @@ -186,7 +188,7 @@ def _create_radiobutton_panel(self, input_data): self._ui.inputWidget = buttongroup = Qt.QButtonGroup() buttongroup.setExclusive(True) for item in items: - is_seq = not isinstance(item, (str, str)) and \ + is_seq = not isinstance(item, string_types) and \ isinstance(item, collections.Sequence) if is_seq: text, userData = item @@ -213,7 +215,7 @@ def _create_multi_selection_panel(self, input_data): default_value = input_data.get('default_value') if default_value is None: default_value = () - dft_is_seq = not isinstance(default_value, (str, str)) and \ + dft_is_seq = not isinstance(default_value, string_types) and \ isinstance(default_value, collections.Sequence) if not dft_is_seq: default_value = default_value, @@ -222,7 +224,7 @@ def _create_multi_selection_panel(self, input_data): listwidget.setSelectionMode(Qt.QAbstractItemView.MultiSelection) for item in items: - is_seq = not isinstance(item, (str, str)) and \ + is_seq = not isinstance(item, string_types) and \ isinstance(item, collections.Sequence) if is_seq: text, userData = item diff --git a/lib/taurus/qt/qtgui/panel/taurusmodellist.py b/lib/taurus/qt/qtgui/panel/taurusmodellist.py index 2c24f5210..7f1474b2a 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmodellist.py +++ b/lib/taurus/qt/qtgui/panel/taurusmodellist.py @@ -35,6 +35,8 @@ import copy +from future.utils import string_types + from taurus.external.qt import Qt import taurus from taurus.core.taurushelper import getSchemeFromName @@ -259,7 +261,7 @@ def insertItems(self, row, items): for e in items: if isinstance(e, TaurusModelItem): itemobjs.append(e) - elif isinstance(e, basestring): + elif isinstance(e, string_types): itemobjs.append(TaurusModelItem(src=e)) else: # assuming it is a sequence of arguments that can be passed to the constructor of TaurusModelItem itemobjs.append(TaurusModelItem(*e)) diff --git a/lib/taurus/qt/qtgui/plot/taurusplot.py b/lib/taurus/qt/qtgui/plot/taurusplot.py index dcf4ea970..f9090a26e 100644 --- a/lib/taurus/qt/qtgui/plot/taurusplot.py +++ b/lib/taurus/qt/qtgui/plot/taurusplot.py @@ -45,7 +45,10 @@ import copy from datetime import datetime import time + import numpy +from future.utils import string_types + from taurus.external.qt import Qt, Qwt5 import taurus @@ -3256,7 +3259,7 @@ def resetGridWidth(self): #-~-~-~-~-~-~-~-~-~-~-~-~ def _splitModel(self, modelNames): '''convert str to list if needed (commas and whitespace are considered as separators)''' - if isinstance(modelNames, (basestring, Qt.QString)): + if isinstance(modelNames, string_types + (Qt.QString,)): modelNames = str(modelNames).replace(',', ' ') modelNames = modelNames.split() return modelNames diff --git a/lib/taurus/qt/qtgui/table/qdictionary.py b/lib/taurus/qt/qtgui/table/qdictionary.py index 2f18f40c8..a3fe4e9a2 100644 --- a/lib/taurus/qt/qtgui/table/qdictionary.py +++ b/lib/taurus/qt/qtgui/table/qdictionary.py @@ -35,7 +35,10 @@ import sys import taurus + import numpy +from future.utils import string_types + from taurus.core.util.containers import SortedDict from taurus.external.qt import Qt from taurus.qt.qtgui.container import TaurusBaseContainer, TaurusWidget @@ -46,7 +49,7 @@ def isString(seq): - if isinstance(seq, basestring): + if isinstance(seq, string_types): return True # It matches most python str-like classes if any(s in str(type(seq)).lower() for s in ('vector', 'array', 'list',)): return False diff --git a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py index ffbefb7f6..162694d5f 100644 --- a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py +++ b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py @@ -38,6 +38,7 @@ import weakref import inspect +from future.utils import string_types from lxml import etree import taurus @@ -1121,7 +1122,7 @@ def loadConfiguration(self, confname): # Synoptics SYNOPTIC = getattr(conf, 'SYNOPTIC', None) - if isinstance(SYNOPTIC, basestring): # old config file style + if isinstance(SYNOPTIC, string_types): # old config file style self.warning( 'Deprecated usage of SYNOPTIC keyword (now it expects a list of paths). Please update your configuration file to: "SYNOPTIC=[\'%s\']".' % SYNOPTIC) SYNOPTIC = [SYNOPTIC] diff --git a/lib/taurus/qt/qtgui/taurusgui/utils.py b/lib/taurus/qt/qtgui/taurusgui/utils.py index 457476c71..8ec5a6da4 100644 --- a/lib/taurus/qt/qtgui/taurusgui/utils.py +++ b/lib/taurus/qt/qtgui/taurusgui/utils.py @@ -33,7 +33,10 @@ import os import sys + from lxml import etree +from future.utils import string_types + from taurus.qt.qtgui.util import ExternalAppAction from taurus.qt.qtgui.util import TaurusWidgetFactory from taurus.core.util.log import Logger @@ -384,7 +387,7 @@ def fromPanel(panel): sharedDataWrite = None sharedDataRead = None model = getattr(panel.widget(), 'model', None) - if model is None or isinstance(model, basestring): + if model is None or isinstance(model, string_types): pass elif hasattr(model, '__iter__'): # if model is a sequence, convert to space-separated string diff --git a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py index a3722d502..bc793719a 100644 --- a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py +++ b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py @@ -47,6 +47,8 @@ import traceback from functools import partial +from future.utils import string_types + # @todo: icons_dev_tree is not an included or standard module. # Is anybody using it? If not, the following lines should be removed and # the TaurusDevTree.setStateIcon method should be cleaned @@ -938,7 +940,7 @@ def expandNode(self, node=None, expand=True): """ Needed to do threaded expansion of the tree """ if node is None: node = self.getNode() - if isinstance(node, (basestring, Qt.QString)): + if isinstance(node, string_types + (Qt.QString,)): name, node = str(node), self.getNode(node) else: name = self.getNodeText(node) diff --git a/lib/taurus/qt/qtgui/util/taurusaction.py b/lib/taurus/qt/qtgui/util/taurusaction.py index 0fd82fa18..816e5a0a8 100644 --- a/lib/taurus/qt/qtgui/util/taurusaction.py +++ b/lib/taurus/qt/qtgui/util/taurusaction.py @@ -45,6 +45,8 @@ import os import xml.dom.minidom +from future.utils import string_types + from taurus.external.qt import Qt from taurus.core.taurushelper import getSchemeFromName from taurus.qt.qtcore.configuration import BaseConfigurableClass @@ -71,7 +73,7 @@ def __init__(self, cmdargs, text=None, icon=None, parent=None, interactive=True) :param icon: (QIcon or any other object that can be passed to QIcon creator) see :class:`Qt.QAction` :param parent: (QObject) The parent object ''' - if isinstance(cmdargs, (basestring, Qt.QString)): + if isinstance(cmdargs, string_types + (Qt.QString,)): import shlex cmdargs = shlex.split(str(cmdargs)) self.path = os.path.realpath(cmdargs and cmdargs[0] or '') @@ -79,7 +81,7 @@ def __init__(self, cmdargs, text=None, icon=None, parent=None, interactive=True) text = os.path.basename(cmdargs and cmdargs[0] or '') if icon is None: icon = Qt.QIcon.fromTheme(self.DEFAULT_ICON_NAME) - elif isinstance(icon, basestring): + elif isinstance(icon, string_types): tmp = Qt.QIcon.fromTheme(icon) if not tmp.isNull(): icon = tmp @@ -103,7 +105,7 @@ def setCmdArgs(self, cmdargs, emitsignal=True): application. It can also be a string containing a command, which will be automatically converted to a list ''' - if isinstance(cmdargs, (basestring, Qt.QString)): + if isinstance(cmdargs, string_types + (Qt.QString,)): import shlex cmdargs = shlex.split(str(cmdargs)) self.__cmdargs = cmdargs @@ -119,7 +121,7 @@ def actionTriggered(self, args=None): import subprocess try: if args is not None: - if isinstance(args, (basestring, Qt.QString)): + if isinstance(args, string_types + (Qt.QString,)): import shlex args = shlex.split(str(args)) args = self.cmdArgs() + args diff --git a/lib/taurus/qt/qtgui/util/taurusactionfactory.py b/lib/taurus/qt/qtgui/util/taurusactionfactory.py index e3c6f7aac..a123b71f0 100644 --- a/lib/taurus/qt/qtgui/util/taurusactionfactory.py +++ b/lib/taurus/qt/qtgui/util/taurusactionfactory.py @@ -30,6 +30,8 @@ __docformat__ = 'restructuredtext' +from future.utils import string_types + from taurus.core.util.log import Logger from taurus.core.util.singleton import Singleton from taurus.external.qt import Qt @@ -130,7 +132,7 @@ def createAction(self, parent, text, shortcut=None, icon=None, tip=None, action.toggled.connect(toggled) action.setCheckable(True) if icon is not None: - if isinstance(icon, (str, str)): + if isinstance(icon, string_types): icon = Qt.QIcon.fromTheme(icon) action.setIcon(icon) if shortcut is not None: From 7fe645737217e5277797a7c90319a1cef9755716 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Mon, 9 Jul 2018 16:27:07 +0700 Subject: [PATCH 026/252] Adds missing changes to Logger. --- lib/taurus/core/util/log.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/taurus/core/util/log.py b/lib/taurus/core/util/log.py index 1674057e8..9d2c9c639 100644 --- a/lib/taurus/core/util/log.py +++ b/lib/taurus/core/util/log.py @@ -433,6 +433,8 @@ def findCaller(self, stack_info=False): if filename in (_srcfile, logging._srcfile): f = f.f_back continue + + sinfo = None if stack_info: sio = io.StringIO() sio.write('Stack (most recent call last):\n') @@ -441,7 +443,7 @@ def findCaller(self, stack_info=False): if sinfo[-1] == '\n': sinfo = sinfo[:-1] sio.close() - rv = (co.co_filename, f.f_lineno, co.co_name, stack_info) + rv = (co.co_filename, f.f_lineno, co.co_name, sinfo) break return rv From 037430c7ac73a797c022fbe2e496d069e50a417b Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Mon, 9 Jul 2018 17:20:58 +0700 Subject: [PATCH 027/252] Fixes incompatibility with python2. Python2 Logger.findCaller returns 3-element tuple. --- lib/taurus/core/util/log.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/taurus/core/util/log.py b/lib/taurus/core/util/log.py index 9d2c9c639..5edff0780 100644 --- a/lib/taurus/core/util/log.py +++ b/lib/taurus/core/util/log.py @@ -899,10 +899,9 @@ def deprecated(self, msg=None, dep=None, alt=None, rel=None, dbg_msg=None, raise Exception(msg) if _DEPRECATION_COUNT[msg] > _MAX_DEPRECATIONS_LOGGED: return - if _callerinfo is None: _callerinfo = self.log_obj.findCaller() - filename, lineno, fname, sinfo = _callerinfo + filename, lineno, fname = _callerinfo[0], _callerinfo[1], _callerinfo[2] depr_msg = warnings.formatwarning( msg, DeprecationWarning, filename, lineno) self.log_obj.warning(depr_msg, **kw) From a52caccd546a85c5ca14d28183d7e571249ad5f0 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Mon, 9 Jul 2018 17:37:24 +0700 Subject: [PATCH 028/252] Fixes wrong basestring replacement. --- lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py index 00296c9b1..15b663e24 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py @@ -446,7 +446,7 @@ def getQtDesignerPluginInfo(cls): model = Qt.pyqtProperty("QString", getModel, setModel) def setSelectionStyle(self, selectionStyle): - if isinstance(selectionStyle, (Qt.QString, string_types)): + if isinstance(selectionStyle, string_types + (Qt.QString,)): selectionStyle = str(selectionStyle).upper() try: selectionStyle = SynopticSelectionStyle[selectionStyle] From f68e3176985b034f0c0eec5368f87ffff4508baa Mon Sep 17 00:00:00 2001 From: piertoni Date: Mon, 9 Jul 2018 16:34:30 +0200 Subject: [PATCH 029/252] add requirement "future" --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 8dd4e561d..e8a1e0ddc 100644 --- a/setup.py +++ b/setup.py @@ -59,6 +59,7 @@ def get_release_info(): 'numpy>=1.1', 'enum34', 'pint>=0.8', + 'future', ] extras_require = { From 9a98d65227522b9b9b9a72935e7c9e715d3fd2d1 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Mon, 9 Jul 2018 21:34:46 +0700 Subject: [PATCH 030/252] Fixes backwardcompatibility with python2. --- lib/taurus/__init__.py | 2 +- lib/taurus/core/evaluation/evalvalidator.py | 4 +++- lib/taurus/qt/qtgui/application/taurusapplication.py | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/taurus/__init__.py b/lib/taurus/__init__.py index bb8c42f74..9cbf2afff 100644 --- a/lib/taurus/__init__.py +++ b/lib/taurus/__init__.py @@ -30,7 +30,7 @@ from .core import release as __R -class Release(object): +class Release: pass for attr, value in __R.__dict__.items(): diff --git a/lib/taurus/core/evaluation/evalvalidator.py b/lib/taurus/core/evaluation/evalvalidator.py index 569a1eb35..14aa743f4 100644 --- a/lib/taurus/core/evaluation/evalvalidator.py +++ b/lib/taurus/core/evaluation/evalvalidator.py @@ -30,6 +30,8 @@ import re import hashlib +from future.util import string_types + import taurus from taurus import isValidName, debug from taurus.core import TaurusElementType @@ -251,7 +253,7 @@ def expandExpr(expr, substmap): string containing a semi-colon separated list of symbol=value pairs can also be passed. ''' - if isinstance(substmap, str): + if isinstance(substmap, (str, unicode)): substmap = dict(K_EQUALS_V_RE.findall(substmap)) ret = expr protected = {} diff --git a/lib/taurus/qt/qtgui/application/taurusapplication.py b/lib/taurus/qt/qtgui/application/taurusapplication.py index 3d2d63d69..7e9c4471e 100644 --- a/lib/taurus/qt/qtgui/application/taurusapplication.py +++ b/lib/taurus/qt/qtgui/application/taurusapplication.py @@ -25,9 +25,9 @@ """This module provides the base :class:`taurus.qt.qtgui.application.TaurusApplication` class.""" - -from builtins import str from __future__ import with_statement +from builtins import str + __all__ = ["TaurusApplication"] From 2240f5e85e2794eb54f4312b46967b068cc4b407 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Mon, 9 Jul 2018 23:00:46 +0700 Subject: [PATCH 031/252] Fixes integer type check. Missing string type checking. --- lib/taurus/core/evaluation/evalvalidator.py | 4 ++-- lib/taurus/core/util/enumeration.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/taurus/core/evaluation/evalvalidator.py b/lib/taurus/core/evaluation/evalvalidator.py index 14aa743f4..d14a0d58d 100644 --- a/lib/taurus/core/evaluation/evalvalidator.py +++ b/lib/taurus/core/evaluation/evalvalidator.py @@ -30,7 +30,7 @@ import re import hashlib -from future.util import string_types +from future.utils import string_types import taurus from taurus import isValidName, debug @@ -253,7 +253,7 @@ def expandExpr(expr, substmap): string containing a semi-colon separated list of symbol=value pairs can also be passed. ''' - if isinstance(substmap, (str, unicode)): + if isinstance(substmap, string_types): substmap = dict(K_EQUALS_V_RE.findall(substmap)) ret = expr protected = {} diff --git a/lib/taurus/core/util/enumeration.py b/lib/taurus/core/util/enumeration.py index 02ba6d554..97d887c74 100644 --- a/lib/taurus/core/util/enumeration.py +++ b/lib/taurus/core/util/enumeration.py @@ -39,7 +39,7 @@ __docformat__ = "restructuredtext" -from future.utils import string_types +from future.utils import integer_types, string_types class EnumException(Exception): @@ -147,7 +147,7 @@ def _generateUniqueId(self): return n def __contains__(self, i): - if isinstance(i, (int, long)): + if isinstance(i, integer_types): return i in self.reverseLookup elif isinstance(i, string_types): return i in self.lookup From b065f64c8cceb664ed7eb7a4976b5eb10db2eb86 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Mon, 9 Jul 2018 23:57:07 +0700 Subject: [PATCH 032/252] Workaround to prevents testsuite from testing unittest --- lib/taurus/test/testsuite.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/taurus/test/testsuite.py b/lib/taurus/test/testsuite.py index 8cfe818be..9c2d67836 100644 --- a/lib/taurus/test/testsuite.py +++ b/lib/taurus/test/testsuite.py @@ -47,6 +47,11 @@ def _filter_suite(suite, exclude_pattern, ret=None): ret = unittest.TestSuite() for e in suite: if isinstance(e, unittest.TestCase): + + + if (e.__module__ == 'unittest.case'): + continue + if re.match(exclude_pattern, e.id()): print("Excluded %s" % e.id()) continue @@ -122,4 +127,4 @@ def main(): if __name__ == '__main__': - main() \ No newline at end of file + main() From d6414023e87aa0624c50157f9fe088503d3ba329 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Tue, 10 Jul 2018 00:31:35 +0700 Subject: [PATCH 033/252] Fixes Logger is incompatible with stderr. --- lib/taurus/qt/qtgui/application/taurusapplication.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/taurus/qt/qtgui/application/taurusapplication.py b/lib/taurus/qt/qtgui/application/taurusapplication.py index 7e9c4471e..7288583e3 100644 --- a/lib/taurus/qt/qtgui/application/taurusapplication.py +++ b/lib/taurus/qt/qtgui/application/taurusapplication.py @@ -67,6 +67,11 @@ def __init__(self, name='', parent=None, format=None, std=None, self.buffer = '' self.log_obj.propagate = False self.std = std + +#Trying to mimic stderr + @property + def errors(self): + return self.std.errors def addLogHandler(self, handler): """When called, set to use a private handler and DON'T send messages From 01ef62e648baa75ba3342e78c9c2a342fbf405c4 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Tue, 10 Jul 2018 17:44:45 +0700 Subject: [PATCH 034/252] Fixes incopatibility with WeakValueDictionary. --- lib/taurus/core/util/containers.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/taurus/core/util/containers.py b/lib/taurus/core/util/containers.py index 31f0dec37..eec00f25c 100644 --- a/lib/taurus/core/util/containers.py +++ b/lib/taurus/core/util/containers.py @@ -306,7 +306,7 @@ def __delitem__(self, k): class CaselessWeakValueDict(weakref.WeakValueDictionary): def __init__(self, other=None): - weakref.WeakValueDictionary.__init__(self) + weakref.WeakValueDictionary.__init__(self, other) if other: # Doesn't do keyword args if isinstance(other, dict): @@ -341,8 +341,9 @@ def setdefault(self, key, def_val=None): def update(self, other): """overwritten from :meth:`weakref.WeakValueDictionary.update`""" - for k, v in list(other.items()): - weakref.WeakValueDictionary.__setitem__(self, k.lower(), v) + if other: + for k, v in list(other.items()): + weakref.WeakValueDictionary.__setitem__(self, k.lower(), v) def fromkeys(self, iterable, value=None): d = CaselessWeakValueDict() From ec1f434bad3e4ded5d8c4368cbbe3235ed0d518e Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Tue, 10 Jul 2018 18:45:56 +0700 Subject: [PATCH 035/252] Replaces buffer with memoryview. --- lib/taurus/core/util/codecs.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/taurus/core/util/codecs.py b/lib/taurus/core/util/codecs.py index fd5a96420..346486cce 100644 --- a/lib/taurus/core/util/codecs.py +++ b/lib/taurus/core/util/codecs.py @@ -76,11 +76,19 @@ import struct import numpy +from future.utils import PY2 + from .singleton import Singleton from .log import Logger from .containers import CaselessDict +if PY2: + buffer_types = buffer, memoryview, +else: + buffer_types = memoryview, + + class Codec(Logger): """The base class for all codecs""" @@ -280,8 +288,8 @@ def decode(self, data, *args, **kwargs): return data format = data[0].partition('_')[2] - if isinstance(data[1], buffer): - data = data[0], str(data[1]) + if isinstance(data[1], buffer_types): + data = data[0], bytes(data[1]) return format, pickle.loads(data[1]) @@ -340,7 +348,7 @@ def decode(self, data, *args, **kwargs): ensure_ascii = kwargs.pop('ensure_ascii', False) - if isinstance(data[1], buffer): + if isinstance(data[1], buffer_types): data = data[0], str(data[1]) data = json.loads(data[1]) From ab4598a5bcbdc6614ce2e6bf7c7000b65b7a598b Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Wed, 11 Jul 2018 23:49:51 +0700 Subject: [PATCH 036/252] Fixes "Unicode-objects must be encoded" --- lib/taurus/core/evaluation/evalvalidator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/core/evaluation/evalvalidator.py b/lib/taurus/core/evaluation/evalvalidator.py index d14a0d58d..184afa02e 100644 --- a/lib/taurus/core/evaluation/evalvalidator.py +++ b/lib/taurus/core/evaluation/evalvalidator.py @@ -260,7 +260,7 @@ def expandExpr(expr, substmap): # temporarily replace the text within quotes by hash-based placeholders for s in QUOTED_TEXT_RE.findall(expr): - placeholder = hashlib.md5(s).hexdigest() + placeholder = hashlib.md5(s.encode('utf-8')).hexdigest() protected[placeholder] = s ret = re.sub(s, placeholder, ret) From d0d7c2b98185c22464689da6b26b8c6bc08bf733 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Thu, 12 Jul 2018 01:37:36 +0700 Subject: [PATCH 037/252] Missing 'print_function' --- lib/taurus/core/tango/test/res/TangoSchemeTest | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/taurus/core/tango/test/res/TangoSchemeTest b/lib/taurus/core/tango/test/res/TangoSchemeTest index 8deda674a..db15dd6a7 100755 --- a/lib/taurus/core/tango/test/res/TangoSchemeTest +++ b/lib/taurus/core/tango/test/res/TangoSchemeTest @@ -22,6 +22,8 @@ # along with Taurus. If not, see . ## ############################################################################# +from __future__ import print_function + import numpy from time import (time, sleep) @@ -495,7 +497,7 @@ class TangoSchemeTest(Device): AttrQuality.ATTR_VALID) sleep(self.sleeptime) except Exception as e: - print 'Exception in update loop', e + print('Exception in update loop', e) sleep(1) def init_device(self): From 57d61b53703ec9c0d563da560ed417689ce47029 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Thu, 12 Jul 2018 01:49:50 +0700 Subject: [PATCH 038/252] enum34 incompatible with python3.6 See https://bitbucket.org/stoneleaf/enum34/issues/19/enum34-isnt-compatible-with-python-36 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 8dd4e561d..36a3470af 100644 --- a/setup.py +++ b/setup.py @@ -57,11 +57,11 @@ def get_release_info(): install_requires = [ 'numpy>=1.1', - 'enum34', 'pint>=0.8', ] extras_require = { + ':python_version<"3.4"': ['enum34'], 'taurus-qt': ['qtpy >=1.2.1', # 'PyQt4 >=4.8', # 'PyQt4.Qwt5 >=5.2.0', # [Taurus-Qt-Plot] From d0e3ad1bdcd659e4779470b0b1df487e0b05cbc8 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Thu, 12 Jul 2018 02:47:46 +0700 Subject: [PATCH 039/252] Fixes '03' is invalid token. For Python3, octal representation of integer starts with '0o' ( e.g. 0o3, 0o4). --- lib/taurus/core/test/test_taurushelper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/taurus/core/test/test_taurushelper.py b/lib/taurus/core/test/test_taurushelper.py index 03a038c2f..252471bac 100644 --- a/lib/taurus/core/test/test_taurushelper.py +++ b/lib/taurus/core/test/test_taurushelper.py @@ -255,7 +255,7 @@ def get_object(self, name=None, klass=None): @insertTest(helper_name='get_object', name='eval:@Foo') @insertTest(helper_name='get_object', name='eval://dev=Foo') @insertTest(helper_name='get_object', name='eval:@datetime.*') -@insertTest(helper_name='get_object', name='eval:@d=datetime.date(2017,03,29)') +@insertTest(helper_name='get_object', name='eval:@d=datetime.date(2017,3,29)') class DeviceTestCase(unittest.TestCase): '''TestCase for the taurus.Device helper''' @@ -404,7 +404,7 @@ def get_object(self, name=None, klass=None): label='Q("1km").to("mm").magnitude', type=DataType.Float)) @insertTest(helper_name='read_attr', - name='eval:@d=datetime.date(1931,04,14)/d.isoformat()', + name='eval:@d=datetime.date(1931,4,14)/d.isoformat()', expected=dict(rvalue='1931-04-14', value='1931-04-14', wvalue=None, w_value=None, label='d.isoformat()', From e3e019240bb6533a72b378a3418db0b2e2184c51 Mon Sep 17 00:00:00 2001 From: piertoni Date: Thu, 12 Jul 2018 15:46:46 +0200 Subject: [PATCH 040/252] fix typo --- lib/taurus/qt/qtgui/extra_guiqwt/plot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py index 750f04f3a..436b25020 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py @@ -241,7 +241,7 @@ def getTaurusTrendItems(self): def _splitModel(self, modelNames): '''convert str to list if needed (commas and whitespace are considered as separators)''' - if isinstance(modelNames, strin_types + (Qt.QString,)): + if isinstance(modelNames, string_types + (Qt.QString,)): modelNames = str(modelNames).replace(',', ' ') modelNames = modelNames.split() return modelNames From a5eb856d0eafb7c0ea9ecf8463a607075265a146 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Fri, 13 Jul 2018 02:27:12 +0700 Subject: [PATCH 041/252] Pythonic way of checking endianness. --- lib/taurus/core/util/codecs.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/taurus/core/util/codecs.py b/lib/taurus/core/util/codecs.py index 346486cce..a876ccbfc 100644 --- a/lib/taurus/core/util/codecs.py +++ b/lib/taurus/core/util/codecs.py @@ -74,6 +74,7 @@ # need by VideoImageCodec import struct +import sys import numpy from future.utils import PY2 @@ -669,7 +670,7 @@ def __unpackHeader(self, header): def __packHeader(self, imgMode, frameNumber, width, height): magic = 0x5644454f version = 1 - endian = ord(struct.pack('=H', 1)[-1]) + endian = 0 if sys.byteorder == 'little' else 1 hsize = struct.calcsize(self.VIDEO_HEADER_FORMAT) return struct.pack(self.VIDEO_HEADER_FORMAT, magic, From 82ae0befac0e13188f46d635a9946099b734988a Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Fri, 13 Jul 2018 14:14:02 +0700 Subject: [PATCH 042/252] Fixes 'DevFailed' object does not support indexing. --- lib/taurus/core/tango/tangodevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/core/tango/tangodevice.py b/lib/taurus/core/tango/tangodevice.py index 310477e87..94f3f0822 100755 --- a/lib/taurus/core/tango/tangodevice.py +++ b/lib/taurus/core/tango/tangodevice.py @@ -203,7 +203,7 @@ def _createHWObject(self): try: return DeviceProxy(self.getFullName()) except DevFailed as e: - self.warning('Could not create HW object: %s' % (e[0].desc)) + self.warning('Could not create HW object: %s' % (e.args[0].desc)) self.traceback() @taurus4_deprecation(alt="getDeviceProxy()") From 289d08b86dc944498cb707e82ebef5382d23fc0e Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Fri, 13 Jul 2018 14:19:46 +0700 Subject: [PATCH 043/252] ZIPCodec expects bytes. --- lib/taurus/core/util/test/test_codecs.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/taurus/core/util/test/test_codecs.py b/lib/taurus/core/util/test/test_codecs.py index 20702ef2f..0543ca876 100644 --- a/lib/taurus/core/util/test/test_codecs.py +++ b/lib/taurus/core/util/test/test_codecs.py @@ -37,17 +37,17 @@ @insertTest(helper_name='encDec', cname='json', data=[1, 2, 3]) -@insertTest(helper_name='encDec', cname='zip', data='foobar') +@insertTest(helper_name='encDec', cname='zip', data=b'foobar') @insertTest(helper_name='encDec', cname='zip_json', data=[1, 2, 3]) @insertTest(helper_name='encDec', cname='videoimage', data=numpy.ones((2, 2), dtype='uint8')) @insertTest(helper_name='encDec', cname='zip_null_zip_videoimage', data=numpy.ones((2, 2), dtype='uint8')) @insertTest(helper_name='dec', cname='videoimage', - data='VDEO\x00\x01\x00\x07\x00\x00\x00\x00\x00\x00\x00' + - '\x01\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00 ' + - '\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01' + - '\x01\x01\x01\x01\x01\x01\x01\x01', + data=b'VDEO\x00\x01\x00\x07\x00\x00\x00\x00\x00\x00\x00' + + b'\x01\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00 ' + + b'\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01' + + b'\x01\x01\x01\x01\x01\x01\x01\x01', expected=numpy.ones((2, 2, 3), dtype='uint8')) class CodecTest(unittest.TestCase): '''TestCase for checking codecs''' From ecb914e00690a111600c65656acc125154aa37e6 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Fri, 13 Jul 2018 14:20:57 +0700 Subject: [PATCH 044/252] JSONCodec should return bytes. --- lib/taurus/core/util/codecs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/core/util/codecs.py b/lib/taurus/core/util/codecs.py index a876ccbfc..075776238 100644 --- a/lib/taurus/core/util/codecs.py +++ b/lib/taurus/core/util/codecs.py @@ -332,7 +332,7 @@ def encode(self, data, *args, **kwargs): format += '_%s' % data[0] # make it compact by default kwargs['separators'] = kwargs.get('separators', (',', ':')) - return format, json.dumps(data[1], *args, **kwargs) + return format, json.dumps(data[1], *args, **kwargs).encode('utf-8') def decode(self, data, *args, **kwargs): """decodes the given data from a json string. From 68589601ff3b9bd4671157975d703a40a0039b6d Mon Sep 17 00:00:00 2001 From: piertoni Date: Fri, 13 Jul 2018 15:36:43 +0200 Subject: [PATCH 045/252] add .vscode --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 95e02ca2d..45a6f3d8e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ doc/~thumbnails.zip *.swp *.orig .eggs/ +.vscode/ From 2bc36dfe848ed51e3f8ae34ff72d4ad6c1fc9687 Mon Sep 17 00:00:00 2001 From: piertoni Date: Fri, 13 Jul 2018 15:50:36 +0200 Subject: [PATCH 046/252] remove unnecessary print --- lib/taurus/test/moduleexplorer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/taurus/test/moduleexplorer.py b/lib/taurus/test/moduleexplorer.py index 922191555..fc345523f 100644 --- a/lib/taurus/test/moduleexplorer.py +++ b/lib/taurus/test/moduleexplorer.py @@ -221,6 +221,7 @@ def main(modulename='taurus', exclude_patterns=( print(w) print('*' * 50 + '\n') print() + print(len(allw)) assert len(allw) == 0 # import pprint From 229182c8e55539a28be6f184ab59bd830190dd8b Mon Sep 17 00:00:00 2001 From: Piergiorgio Pancino Date: Sun, 15 Jul 2018 11:29:37 +0200 Subject: [PATCH 047/252] patch Pytango.DevFailed exception unpacking --- lib/taurus/core/tango/tangoattribute.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/taurus/core/tango/tangoattribute.py b/lib/taurus/core/tango/tangoattribute.py index 60248a6e3..6fc48b48f 100755 --- a/lib/taurus/core/tango/tangoattribute.py +++ b/lib/taurus/core/tango/tangoattribute.py @@ -443,7 +443,7 @@ def write(self, value, with_read=True): dev.write_attribute(name, value) return None except PyTango.DevFailed as df: - err = df[0] + err = df.args[0] self.error("[Tango] write failed (%s): %s" % (err.reason, err.desc)) raise df @@ -478,7 +478,7 @@ def poll(self, single=True, value=None, time=None, error=None): self.__attr_value = value except PyTango.DevFailed as df: self.__subscription_event.set() - self.debug("Error polling: %s" % df[0].desc) + self.debug("Error polling: %s" % df.args[0].desc) self.traceback() self.fireEvent(TaurusEventType.Error, self.__attr_err) except Exception as e: @@ -523,7 +523,7 @@ def read(self, cache=True): except PyTango.DevFailed as df: self.__attr_value = None self.__attr_err = df - err = df[0] + err = df.args[0] self.debug("[Tango] read failed (%s): %s", err.reason, err.desc) raise df @@ -690,12 +690,12 @@ def _unsubscribeEvents(self): self.__dev_hw_obj.unsubscribe_event(self.__chg_evt_id) self.__chg_evt_id = None except PyTango.DevFailed as df: - if len(df.args) and df[0].reason == 'API_EventNotFound': + if len(df.args) and df.args[0].reason == 'API_EventNotFound': # probably tango shutdown has been initiated before and # it unsubscribed from events itself pass else: - self.debug("Failed: %s", df[0].desc) + self.debug("Failed: %s", df.args[0].desc) self.trace(str(df)) self._deactivatePolling() self.__subscription_state = SubscriptionState.Unsubscribed From 262977ef80923ac1d1516c91217611f73ce2535d Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Mon, 16 Jul 2018 17:16:40 +0700 Subject: [PATCH 048/252] Mutliple creation-deletion of taurus application lead to sigfault. This commit provides a work a round. --- lib/taurus/qt/qtgui/application/taurusapplication.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/taurus/qt/qtgui/application/taurusapplication.py b/lib/taurus/qt/qtgui/application/taurusapplication.py index 7288583e3..c4ec11939 100644 --- a/lib/taurus/qt/qtgui/application/taurusapplication.py +++ b/lib/taurus/qt/qtgui/application/taurusapplication.py @@ -176,6 +176,7 @@ class TaurusApplication(Qt.QApplication, Logger): For more details on taurus command line parsing check :mod:`taurus.core.util.argparse`. """ + __app = None def __init__(self, *args, **kwargs): """The constructor. Parameters are the same as QApplication plus a @@ -258,6 +259,7 @@ def __init__(self, *args, **kwargs): self.__registerQtLogger() self.__registerExtensions() self.__redirect_std() + TaurusApplication.__app = self def __registerQtLogger(self): import taurus.qt.qtcore.util @@ -373,3 +375,10 @@ def exec_(*args, **kwargs): from taurus import info info('\n*********************\n%s', _DEPRECATION_COUNT.pretty()) return ret + + counter = 0 + @staticmethod + def instance(*args): + print('XXX',TaurusApplication.counter) + TaurusApplication.counter +=1 + return Qt.QApplication.instance(*args) From 05d36c7166daff9f8a070435b206f4c1a04b4749 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Mon, 16 Jul 2018 21:57:41 +0700 Subject: [PATCH 049/252] DevFailed does not support indexing. --- lib/taurus/core/tango/tangoattribute.py | 10 +++++----- lib/taurus/qt/qtgui/panel/taurusmessagepanel.py | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/taurus/core/tango/tangoattribute.py b/lib/taurus/core/tango/tangoattribute.py index 60248a6e3..a7ac86881 100755 --- a/lib/taurus/core/tango/tangoattribute.py +++ b/lib/taurus/core/tango/tangoattribute.py @@ -429,7 +429,7 @@ def write(self, value, with_read=True): dev.write_attribute(name, value) result = dev.read_attribute(name) except PyTango.DevFailed as df: - for err in df: + for err in df.args: # Handle old device servers if err.reason == 'API_UnsupportedFeature': dev.write_attribute(name, value) @@ -443,7 +443,7 @@ def write(self, value, with_read=True): dev.write_attribute(name, value) return None except PyTango.DevFailed as df: - err = df[0] + err = df.args[0] self.error("[Tango] write failed (%s): %s" % (err.reason, err.desc)) raise df @@ -478,7 +478,7 @@ def poll(self, single=True, value=None, time=None, error=None): self.__attr_value = value except PyTango.DevFailed as df: self.__subscription_event.set() - self.debug("Error polling: %s" % df[0].desc) + self.debug("Error polling: %s" % df.args[0].desc) self.traceback() self.fireEvent(TaurusEventType.Error, self.__attr_err) except Exception as e: @@ -523,7 +523,7 @@ def read(self, cache=True): except PyTango.DevFailed as df: self.__attr_value = None self.__attr_err = df - err = df[0] + err = df.args[0] self.debug("[Tango] read failed (%s): %s", err.reason, err.desc) raise df @@ -690,7 +690,7 @@ def _unsubscribeEvents(self): self.__dev_hw_obj.unsubscribe_event(self.__chg_evt_id) self.__chg_evt_id = None except PyTango.DevFailed as df: - if len(df.args) and df[0].reason == 'API_EventNotFound': + if len(df.args) and df.args[0].reason == 'API_EventNotFound': # probably tango shutdown has been initiated before and # it unsubscribed from events itself pass diff --git a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py index ad42ee1fd..72246d434 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py @@ -111,7 +111,7 @@ def setError(self, err_type=None, err_value=None, err_traceback=None): formatter = HtmlFormatter() style = formatter.get_style_defs() html = html_orig.format(style=style) - for de in err_value: + for de in err_value.args: e_html = """
{reason}: {desc}
{origin}
""" origin, reason, desc = de.origin, de.reason, de.desc if reason.startswith("PyDs_") and pygments is not None: @@ -120,7 +120,7 @@ def setError(self, err_type=None, err_value=None, err_traceback=None): origin = "
%s
" % origin html += e_html.format(desc=desc, origin=origin, reason=reason) html += "" - msgbox.setText(err_value[0].desc) + msgbox.setText(err_value.args[0].desc) msgbox.setDetailedHtml(html) exc_info = "".join(traceback.format_exception(err_type, err_value, @@ -208,7 +208,7 @@ def get_report_handlers(): elem, _ = os.path.splitext(elem) _is_report_handler = functools.partial( is_report_handler, abs_file=full_elem) - report_lib = __import__(elem, globals(), locals(), [], -1) + report_lib = __import__(elem, globals(), locals(), [], 0) for name, obj in inspect.getmembers(report_lib, _is_report_handler): _REPORT_HANDLERS[name] = obj finally: From 76a398abb01ed2c4d85be26e541769b2a7e0ac86 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Wed, 18 Jul 2018 01:16:25 +0700 Subject: [PATCH 050/252] Fixes relative __import__. --- lib/taurus/qt/qtgui/panel/report/albareport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/panel/report/albareport.py b/lib/taurus/qt/qtgui/panel/report/albareport.py index 86857eeff..49979279f 100644 --- a/lib/taurus/qt/qtgui/panel/report/albareport.py +++ b/lib/taurus/qt/qtgui/panel/report/albareport.py @@ -32,7 +32,7 @@ __docformat__ = 'restructuredtext' from taurus.external.qt import Qt -from .basicreport import SendMailDialog, SMTPReportHandler +from basicreport import SendMailDialog, SMTPReportHandler class SendTicketDialog(SendMailDialog): From b2f85413fdb35ba4bd919a037c7a90e0588658ec Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Wed, 18 Jul 2018 02:20:33 +0700 Subject: [PATCH 051/252] Alternative solution for relative __import__. --- lib/taurus/qt/qtgui/panel/report/albareport.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/panel/report/albareport.py b/lib/taurus/qt/qtgui/panel/report/albareport.py index 49979279f..bf2227cfb 100644 --- a/lib/taurus/qt/qtgui/panel/report/albareport.py +++ b/lib/taurus/qt/qtgui/panel/report/albareport.py @@ -26,13 +26,15 @@ """This module provides a panel to display taurus messages""" from __future__ import absolute_import +__package__ = 'taurus.qt.qtgui.panel.report' + from builtins import str __all__ = ["TicketReportHandler"] __docformat__ = 'restructuredtext' from taurus.external.qt import Qt -from basicreport import SendMailDialog, SMTPReportHandler +from .basicreport import SendMailDialog, SMTPReportHandler class SendTicketDialog(SendMailDialog): From 877ed337ae2dcc1f28aaa6b9a5ae81b9ed28de93 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Wed, 18 Jul 2018 16:13:38 +0700 Subject: [PATCH 052/252] Revert "Mutliple creation-deletion of taurus application lead to sigfault." This reverts commit 262977ef80923ac1d1516c91217611f73ce2535d. This commit was accidently added to PR. --- lib/taurus/qt/qtgui/application/taurusapplication.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/lib/taurus/qt/qtgui/application/taurusapplication.py b/lib/taurus/qt/qtgui/application/taurusapplication.py index c4ec11939..7288583e3 100644 --- a/lib/taurus/qt/qtgui/application/taurusapplication.py +++ b/lib/taurus/qt/qtgui/application/taurusapplication.py @@ -176,7 +176,6 @@ class TaurusApplication(Qt.QApplication, Logger): For more details on taurus command line parsing check :mod:`taurus.core.util.argparse`. """ - __app = None def __init__(self, *args, **kwargs): """The constructor. Parameters are the same as QApplication plus a @@ -259,7 +258,6 @@ def __init__(self, *args, **kwargs): self.__registerQtLogger() self.__registerExtensions() self.__redirect_std() - TaurusApplication.__app = self def __registerQtLogger(self): import taurus.qt.qtcore.util @@ -375,10 +373,3 @@ def exec_(*args, **kwargs): from taurus import info info('\n*********************\n%s', _DEPRECATION_COUNT.pretty()) return ret - - counter = 0 - @staticmethod - def instance(*args): - print('XXX',TaurusApplication.counter) - TaurusApplication.counter +=1 - return Qt.QApplication.instance(*args) From 759de098cd4f41a23d61e35a6f7a8bb2d4baff4f Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Wed, 18 Jul 2018 19:21:29 +0700 Subject: [PATCH 053/252] Fixes wrong type check. It is necessary check against (str, unicode) for python2. --- lib/taurus/core/evaluation/evalvalidator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/core/evaluation/evalvalidator.py b/lib/taurus/core/evaluation/evalvalidator.py index 184afa02e..b53e88cdf 100644 --- a/lib/taurus/core/evaluation/evalvalidator.py +++ b/lib/taurus/core/evaluation/evalvalidator.py @@ -366,7 +366,7 @@ def getUriGroups(self, name, strict=None): # create the groups dict with unmangled refs in its values groups = {} for n, g in list(_groups.items()): - if isinstance(g, str): # avoid None or boolean values + if isinstance(g, string_types): # avoid None or boolean values g = g.format(**refs_dict) groups[n] = g From c34e45f24787b3fd0591157cab36d0e86dc83b3f Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Wed, 18 Jul 2018 19:26:41 +0700 Subject: [PATCH 054/252] Removes unmecessary import. --- lib/taurus/core/release.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/core/release.py b/lib/taurus/core/release.py index cfd7e894a..dbd4a0723 100644 --- a/lib/taurus/core/release.py +++ b/lib/taurus/core/release.py @@ -23,7 +23,7 @@ ## ############################################################################# -from builtins import str + __docformat__ = "restructuredtext" """ From d4767355425c79ee7c0bff7cfdd911b50157dc72 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Fri, 20 Jul 2018 13:10:11 +0700 Subject: [PATCH 055/252] Moves enum34 from extras_require to install_requires. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 9e297a79d..317093ee9 100644 --- a/setup.py +++ b/setup.py @@ -59,10 +59,10 @@ def get_release_info(): 'numpy>=1.1', 'pint>=0.8', 'future', + 'enum34;python_version<"3.4"', ] extras_require = { - ':python_version<"3.4"': ['enum34'], 'taurus-qt': ['qtpy >=1.2.1', # 'PyQt4 >=4.8', # 'PyQt4.Qwt5 >=5.2.0', # [Taurus-Qt-Plot] From b045205813547490533160ee92a8af9a9970ce26 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Fri, 20 Jul 2018 14:45:09 +0700 Subject: [PATCH 056/252] Provides workaround for old setuptool (<20.2). We need PEP508. --- setup.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 317093ee9..5f9042dd1 100644 --- a/setup.py +++ b/setup.py @@ -25,7 +25,9 @@ import os import imp -from setuptools import setup, find_packages +import sys +from distutils.version import LooseVersion +from setuptools import setup, find_packages, __version__ def get_release_info(): @@ -59,9 +61,17 @@ def get_release_info(): 'numpy>=1.1', 'pint>=0.8', 'future', - 'enum34;python_version<"3.4"', ] +#Workaround for old setuptools + +if LooseVersion(__version__)=1.2.1', # 'PyQt4 >=4.8', From 66b408fcae7201780e1503861e522e1ec5325fa4 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Fri, 20 Jul 2018 15:33:23 +0700 Subject: [PATCH 057/252] In python <3.6 json.loads expects str not bytes. --- lib/taurus/core/util/codecs.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/taurus/core/util/codecs.py b/lib/taurus/core/util/codecs.py index 075776238..4009ff229 100644 --- a/lib/taurus/core/util/codecs.py +++ b/lib/taurus/core/util/codecs.py @@ -351,7 +351,9 @@ def decode(self, data, *args, **kwargs): if isinstance(data[1], buffer_types): data = data[0], str(data[1]) - + elif isinstance(data[1], bytes): + data = data[0], data[1].decode('utf-8') + data = json.loads(data[1]) if ensure_ascii: data = self._transform_ascii(data) From 4b231356b66e72bbbadeded9101457840bf59bf6 Mon Sep 17 00:00:00 2001 From: Piergiorgio Pancino Date: Sun, 22 Jul 2018 12:54:56 +0200 Subject: [PATCH 058/252] on python2 name is a bytestring but the function requires a unicode string --- lib/taurus/core/tango/tangodatabase.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/taurus/core/tango/tangodatabase.py b/lib/taurus/core/tango/tangodatabase.py index 03413ea38..aef518934 100644 --- a/lib/taurus/core/tango/tangodatabase.py +++ b/lib/taurus/core/tango/tangodatabase.py @@ -129,6 +129,7 @@ def __init__(self, container, name=None, full_name=None, alias=None, self._alive = None self._state = None self._host = host + name = str(name) # python2 compatibility self._domain, self._family, self._member = list(map(str.upper, name.split("/", 2))) self._attributes = None From df182842b03a16f1aacee6f66b39f60f8cc8e63b Mon Sep 17 00:00:00 2001 From: Piergiorgio Pancino Date: Mon, 23 Jul 2018 21:05:02 +0200 Subject: [PATCH 059/252] fix python2 and 3 metaclass compatibility --- lib/taurus/core/tango/test/res/TangoSchemeTest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/taurus/core/tango/test/res/TangoSchemeTest b/lib/taurus/core/tango/test/res/TangoSchemeTest index db15dd6a7..d047aa54b 100755 --- a/lib/taurus/core/tango/test/res/TangoSchemeTest +++ b/lib/taurus/core/tango/test/res/TangoSchemeTest @@ -23,6 +23,7 @@ ## ############################################################################# from __future__ import print_function +from future.utils import with_metaclass import numpy from time import (time, sleep) @@ -33,7 +34,7 @@ from PyTango.server import Device, DeviceMeta, attribute, run, command from threading import Thread -class TangoSchemeTest(Device): +class TangoSchemeTest(with_metaclass(DeviceMeta, Device)): """ This device server emulates the TangoTest device server for taurus test purposes (Tango schema). Only works with PyTango8. @@ -68,7 +69,6 @@ class TangoSchemeTest(Device): alarm = default_ranges["int"] warning = default_warnings["int"] """ - __metaclass__ = DeviceMeta doc = __doc__ From 6599f8e9d2979f8dcec74b4e39206cac40468d60 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 25 Jul 2018 16:02:46 +0200 Subject: [PATCH 060/252] Update how_to_release.md --- doc/how_to_release.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/how_to_release.md b/doc/how_to_release.md index 72664fd28..441531e37 100644 --- a/doc/how_to_release.md +++ b/doc/how_to_release.md @@ -11,7 +11,7 @@ of stuff that should be manually tested. 3. Work to close all the PR/issues remaining open in the milestone. This can be either done in develop or in a release branch called `release-XXX` (where `XXX` is the milestone name, e.g. `Jul17`). If a release branch is used, `develop` is freed to continue with integrations that may not be suitable for this release. On the other hand, it adds a bit more work because the release-related PRs (which are done against the `release-XXX` branch), may need to be also merged to develop. Note: the `release-XXX` branch *can* live in the taurus-org repo or on a personal fork (in which case you should do step 4.iv **now** to allow other integrators to push directly to it). 4. Create the release branch if it was not done already in the previous step and: 1. Review and update the CHANGELOG.md if necessary. See [this](http://keepachangelog.com) - 2. Bump version using `bumpversion && bumpversion release` (use [semver](http://semver.org/) criteria to choose amongst `major`, `minor` or `patch` + 2. Bump version using `bumpversion ` (use [semver](http://semver.org/) criteria to choose amongst `major`, `minor` or `patch` 3. Update man pages: ``` cd /doc @@ -22,7 +22,7 @@ of stuff that should be manually tested. 4. Create a PR to merge the `release-XXX` against the **`master`** branch of the taurus-org repo 5. Request reviews in the PR from at least one integrator from each participating institute. The master branch is protected, so the reviews need to be cleared (or dismissed with an explanation) before the release can be merged. 6. Perform manual tests (see checklist below). You may use the CI artifacts (e.g., from appveyor). To avoid spamming the PR comments with the manual test results, a new issue can be created to report the tests results on each platform (and just use a single check for each platform in the PR). -7. Once all reviews a cleared, update the date of the release in the CHANGELOG.md, merge the PR and tag in master +7. Once all reviews a cleared, update the date of the release in the CHANGELOG.md, run `bumpversion release`, push and merge the PR and tag in master 8. Merge also the `release-XXX` branch into develop, and bump the version of develop with `bumpversion patch` 9. Release to PyPI **from a clean checkout** and using [twine](https://github.com/pypa/twine): ``` From 7b4e05c0adb8607b002d2c0c986f58594cf099dd Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 25 Jul 2018 20:11:58 +0200 Subject: [PATCH 061/252] Update the manual tests checklist --- doc/how_to_release.md | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/doc/how_to_release.md b/doc/how_to_release.md index 441531e37..40d2b4ad9 100644 --- a/doc/how_to_release.md +++ b/doc/how_to_release.md @@ -52,13 +52,13 @@ Hint: this list can be used as a template to be copy-pasted on an issue linked f - [ ] For TaurusLabel, check foreground role, the background role, the prefix, the suffix, the formatter, etc. - [ ] For TaurusLabel, use a model with fragment (e.g., `sys/tg_test/1/ampli#magnitude`, `eval:Q('1mm')#unit"`) - [ ] For LCD: Test the foreground roles and the background role -- [ ] For Led: Test the colors, ON color, Off color. +- [ ] For Led: Test the colors, ON color, Off color. (hint: you can use `eval:False` as a model for testing) ### taurusplot (basically try all features described in the [user's guide](http://taurus-scada.org/en/latest/users/ui/index.html) - [ ] Execute: `taurusplot "eval:Q(rand(333),'mm')" sys/tg_test/1/wave` -- [ ] Check region Zoom in and out with region zoom and go back stacked zoom levels with +- [ ] Check region Zoom in and out with region zoom and go back stacked zoom levels with the mouse middle button - [ ] Check mouse wheel Zoom - [ ] Test panning (dragging with CTRL pressed) - [ ] Test inspector mode @@ -67,6 +67,8 @@ Hint: this list can be used as a template to be copy-pasted on an issue linked f - [ ] Test plot configuration dialog - [ ] Test changing curve titles - [ ] Test Save & restore config (change curve properties, zoom, etc & check that everything is restored) +- [ ] Open the "Input data selection" dialog and add/remove/reorder /edit models +- [ ] export one curve data to ASCII and then load it using "Input data selection" -> raw data -> open file - [ ] ... other features from [user's guide](http://taurus-scada.org/en/latest/users/ui/index.html) ### taurustrend @@ -74,7 +76,7 @@ Hint: this list can be used as a template to be copy-pasted on an issue linked f - [ ] Execute: `taurustrend "eval:Q(rand(),'mm')" sys/tg_test/1/ampli` - [ ] Execute: `taurustrend -xe "eval:Q(rand(),'mm')" sys/tg_test/1/ampli` -- [ ] Check region Zoom in and out with region zoom and go back stacked zoom levels with +- [ ] Check region Zoom in and out with region zoom and go back stacked zoom levels with the mouse middle button - [ ] Check mouse wheel Zoom - [ ] Test panning (dragging with CTRL pressed) - [ ] Test inspector mode @@ -82,8 +84,10 @@ Hint: this list can be used as a template to be copy-pasted on an issue linked f - [ ] Move curves between axes by clicking on legend (and test zoom on Y2) - [ ] Test plot configuration dialog - [ ] Test Forced reading mode +- [ ] Test autopanning mode +- [ ] Test autoscale x mode - [ ] Test Save & restore config (change curve properties, zoom, etc & check that everything is restored) -- [ ] ... other features from [user's guide](http://taurus-scada.org/en/latest/users/ui/index.html) +- [ ] ... other features from [user's guide](http://taurus-scada.org/users/ui/index.html) ### Test taurusimage @@ -98,16 +102,6 @@ Hint: this list can be used as a template to be copy-pasted on an issue linked f - [ ] Test auto-scroll and auto-scale tools - [ ] Test Save & restore config (change axes range, zoom, tool status colormap etc & check that everything is restored) -### Tauruscurve & taurustrend1d -(unused and to be deprecated, you may test but **do not worry too much if they fail**) - -- [ ] Execute: `tauruscurve --demo` -- [ ] Change size -- [ ] Move curve with mouse -- [ ] Resize curve with mouse -- [ ] Test some option of the menu with mouse. -- [ ] Execute: `taurustrend1d "eval:Q(rand(),'mm')"` and test it in the same way - ### taurusdesigner - [ ] Check that taurusdesigner is correctly opened and taurus widgets are present in the catalog - [ ] Create an empty widget and drag various taurus widgets to it (they should be correctly dropped) @@ -123,9 +117,10 @@ Hint: this list can be used as a template to be copy-pasted on an issue linked f - [ ] Navigate in the tree and select the TangoTest device (the attr an command panels should be populated) ### taurusform -(basically try all features described in the [user's guide](http://taurus-scada.org/en/latest/users/ui/index.html) +(basically try all features described in the [user's guide](http://taurus-scada.org/users/ui/index.html) - [ ] Launch `taurusform sys/tg_test/1/short_scalar` +- [ ] go to label context menu, change the configuration and set range to (-1000, 1000), alarm to (-500, 500) and unit to `mm`. Close the form and relaunch. The new units should be used. Change the the write value and check that the orange color is used when in warning values, and that the write widget does not allow to write values out of range. - [ ] Test to drag and drop of this attribute onto the same form many times (4 times) (If it crashes, you are seeing bug #96) - [ ] Open "Modify Contents" and add sys/tg_test/1 and all of its attributes. They should all show ok @@ -133,16 +128,16 @@ Hint: this list can be used as a template to be copy-pasted on an issue linked f value (from the context menu of a value label) - [ ] Test compact mode for all values (from the context menu of the whole form) - [ ] Test changing labels -- [ ] Test changing the formatter for a single value (from the context menu of a value label) (use, e.g. `>>{}<<`) +- [ ] Test changing the formatter for a single value (from the context menu of a value label) (use, e.g. `>>{}<<`). Do this in compact and non compact modes. - [ ] Test changing the formatter for all values (from the context menu of the whole form) - [ ] Test re-order of values with "Modify contents" - [ ] Test the different "show" buttons (tables, images, spectra) - [ ] Change the write widget of double_scalar by a TaurusWheelEdit - [ ] Change other read and write widgets -- [ ] ... other features from [user's guide](http://taurus-scada.org/en/latest/users/ui/index.html) +- [ ] ... other features from [user's guide](http://taurus-scada.org/users/ui/index.html) ### taurusgui -(basically try all features described in the [user's guide](http://taurus-scada.org/en/latest/users/ui/index.html) +(basically try all features described in the [user's guide](http://taurus-scada.org/users/ui/index.html) - [ ] Launch `taurusgui example01` - [ ] Test (un)lock view @@ -156,7 +151,7 @@ Hint: this list can be used as a template to be copy-pasted on an issue linked f - [ ] Create a new TaurusGui (call it `foogui`) with `taurusgui --new-gui` (follow the wizard) - [ ] Install `foogui` with pip (using a virtualenv may be a good idea) - [ ] launch `foogui` using the script that has been installed -- [ ] ... other features from [user's guide](http://taurus-scada.org/en/latest/users/ui/index.html) +- [ ] ... other features from [user's guide](http://taurus-scada.org/users/ui/index.html) ### taurusconfigbrowser From 68baeba331e2bc974c8f3de0eb8d5d812f6b71c1 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 26 Jul 2018 16:56:17 +0200 Subject: [PATCH 062/252] Bump version 4.4.0 to 4.4.1-alpha --- .bumpversion.cfg | 2 +- lib/taurus/core/release.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index d7e9f411c..38e2cba1e 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -3,7 +3,7 @@ commit = True message = Bump version {current_version} to {new_version} tag = False tag_name = {new_version} -current_version = 4.4.0 +current_version = 4.4.1-alpha parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\-(?P[a-z]+))? serialize = {major}.{minor}.{patch}-{release} diff --git a/lib/taurus/core/release.py b/lib/taurus/core/release.py index f4a960686..d52b3629c 100644 --- a/lib/taurus/core/release.py +++ b/lib/taurus/core/release.py @@ -48,7 +48,7 @@ # we use semantic versioning (http://semver.org/) and we update it using the # bumpversion script (https://github.com/peritus/bumpversion) -version = '4.4.0' +version = '4.4.1-alpha' # generate version_info and revision (**deprecated** since version 4.0.2-dev). if '-' in version: From 8b3c42b1e7e655eb5456419c711830ea25bc5ec1 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Mon, 30 Jul 2018 19:40:10 +0700 Subject: [PATCH 063/252] In PyTango 9.2.0 DeviceMeta is a function. We can not pass it as argument to future.util.with_metaclass. Since PyTango 9.2.1, DeviceMeta is a Metaclass. --- .../core/tango/test/res/TangoSchemeTest | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/taurus/core/tango/test/res/TangoSchemeTest b/lib/taurus/core/tango/test/res/TangoSchemeTest index d047aa54b..abf7734d8 100755 --- a/lib/taurus/core/tango/test/res/TangoSchemeTest +++ b/lib/taurus/core/tango/test/res/TangoSchemeTest @@ -25,16 +25,38 @@ from __future__ import print_function from future.utils import with_metaclass +from distutils.version import LooseVersion import numpy from time import (time, sleep) +import PyTango from PyTango import DeviceProxy, AttrWriteType, DevState, AttrQuality -from PyTango.server import Device, DeviceMeta, attribute, run, command +from PyTango.server import Device, DeviceMeta, LatestDeviceImpl, attribute, run, command from threading import Thread -class TangoSchemeTest(with_metaclass(DeviceMeta, Device)): +""" +We should check PyTango version +If it lower than 9.2.0 then DeviceMeta is a function and we can not use directly. +""" + +if LooseVersion(PyTango.__version__) Date: Mon, 20 Aug 2018 12:16:17 +0200 Subject: [PATCH 064/252] Handle exception when adding listener to non-ready device TangoDevice.addListener() fails to handle an exception when a second listener is added and the device is not ready. Handle it. Fixes #791 --- lib/taurus/core/tango/tangodevice.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/taurus/core/tango/tangodevice.py b/lib/taurus/core/tango/tangodevice.py index 7f5899516..590a8559d 100755 --- a/lib/taurus/core/tango/tangodevice.py +++ b/lib/taurus/core/tango/tangodevice.py @@ -281,7 +281,12 @@ def addListener(self, listener): if weWereListening: # We were listening already, so we must fake an event to the new # subscribed listener with the current value - evt_value = self.__decode(self.stateObj.read()) + try: + evt_value = self.__decode(self.stateObj.read()) + except: + # the value may not be available (e.g. if device is not ready) + self.debug('Cannot read state') + return ret listeners = hasattr(listener, '__iter__') and listener or [ listener] self.fireEvent(TaurusEventType.Change, evt_value, listeners) From 24ec9b1337cf39f740a56ce862168b99828a6d61 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 20 Aug 2018 18:13:21 +0200 Subject: [PATCH 065/252] Avoid deprecation warning in TaurusDevicePanel TaurusDevicePanel triggers a deprecation warning when showing the state. Use the new API to avoid the warning. --- lib/taurus/qt/qtgui/panel/taurusdevicepanel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py index 870482001..f410a5ceb 100644 --- a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py @@ -217,7 +217,7 @@ def __init__(self, parent=None, model=None, palette=None, bound=True): self._stateframe.layout().addWidget(Qt.QLabel('State'), 0, 0, Qt.Qt.AlignCenter) self._statelabel = TaurusLabel(self._stateframe) self._statelabel.setMinimumWidth(100) - self._statelabel.setBgRole('value') + self._statelabel.setBgRole('rvalue') self._stateframe.layout().addWidget(self._statelabel, 0, 1, Qt.Qt.AlignCenter) self._statusframe = Qt.QScrollArea(self) From dc3a6f5b4afa06cc411ee84ca3d062d60177708d Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 21 Aug 2018 15:55:49 +0200 Subject: [PATCH 066/252] Exclude taurus.qt.qtgui.plot from import tests for py3 The plot submodule requires PyQt4.Qwt5, which is not available for python3. Exclude it from the import test in this case. --- lib/taurus/test/test_import.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/taurus/test/test_import.py b/lib/taurus/test/test_import.py index 24c9e00dc..a06f8000e 100644 --- a/lib/taurus/test/test_import.py +++ b/lib/taurus/test/test_import.py @@ -27,6 +27,7 @@ from __future__ import absolute_import from builtins import zip +import sys import unittest @@ -59,6 +60,10 @@ def testImportSubmodules(self): except ImportError: exclude_patterns.append(r'taurus\.core\.epics') + if sys.version_info.major > 2: + # PyQwt4.Qwt5 not available for PY3 + exclude_patterns.append(r'taurus\.qt\.qtgui\.plot') + moduleinfo, wrn = self.explore('taurus', verbose=False, exclude_patterns=exclude_patterns) From bfa82af1195f8e2119d4e40edf8e6aa99b5908e3 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 22 Aug 2018 11:46:05 +0200 Subject: [PATCH 067/252] Set QWheel minimum height (Fix #788) Fix #788 by explicitly setting the minimum height of the QWheel widget when it is being constructed. --- lib/taurus/qt/qtgui/input/qwheel.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/taurus/qt/qtgui/input/qwheel.py b/lib/taurus/qt/qtgui/input/qwheel.py index b71db84f8..bfb7fa027 100755 --- a/lib/taurus/qt/qtgui/input/qwheel.py +++ b/lib/taurus/qt/qtgui/input/qwheel.py @@ -325,6 +325,15 @@ def _build(self): self.getDecDigitCount()) ed.setVisible(False) self._editor = ed + + # set the minimum height for the widget + # (otherwise the hints seem to be ignored by the layouts) + min_height = max(ed.minimumSizeHint().height(), + signLabel.minimumSizeHint().height()) + if self.getShowArrowButtons(): + min_height += 2 * _ArrowButton.ButtonSize + self.setMinimumHeight(min_height) + self.clearWarning() def _clear(self): @@ -864,6 +873,7 @@ def resetShowArrowButtons(self): def main(): + import taurus.qt.qtgui.icon # otherwise the arrows don't show in the demo global arrowWidget def resetAll(): From 32c311a28c3e18349ea935cc4bdcf33349d06dda Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 22 Aug 2018 13:40:53 +0200 Subject: [PATCH 068/252] (m) (doc) fix formatting issue in docstring --- lib/taurus/qt/qtgui/base/taurusbase.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/base/taurusbase.py b/lib/taurus/qt/qtgui/base/taurusbase.py index 66dda2663..af384a09e 100644 --- a/lib/taurus/qt/qtgui/base/taurusbase.py +++ b/lib/taurus/qt/qtgui/base/taurusbase.py @@ -702,7 +702,7 @@ def displayValue(self, v): - dtype: the data type of the value to be formatted - basecomponent: the affected widget - The following are some examples for customizing the formatting:: + The following are some examples for customizing the formatting: - Change the format for widget instance `foo`:: From 7f15b3eead24ba2579d49d044bf605cdee7a859e Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 22 Aug 2018 14:07:03 +0200 Subject: [PATCH 069/252] Avoid unnecessary usage of past.builtins.basestring An import of past.builtins.basestring was introduced for py2-3 compat, but it is not needed. Remove it to make the code more idiomatic while fixing a sphinx warning. --- lib/taurus/core/resource/resfactory.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/taurus/core/resource/resfactory.py b/lib/taurus/core/resource/resfactory.py index 65097b254..49446c73d 100644 --- a/lib/taurus/core/resource/resfactory.py +++ b/lib/taurus/core/resource/resfactory.py @@ -28,7 +28,6 @@ """ from __future__ import absolute_import -from past.builtins import basestring import os import imp import operator @@ -95,7 +94,7 @@ def reloadResource(self, obj=None, priority=1, name=None): name, mod = self.__reloadResource(obj) obj = {} for k, v in list(mod.__dict__.items()): - if not k.startswith('_') and isinstance(v, basestring): + if not k.startswith('_') and isinstance(v, str): obj[k] = v else: raise TypeError From ab3e37e6211c1900a4bdb4f3a60c4de76b98ec3f Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 22 Aug 2018 14:08:17 +0200 Subject: [PATCH 070/252] (doc) Fix a sphinx warning due to a typo in a docstring --- lib/taurus/core/util/containers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/core/util/containers.py b/lib/taurus/core/util/containers.py index eec00f25c..075a5f13c 100644 --- a/lib/taurus/core/util/containers.py +++ b/lib/taurus/core/util/containers.py @@ -326,7 +326,7 @@ def __contains__(self, key): return weakref.WeakValueDictionary.__contains__(self, key.lower()) def has_key(self, key): - """overwritten from :meth:`weakref.WeakValueDictionary + """overwritten from :meth:`weakref.WeakValueDictionary` (needed for python2) """ return key in self From 7f24e3350c906456627bc5e5ca55a49d21810070 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 22 Aug 2018 16:24:10 +0200 Subject: [PATCH 071/252] Filter out from testsuite those tests that fail to load On PY3, the unittest.defaultTestLoader.discover returns test cases also for modules that fail to import (this is different from the PY2 behaviour). This means that the testsuite fails if there are submodules that cannot be imported. Exclude the modules which are known to be unimportable in PY3. --- lib/taurus/test/testsuite.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/taurus/test/testsuite.py b/lib/taurus/test/testsuite.py index 9c2d67836..ebc82a9c4 100644 --- a/lib/taurus/test/testsuite.py +++ b/lib/taurus/test/testsuite.py @@ -36,20 +36,30 @@ __docformat__ = 'restructuredtext' import os +import sys import re import unittest import taurus +PY3_EXCLUDED = ( + 'unittest.loader._FailedTest.taurus.qt.qtgui.plot', + 'unittest.loader._FailedTest.taurus.qt.qtgui.extra_sardana', + 'unittest.loader._FailedTest.taurus.qt.qtgui.extra_pool', + 'unittest.loader._FailedTest.taurus.qt.qtgui.extra_macroexecutor') + def _filter_suite(suite, exclude_pattern, ret=None): """removes TestCases from a suite based on regexp matching on the Test id""" if ret is None: ret = unittest.TestSuite() for e in suite: if isinstance(e, unittest.TestCase): - - if (e.__module__ == 'unittest.case'): + if e.__module__ == 'unittest.case': + continue + + if sys.version_info.major > 2 and e.id() in PY3_EXCLUDED: + print("Excluded %s" % e.id()) continue if re.match(exclude_pattern, e.id()): @@ -83,7 +93,6 @@ def run(disableLogger=True, exclude_pattern='(?!)'): def main(): - import sys import taurus.test.skip import argparse from taurus import Release From d52d69059ff526b88cdf3be2a075ff074bf45cb2 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 22 Aug 2018 16:51:55 +0200 Subject: [PATCH 072/252] Avoid import error on PY3 Delay import of TaurusPlot to avoid import error in extra_nexus module when using PY3 --- lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py b/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py index 782a3e626..0cc8e04fa 100644 --- a/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py +++ b/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py @@ -37,7 +37,6 @@ from taurus.external.qt import Qt from taurus.qt.qtgui.container import TaurusWidget -from taurus.qt.qtgui.plot import TaurusPlot class NeXusInfoWidget(Qt.QTabWidget): @@ -130,6 +129,7 @@ def neXusPreviewWidgetFactory(self, ddict): node = ddict['name'] data = self.__nexusFile[node] if len(data.shape) == 1 and isinstance(data[0], (numpy.floating, numpy.integer, int, float)): + from taurus.qt.qtgui.plot import TaurusPlot w = TaurusPlot() w.attachRawData({"x": numpy.arange(len(data)), "y": data}) else: From e93fc561763a5ecf2778e28f4178b1e7013c353d Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 24 Aug 2018 12:54:20 +0200 Subject: [PATCH 073/252] Exclude qtgui.plot and builtins from auto-api creation for PY3 On PY3, we get sphinx warnings due to attempts to document explicitly imported builtin classes. Exclude them from the api rst autogeneration. Also exclude the taurus.qt.qtgui.plot (at least until it is importable under PY3. --- doc/source/conf.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/source/conf.py b/doc/source/conf.py index d3cb8d42d..340f6999f 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -65,6 +65,12 @@ def _build_doc_api(): 'taurus\.qt\.qtgui\.resource', 'taurus\.qt\.qtgui\.taurusgui\.conf', ] + if sys.version_info.major > 2: + excl += [ + 'taurus\.qt\.qtgui\.plot', # for now plot fails to import in PY3 + '.*\.(object|zip|str)', # avoid warnings from builtins + ] + rstCreator = API_Creator(exclude_patterns=excl, templatespath=_doc_dir, overwrite_old=True, From 35d6fe52590829296d1779ef1df2d30b228c3ca4 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 24 Aug 2018 12:55:30 +0200 Subject: [PATCH 074/252] (m) make API autogeneration less verbose --- doc/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index 340f6999f..63055ef5a 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -74,7 +74,7 @@ def _build_doc_api(): rstCreator = API_Creator(exclude_patterns=excl, templatespath=_doc_dir, overwrite_old=True, - verbose=True) + verbose=False) # clean previously existing rst files rstCreator.cleanAutogenerated(_api_dir) # generate api From 157caf250715e198740cfe7ee2cd9a8de570eefc Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 24 Aug 2018 12:56:53 +0200 Subject: [PATCH 075/252] (m) (doc) add docstring to TangoAttribute.isState For some reason it was generating a sphinx warning... which disapears when defining the docstring. --- lib/taurus/core/tango/tangoattribute.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/taurus/core/tango/tangoattribute.py b/lib/taurus/core/tango/tangoattribute.py index 3af2691ca..d132b6f7d 100755 --- a/lib/taurus/core/tango/tangoattribute.py +++ b/lib/taurus/core/tango/tangoattribute.py @@ -361,6 +361,9 @@ def isBoolean(self, inc_array=False): return False def isState(self): + """ + returns whether the attribute of tango DevState type + """ tgtype = self._tango_data_type return tgtype == PyTango.CmdArgType.DevState From db9b5280f42687336f455862acc59cf557abe95d Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 24 Aug 2018 13:02:54 +0200 Subject: [PATCH 076/252] Insstall future when testing taurus in appveyor --- ci/win-test.bat | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ci/win-test.bat b/ci/win-test.bat index be73200a2..1ba3d3195 100644 --- a/ci/win-test.bat +++ b/ci/win-test.bat @@ -14,6 +14,9 @@ pip install pint :: Install enum34 pip install enum34 +:: Install enum34 +pip install future + :: Install guiqwt :: TODO, install guiqwt from pypi :: pip install --upgrade guiqwt From c7f484bea18ea27c962dcd134db598bffd47f142 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 24 Aug 2018 15:14:39 +0200 Subject: [PATCH 077/252] Workaround import error in h5py when building docs sphinx build is failing for PY2 on travis due to a bug in h5py <2.8 (debian-stretch uses 2.7): https://github.com/h5py/h5py/issues/803 Work around it by defining the locale to utf-8 when building the docs --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 702969d85..1fbab951b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,7 +35,10 @@ script: - set -e - docker exec -t taurus-test /bin/bash -c "cd /taurus ; python setup.py install" - docker exec -t taurus-test /bin/bash -c "TAURUS_STARTER_WAIT=5 taurustestsuite -e 'taurus\.core\.util\.test\.test_timer'" - - docker exec -t taurus-test /bin/bash -c "cd /taurus ; sphinx-build -qW doc/source/ build/sphinx/html" + # build docs. The use of LANG=C.UTF-8 is a workaround to avoid an + # import error related to https://github.com/h5py/h5py/issues/803 + # note: the problem is fixed in h5py 2.8 (but debian9 uses 2.7) + - docker exec -t taurus-test /bin/bash -c "cd /taurus ; LANG=C.UTF-8 sphinx-build -qW doc/source/ build/sphinx/html" # deploy sphinx-built docs to taurus-doc repo - if [[ "$DOCKER_IMG" == "cpascual/taurus-test:debian-stretch" && "$TRAVIS_REPO_SLUG" == "taurus-org/taurus" ]]; then pip install doctr ; From 38a7770a94dba758173dedcecb2b5a81c041b1b9 Mon Sep 17 00:00:00 2001 From: Piergiorgio Pancino Date: Sun, 26 Aug 2018 11:12:30 +0200 Subject: [PATCH 078/252] give the same appearance to taurusdemo on py2 and py3 sorting widget groups --- lib/taurus/qt/qtgui/panel/taurusdemo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/panel/taurusdemo.py b/lib/taurus/qt/qtgui/panel/taurusdemo.py index ea0f2583d..432ca47fa 100644 --- a/lib/taurus/qt/qtgui/panel/taurusdemo.py +++ b/lib/taurus/qt/qtgui/panel/taurusdemo.py @@ -66,7 +66,7 @@ def __init__(self, parent=None): group = parts[-2] groups.add(group) - for group in groups: + for group in sorted(groups): self.addGroup(group) for demo_name in sorted(demos.keys()): From a447ce66880eb83aebd525bd6e578b16c34b7f35 Mon Sep 17 00:00:00 2001 From: Piergiorgio Pancino Date: Sun, 26 Aug 2018 11:42:08 +0200 Subject: [PATCH 079/252] fix string compatibility, add to_str function and py2and3 module --- lib/taurus/core/util/py2and3.py | 6 ++++++ lib/taurus/qt/qtgui/display/tauruslabel.py | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 lib/taurus/core/util/py2and3.py diff --git a/lib/taurus/core/util/py2and3.py b/lib/taurus/core/util/py2and3.py new file mode 100644 index 000000000..5fe848f38 --- /dev/null +++ b/lib/taurus/core/util/py2and3.py @@ -0,0 +1,6 @@ +def to_str(bytes_or_str, errors=None): + if isinstance(bytes_or_str, bytes): + value = bytes_or_str.decode("utf-8", errors=errors) + else: + value = bytes_or_str + return value \ No newline at end of file diff --git a/lib/taurus/qt/qtgui/display/tauruslabel.py b/lib/taurus/qt/qtgui/display/tauruslabel.py index f20cc1576..275e5e011 100644 --- a/lib/taurus/qt/qtgui/display/tauruslabel.py +++ b/lib/taurus/qt/qtgui/display/tauruslabel.py @@ -44,6 +44,7 @@ from taurus.qt.qtgui.base import TaurusScalarAttributeControllerHelper from taurus.qt.qtgui.base import TaurusConfigurationControllerHelper from taurus.qt.qtgui.base import updateLabelBackground +from taurus.core.util.py2and3 import to_str _QT_PLUGIN_INFO = { 'module': 'taurus.qt.qtgui.display', @@ -118,8 +119,8 @@ def _updateToolTip(self, label): toolTip = label.getFormatedToolTip() if self._trimmedText: toolTip = u"

Value: %s


%s" %\ - (str(self._text, errors='replace'), - str(str(toolTip), errors='replace')) + (to_str(self._text, errors='replace'), + to_str(toolTip, errors='replace')) label.setToolTip(toolTip) _updateBackground = updateLabelBackground From 92ec744e9c49ad9529fbd7b2a5c4ab9addafd851 Mon Sep 17 00:00:00 2001 From: cfalcon Date: Mon, 27 Aug 2018 10:34:05 +0200 Subject: [PATCH 080/252] Fix TaurusValueLineEdit ignores #wvalue.magnitude fragment Line edits are failing to act on #wvalue.magnitude fragments. The validator is not initialized when setValue is called in the postAttach method. Fix #797 overwriting the postAttach method. --- lib/taurus/qt/qtgui/input/tauruslineedit.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/taurus/qt/qtgui/input/tauruslineedit.py b/lib/taurus/qt/qtgui/input/tauruslineedit.py index ca5aad229..8331ce63a 100755 --- a/lib/taurus/qt/qtgui/input/tauruslineedit.py +++ b/lib/taurus/qt/qtgui/input/tauruslineedit.py @@ -105,6 +105,18 @@ def notifyValueChanged(self, *args): """reimplement to avoid autoapply on every partial edition""" self.emitValueChanged() + def postAttach(self): + """reimplemented from :class:`TaurusBaseWritableWidget`""" + TaurusBaseWritableWidget.postAttach(self) + if self.isAttached(): + try: + value = self.getModelObj().read(cache=True) + self._updateValidator(value) + v = value.wvalue + except: + v = None + self.setValue(v) + def handleEvent(self, evt_src, evt_type, evt_value): # handle the case in which the line edit is not yet initialized From e02797437a8ee9801b67cdd7120a60e5056a9bd9 Mon Sep 17 00:00:00 2001 From: Piergiorgio Pancino Date: Mon, 27 Aug 2018 19:13:30 +0200 Subject: [PATCH 081/252] string 2and3 compatibility --- lib/taurus/external/qt/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/taurus/external/qt/__init__.py b/lib/taurus/external/qt/__init__.py index 5404ad295..618f7a2f6 100644 --- a/lib/taurus/external/qt/__init__.py +++ b/lib/taurus/external/qt/__init__.py @@ -31,6 +31,7 @@ import os from taurus.core.util import log as __log from taurus import tauruscustomsettings as __config +from taurus.core.util.py2and3 import to_str # -------------------------------------------------------------------------- # Deprecated (in Jul17) pending to be removed later on @@ -156,7 +157,7 @@ def taurusMessageHandler(msg_type, log_ctx, msg): elif hasattr(QtCore, "qInstallMsgHandler"): def taurusMsgHandler(msg_type, msg): f = QT_LEVEL_MATCHER.get(msg_type) - return f("Qt: " + msg) + return f(u"Qt: " + to_str(msg, errors="replace")) QtCore.qInstallMsgHandler(taurusMsgHandler) From 86b79ea006715709294b023eed053b077335d548 Mon Sep 17 00:00:00 2001 From: cfalcon Date: Tue, 28 Aug 2018 10:41:14 +0200 Subject: [PATCH 082/252] Fix TaurusForm "Set Format" option does not work in compact mode The compact elements of a taurusform ignore the set format option. Propagate the format when the read widget is compacted and vice versa. Fix #787 --- lib/taurus/qt/qtgui/panel/taurusform.py | 4 ++-- lib/taurus/qt/qtgui/panel/taurusvalue.py | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/taurus/qt/qtgui/panel/taurusform.py b/lib/taurus/qt/qtgui/panel/taurusform.py index 1f959352b..f1db5fdc1 100644 --- a/lib/taurus/qt/qtgui/panel/taurusform.py +++ b/lib/taurus/qt/qtgui/panel/taurusform.py @@ -386,7 +386,7 @@ def onSetFormatter(self): format = TaurusWidget.onSetFormatter(self) if format is not None: for item in self.getItems(): - rw = item.readWidget() + rw = item.readWidget(followCompact=True) if hasattr(rw, 'setFormat'): rw.setFormat(format) return format @@ -397,7 +397,7 @@ def setFormat(self, format): """ TaurusWidget.setFormat(self, format) for item in self.getItems(): - rw = item.readWidget() + rw = item.readWidget(followCompact=True) if hasattr(rw, 'setFormat'): rw.setFormat(format) diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py index c052cef25..f50d3e983 100644 --- a/lib/taurus/qt/qtgui/panel/taurusvalue.py +++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py @@ -442,8 +442,9 @@ def onSetFormatter(self): """ Reimplemented to call onSetFormatter of the read widget (if provided) """ - if hasattr(self._readWidget, 'onSetFormatter'): - return self._readWidget.onSetFormatter() + rw = readWidget(followCompact=True) + if hasattr(rw, 'onSetFormatter'): + return rw.onSetFormatter() def setFormat(self, format): """ @@ -1086,11 +1087,20 @@ def resetExtraWidgetClass(self): def setCompact(self, compact): if compact == self._compact: return + + # Backup the current RW format + rw = self.readWidget(followCompact=True) + format = rw.getFormat() + self._compact = compact if self.getModel(): self.updateReadWidget() self.updateWriteWidget() + # Apply the format to the new RW + rw = self.readWidget(followCompact=True) + rw.setFormat(format) + def isCompact(self): return self._compact From e4b689c91881b121acad8449e2d8bbe40f3c7360 Mon Sep 17 00:00:00 2001 From: cfalcon Date: Thu, 30 Aug 2018 12:51:50 +0200 Subject: [PATCH 083/252] Fix Taurusform: Change label fails for devices Taurus form change label context menu option does not work when the set model is a device URI. Fix #786 --- lib/taurus/qt/qtgui/display/tauruslabel.py | 12 ++++++++++-- lib/taurus/qt/qtgui/panel/taurusvalue.py | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/taurus/qt/qtgui/display/tauruslabel.py b/lib/taurus/qt/qtgui/display/tauruslabel.py index 5fe0f1ead..28dee3d8b 100644 --- a/lib/taurus/qt/qtgui/display/tauruslabel.py +++ b/lib/taurus/qt/qtgui/display/tauruslabel.py @@ -32,6 +32,7 @@ import operator import re +from taurus.core import (TaurusDevice, TaurusAttribute) from taurus.core.taurusbasetypes import (TaurusElementType, TaurusEventType, AttrQuality, TaurusDevState) from taurus.external.qt import Qt @@ -487,8 +488,15 @@ def displayValue(self, v): else: value = self._permanentText - attr = self.getModelObj() - dev = attr.getParent() + dev = None + attr = None + + modelclass = self.getModelClass() + if modelclass and issubclass(modelclass, TaurusDevice): + dev = self.getModelObj() + elif modelclass and issubclass(modelclass, TaurusAttribute): + attr = self.getModelObj() + dev = attr.getParent() try: v = value.format(dev=dev, attr=attr) diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py index c052cef25..c35944119 100644 --- a/lib/taurus/qt/qtgui/panel/taurusvalue.py +++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py @@ -105,7 +105,7 @@ def setModel(self, model): # The following is a workaround to avoid tango-centricity, but # it has the drawback that the model is not set (e.g., no tooltip) devName = self.taurusValueBuddy().getModelObj().getSimpleName() - TaurusLabel.setModel(self, None) + TaurusLabel.setModel(self, model) self.setText(devName) _BCK_COMPAT_TAGS = {'': '{attr.name}', From cb3e32f239459b4d77cbaf84bcbc2ee7418b3f7f Mon Sep 17 00:00:00 2001 From: Piergiorgio Pancino Date: Sun, 2 Sep 2018 12:19:59 +0200 Subject: [PATCH 084/252] add disclaimer --- lib/taurus/core/util/py2and3.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lib/taurus/core/util/py2and3.py b/lib/taurus/core/util/py2and3.py index 5fe848f38..97e6bfd4a 100644 --- a/lib/taurus/core/util/py2and3.py +++ b/lib/taurus/core/util/py2and3.py @@ -1,3 +1,28 @@ +#!/usr/bin/env python + +############################################################################# +## +# This file is part of Taurus +## +# http://taurus-scada.org +## +# Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain +## +# Taurus is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +## +# Taurus is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +## +# You should have received a copy of the GNU Lesser General Public License +# along with Taurus. If not, see . +## +############################################################################# + def to_str(bytes_or_str, errors=None): if isinstance(bytes_or_str, bytes): value = bytes_or_str.decode("utf-8", errors=errors) From ca1d548b253d00b1d99073dc056b67acdc586b5b Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Wed, 5 Sep 2018 23:02:01 +0700 Subject: [PATCH 085/252] Replaces list(somedict.key()) with list(somedict) and similar patters. --- lib/taurus/qt/qtcore/model/taurusdatabasemodel.py | 6 +++--- lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py | 4 ++-- lib/taurus/qt/qtgui/panel/qdataexportdialog.py | 2 +- lib/taurus/qt/qtgui/panel/taurusdemo.py | 4 ++-- lib/taurus/qt/qtgui/plot/qwtdialog.py | 2 +- lib/taurus/qt/qtgui/plot/taurusplot.py | 10 +++++----- lib/taurus/qt/qtgui/plot/taurustrend.py | 4 ++-- lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py | 2 +- lib/taurus/qt/qtgui/tree/taurusdevicetree.py | 2 +- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py index 78af505aa..e7a0b57fd 100644 --- a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py +++ b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py @@ -554,15 +554,15 @@ def setupModelData(self, data): data = data.deviceTree() rootItem = self._rootItem - for domain in list(data.keys()): + for domain in data: families = data[domain] domainItem = TaurusTreeDeviceDomainItem( self, domain.upper(), rootItem) - for family in list(families.keys()): + for family in families: members = families[family] familyItem = TaurusTreeDeviceFamilyItem( self, family.upper(), domainItem) - for member in list(members.keys()): + for member in members: dev = members[member] memberItem = TaurusTreeDeviceItem( self, dev, parent=familyItem) diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py index 70734e162..1603188de 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py @@ -215,8 +215,8 @@ def readLabelObj(self, item, params): # it is parsed as a float vAlignment = int(params.get('vAlignment', 0)) hAlignment = int(params.get('hAlignment', 0)) - assert(vAlignment in list(VALIGNMENT.keys())) - assert(hAlignment in list(ALIGNMENT.keys())) + assert(vAlignment in VALIGNMENT) + assert(hAlignment in ALIGNMENT) vAlignment = VALIGNMENT[vAlignment] hAlignment = ALIGNMENT[hAlignment] item.setAlignment(hAlignment | vAlignment) diff --git a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py index fbb3c5b8f..e4079575a 100755 --- a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py +++ b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py @@ -79,7 +79,7 @@ def setDataSets(self, datadict, sortedNames=None): self.datadict = datadict self.dataSetCB.clear() self.dataSetCB.insertItems(0, sortedNames) - if len(list(self.datadict.keys())) > 1: + if len(self.datadict) > 1: self.dataSetCB.insertItems( 0, [self.allInSingleFile, self.allInMultipleFiles]) diff --git a/lib/taurus/qt/qtgui/panel/taurusdemo.py b/lib/taurus/qt/qtgui/panel/taurusdemo.py index ea0f2583d..8071e9140 100644 --- a/lib/taurus/qt/qtgui/panel/taurusdemo.py +++ b/lib/taurus/qt/qtgui/panel/taurusdemo.py @@ -61,7 +61,7 @@ def __init__(self, parent=None): groups = set() - for demo_name in list(demos.keys()): + for demo_name in demos: parts = demo_name.split(".") group = parts[-2] groups.add(group) @@ -69,7 +69,7 @@ def __init__(self, parent=None): for group in groups: self.addGroup(group) - for demo_name in sorted(demos.keys()): + for demo_name in sorted(demos): demo_func = demos[demo_name] parts = demo_name.split(".") group = parts[-2] diff --git a/lib/taurus/qt/qtgui/plot/qwtdialog.py b/lib/taurus/qt/qtgui/plot/qwtdialog.py index 336437052..f87614dd7 100644 --- a/lib/taurus/qt/qtgui/plot/qwtdialog.py +++ b/lib/taurus/qt/qtgui/plot/qwtdialog.py @@ -283,7 +283,7 @@ def str2deltatime(self, strtime): 24, 'w': 3600 * 24 * 7, 'y': 3600 * 24 * 365} if strtime.lower() == "now": return time.time() - if strtime[-1] in list(timeunits.keys()): + if strtime[-1] in timeunits: try: return float(strtime[:-1]) * timeunits[strtime[-1]] except Exception as e: diff --git a/lib/taurus/qt/qtgui/plot/taurusplot.py b/lib/taurus/qt/qtgui/plot/taurusplot.py index f9ddce87d..5a9c06388 100644 --- a/lib/taurus/qt/qtgui/plot/taurusplot.py +++ b/lib/taurus/qt/qtgui/plot/taurusplot.py @@ -1943,7 +1943,7 @@ def clearAllRawData(self): """ self.curves_lock.acquire() try: - names = [name for name in list(self.curves.keys()) if self.curves[ + names = [name for name in self.curves if self.curves[ name].isRawData] finally: self.curves_lock.release() @@ -2001,7 +2001,7 @@ def updateCurves(self, names): xnames.append(xname) ynames.append(yname) - del_curves = [name for name in list(self.curves.keys()) + del_curves = [name for name in self.curves if name not in ynames] # if all curves were removed, reset the color palette @@ -2410,7 +2410,7 @@ def createConfig(self, allowUnpickable=False, curvenames=None, **kwargs): self.curves_lock.acquire() try: if curvenames is None: - curvenames = list(self.curves.keys()) + curvenames = list(self.curves) curvenames = self._lowerIfInsensitive(curvenames) for name in curvenames: curve = self.curves.get(name) @@ -2536,7 +2536,7 @@ def setEventFilters(self, filters=None, curvenames=None, preqt=False): See :meth:`TaurusBaseComponent.setEventFilters` ''' if curvenames is None: - curvenames = list(self.curves.keys()) + curvenames = list(self.curves) self.curves_lock.acquire() try: for name in curvenames: @@ -3743,7 +3743,7 @@ def main(): w.setModel(models) if options.export_file is not None: - curves = dict.fromkeys(list(w.trendSets.keys()), 0) + curves = dict.fromkeys(w.trendSets, 0) def exportIfAllCurves(curve, trend=w, counters=curves): curve = str(curve) diff --git a/lib/taurus/qt/qtgui/plot/taurustrend.py b/lib/taurus/qt/qtgui/plot/taurustrend.py index 67988ddbf..2a345bed2 100644 --- a/lib/taurus/qt/qtgui/plot/taurustrend.py +++ b/lib/taurus/qt/qtgui/plot/taurustrend.py @@ -117,7 +117,7 @@ def __init__(self, name, parent=None, curves=None): self._orderedCurveNames = [] else: self._curves = curves - self._orderedCurveNames = list(curves.keys()) + self._orderedCurveNames = list(curves) self._titleText = None self.setModel(name) @@ -1931,7 +1931,7 @@ def main(): w.setModel(models) # export option if options.export_file is not None: - curves = dict.fromkeys(list(w.trendSets.keys()), 0) + curves = dict.fromkeys(list(w.trendSets), 0) def exportIfAllCurves(curve, trend=w, counters=curves): curve = str(curve) diff --git a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py index b0d0e8393..fd4d9561e 100644 --- a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py +++ b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py @@ -1490,7 +1490,7 @@ def loadXml(self, fname): root = etree.fromstring(xml) # print self.Pages - for pageNumber in range(len(list(self.Pages.keys()))): + for pageNumber in range(len(self.Pages)): self.page(pageNumber).fromXml(root) def getXml(self): diff --git a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py index bc793719a..a360fe289 100644 --- a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py +++ b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py @@ -647,7 +647,7 @@ def loadTree(self, filters): dct = self.getTangoDict(filters) else: # if isMap(filters): self.setWindowTitle('TaurusDevTree:%s' % - ','.join(list(filters.keys()))) + ','.join(list(filters))) def expand_dict(d): return [x for v in list(d.values()) for x in (expand_dict(v) if hasattr(v, 'values') else (v,))] From 2e55afb33cbb6dd67110cd6f4a646e041c031d02 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Wed, 5 Sep 2018 23:34:29 +0700 Subject: [PATCH 086/252] Missing fix. --- lib/taurus/qt/qtgui/plot/taurustrend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/plot/taurustrend.py b/lib/taurus/qt/qtgui/plot/taurustrend.py index 2a345bed2..d742a5257 100644 --- a/lib/taurus/qt/qtgui/plot/taurustrend.py +++ b/lib/taurus/qt/qtgui/plot/taurustrend.py @@ -1931,7 +1931,7 @@ def main(): w.setModel(models) # export option if options.export_file is not None: - curves = dict.fromkeys(list(w.trendSets), 0) + curves = dict.fromkeys(w.trendSets, 0) def exportIfAllCurves(curve, trend=w, counters=curves): curve = str(curve) From 7141e56a0f7f5831a92c634289981c8fca146bc1 Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Thu, 6 Sep 2018 01:24:14 +0700 Subject: [PATCH 087/252] Replaces for i in list(somedict.values()) to for i in somedict.values(). --- lib/taurus/core/tango/tangodatabase.py | 18 ++++++++---------- lib/taurus/core/tango/tangodevice.py | 2 +- lib/taurus/core/taurusdevice.py | 2 +- lib/taurus/core/taurusmanager.py | 2 +- lib/taurus/qt/qtdesigner/tauruspluginplugin.py | 2 +- lib/taurus/qt/qtgui/base/taurusbase.py | 2 +- lib/taurus/qt/qtgui/graphic/taurusgraphic.py | 2 +- lib/taurus/qt/qtgui/plot/taurusplot.py | 11 +++++------ lib/taurus/qt/qtgui/taurusgui/macrolistener.py | 2 +- lib/taurus/qt/qtgui/taurusgui/taurusgui.py | 4 ++-- lib/taurus/qt/qtgui/tree/taurusdevicetree.py | 2 +- 11 files changed, 23 insertions(+), 26 deletions(-) diff --git a/lib/taurus/core/tango/tangodatabase.py b/lib/taurus/core/tango/tangodatabase.py index aef518934..b4debb387 100644 --- a/lib/taurus/core/tango/tangodatabase.py +++ b/lib/taurus/core/tango/tangodatabase.py @@ -111,8 +111,7 @@ def addDevice(self, dev): def getDeviceNames(self): if not hasattr(self, "_device_name_list"): - self._device_name_list = sorted(map(TangoDevInfo.name, - list(self._devices.values()))) + self._device_name_list = sorted(map(TangoDevInfo.name, self._devices.values())) return self._device_name_list @@ -252,13 +251,12 @@ def devices(self): def getDeviceNames(self): if not hasattr(self, "_device_name_list"): - self._device_name_list = sorted(map(TangoDevInfo.name, - list(self._devices.values()))) + self._device_name_list = sorted(map(TangoDevInfo.name, self._devices.values())) return self._device_name_list def getClassNames(self): if not hasattr(self, "_klass_name_list"): - klasses = set(map(TangoDevInfo.klass, list(self._devices.values()))) + klasses = set(map(TangoDevInfo.klass, self._devices.values())) self._klass_name_list = sorted(map(TangoDevClassInfo.name, klasses)) return self._klass_name_list @@ -293,7 +291,7 @@ def alive(self): try: self._alivePending = True alive = True - for d in list(self.devices().values()): + for d in self.devices().values(): alive = d.alive() if not alive: break @@ -431,13 +429,13 @@ def getDeviceNames(self): :return: (sequence) a sequence with all registered device names""" if self._device_name_list is None: self._device_name_list = sorted( - map(TangoDevInfo.name, list(self.devices().values()))) + map(TangoDevInfo.name, self.devices().values())) return self._device_name_list def getAliasNames(self): if self._alias_name_list is None: self._alias_name_list = sorted( - map(TangoDevInfo.alias, list(self.aliases().values()))) + map(TangoDevInfo.alias, self.aliases().values())) return self._alias_name_list def getServerNames(self): @@ -446,7 +444,7 @@ def getServerNames(self): :return: (sequence) a sequence with all registered server names""" if self._server_name_list is None: self._server_name_list = sorted( - map(TangoServInfo.name, list(self.servers().values()))) + map(TangoServInfo.name, self.servers().values())) return self._server_name_list def getClassNames(self): @@ -455,7 +453,7 @@ def getClassNames(self): :return: (sequence) a sequence with all registered device classes""" if self._klass_name_list is None: self._klass_name_list = sorted( - map(TangoDevClassInfo.name, list(self.klasses().values()))) + map(TangoDevClassInfo.name, self.klasses().values())) return self._klass_name_list def deviceTree(self): diff --git a/lib/taurus/core/tango/tangodevice.py b/lib/taurus/core/tango/tangodevice.py index 2dca68428..e172e7911 100755 --- a/lib/taurus/core/tango/tangodevice.py +++ b/lib/taurus/core/tango/tangodevice.py @@ -326,7 +326,7 @@ def __decode(self, event_value): def __pollResult(self, attrs, ts, result, error=False): if error: - for attr in list(attrs.values()): + for attr in attrs.values(): attr.poll(single=False, value=None, error=result, time=ts) return diff --git a/lib/taurus/core/taurusdevice.py b/lib/taurus/core/taurusdevice.py index a6979df82..af4e909e7 100755 --- a/lib/taurus/core/taurusdevice.py +++ b/lib/taurus/core/taurusdevice.py @@ -126,7 +126,7 @@ def poll(self, attrs, asynch=False, req_id=None): # synchronous polling. if asynch is True: return 1 - for attr in list(attrs.values()): + for attr in attrs.values(): attr.poll() @property diff --git a/lib/taurus/core/taurusmanager.py b/lib/taurus/core/taurusmanager.py index 2e0e3cfcc..4f7ed119f 100755 --- a/lib/taurus/core/taurusmanager.py +++ b/lib/taurus/core/taurusmanager.py @@ -381,7 +381,7 @@ def _get_plugin_classes(self): self.debug('Failed to inspect %s' % (full_module_name)) self.debug('Details:', exc_info=1) continue - for s in list(m.__dict__.values()): + for s in m.__dict__.values(): plugin = None try: if (issubclass(s, TaurusFactory) diff --git a/lib/taurus/qt/qtdesigner/tauruspluginplugin.py b/lib/taurus/qt/qtdesigner/tauruspluginplugin.py index 86744cfa8..2abb98f93 100644 --- a/lib/taurus/qt/qtdesigner/tauruspluginplugin.py +++ b/lib/taurus/qt/qtdesigner/tauruspluginplugin.py @@ -119,7 +119,7 @@ def __init__(self, parent=None): def customWidgets(self): if self._widgets is None: - self._widgets = [w(self) for w in list(_plugins.values())] + self._widgets = [w(self) for w in _plugins.values()] return self._widgets if __name__ != "__main__": diff --git a/lib/taurus/qt/qtgui/base/taurusbase.py b/lib/taurus/qt/qtgui/base/taurusbase.py index e689083c1..c81383f02 100644 --- a/lib/taurus/qt/qtgui/base/taurusbase.py +++ b/lib/taurus/qt/qtgui/base/taurusbase.py @@ -332,7 +332,7 @@ def fireBufferedEvents(self): but it can also be called any time the buffer needs to be flushed ''' with self._eventsBufferLock: - for evt in list(self._bufferedEvents.values()): + for evt in self._bufferedEvents.values(): self.taurusEvent.emit(*evt) self._bufferedEvents = {} diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py index 56eb0e580..9c32f6bc0 100755 --- a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py +++ b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py @@ -392,7 +392,7 @@ def getItemByPosition(self, x, y): """ This method will try first with named objects; if failed then with itemAt """ pos = Qt.QPointF(x, y) itemsAtPos = [] - for z, o in sorted((i.zValue(), i) for v in list(self._itemnames.values()) for i in v if i.contains(pos) or i.isUnderMouse()): + for z, o in sorted((i.zValue(), i) for v in self._itemnames.values() for i in v if i.contains(pos) or i.isUnderMouse()): if not hasattr(o, 'getExtensions'): self.debug( 'getItemByPosition(%d,%d): adding Qt primitive %s' % (x, y, o)) diff --git a/lib/taurus/qt/qtgui/plot/taurusplot.py b/lib/taurus/qt/qtgui/plot/taurusplot.py index 5a9c06388..a8643ebfb 100644 --- a/lib/taurus/qt/qtgui/plot/taurusplot.py +++ b/lib/taurus/qt/qtgui/plot/taurusplot.py @@ -1407,8 +1407,7 @@ def sortCurves(self, ordered=None): self.curves_lock.acquire() try: if ordered is None: - orderedObjs = sorted( - list(self.curves.values()), key=lambda curve: curve.titleText(compiled=True)) + orderedObjs = sorted(self.curves.values(), key=lambda curve: curve.titleText(compiled=True)) else: #current = self.curves.keys() # if len(ordered) != len(current) or set(map(str.lower,current)) - set(map(str.lower, ordered)): @@ -2114,7 +2113,7 @@ def parentModelChanged(self, parentmodel_name): '''See :meth:`TaurusBaseComponent.parentModelChanged`''' self.curves_lock.acquire() try: - for curve in list(self.curves.values()): + for curve in self.curves.values(): curve.setModelCheck(curve.getModel(), False) finally: self.curves_lock.release() @@ -2564,7 +2563,7 @@ def autoScaleAllAxes(self): originalXRange = self.getXAxisRange() self.curves_lock.acquire() try: - for c in list(self.curves.values()): + for c in self.curves.values(): if c.minXValue() < minX: minX = c.minXValue() if c.maxXValue() > maxX: @@ -3374,7 +3373,7 @@ def setUseParentModel(self, yesno): self.curves_lock.acquire() try: - for curve in list(self.curves.values()): + for curve in self.curves.values(): curve.setUseParentModel(yesno) finally: self.curves_lock.release() @@ -3758,7 +3757,7 @@ def exportIfAllCurves(curve, trend=w, counters=curves): if not curves: w.close() else: - for ts in list(w.trendSets.values()): + for ts in w.trendSets.values(): ts.dataChanged.connect(exportIfAllCurves) sys.exit(app.exec_()) # exit without showing the widget diff --git a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py index 02adbd384..9241fe59b 100644 --- a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py +++ b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py @@ -553,7 +553,7 @@ def __onDoorAbort(self): door.command_inout('abort') # send stop/abort to all pools pools = door.macro_server.getElementsOfType('Pool') - for pool in list(pools.values()): + for pool in pools.values(): self.info('Sending %s command to %s' % (cmd, pool.getFullName())) try: pool.getObj().command_inout(cmd) diff --git a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py index 162694d5f..a55a55d12 100644 --- a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py +++ b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py @@ -891,7 +891,7 @@ def createInstrumentsFromPool(self, macroservername): if result == Qt.QMessageBox.Abort: sys.exit() return [] - for i in list(instruments.values()): + for i in instruments.values(): i_name = i.full_name #i_name, i_unknown, i_type, i_pools = i.split() i_view = PanelDescription( @@ -918,7 +918,7 @@ def createInstrumentsFromPool(self, macroservername): # ----------------------------------------------------------- instrument_dict[i_name].model.append(e_name) # filter out empty panels - ret = [instrument for instrument in list(instrument_dict.values()) + ret = [instrument for instrument in instrument_dict.values() if len(instrument.model) > 0] return ret diff --git a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py index a360fe289..d73b6a171 100644 --- a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py +++ b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py @@ -650,7 +650,7 @@ def loadTree(self, filters): ','.join(list(filters))) def expand_dict(d): - return [x for v in list(d.values()) for x in (expand_dict(v) if hasattr(v, 'values') else (v,))] + return [x for v in d.values() for x in (expand_dict(v) if hasattr(v, 'values') else (v,))] targets = [t.upper() for t in get_matching_devices( ['*%s*' % f if '*' not in f else f for f in expand_dict(filters)])] From 4a9ccad9558fad60951171d9f931cea6a7cf8cd2 Mon Sep 17 00:00:00 2001 From: cfalcon Date: Fri, 14 Sep 2018 12:01:36 +0200 Subject: [PATCH 088/252] Avoid filtering first change event If the FILTER_OLD_TANGO_EVENTS feature is enabled the first CHANGE_EVENT could be rejected; even if the subscription state is Subscribing, causing side effects. Avoid dropping a valid change event checking the subscription state. --- lib/taurus/core/tango/tangoattribute.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/taurus/core/tango/tangoattribute.py b/lib/taurus/core/tango/tangoattribute.py index f4b0c4c41..ae21c4c74 100755 --- a/lib/taurus/core/tango/tangoattribute.py +++ b/lib/taurus/core/tango/tangoattribute.py @@ -836,6 +836,7 @@ def _pushAttrEvent(self, event): # and the given timestamp is older than the timestamp # of the cache value if (self.__attr_value is not None + and self.__subscription_state == SubscriptionState.Subscribed and filter_old_event and time < self.__attr_value.time.totime()): return [None, None] From 9d04184fafb483d64875bcb1eec531dc9c4894ab Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 17 Sep 2018 10:33:21 +0200 Subject: [PATCH 089/252] Remove unused private method The TaurusBaseWritableWidget._updateValidator() method is already marked for deletion and it is unused (reimplemented where it is really used). Remove it. --- lib/taurus/qt/qtgui/base/taurusbase.py | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/lib/taurus/qt/qtgui/base/taurusbase.py b/lib/taurus/qt/qtgui/base/taurusbase.py index af384a09e..6cc20797b 100644 --- a/lib/taurus/qt/qtgui/base/taurusbase.py +++ b/lib/taurus/qt/qtgui/base/taurusbase.py @@ -2147,31 +2147,6 @@ def updateStyle(self): v_str, model_v_str) self.setToolTip(toolTip) - def _updateValidator(self, evt_value): # TODO: Remove this method - # re-set the validator ranges if applicable - if evt_value is None: - return - v = self.validator() - if isinstance(v, Qt.QIntValidator): - bottom = evt_value.min_value - top = evt_value.max_value - bottom = int( - bottom) if bottom != TaurusConfiguration.no_min_value else -sys.maxint - top = int( - top) if top != TaurusConfiguration.no_max_value else sys.maxint - v.setRange(bottom, top) - self.debug("Validator range set to %i-%i" % (bottom, top)) - elif isinstance(v, Qt.QDoubleValidator): - bottom = evt_value.min_value - top = evt_value.max_value - bottom = float( - bottom) if bottom != TaurusConfiguration.no_min_value else -float("inf") - top = float( - top) if top != TaurusConfiguration.no_max_value else float("inf") - v.setBottom(bottom) - v.setTop(top) - self.debug("Validator range set to %f-%f" % (bottom, top)) - @classmethod def getQtDesignerPluginInfo(cls): '''reimplemented from :class:`TaurusBaseWidget`''' From b67ee85c2d54086b29918ed10a04d275fbc3da56 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 17 Sep 2018 10:36:28 +0200 Subject: [PATCH 090/252] Refactor solution to #797 The solution from a previous commit fixed the issue but still triggered an exception. Refactor it by initializing the validator right where it is needed. --- lib/taurus/qt/qtgui/input/tauruslineedit.py | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/lib/taurus/qt/qtgui/input/tauruslineedit.py b/lib/taurus/qt/qtgui/input/tauruslineedit.py index d20aa5fdc..d8a9ec73e 100755 --- a/lib/taurus/qt/qtgui/input/tauruslineedit.py +++ b/lib/taurus/qt/qtgui/input/tauruslineedit.py @@ -85,6 +85,7 @@ def __init__(self, qt_parent=None, designMode=False): def _updateValidator(self, value): """This method sets a validator depending on the data type""" + val = None if isinstance(value.wvalue, Quantity): val = self.validator() if not isinstance(val, PintValidator): @@ -105,6 +106,7 @@ def _updateValidator(self, value): else: self.setValidator(None) self.debug("Validator disabled") + return val def __decimalDigits(self, fmt): """returns the number of decimal digits from a format string @@ -129,18 +131,6 @@ def notifyValueChanged(self, *args): """reimplement to avoid autoapply on every partial edition""" self.emitValueChanged() - def postAttach(self): - """reimplemented from :class:`TaurusBaseWritableWidget`""" - TaurusBaseWritableWidget.postAttach(self) - if self.isAttached(): - try: - value = self.getModelObj().read(cache=True) - self._updateValidator(value) - v = value.wvalue - except: - v = None - self.setValue(v) - def handleEvent(self, evt_src, evt_type, evt_value): # handle the case in which the line edit is not yet initialized @@ -256,7 +246,11 @@ def setValue(self, v): # Other fragments are ignored by setValue if self.modelFragmentName == "wvalue.magnitude": try: - units = self.validator().units + validator = self.validator() + if validator is None: + value = self.getModelValueObj() + validator = self._updateValidator(value) + units = validator.units v = v.to(units).magnitude except Exception as e: self.debug('Cannot enforce fragment. Reason: %r', e) From 12f87b0d3da716b87ebb4f9d787166a454519b4a Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 17 Sep 2018 15:44:16 +0200 Subject: [PATCH 091/252] Fix exception in tangoDevice.getValueObj() The (deprecated) tangoDevice.getValueObj() method raises an exception because self.state is called as a method instead of as a property. Fix it. Note that this implies removing the possibility of calling it with "cache=False" argument and therefore this is warned if it happens. --- lib/taurus/core/tango/tangodevice.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/taurus/core/tango/tangodevice.py b/lib/taurus/core/tango/tangodevice.py index 590a8559d..26a515beb 100755 --- a/lib/taurus/core/tango/tangodevice.py +++ b/lib/taurus/core/tango/tangodevice.py @@ -168,9 +168,11 @@ def getValueObj(self, cache=True): rvalue of the returned TangoAttributeValue is now a member of TaurusDevState instead of TaurusSWDevState """ + if not cache: + self.warning('Ignoring argument `cache=False`to getValueObj()') from taurus.core.tango.tangoattribute import TangoAttrValue ret = TangoAttrValue() - ret.rvalue = self.state(cache) + ret.rvalue = self.state return ret def getDisplayDescrObj(self, cache=True): From af45acc0c9ae9cb5754b25c208f45d9b665174a7 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 17 Sep 2018 15:48:06 +0200 Subject: [PATCH 092/252] Use getModelType() instead of getModelClass() Use getModelType() instead of getModelClass() to discern between devices and attributes in TaurusLabel.displayValue() --- lib/taurus/qt/qtgui/display/tauruslabel.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/taurus/qt/qtgui/display/tauruslabel.py b/lib/taurus/qt/qtgui/display/tauruslabel.py index 28dee3d8b..66cf6520e 100644 --- a/lib/taurus/qt/qtgui/display/tauruslabel.py +++ b/lib/taurus/qt/qtgui/display/tauruslabel.py @@ -32,7 +32,6 @@ import operator import re -from taurus.core import (TaurusDevice, TaurusAttribute) from taurus.core.taurusbasetypes import (TaurusElementType, TaurusEventType, AttrQuality, TaurusDevState) from taurus.external.qt import Qt @@ -491,10 +490,10 @@ def displayValue(self, v): dev = None attr = None - modelclass = self.getModelClass() - if modelclass and issubclass(modelclass, TaurusDevice): + modeltype = self.getModelType() + if modeltype == TaurusElementType.Device: dev = self.getModelObj() - elif modelclass and issubclass(modelclass, TaurusAttribute): + elif modeltype == TaurusElementType.Attribute: attr = self.getModelObj() dev = attr.getParent() From a996cc8bec7d2bd629c931c376d3d3d9a1ddfa9e Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 17 Sep 2018 15:48:44 +0200 Subject: [PATCH 093/252] (m) Remove TODO and outdated comment --- lib/taurus/qt/qtgui/panel/taurusvalue.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py index c35944119..ce0ca626a 100644 --- a/lib/taurus/qt/qtgui/panel/taurusvalue.py +++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py @@ -99,11 +99,6 @@ def setModel(self, model): config = self.taurusValueBuddy().getLabelConfig() TaurusLabel.setModel(self, '%s#%s' % (fullname, config)) elif elementtype == TaurusElementType.Device: - # @TODO: tango-centric! - # TaurusLabel.setModel(self, '%s/state#dev_alias'%fullname) - # - # The following is a workaround to avoid tango-centricity, but - # it has the drawback that the model is not set (e.g., no tooltip) devName = self.taurusValueBuddy().getModelObj().getSimpleName() TaurusLabel.setModel(self, model) self.setText(devName) From 064a5e7e0145db04f2638a6967d9e2331061212e Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 18 Sep 2018 09:42:57 +0200 Subject: [PATCH 094/252] Fix reference error in TaurusValue.onSetFormatter Fix missing `self.` in TaurusValue.onSetFormatter --- lib/taurus/qt/qtgui/panel/taurusvalue.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py index f50d3e983..cce1eb923 100644 --- a/lib/taurus/qt/qtgui/panel/taurusvalue.py +++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py @@ -442,7 +442,7 @@ def onSetFormatter(self): """ Reimplemented to call onSetFormatter of the read widget (if provided) """ - rw = readWidget(followCompact=True) + rw = self.readWidget(followCompact=True) if hasattr(rw, 'onSetFormatter'): return rw.onSetFormatter() From 38d8e77f711e3fe71239ed6bf1d95c6b04a824cd Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 18 Sep 2018 11:27:00 +0200 Subject: [PATCH 095/252] Avoid compacting TV if there is no write widget --- lib/taurus/qt/qtgui/panel/taurusvalue.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py index cce1eb923..67df43a4a 100644 --- a/lib/taurus/qt/qtgui/panel/taurusvalue.py +++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py @@ -1085,9 +1085,15 @@ def resetExtraWidgetClass(self): self.extraWidgetClassID = 'Auto' def setCompact(self, compact): + + # don't do anything if it is already done if compact == self._compact: return + #do not switch to compact mode if the write widget is None + if compact and self.writeWidget() is None: + return + # Backup the current RW format rw = self.readWidget(followCompact=True) format = rw.getFormat() From 3c72278eb9ca8b46adc0270e8595af826e46f468 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 18 Sep 2018 15:36:55 +0200 Subject: [PATCH 096/252] (m) Raise debug message when skipping setCompact(True) --- lib/taurus/qt/qtgui/panel/taurusvalue.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py index 67df43a4a..8b48ed1f5 100644 --- a/lib/taurus/qt/qtgui/panel/taurusvalue.py +++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py @@ -1092,7 +1092,8 @@ def setCompact(self, compact): #do not switch to compact mode if the write widget is None if compact and self.writeWidget() is None: - return + self.debug('No write widget. Ignoring setCompact(True)') + return # Backup the current RW format rw = self.readWidget(followCompact=True) From a85dd00d5720c1a22985a227b6b3514fba4bb9f1 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 18 Sep 2018 15:40:14 +0200 Subject: [PATCH 097/252] Fix isues with format setting propagation in forms When setting the format, TaurusForms should propagate to TaurusValue and TaurusVlaue should propagate to readwidget. --- lib/taurus/qt/qtgui/panel/taurusform.py | 5 ++--- lib/taurus/qt/qtgui/panel/taurusvalue.py | 8 ++++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/taurus/qt/qtgui/panel/taurusform.py b/lib/taurus/qt/qtgui/panel/taurusform.py index f1db5fdc1..7c9d4d769 100644 --- a/lib/taurus/qt/qtgui/panel/taurusform.py +++ b/lib/taurus/qt/qtgui/panel/taurusform.py @@ -397,9 +397,8 @@ def setFormat(self, format): """ TaurusWidget.setFormat(self, format) for item in self.getItems(): - rw = item.readWidget(followCompact=True) - if hasattr(rw, 'setFormat'): - rw.setFormat(format) + if hasattr(item, 'setFormat'): + item.setFormat(format) def setCompact(self, compact): self._compact = compact diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py index 8b48ed1f5..bc5cf269f 100644 --- a/lib/taurus/qt/qtgui/panel/taurusvalue.py +++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py @@ -451,8 +451,12 @@ def setFormat(self, format): Reimplemented to call setFormat of the read widget (if provided) """ TaurusBaseWidget.setFormat(self, format) - if hasattr(getattr(self, '_readWidget', None), 'setFormat'): - return self._readWidget.setFormat(format) + try: + rw = self.readWidget(followCompact=True) + except AttributeError: + return + if hasattr(rw, 'setFormat'): + rw.setFormat(format) def getAllowWrite(self): return self._allowWrite From 28ae2b845d94ec0d2f812bf758e02005cc5f8386 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 19 Sep 2018 10:27:46 +0200 Subject: [PATCH 098/252] Fix py3 syntax error --- lib/taurus/qt/qtgui/base/taurusbase.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/base/taurusbase.py b/lib/taurus/qt/qtgui/base/taurusbase.py index 9b811898c..d60763ecb 100644 --- a/lib/taurus/qt/qtgui/base/taurusbase.py +++ b/lib/taurus/qt/qtgui/base/taurusbase.py @@ -739,7 +739,7 @@ def baseFormatter(dtype=None, basecomponent=None, **kwargs): if self._format is None: try: self._updateFormat(type(v)) - except Exception, e: + except Exception as e: self.warning(('Cannot update format. Reverting to default.' + ' Reason: %r'), e) self.setFormat(defaultFormatter) From a685d5804a3c3edc82a27858a998342d795bba04 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 19 Sep 2018 11:54:57 +0200 Subject: [PATCH 099/252] Fix py3 issues introduced in last merge of develop --- lib/taurus/qt/qtgui/base/taurusbase.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/taurus/qt/qtgui/base/taurusbase.py b/lib/taurus/qt/qtgui/base/taurusbase.py index d60763ecb..3e0e182bd 100644 --- a/lib/taurus/qt/qtgui/base/taurusbase.py +++ b/lib/taurus/qt/qtgui/base/taurusbase.py @@ -762,7 +762,7 @@ def _updateFormat(self, dtype, **kwargs): :param kwargs: keyword arguments that will be passed to :attribute:`FORMAT` if it is a callable """ - if not isinstance(self.FORMAT, basestring): + if not isinstance(self.FORMAT, str): # unbound method to callable if isinstance(self.FORMAT, MethodType): self.FORMAT = self.FORMAT.__func__ @@ -781,7 +781,7 @@ def setFormat(self, format): "full.module.callable" format) """ # Check if the format is a callable string representation - if isinstance(format, basestring): + if isinstance(format, str): try: moduleName, formatterName = format.rsplit('.', 1) __import__(moduleName) @@ -798,7 +798,7 @@ def getFormat(self): :return: (str) a string of the current format. It could be a python format string or a callable string representation. """ - if isinstance(self.FORMAT, basestring): + if isinstance(self.FORMAT, str): formatter = self.FORMAT else: formatter = '{0}.{1}'.format(self.FORMAT.__module__, From 34c58f209158006fb06fb77e1d9a329b4f90781e Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 20 Sep 2018 11:41:40 +0200 Subject: [PATCH 100/252] Avoid using py2and3.to_str method A previous commit in this feature introduced the py2and3 module to handle str/bytes incompatibilities. Instead, remove bytes handling in the affected methods. --- lib/taurus/core/util/py2and3.py | 31 ---------------------- lib/taurus/external/qt/__init__.py | 3 +-- lib/taurus/qt/qtgui/display/tauruslabel.py | 5 +--- 3 files changed, 2 insertions(+), 37 deletions(-) delete mode 100644 lib/taurus/core/util/py2and3.py diff --git a/lib/taurus/core/util/py2and3.py b/lib/taurus/core/util/py2and3.py deleted file mode 100644 index 97e6bfd4a..000000000 --- a/lib/taurus/core/util/py2and3.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python - -############################################################################# -## -# This file is part of Taurus -## -# http://taurus-scada.org -## -# Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain -## -# Taurus is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -## -# Taurus is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -## -# You should have received a copy of the GNU Lesser General Public License -# along with Taurus. If not, see . -## -############################################################################# - -def to_str(bytes_or_str, errors=None): - if isinstance(bytes_or_str, bytes): - value = bytes_or_str.decode("utf-8", errors=errors) - else: - value = bytes_or_str - return value \ No newline at end of file diff --git a/lib/taurus/external/qt/__init__.py b/lib/taurus/external/qt/__init__.py index 618f7a2f6..5404ad295 100644 --- a/lib/taurus/external/qt/__init__.py +++ b/lib/taurus/external/qt/__init__.py @@ -31,7 +31,6 @@ import os from taurus.core.util import log as __log from taurus import tauruscustomsettings as __config -from taurus.core.util.py2and3 import to_str # -------------------------------------------------------------------------- # Deprecated (in Jul17) pending to be removed later on @@ -157,7 +156,7 @@ def taurusMessageHandler(msg_type, log_ctx, msg): elif hasattr(QtCore, "qInstallMsgHandler"): def taurusMsgHandler(msg_type, msg): f = QT_LEVEL_MATCHER.get(msg_type) - return f(u"Qt: " + to_str(msg, errors="replace")) + return f("Qt: " + msg) QtCore.qInstallMsgHandler(taurusMsgHandler) diff --git a/lib/taurus/qt/qtgui/display/tauruslabel.py b/lib/taurus/qt/qtgui/display/tauruslabel.py index a89580e65..ba196647a 100644 --- a/lib/taurus/qt/qtgui/display/tauruslabel.py +++ b/lib/taurus/qt/qtgui/display/tauruslabel.py @@ -44,7 +44,6 @@ from taurus.qt.qtgui.base import TaurusScalarAttributeControllerHelper from taurus.qt.qtgui.base import TaurusConfigurationControllerHelper from taurus.qt.qtgui.base import updateLabelBackground -from taurus.core.util.py2and3 import to_str _QT_PLUGIN_INFO = { 'module': 'taurus.qt.qtgui.display', @@ -118,9 +117,7 @@ def _updateToolTip(self, label): return toolTip = label.getFormatedToolTip() if self._trimmedText: - toolTip = u"

Value: %s


%s" %\ - (to_str(self._text, errors='replace'), - to_str(toolTip, errors='replace')) + toolTip = u"

Value: %s


%s" % (self._text, toolTip) label.setToolTip(toolTip) _updateBackground = updateLabelBackground From d157fa47aef71667db516c621c6d3f9289a98ca0 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 20 Sep 2018 12:09:02 +0200 Subject: [PATCH 101/252] Fix format string error Add missing parentheses --- lib/taurus/console/table.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/taurus/console/table.py b/lib/taurus/console/table.py index 0a2493c70..389ac5380 100644 --- a/lib/taurus/console/table.py +++ b/lib/taurus/console/table.py @@ -81,8 +81,8 @@ def __init__(self, elem_list, elem_fmt=None, term_width=None, self.col_head_str = col_head_str self.col_head_fmt = col_head_fmt if col_head_str is not None and len(col_head_str) != self.nr_col: - msg = 'ColHeadStr nr (%d) and ColNr (%d) mistmatch' % \ - len(col_head_str), self.nr_col + msg = 'ColHeadStr nr (%d) and ColNr (%d) mistmatch' % ( + len(col_head_str), self.nr_col) raise ValueError(msg) if col_head_width is None: if col_head_str is not None: From 856e3f6085cc9a9d7cd1d9c68e37d1e4eed039e7 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 20 Sep 2018 14:47:22 +0200 Subject: [PATCH 102/252] Add missing import --- lib/taurus/core/util/safeeval.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/taurus/core/util/safeeval.py b/lib/taurus/core/util/safeeval.py index 21a17f34a..2515e0f2d 100644 --- a/lib/taurus/core/util/safeeval.py +++ b/lib/taurus/core/util/safeeval.py @@ -144,6 +144,7 @@ def getSafe(self): except: print('ERROR: %s cannot be evaluated' % f) + import numpy vector = numpy.arange(6) # Another way of registering a variable is using the init method... sev2 = SafeEvaluator({'x': x, 'y': vector}, defaultSafe=False) From 701648402019468237b74d895e9879ee85ccbf3d Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 21 Sep 2018 09:03:39 +0200 Subject: [PATCH 103/252] Review futurize changes in doc Review the futurize changes. - avoid (when reasonable) the non-idiomatic code introduced by futurize - remove unneeded futurize-related imports (refactor code if necessary) --- doc/source/devel/examples/TaurusTest.py | 5 +---- doc/source/devel/examples/label06.py | 1 - doc/source/devel/examples/pyqwt_issue_test.py | 1 - doc/source/sphinxext/taurusextension.py | 3 --- 4 files changed, 1 insertion(+), 9 deletions(-) diff --git a/doc/source/devel/examples/TaurusTest.py b/doc/source/devel/examples/TaurusTest.py index b6cd4b132..381ffccdb 100644 --- a/doc/source/devel/examples/TaurusTest.py +++ b/doc/source/devel/examples/TaurusTest.py @@ -1,7 +1,4 @@ from __future__ import print_function -from __future__ import division -from builtins import range -from past.utils import old_div import PyTango import sys import math @@ -24,7 +21,7 @@ def init_device(self): self._velocity = 20.0 self._acceleration = 4.0 self._simulation_mode = False - self._abscissas = [old_div(x, 50.0) for x in range(1024)] + self._abscissas = [x / 50.0 for x in range(1024)] self._curve = [math.sin(x) for x in self._abscissas] def always_executed_hook(self): diff --git a/doc/source/devel/examples/label06.py b/doc/source/devel/examples/label06.py index 4bff08df7..0dfbe2a09 100644 --- a/doc/source/devel/examples/label06.py +++ b/doc/source/devel/examples/label06.py @@ -1,4 +1,3 @@ -from builtins import range import sys from taurus.external.qt import Qt from taurus.qt.qtgui.display import TaurusLabel diff --git a/doc/source/devel/examples/pyqwt_issue_test.py b/doc/source/devel/examples/pyqwt_issue_test.py index dfc4add44..56c66fad2 100644 --- a/doc/source/devel/examples/pyqwt_issue_test.py +++ b/doc/source/devel/examples/pyqwt_issue_test.py @@ -15,7 +15,6 @@ https://bugs.launchpad.net/ubuntu/+source/pyqwt5/+bug/672509 http://www.esrf.eu/mail_archives/tango/archive/msg04025.html ''' -from __future__ import print_function from PyQt4 import Qt, Qwt5 diff --git a/doc/source/sphinxext/taurusextension.py b/doc/source/sphinxext/taurusextension.py index c108cc0c2..f864035e9 100644 --- a/doc/source/sphinxext/taurusextension.py +++ b/doc/source/sphinxext/taurusextension.py @@ -25,9 +25,6 @@ """helper methods for taurus sphinx documentation""" from __future__ import print_function - -from builtins import str -from builtins import map __expr = ('or',) From 254017352a9430648f5b3373eb8a3388ff7cbf57 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 21 Sep 2018 09:15:40 +0200 Subject: [PATCH 104/252] Review futurize changes in core Review the futurize changes. - avoid (when reasonable) the non-idiomatic code introduced by futurize - remove unneeded futurize-related imports (refactor code if necessary) - avoid using futurize's `past` module - clean unused imports --- lib/taurus/core/evaluation/evalattribute.py | 1 - lib/taurus/core/evaluation/evaldevice.py | 1 - lib/taurus/core/evaluation/evalvalidator.py | 8 +++--- lib/taurus/core/evaluation/test/res/mymod.py | 1 - lib/taurus/core/resource/resfactory.py | 6 +---- lib/taurus/core/tango/img/img.py | 4 +-- lib/taurus/core/tango/starter.py | 2 -- lib/taurus/core/tango/tangodatabase.py | 17 +++++------- lib/taurus/core/tango/tangofactory.py | 10 +++---- .../core/tango/test/test_tangoattribute.py | 5 ++-- lib/taurus/core/taurusattribute.py | 1 - lib/taurus/core/taurusbasetypes.py | 10 ++++--- lib/taurus/core/taurusexception.py | 1 - lib/taurus/core/taurushelper.py | 5 ++-- lib/taurus/core/tauruslistener.py | 1 - lib/taurus/core/taurusmodel.py | 2 -- lib/taurus/core/tauruspollingtimer.py | 8 +++--- lib/taurus/core/test/basevalidator.py | 1 - .../core/util/argparse/taurusargparse.py | 3 +-- lib/taurus/core/util/colors.py | 4 +-- lib/taurus/core/util/containers.py | 24 +++++++---------- lib/taurus/core/util/decorator/typecheck.py | 2 -- lib/taurus/core/util/enumeration.py | 9 ++++--- lib/taurus/core/util/event.py | 26 +++++++++++++------ lib/taurus/core/util/fandango_search.py | 7 +++++ lib/taurus/core/util/log.py | 7 +++-- lib/taurus/core/util/property_parser.py | 1 - lib/taurus/core/util/propertyfile.py | 3 +-- lib/taurus/core/util/remotelogmonitor.py | 5 +--- lib/taurus/core/util/threadpool.py | 4 +-- 30 files changed, 79 insertions(+), 100 deletions(-) diff --git a/lib/taurus/core/evaluation/evalattribute.py b/lib/taurus/core/evaluation/evalattribute.py index c49d0c3ab..fa4772821 100644 --- a/lib/taurus/core/evaluation/evalattribute.py +++ b/lib/taurus/core/evaluation/evalattribute.py @@ -22,7 +22,6 @@ ## ############################################################################# -from builtins import str __all__ = ['EvaluationAttribute'] import numpy diff --git a/lib/taurus/core/evaluation/evaldevice.py b/lib/taurus/core/evaluation/evaldevice.py index 0a3ebfb4a..74eac3fae 100644 --- a/lib/taurus/core/evaluation/evaldevice.py +++ b/lib/taurus/core/evaluation/evaldevice.py @@ -22,7 +22,6 @@ ## ############################################################################# -from builtins import str __all__ = ['EvaluationDevice'] from taurus import Factory diff --git a/lib/taurus/core/evaluation/evalvalidator.py b/lib/taurus/core/evaluation/evalvalidator.py index b53e88cdf..e1c647003 100644 --- a/lib/taurus/core/evaluation/evalvalidator.py +++ b/lib/taurus/core/evaluation/evalvalidator.py @@ -30,8 +30,6 @@ import re import hashlib -from future.utils import string_types - import taurus from taurus import isValidName, debug from taurus.core import TaurusElementType @@ -253,7 +251,7 @@ def expandExpr(expr, substmap): string containing a semi-colon separated list of symbol=value pairs can also be passed. ''' - if isinstance(substmap, string_types): + if isinstance(substmap, str): substmap = dict(K_EQUALS_V_RE.findall(substmap)) ret = expr protected = {} @@ -365,8 +363,8 @@ def getUriGroups(self, name, strict=None): # create the groups dict with unmangled refs in its values groups = {} - for n, g in list(_groups.items()): - if isinstance(g, string_types): # avoid None or boolean values + for n, g in _groups.items(): + if isinstance(g, str): # avoid None or boolean values g = g.format(**refs_dict) groups[n] = g diff --git a/lib/taurus/core/evaluation/test/res/mymod.py b/lib/taurus/core/evaluation/test/res/mymod.py index acac6d8d2..080d14c2d 100644 --- a/lib/taurus/core/evaluation/test/res/mymod.py +++ b/lib/taurus/core/evaluation/test/res/mymod.py @@ -28,7 +28,6 @@ """ from __future__ import print_function -from builtins import str from builtins import object import os from taurus.core.units import Quantity diff --git a/lib/taurus/core/resource/resfactory.py b/lib/taurus/core/resource/resfactory.py index 49446c73d..1c8678285 100644 --- a/lib/taurus/core/resource/resfactory.py +++ b/lib/taurus/core/resource/resfactory.py @@ -30,10 +30,6 @@ import os import imp -import operator -import types - -from future.utils import string_types from taurus.core.taurushelper import Manager from taurus.core.util.singleton import Singleton @@ -93,7 +89,7 @@ def reloadResource(self, obj=None, priority=1, name=None): elif type(obj) in (str,) or obj is None: name, mod = self.__reloadResource(obj) obj = {} - for k, v in list(mod.__dict__.items()): + for k, v in mod.__dict__.items(): if not k.startswith('_') and isinstance(v, str): obj[k] = v else: diff --git a/lib/taurus/core/tango/img/img.py b/lib/taurus/core/tango/img/img.py index e5dc760e9..946163530 100644 --- a/lib/taurus/core/tango/img/img.py +++ b/lib/taurus/core/tango/img/img.py @@ -25,9 +25,7 @@ """The img submodule. It contains specific device implementation for CCDs and 2D detectors""" -from __future__ import division -from past.utils import old_div __all__ = ['ImageDevice', 'ImageCounterDevice', 'PyImageViewer', 'ImgGrabber', 'CCDPVCAM', 'ImgBeamAnalyzer', 'Falcon', 'LimaCCDs'] @@ -180,7 +178,7 @@ def getImageData(self, names=None): if self._color: for k, v in list(data.items()): s = v[1].value.shape - v[1].value = v[1].value.reshape((s[0], old_div(s[1], 3), 3)) + v[1].value = v[1].value.reshape((s[0], s[1] // 3, 3)) return data diff --git a/lib/taurus/core/tango/starter.py b/lib/taurus/core/tango/starter.py index 0c50488e1..74878c3d4 100644 --- a/lib/taurus/core/tango/starter.py +++ b/lib/taurus/core/tango/starter.py @@ -30,8 +30,6 @@ more limited in scope. """ from __future__ import print_function - -from builtins import range from builtins import object __docformat__ = 'restructuredtext' diff --git a/lib/taurus/core/tango/tangodatabase.py b/lib/taurus/core/tango/tangodatabase.py index b4debb387..55fd221a9 100644 --- a/lib/taurus/core/tango/tangodatabase.py +++ b/lib/taurus/core/tango/tangodatabase.py @@ -25,12 +25,10 @@ """This module contains all taurus tango authority""" from __future__ import print_function -from __future__ import division from builtins import str from builtins import map from builtins import range -from past.utils import old_div from builtins import object import collections __all__ = ["TangoInfo", "TangoAttrInfo", "TangoDevInfo", "TangoServInfo", @@ -41,7 +39,6 @@ import os import socket -import operator import weakref from PyTango import (Database, DeviceProxy, DevFailed, ApiUtil) @@ -111,7 +108,8 @@ def addDevice(self, dev): def getDeviceNames(self): if not hasattr(self, "_device_name_list"): - self._device_name_list = sorted(map(TangoDevInfo.name, self._devices.values())) + self._device_name_list = sorted(map(TangoDevInfo.name, + self._devices.values())) return self._device_name_list @@ -333,7 +331,7 @@ def refresh(self): r = db.command_inout("DbMySqlSelect", query) row_nb, column_nb = r[0][-2:] data = r[1] - assert row_nb == old_div(len(data), column_nb) + assert row_nb == len(data) // column_nb else: # fallback using tango commands (slow but works with sqlite DB) # see http://sf.net/p/tauruslib/tickets/148/ @@ -669,12 +667,11 @@ class TangoAuthority(TaurusAuthority): _description = 'A Tango Authority' def __init__(self, host=None, port=None, parent=None): - pars = () if host is None or port is None: try: - host, port = TangoAuthority.get_default_tango_host().rsplit(':', 1) - pars = host, port - except Exception as e: + _hp = TangoAuthority.get_default_tango_host() + host, port = _hp.rsplit(':', 1) + except Exception: from taurus import warning warning("Error getting default Tango host") @@ -708,7 +705,7 @@ def __get_class_for_device(self, dev_name): serv_name = self.command_inout("DbGetDeviceInfo", dev_name)[1][3] devs = self.get_device_class_list(serv_name) dev_name_lower = dev_name.lower() - for i in range(old_div(len(devs), 2)): + for i in range(len(devs) // 2): idx = i * 2 if devs[idx].lower() == dev_name_lower: return devs[idx + 1] diff --git a/lib/taurus/core/tango/tangofactory.py b/lib/taurus/core/tango/tangofactory.py index f5ea4e99a..5e3bbe488 100644 --- a/lib/taurus/core/tango/tangofactory.py +++ b/lib/taurus/core/tango/tangofactory.py @@ -134,16 +134,16 @@ def reInit(self): def cleanUp(self): """Cleanup the singleton instance""" self.trace("[TangoFactory] cleanUp") - for k, v in list(self.tango_attrs.items()): + for k, v in self.tango_attrs.items(): v.cleanUp() - for k, v in list(self.tango_dev_queries.items()): + for k, v in self.tango_dev_queries.items(): v.cleanUp() - for k, v in list(self.tango_devs.items()): + for k, v in self.tango_devs.items(): v.cleanUp() self.dft_db = None - for k, v in list(self.tango_db_queries.items()): + for k, v in self.tango_db_queries.items(): v.cleanUp() - for k, v in list(self.tango_db.items()): + for k, v in self.tango_db.items(): v.cleanUp() self.reInit() diff --git a/lib/taurus/core/tango/test/test_tangoattribute.py b/lib/taurus/core/tango/test/test_tangoattribute.py index 19c878a50..3cf2c7fbc 100644 --- a/lib/taurus/core/tango/test/test_tangoattribute.py +++ b/lib/taurus/core/tango/test/test_tangoattribute.py @@ -27,7 +27,6 @@ # __all__ = [] -from builtins import map __docformat__ = 'restructuredtext' import numpy @@ -772,12 +771,12 @@ def write_read_conf(self, attr_name, cfg, value, expected): got = getattr(attr, cfg) msg = '%s.%s from Taurus do not mach, expected %s read %s' %\ (attr_name, cfg, expected, got) - list(map(self.__assertValidValue, got, expected, msg)) + map(self.__assertValidValue, got, expected, msg) msg = '%s.%s from Tango do not mach, expected %s read %s' %\ (attr_name, cfg, expected, got) tangovalue = self._getDecodePyTangoAttr(attr_name, cfg) - list(map(self.__assertValidValue, got, tangovalue, msg)) + map(self.__assertValidValue, got, tangovalue, msg) def write_read_attr(self, attrname=None, setvalue=None, expected=None, expected_attrv=None, expectedshape=None): diff --git a/lib/taurus/core/taurusattribute.py b/lib/taurus/core/taurusattribute.py index fc7e9d916..73e485568 100644 --- a/lib/taurus/core/taurusattribute.py +++ b/lib/taurus/core/taurusattribute.py @@ -25,7 +25,6 @@ """This module contains the base class for a taurus attribute""" -from builtins import str __all__ = ["TaurusAttribute"] __docformat__ = "restructuredtext" diff --git a/lib/taurus/core/taurusbasetypes.py b/lib/taurus/core/taurusbasetypes.py index bcd003336..711403ba5 100644 --- a/lib/taurus/core/taurusbasetypes.py +++ b/lib/taurus/core/taurusbasetypes.py @@ -41,6 +41,7 @@ from .util.enumeration import Enumeration from .util.log import taurus4_deprecation from enum import IntEnum +from future.utils import PY2 class TaurusDevState(IntEnum): @@ -151,14 +152,15 @@ class TaurusDevState(IntEnum): __PYTHON_TYPE_TO_TAURUS_DATATYPE = { str: DataType.String, int: DataType.Integer, - int: DataType.Integer, + # long : DataType.Integer, # (only in py2) see below... float: DataType.Float, bool: DataType.Boolean, - # bytes : DataType.Bytes, # see below... + # bytes : DataType.Bytes, # (only in py>=3) see below... } -if str is not bytes: # Python >=3 +if PY2: # Python 2 + __PYTHON_TYPE_TO_TAURUS_DATATYPE[long] = DataType.Integer +else: # Python >=3 __PYTHON_TYPE_TO_TAURUS_DATATYPE[bytes] = DataType.Bytes -# Note: in Python2, DataType.from_python_type(bytes) --> DataType.String DataType.from_python_type = __PYTHON_TYPE_TO_TAURUS_DATATYPE.get SubscriptionState = Enumeration( diff --git a/lib/taurus/core/taurusexception.py b/lib/taurus/core/taurusexception.py index 1730d3d54..0af114379 100644 --- a/lib/taurus/core/taurusexception.py +++ b/lib/taurus/core/taurusexception.py @@ -25,7 +25,6 @@ """This module contains the taurus base exception classes""" -from builtins import str __all__ = ["TaurusException", "DoubleRegistration"] __docformat__ = "restructuredtext" diff --git a/lib/taurus/core/taurushelper.py b/lib/taurus/core/taurushelper.py index cd2451129..5fd8ad1bb 100644 --- a/lib/taurus/core/taurushelper.py +++ b/lib/taurus/core/taurushelper.py @@ -27,6 +27,8 @@ from __future__ import print_function from builtins import str +from future.utils import string_types + __all__ = ['check_dependencies', 'log_dependencies', 'getSchemeFromName', 'getValidTypesForName', 'isValidName', 'makeSchemeExplicit', 'Manager', 'Factory', 'Device', 'Attribute', 'Configuration', @@ -40,7 +42,6 @@ __docformat__ = "restructuredtext" -import sys import re from taurus import tauruscustomsettings from .util.log import taurus4_deprecation @@ -298,7 +299,7 @@ def Attribute(dev_or_attr_name, attr_name=None): if attr_name is None: return Factory(scheme=getSchemeFromName(dev_or_attr_name)).getAttribute(dev_or_attr_name) else: - if type(dev_or_attr_name) in (str,): + if isinstance(dev_or_attr_name, string_types): dev = Device(dev_or_attr_name) else: dev = dev_or_attr_name diff --git a/lib/taurus/core/tauruslistener.py b/lib/taurus/core/tauruslistener.py index 0dff5a33a..e04cb86c4 100644 --- a/lib/taurus/core/tauruslistener.py +++ b/lib/taurus/core/tauruslistener.py @@ -26,7 +26,6 @@ """This module contains the taurus base listeners classes""" from __future__ import print_function -from builtins import str from builtins import object __all__ = ["TaurusListener", "TaurusExceptionListener"] diff --git a/lib/taurus/core/taurusmodel.py b/lib/taurus/core/taurusmodel.py index 04a3daa57..45f92a68b 100644 --- a/lib/taurus/core/taurusmodel.py +++ b/lib/taurus/core/taurusmodel.py @@ -31,8 +31,6 @@ __docformat__ = "restructuredtext" import weakref -import operator -import threading import collections from .util.log import Logger diff --git a/lib/taurus/core/tauruspollingtimer.py b/lib/taurus/core/tauruspollingtimer.py index 8966699fe..cbba9cc4b 100644 --- a/lib/taurus/core/tauruspollingtimer.py +++ b/lib/taurus/core/tauruspollingtimer.py @@ -24,9 +24,7 @@ ############################################################################# """This module contains the polling class""" -from __future__ import division -from past.utils import old_div __all__ = ["TaurusPollingTimer"] __docformat__ = "restructuredtext" @@ -54,7 +52,7 @@ def __init__(self, period, parent=None): self.call__init__(Logger, name, parent) self.dev_dict = {} self.attr_nb = 0 - self.timer = Timer(old_div(period, 1000.0), self._pollAttributes, self) + self.timer = Timer(period / 1000.0, self._pollAttributes, self) self.lock = threading.RLock() def start(self): @@ -136,14 +134,14 @@ def _pollAttributes(self): when it is time to poll. Do not call this method directly """ req_ids = {} - for dev, attrs in list(self.dev_dict.items()): + for dev, attrs in self.dev_dict.items(): try: req_id = dev.poll(attrs, asynch=True) req_ids[dev] = attrs, req_id except Exception as e: self.error("poll_asynch error") self.debug("Details:", exc_info=1) - for dev, (attrs, req_id) in list(req_ids.items()): + for dev, (attrs, req_id) in req_ids.items(): try: dev.poll(attrs, req_id=req_id) except Exception as e: diff --git a/lib/taurus/core/test/basevalidator.py b/lib/taurus/core/test/basevalidator.py index 61bec9c33..5ae411b1b 100644 --- a/lib/taurus/core/test/basevalidator.py +++ b/lib/taurus/core/test/basevalidator.py @@ -27,7 +27,6 @@ #__all__ = [] -from builtins import str from builtins import object __docformat__ = 'restructuredtext' diff --git a/lib/taurus/core/util/argparse/taurusargparse.py b/lib/taurus/core/util/argparse/taurusargparse.py index 9207d49d4..b21e717a3 100644 --- a/lib/taurus/core/util/argparse/taurusargparse.py +++ b/lib/taurus/core/util/argparse/taurusargparse.py @@ -78,7 +78,6 @@ def main(): sys.exit(app.exec_()) """ -from builtins import str __all__ = ["get_taurus_parser", "init_taurus_args", "parse_taurus_args", "split_taurus_args"] @@ -202,7 +201,7 @@ def init_taurus_args(parser=None, args=None, values=None): taurus.info("rconsole started. You can connect to it by typing: rconsole -p %d", options.remote_console_port) except Exception as e: - taurus.warning("Cannot spawn debugger. Reason: %s", str(e)) + taurus.warning("Cannot spawn debugger. Reason: %s", e) # initialize default formatter if options.default_formatter is not None: diff --git a/lib/taurus/core/util/colors.py b/lib/taurus/core/util/colors.py index c5ea6b15d..d616aa14f 100644 --- a/lib/taurus/core/util/colors.py +++ b/lib/taurus/core/util/colors.py @@ -26,12 +26,10 @@ """This module contains color codes for state and quality""" from __future__ import print_function -from builtins import str from builtins import object __all__ = ["DEVICE_STATE_DATA", "ATTRIBUTE_QUALITY_DATA", "ColorPalette", "DEVICE_STATE_PALETTE", "ATTRIBUTE_QUALITY_PALETTE"] -import types DEVICE_STATE_DATA = { # map for TaurusDevState states (used for agnostic TaurusDevice.state) @@ -97,7 +95,7 @@ def __init__(self, dat, int_decoder_dict=None): self._int_decoder_dict = int_decoder_dict def _decoder(self, elem): - if type(elem) == int or type(elem) == int: + if type(elem) == int: elem = self._int_decoder_dict.get(elem) return str(elem) diff --git a/lib/taurus/core/util/containers.py b/lib/taurus/core/util/containers.py index 075a5f13c..b5e3d22b8 100644 --- a/lib/taurus/core/util/containers.py +++ b/lib/taurus/core/util/containers.py @@ -29,10 +29,7 @@ """ from __future__ import print_function -from builtins import zip -from builtins import str from builtins import range -from past.builtins import basestring from builtins import object __all__ = ["CaselessList", "CaselessDict", "CaselessWeakValueDict", "LoopList", "CircBuf", "LIFO", "TimedQueue", "self_locked", "ThreadDict", @@ -47,7 +44,6 @@ import collections import time import weakref -import operator class CaselessList(list): @@ -74,8 +70,8 @@ def __init__(self, inlist=[]): self.append(entry) def __lowerstreq(self, a, b): - a = type(a) == str and a or str(a) - b = type(b) == str and b or str(b) + a = str(a) + b = str(b) return (a.lower() == b.lower()) def findentry(self, item): @@ -257,7 +253,7 @@ def __init__(self, other=None): if other: # Doesn't do keyword args if isinstance(other, dict): - for k, v in list(other.items()): + for k, v in other.items(): dict.__setitem__(self, k.lower(), v) else: for k, v in other: @@ -286,7 +282,7 @@ def setdefault(self, key, def_val=None): def update(self, other): """overwritten from :meth:`dict.update`""" - for k, v in list(other.items()): + for k, v in other.items(): dict.__setitem__(self, k.lower(), v) def fromkeys(self, iterable, value=None): @@ -310,7 +306,7 @@ def __init__(self, other=None): if other: # Doesn't do keyword args if isinstance(other, dict): - for k, v in list(other.items()): + for k, v in other.items(): weakref.WeakValueDictionary.__setitem__(self, k.lower(), v) else: for k, v in other: @@ -342,7 +338,7 @@ def setdefault(self, key, def_val=None): def update(self, other): """overwritten from :meth:`weakref.WeakValueDictionary.update`""" if other: - for k, v in list(other.items()): + for k, v in other.items(): weakref.WeakValueDictionary.__setitem__(self, k.lower(), v) def fromkeys(self, iterable, value=None): @@ -921,7 +917,7 @@ def __setitem__(self, k, v): def update(self, other): if hasattr(other, 'items'): - other = list(other.items()) + other = other.items() for k, v in other: self.__setitem__(k, v) @@ -1059,11 +1055,11 @@ def getDictAsTree(dct): """This method will print a recursive dict in a tree-like shape:: - >>> print getDictAsTree({'A':{'B':[1,2],'C':[3]}})""" + >>> print(getDictAsTree({'A':{'B':[1,2],'C':[3]}}))""" def add_to_level(l, d): lines = [] if isinstance(d, dict): - for k, v in list(d.items()): + for k, v in d.items(): print('with key "%s"' % k) lines.append([''] * l + [str(k)]) lines += add_to_level(l + 1, v) @@ -1137,7 +1133,7 @@ def __str__(self): return self.__buffer[:self.__end].__str__() def __bool__(self): - return self.__buffer[:self.__end].__nonzero__() + return self.__buffer[:self.__end].__bool__() def __setitem__(self, i, x): self.__buffer[:self.__end].__setitem__(i, x) diff --git a/lib/taurus/core/util/decorator/typecheck.py b/lib/taurus/core/util/decorator/typecheck.py index 36f22e920..2a1c27a0b 100644 --- a/lib/taurus/core/util/decorator/typecheck.py +++ b/lib/taurus/core/util/decorator/typecheck.py @@ -64,8 +64,6 @@ """ from __future__ import print_function -from builtins import str -from builtins import map __all__ = ["accepts", "returns"] __docformat__ = "restructuredtext" diff --git a/lib/taurus/core/util/enumeration.py b/lib/taurus/core/util/enumeration.py index 97d887c74..cdbfd8954 100644 --- a/lib/taurus/core/util/enumeration.py +++ b/lib/taurus/core/util/enumeration.py @@ -33,13 +33,14 @@ values (specified and unspecified) are unique. Enum values then are attributes of an Enumeration class (Volkswagen.BEETLE, Volkswagen.PASSAT, etc.).""" +from builtins import int from builtins import str from builtins import object __all__ = ["EnumException", "Enumeration"] __docformat__ = "restructuredtext" -from future.utils import integer_types, string_types +from future.utils import string_types class EnumException(Exception): @@ -101,7 +102,7 @@ def __init__(self, name, enumList, flaggable=False, no_doc=False): x, i = x if not isinstance(x, string_types): raise EnumException("enum name is not a string: " + str(x)) - if not isinstance(i, (int, int)): + if not isinstance(i, int): raise EnumException( "enum value is not an integer: " + str(i)) if x in uniqueNames: @@ -147,13 +148,13 @@ def _generateUniqueId(self): return n def __contains__(self, i): - if isinstance(i, integer_types): + if isinstance(i, int): return i in self.reverseLookup elif isinstance(i, string_types): return i in self.lookup def __getitem__(self, i): - if isinstance(i, (int, int)): + if isinstance(i, int): return self.whatis(i) elif isinstance(i, string_types): return self.lookup[i] diff --git a/lib/taurus/core/util/event.py b/lib/taurus/core/util/event.py index 045af7ef4..dde969b6a 100644 --- a/lib/taurus/core/util/event.py +++ b/lib/taurus/core/util/event.py @@ -29,8 +29,6 @@ from __future__ import print_function from __future__ import absolute_import -from past.builtins import cmp -from builtins import str from builtins import range from builtins import object __all__ = ["BoundMethodWeakref", "CallableRef", "EventGenerator", @@ -44,7 +42,6 @@ import threading import time import collections -import operator import taurus.core @@ -80,11 +77,24 @@ def __hash__(self): def __cmp__(self, other): if other.__class__ == self.__class__: + from past.builtins import cmp ret = cmp((self.func_ref, self.obj_ref), (other.func_ref, other.obj_ref)) return ret return 1 + def __eq__(self, other): + if other.__class__ != self.__class__: + return ((self.func_ref, self.obj_ref) + == (other.func_ref, other.obj_ref)) + return False + + def __ne__(self, other): + if other.__class__ != self.__class__: + return ((self.func_ref, self.obj_ref) + != (other.func_ref, other.obj_ref)) + return True + def __repr__(self): obj, func = self.obj_ref(), self.func_ref() return 'BoundMethodWeakRef of %s.%s' % (obj, func) @@ -650,7 +660,7 @@ def waitEvent(self, val, after=0, equal=True, timeout=None, retries=-1, retries += 1 while retries != 0: if any: - for v, t in list(s.items()): + for v, t in s.items(): if t >= after: return if equal: @@ -658,7 +668,7 @@ def waitEvent(self, val, after=0, equal=True, timeout=None, retries=-1, if (t is not None) and (t >= after): return else: - for v, t in list(s.items()): + for v, t in s.items(): if v == val: continue if t >= after: @@ -667,7 +677,7 @@ def waitEvent(self, val, after=0, equal=True, timeout=None, retries=-1, retries -= 1 except Exception as e: sys.stderr.write( - "AttributeEventWait: Caught exception while waitting: %s\n" % str(e)) + "AttributeEventWait: Caught exception while waiting: %s\n" % str(e)) raise e finally: self.unlock() @@ -706,8 +716,8 @@ def unlock(self): lock = getattr(self._cond, "_Condition__lock") th = getattr(lock, "_RLock__owner") curr_th = threading.current_thread() - print("WARNING: Thread %s trying to unlock condition previously " \ - "locked by thread %s" % (curr_th.name, th.name)) + print(("WARNING: Thread %s trying to unlock condition previously " + + "locked by thread %s") % (curr_th.name, th.name)) def eventReceived(self, s, t, v): if t not in (taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic): diff --git a/lib/taurus/core/util/fandango_search.py b/lib/taurus/core/util/fandango_search.py index fda8eb91f..c14ae05a1 100644 --- a/lib/taurus/core/util/fandango_search.py +++ b/lib/taurus/core/util/fandango_search.py @@ -69,23 +69,28 @@ def extend_regexp(s): def isString(s): + # TODO: UGLY AND FRAGILE!!! (Refactor) May not even work with py3 typ = s.__class__.__name__.lower() return not hasattr(s, '__iter__') and 'str' in typ and 'list' not in typ def isCallable(obj): + # TODO: UGLY AND FRAGILE!!! (Refactor) May not even work with py3 return hasattr(obj, '__call__') def isMap(obj): + # TODO: UGLY AND FRAGILE!!! (Refactor) May not even work with py3 return hasattr(obj, 'has_key') or hasattr(obj, 'items') def isDictionary(obj): + # TODO: UGLY AND FRAGILE!!! (Refactor) return isMap(obj) def isSequence(obj): + # TODO: UGLY AND FRAGILE!!! (Refactor) May not even work with py3 typ = obj.__class__.__name__.lower() return (hasattr(obj, '__iter__') or 'list' in typ) and not isString(obj) and not isMap(obj) @@ -123,6 +128,7 @@ def get_matching_devices(expressions, limit=0, exported=False): def get_device_for_alias(alias): + # TODO: Use validators instead db = taurus.Authority() try: return db.get_device_alias(alias) @@ -133,6 +139,7 @@ def get_device_for_alias(alias): def get_alias_for_device(dev): + # TODO: Use validators instead db = taurus.Authority() try: # .get_database_device().DbGetDeviceAlias(dev) diff --git a/lib/taurus/core/util/log.py b/lib/taurus/core/util/log.py index 5edff0780..879fff401 100644 --- a/lib/taurus/core/util/log.py +++ b/lib/taurus/core/util/log.py @@ -72,8 +72,7 @@ def getTotal(self): def pretty(self): from operator import itemgetter - sorted_items = sorted( - iter(self.items()), key=itemgetter(1), reverse=True) + sorted_items = sorted(self.items(), key=itemgetter(1), reverse=True) ret = '\n'.join(['\t%d * "%s"' % (v, k) for k, v in sorted_items]) return "< Deprecation Counts (%d):\n%s >" % (self.getTotal(), ret) @@ -797,7 +796,7 @@ def _format_stack(self, stack_func=inspect.stack): out += '\n\t -> line = [%d]: %s' % (line, lines[0]) if frame: out += '\n\t locals = ' - for k, v in list(frame.f_locals.items()): + for k, v in frame.f_locals.items(): out += '\n\t\t%20s = ' % k try: cut = False @@ -901,7 +900,7 @@ def deprecated(self, msg=None, dep=None, alt=None, rel=None, dbg_msg=None, return if _callerinfo is None: _callerinfo = self.log_obj.findCaller() - filename, lineno, fname = _callerinfo[0], _callerinfo[1], _callerinfo[2] + filename, lineno = _callerinfo[:2] depr_msg = warnings.formatwarning( msg, DeprecationWarning, filename, lineno) self.log_obj.warning(depr_msg, **kw) diff --git a/lib/taurus/core/util/property_parser.py b/lib/taurus/core/util/property_parser.py index f495c4214..1f72a6b4c 100644 --- a/lib/taurus/core/util/property_parser.py +++ b/lib/taurus/core/util/property_parser.py @@ -27,7 +27,6 @@ from __future__ import print_function from builtins import str -from builtins import range import os import ply.lex as lex diff --git a/lib/taurus/core/util/propertyfile.py b/lib/taurus/core/util/propertyfile.py index a35d7fc7d..9d8701d82 100644 --- a/lib/taurus/core/util/propertyfile.py +++ b/lib/taurus/core/util/propertyfile.py @@ -41,7 +41,6 @@ __docformat__ = "restructuredtext" import sys -import os import re import time @@ -71,7 +70,7 @@ def __init__(self, props=None): def __str__(self): s = '{' - for key, value in list(self._props.items()): + for key, value in self._props.items(): s = ''.join((s, key, '=', value, ', ')) s = ''.join((s[:-2], '}')) diff --git a/lib/taurus/core/util/remotelogmonitor.py b/lib/taurus/core/util/remotelogmonitor.py index 3ed9a0e7f..aeabd6fa4 100644 --- a/lib/taurus/core/util/remotelogmonitor.py +++ b/lib/taurus/core/util/remotelogmonitor.py @@ -40,10 +40,7 @@ import struct import weakref -try: - import socketserver -except: - import socketserver as socketserver +import socketserver class LogRecordStreamHandler(socketserver.StreamRequestHandler): diff --git a/lib/taurus/core/util/threadpool.py b/lib/taurus/core/util/threadpool.py index 3605ea26b..185348a1e 100644 --- a/lib/taurus/core/util/threadpool.py +++ b/lib/taurus/core/util/threadpool.py @@ -26,12 +26,10 @@ """adapted from http://code.activestate.com/recipes/576576/""" from __future__ import print_function from __future__ import absolute_import -from __future__ import division from future import standard_library standard_library.install_aliases() from builtins import range -from past.utils import old_div __all__ = ["ThreadPool", "Worker"] __docformat__ = "restructuredtext" @@ -171,7 +169,7 @@ def longJob(*arg, **kw): def badJob(*a, **k): print('\n !!! OOOPS !!!\n') - a = old_div(1, 0) + a = 1 / 0 def show(*arg, **kw): print('callback : %s' % arg[0]) From 4d680868dea828f710c00c752ae533445871f673 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 21 Sep 2018 09:17:03 +0200 Subject: [PATCH 105/252] Review futurize changes in external Review the futurize changes. - avoid (when reasonable) the non-idiomatic code introduced by futurize --- lib/taurus/external/qt/QtCore.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/taurus/external/qt/QtCore.py b/lib/taurus/external/qt/QtCore.py index d1449939a..602655b6e 100644 --- a/lib/taurus/external/qt/QtCore.py +++ b/lib/taurus/external/qt/QtCore.py @@ -27,6 +27,7 @@ from builtins import object from future.utils import string_types +from future.utils import PY2 from taurus.external.qt import API_NAME __backend = API_NAME @@ -59,7 +60,7 @@ def __from_qvariant_1(qobj=None, convfunc=None): if convfunc is None: return qobj.toPyObject() elif callable(convfunc): - if convfunc in (str, str): + if convfunc is str: return convfunc(qobj.toString()) elif convfunc is bool: return qobj.toBool() @@ -67,6 +68,8 @@ def __from_qvariant_1(qobj=None, convfunc=None): return qobj.toInt()[0] elif convfunc is float: return qobj.toDouble()[0] + elif PY2 and confunc is unicode: # py2 compatibility + return convfunc(qobj.toString()) elif isinstance(convfunc, string_types): return getattr(qobj, convfunc)() From 16afabc5f151312bde6be645e87094014b7c16bd Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 21 Sep 2018 09:41:30 +0200 Subject: [PATCH 106/252] Review futurize changes in taurus.test Review the futurize changes. - avoid (when reasonable) the non-idiomatic code introduced by futurize --- lib/taurus/test/base.py | 2 +- lib/taurus/test/fuzzytest.py | 8 +++----- lib/taurus/test/moduleexplorer.py | 1 - lib/taurus/test/test_import.py | 3 +-- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/lib/taurus/test/base.py b/lib/taurus/test/base.py index 0755fb6fb..e0111eca9 100644 --- a/lib/taurus/test/base.py +++ b/lib/taurus/test/base.py @@ -100,7 +100,7 @@ def isPositive(self, x): if test_method_doc is None: argsrep = ', '.join(['%s=%s' % (k, repr(v)) - for k, v in list(helper_kwargs.items())]) + for k, v in helper_kwargs.items()]) if tested_name: test_method_doc = 'Testing %s with %s(%s)' % (tested_name, helper_name, argsrep) diff --git a/lib/taurus/test/fuzzytest.py b/lib/taurus/test/fuzzytest.py index 4b1119b94..145fef489 100644 --- a/lib/taurus/test/fuzzytest.py +++ b/lib/taurus/test/fuzzytest.py @@ -25,10 +25,8 @@ '''Utility functions to deal with non-ideal (fuzzy) tests''' from __future__ import print_function -from __future__ import division -from past.utils import old_div def loopTest(testname, maxtries=100, maxfails=10): '''Run a test `maxtries` times or until it fails `maxfails` times and report the number of tries and failures. @@ -109,11 +107,11 @@ def calculateTestFuzziness(test, maxtries=100, maxfails=10, **kwargs): else: tries, fails = loopSubprocess(test, maxtries=maxtries, maxfails=maxfails, **kwargs) - r = old_div(float(fails), tries) - dr = old_div(numpy.sqrt(fails), tries) + r = float(fails) / tries + dr = numpy.sqrt(fails) / tries print('Failure rate = %g +/- %g (%i/%i)' % (r, dr, fails, tries)) # calculating n using p-value=1% and failure rate with -1 sigma - n = numpy.ceil(old_div(numpy.log(.01), numpy.log(1 - (r - dr)))) + n = numpy.ceil(numpy.log(.01) / numpy.log(1 - (r - dr))) print(('Number of consecutive times that the test should be passed ' + 'to have a confidence>99%% that the bug is fixed: %g') % n) return r, dr, n diff --git a/lib/taurus/test/moduleexplorer.py b/lib/taurus/test/moduleexplorer.py index fc345523f..c14742821 100644 --- a/lib/taurus/test/moduleexplorer.py +++ b/lib/taurus/test/moduleexplorer.py @@ -28,7 +28,6 @@ from __future__ import print_function from builtins import object -import sys import os import inspect import glob diff --git a/lib/taurus/test/test_import.py b/lib/taurus/test/test_import.py index a06f8000e..d0d287df6 100644 --- a/lib/taurus/test/test_import.py +++ b/lib/taurus/test/test_import.py @@ -26,7 +26,6 @@ """Taurus import tests""" from __future__ import absolute_import -from builtins import zip import sys import unittest @@ -69,7 +68,7 @@ def testImportSubmodules(self): exclude_patterns=exclude_patterns) msg = None if wrn: - msg = '\n%s' % '\n'.join(list(zip(*wrn))[1]) + msg = '\n%s' % '\n'.join(zip(*wrn)[1]) self.assertEqual(len(wrn), 0, msg=msg) From d3354f45f1ce205f29a37bd6e79791f29cc5a670 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 21 Sep 2018 09:41:59 +0200 Subject: [PATCH 107/252] (m) PEP8 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 5f9042dd1..1bd112af9 100644 --- a/setup.py +++ b/setup.py @@ -65,7 +65,7 @@ def get_release_info(): #Workaround for old setuptools -if LooseVersion(__version__) Date: Fri, 21 Sep 2018 09:45:09 +0200 Subject: [PATCH 108/252] Remove non-generic entries in .gitignore Some previous commits added a few entries to .gitignore which are system-specific and thus belong to .git/info/exclude (which is kept local) instead of .gitignore (which is shared under version control) --- .gitignore | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.gitignore b/.gitignore index 45a6f3d8e..c120963b4 100644 --- a/.gitignore +++ b/.gitignore @@ -5,8 +5,3 @@ MANIFEST /setup.cfg doc/~thumbnails.zip /lib/taurus.egg-info -*.bak -*.swp -*.orig -.eggs/ -.vscode/ From 5fccaf4f74af26e0a3206cfb87a002f6a9f0425e Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 21 Sep 2018 13:16:48 +0200 Subject: [PATCH 109/252] Review futurize changes in taurus.__init__ Review the futurize changes. - remove unused import --- lib/taurus/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/taurus/__init__.py b/lib/taurus/__init__.py index 9cbf2afff..9a8e92b89 100644 --- a/lib/taurus/__init__.py +++ b/lib/taurus/__init__.py @@ -26,7 +26,6 @@ """The main taurus module. It contains a reduced set of wrappers around the real taurus model classes and information regarding the current release.""" -from builtins import object from .core import release as __R From 0040296c7a930200c5ed3fd43462290d786dc695 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 21 Sep 2018 15:22:01 +0200 Subject: [PATCH 110/252] Review futurize changes in emitter Futurize treated some classes from the emitter modules as iterators (because they implemented a `next` method, but they are not really iterators. Revert the related futurize changes. --- .../qt/qtcore/configuration/configuration.py | 9 +++-- .../qt/qtcore/model/taurusdatabasemodel.py | 4 +-- lib/taurus/qt/qtcore/util/emitter.py | 35 ++++++++----------- lib/taurus/qt/qtcore/util/properties.py | 3 +- lib/taurus/qt/qtdesigner/containerplugin.py | 1 - .../qtdesigner/taurusplugin/taurusplugin.py | 7 ++-- lib/taurus/qt/qtgui/table/taurusgrid.py | 2 +- lib/taurus/qt/qtgui/tree/taurusdevicetree.py | 2 +- 8 files changed, 25 insertions(+), 38 deletions(-) diff --git a/lib/taurus/qt/qtcore/configuration/configuration.py b/lib/taurus/qt/qtcore/configuration/configuration.py index aadf627c0..dbc80ab75 100644 --- a/lib/taurus/qt/qtcore/configuration/configuration.py +++ b/lib/taurus/qt/qtcore/configuration/configuration.py @@ -30,7 +30,6 @@ from future import standard_library standard_library.install_aliases() from builtins import str -from past.builtins import basestring from builtins import object __all__ = ["configurableProperty", "BaseConfigurableClass"] @@ -410,7 +409,7 @@ def createQConfig(self): .. seealso:: :meth:`restoreQConfig` ''' from taurus.external.qt import Qt - import pickle as pickle + import pickle configdict = self.createConfig(allowUnpickable=False) return Qt.QByteArray(pickle.dumps(configdict)) @@ -424,7 +423,7 @@ def applyQConfig(self, qstate): ''' if qstate.isNull(): return - import pickle as pickle + import pickle configdict = pickle.loads(qstate.data()) self.applyConfig(configdict) @@ -435,7 +434,7 @@ def saveConfigFile(self, ofile=None): :return: (str) file name used """ - import pickle as pickle + import pickle if ofile is None: from taurus.external.qt import Qt ofile = str(Qt.QFileDialog.getSaveFileName( @@ -456,7 +455,7 @@ def loadConfigFile(self, ifile=None): :return: (str) file name used """ - import pickle as pickle + import pickle if ifile is None: from taurus.external.qt import Qt ifile = str(Qt.QFileDialog.getOpenFileName( diff --git a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py index e7a0b57fd..e1f68d5d6 100644 --- a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py +++ b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py @@ -267,7 +267,7 @@ def toolTip(self, index): alarms="[%s, %s]" % (di.alarms.min_alarm, di.alarms.max_alarm), warnings="[%s, %s]" % (di.alarms.min_warning, di.alarms.max_warning),) - for id, value in list(items.items()): + for id, value in items.items(): ret += '%s:%s' % ( id.capitalize(), value) ret += '' @@ -587,7 +587,7 @@ def setupModelData(self, data): servers = data.servers() rootItem = self._rootItem - for server_name, server in list(servers.items()): + for server_name, server in servers.items(): serverInstanceItem = TaurusTreeFullServerItem( self, server, rootItem) rootItem.appendChild(serverInstanceItem) diff --git a/lib/taurus/qt/qtcore/util/emitter.py b/lib/taurus/qt/qtcore/util/emitter.py index a1abb7898..0e6c430bc 100644 --- a/lib/taurus/qt/qtcore/util/emitter.py +++ b/lib/taurus/qt/qtcore/util/emitter.py @@ -27,19 +27,13 @@ emitter.py: This module provides a task scheduler used by TaurusGrid and TaurusDevTree widgets """ -from __future__ import division from future import standard_library standard_library.install_aliases() -from builtins import next from builtins import str -from builtins import map -from past.builtins import basestring -from past.utils import old_div from builtins import object from queue import Queue, Empty import traceback -from functools import partial from collections import Iterable from future.utils import string_types @@ -229,14 +223,14 @@ def __init__(self, parent=None, name='', queue=None, method=None, self.emitter.doSomething.connect(self._doSomething) if not self.refreshTimer: - self.emitter.somethingDone.connect(self.__next__) + self.emitter.somethingDone.connect(self.next) def onRefresh(self): try: size = self.getQueue().qsize() if size: self.log.info('onRefresh(%s)' % size) - next(self) + self.next() else: self.log.debug('onRefresh()') except: @@ -253,7 +247,7 @@ def getQueue(self): def getDone(self): """ Returns % of done tasks in 0-1 range """ pending = self.getQueue().qsize() - return old_div(float(self._done), (self._done + pending)) + return float(self._done) / (self._done + pending) def clear(self): while not self.todo.empty(): @@ -277,7 +271,7 @@ def purge(self, obj): nqueue.put(i) while not nqueue.empty(): self.queue.put(nqueue.get()) - next(self) + self.next() def _doSomething(self, params): self.log.debug('At TaurusEmitterThread._doSomething(%s)' % str(params)) @@ -295,7 +289,7 @@ def _doSomething(self, params): self._done += 1 return - def __next__(self): + def next(self): queue = self.getQueue() msg = ('At TaurusEmitterThread.next(), %d items remaining.' % queue.qsize()) @@ -328,7 +322,7 @@ def run(self): Qt.QApplication.instance().thread().msleep(self.timewait) self.log.info('#' * 80) self.log.info('At TaurusEmitterThread.run()') - next(self) + self.next() if self.refreshTimer: self.refreshTimer.start(self.polling) @@ -387,8 +381,7 @@ def getUnsubscribedAttributes(self): """Check all pending subscriptions in the current factory """ attrs = [] - items = list(self._factory.getExistingAttributes().items()) - for name, attr in items: + for name, attr in self._factory.getExistingAttributes().items(): if attr is None: continue elif attr.hasListeners() and not attr.isUsingEvents(): @@ -405,7 +398,7 @@ def addUnsubscribedAttributes(self): self.info('addUnsubscribedAttributes([%d])' % len(items)) for attr in items: self._addModelObj(attr) - next(self._modelsThread) + self._modelsThread.next() self.info('Thread queue: [%d]' % (self._modelsQueue.qsize())) except: self.warning(traceback.format_exc()) @@ -509,19 +502,19 @@ def getDone(self): return self.thread.getDone() def start(self): - self.thread.emitter.somethingDone.connect(self.__next__) - self.thread.emitter.newQueue.connect(self.thread.__next__) + self.thread.emitter.somethingDone.connect(self.next) + self.thread.emitter.newQueue.connect(self.thread.next) try: self.thread.start() except: pass - next(self) + self.next() self._running = True return def stop(self): - self.thread.emitter.somethingDone.disconnect(self.__next__) - self.thread.emitter.newQueue.disconnect(self.thread.__next__) + self.thread.emitter.somethingDone.disconnect(self.next) + self.thread.emitter.newQueue.disconnect(self.thread.next) self._running = False return @@ -546,7 +539,7 @@ def purge(self, obj): nqueue.put(i) while not nqueue.empty(): self.queue.put(nqueue.get()) - next(self) + self.next() def isRunning(self): return self._running diff --git a/lib/taurus/qt/qtcore/util/properties.py b/lib/taurus/qt/qtcore/util/properties.py index 524351556..287cdb1e8 100644 --- a/lib/taurus/qt/qtcore/util/properties.py +++ b/lib/taurus/qt/qtcore/util/properties.py @@ -57,7 +57,6 @@ def resetFilters(self): from builtins import str from builtins import map -from functools import partial from taurus.external.qt import Qt from taurus.core.util.fandango_search import isSequence, isDictionary @@ -83,7 +82,7 @@ def djoin(a, b): other, dct = sorted((a, b), key=isDictionary) if not isDictionary(other): other = dict.fromkeys(other if isSequence(other) else [other, ]) - for k, v in list(other.items()): + for k, v in other.items(): dct[k] = v if not k in dct else djoin(dct[k], v) return dct diff --git a/lib/taurus/qt/qtdesigner/containerplugin.py b/lib/taurus/qt/qtdesigner/containerplugin.py index 7e1330930..8a167b5d7 100644 --- a/lib/taurus/qt/qtdesigner/containerplugin.py +++ b/lib/taurus/qt/qtdesigner/containerplugin.py @@ -38,7 +38,6 @@ """ from __future__ import absolute_import -from taurus.core.util.log import Logger from taurus.external.qt import Qt from taurus.external.qt import QtDesigner diff --git a/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py b/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py index 9659b6720..4bdd0b0f5 100644 --- a/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py +++ b/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py @@ -37,9 +37,6 @@ editing the widget model (same has 'Edit model...' task menu item """ from __future__ import print_function - -from builtins import str -from builtins import zip import inspect from taurus.external.qt import Qt @@ -88,8 +85,8 @@ def __getWidgetArgs(self, klass=None, designMode=True, parent=None): if aspec.defaults is None: kwspec = {} else: - kwspec = dict(list(zip(aspec.args[-len(aspec.defaults):], - aspec.defaults))) + kwspec = dict(zip(aspec.args[-len(aspec.defaults):], + aspec.defaults)) args, kwargs = [], {} if 'designMode' in kwspec: kwargs['designMode'] = designMode diff --git a/lib/taurus/qt/qtgui/table/taurusgrid.py b/lib/taurus/qt/qtgui/table/taurusgrid.py index 8a685b7f1..06021988f 100644 --- a/lib/taurus/qt/qtgui/table/taurusgrid.py +++ b/lib/taurus/qt/qtgui/table/taurusgrid.py @@ -501,7 +501,7 @@ def setModel(self, model, devsInRows=False, delayed=False, append=False, else: # print 'In setModel(): Thread already started! (%d # objs in queue)'%(self.modelsThread.queue.qsize()) - next(self.modelsThread) + self.modelsThread.next() else: self.trace('In setModel(): models loading delayed!') pass diff --git a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py index d73b6a171..ce3521ba8 100644 --- a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py +++ b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py @@ -1014,7 +1014,7 @@ def findInTree(self, regexp, collapseAll=None, exclude=None, select=True, queue= for item in self.item_list if item.isExpanded()] self.debug('findInTree(%s): Node not found' % (regexp)) if queue: - next(self.Expander) + self.Expander.next() except: self.warning('findInTree(%s): failed' % (regexp)) self.error(traceback.format_exc()) From c6da28b86ce568a5e8d5e78ad4b9c735be9a52e2 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 27 Sep 2018 10:45:55 +0200 Subject: [PATCH 111/252] Review futurize changes in qtgui Review the futurize changes. - avoid (when reasonable) the non-idiomatic code introduced by futurize - remove unneeded futurize-related imports (refactor code if necessary) - avoid using futurize's `past` module - clean unused imports --- .../qt/qtgui/application/taurusapplication.py | 5 ++- lib/taurus/qt/qtgui/button/qbuttonbox.py | 1 - lib/taurus/qt/qtgui/button/taurusbutton.py | 3 +- .../qt/qtgui/compact/abstractswitcher.py | 1 - lib/taurus/qt/qtgui/container/taurusframe.py | 3 +- .../qt/qtgui/container/taurusgroupbox.py | 4 +-- .../qt/qtgui/container/taurusgroupwidget.py | 3 +- .../qt/qtgui/container/taurusmainwindow.py | 33 +++++++++++-------- .../qt/qtgui/container/taurusscrollarea.py | 3 +- lib/taurus/qt/qtgui/display/qled.py | 1 - lib/taurus/qt/qtgui/display/qpixmapwidget.py | 6 ++-- lib/taurus/qt/qtgui/display/qsevensegment.py | 10 ++---- lib/taurus/qt/qtgui/display/tauruslabel.py | 1 - lib/taurus/qt/qtgui/display/tauruslcd.py | 4 +-- lib/taurus/qt/qtgui/display/taurusled.py | 4 +-- .../qt/qtgui/display/test/test_tauruslabel.py | 1 - lib/taurus/qt/qtgui/editor/tauruseditor.py | 1 - .../qt/qtgui/extra_guiqwt/curvesmodel.py | 1 - lib/taurus/qt/qtgui/extra_guiqwt/plot.py | 1 - lib/taurus/qt/qtgui/extra_guiqwt/scales.py | 9 ++--- .../qt/qtgui/extra_guiqwt/taurustrend2d.py | 1 - lib/taurus/qt/qtgui/extra_guiqwt/tools.py | 3 +- lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py | 2 +- .../qt/qtgui/graphic/jdraw/jdraw_parser.py | 2 -- .../qt/qtgui/graphic/jdraw/jdraw_view.py | 7 ++-- lib/taurus/qt/qtgui/graphic/taurusgraphic.py | 13 +++----- lib/taurus/qt/qtgui/help/assistant.py | 1 - lib/taurus/qt/qtgui/icon/catalog.py | 2 +- lib/taurus/qt/qtgui/icon/icon.py | 1 - lib/taurus/qt/qtgui/input/qwheel.py | 6 ++-- lib/taurus/qt/qtgui/input/tauruscheckbox.py | 1 - lib/taurus/qt/qtgui/input/tauruscombobox.py | 1 - lib/taurus/qt/qtgui/input/tauruslineedit.py | 6 ++-- lib/taurus/qt/qtgui/input/taurusspinbox.py | 1 - lib/taurus/qt/qtgui/model/qbasemodel.py | 2 +- .../qt/qtgui/panel/qdataexportdialog.py | 5 +-- lib/taurus/qt/qtgui/panel/qrawdatachooser.py | 1 - .../qt/qtgui/panel/report/albareport.py | 1 - .../qt/qtgui/panel/report/basicreport.py | 1 - .../qt/qtgui/panel/taurusconfigeditor.py | 3 +- .../qtgui/panel/taurusconfigurationpanel.py | 1 - lib/taurus/qt/qtgui/panel/taurusdemo.py | 2 -- .../qt/qtgui/panel/taurusdevicepanel.py | 9 +++-- lib/taurus/qt/qtgui/panel/taurusform.py | 6 +--- lib/taurus/qt/qtgui/panel/taurusinputpanel.py | 1 - .../qt/qtgui/panel/taurusmessagepanel.py | 5 ++- .../qt/qtgui/panel/taurusmodelchooser.py | 1 - lib/taurus/qt/qtgui/panel/taurusmodellist.py | 3 -- lib/taurus/qt/qtgui/panel/taurusvalue.py | 1 - .../qt/qtgui/panel/test/test_taurusvalue.py | 1 - lib/taurus/qt/qtgui/plot/arrayedit.py | 9 ++--- lib/taurus/qt/qtgui/plot/curveStatsDlg.py | 18 +++++----- lib/taurus/qt/qtgui/plot/curveprops.py | 1 - .../qtgui/plot/curvesAppearanceChooserDlg.py | 1 - lib/taurus/qt/qtgui/plot/qwtdialog.py | 11 ++----- lib/taurus/qt/qtgui/plot/scales.py | 11 +++---- lib/taurus/qt/qtgui/plot/taurusarrayedit.py | 1 - lib/taurus/qt/qtgui/plot/taurusplot.py | 30 ++++++++--------- lib/taurus/qt/qtgui/plot/taurustrend.py | 3 -- lib/taurus/qt/qtgui/table/qdictionary.py | 8 +---- lib/taurus/qt/qtgui/table/qlogtable.py | 31 +++++------------ .../qtgui/table/taurusdevicepropertytable.py | 1 - lib/taurus/qt/qtgui/table/taurusgrid.py | 9 +---- .../qt/qtgui/table/taurusvaluestable.py | 24 +++++++------- .../qt/qtgui/taurusgui/appsettingswizard.py | 11 +++---- .../qt/qtgui/taurusgui/macrolistener.py | 6 ++-- .../qtgui/taurusgui/paneldescriptionwizard.py | 4 --- lib/taurus/qt/qtgui/taurusgui/taurusgui.py | 27 ++++++++------- lib/taurus/qt/qtgui/taurusgui/utils.py | 5 --- lib/taurus/qt/qtgui/test/base.py | 1 - lib/taurus/qt/qtgui/tree/qtree.py | 1 - lib/taurus/qt/qtgui/tree/taurusdevicetree.py | 22 +++++-------- lib/taurus/qt/qtgui/util/taurusaction.py | 1 - .../qt/qtgui/util/tauruswidgetfactory.py | 4 +-- lib/taurus/qt/qtgui/util/tauruswidgettree.py | 1 - 75 files changed, 144 insertions(+), 282 deletions(-) diff --git a/lib/taurus/qt/qtgui/application/taurusapplication.py b/lib/taurus/qt/qtgui/application/taurusapplication.py index 7288583e3..f7d9e19f6 100644 --- a/lib/taurus/qt/qtgui/application/taurusapplication.py +++ b/lib/taurus/qt/qtgui/application/taurusapplication.py @@ -25,9 +25,8 @@ """This module provides the base :class:`taurus.qt.qtgui.application.TaurusApplication` class.""" -from __future__ import with_statement -from builtins import str +from builtins import str __all__ = ["TaurusApplication"] @@ -68,7 +67,7 @@ def __init__(self, name='', parent=None, format=None, std=None, self.log_obj.propagate = False self.std = std -#Trying to mimic stderr + #Trying to mimic stderr @property def errors(self): return self.std.errors diff --git a/lib/taurus/qt/qtgui/button/qbuttonbox.py b/lib/taurus/qt/qtgui/button/qbuttonbox.py index bf07ee444..dc3646207 100644 --- a/lib/taurus/qt/qtgui/button/qbuttonbox.py +++ b/lib/taurus/qt/qtgui/button/qbuttonbox.py @@ -26,7 +26,6 @@ """ qbuttonbox.py: """ -from __future__ import print_function __all__ = ["QButtonBox"] diff --git a/lib/taurus/qt/qtgui/button/taurusbutton.py b/lib/taurus/qt/qtgui/button/taurusbutton.py index 5b843546b..2c059437f 100644 --- a/lib/taurus/qt/qtgui/button/taurusbutton.py +++ b/lib/taurus/qt/qtgui/button/taurusbutton.py @@ -29,7 +29,6 @@ from builtins import map from builtins import str -from past.builtins import basestring __all__ = ["TaurusLauncherButton", "TaurusCommandButton", "TaurusLockButton"] __docformat__ = 'restructuredtext' @@ -445,7 +444,7 @@ def setParameters(self, parameters): quotes will be removed and the quoted text will not be splitted. ''' - if isinstance(parameters, string_types+ (Qt.QString,)): + if isinstance(parameters, string_types + (Qt.QString,)): parameters = str(parameters).strip() if parameters[0] in ('"', "'") and parameters[0] == parameters[-1]: parameters = [parameters[1:-1]] diff --git a/lib/taurus/qt/qtgui/compact/abstractswitcher.py b/lib/taurus/qt/qtgui/compact/abstractswitcher.py index 4ba74b742..a5e9ad5a2 100644 --- a/lib/taurus/qt/qtgui/compact/abstractswitcher.py +++ b/lib/taurus/qt/qtgui/compact/abstractswitcher.py @@ -26,7 +26,6 @@ """This module provides base classes from which the compact widgets should inherit """ -from past.builtins import basestring __all__ = ["TaurusReadWriteSwitcher"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/container/taurusframe.py b/lib/taurus/qt/qtgui/container/taurusframe.py index e9e534835..fca07350c 100644 --- a/lib/taurus/qt/qtgui/container/taurusframe.py +++ b/lib/taurus/qt/qtgui/container/taurusframe.py @@ -26,7 +26,6 @@ """This module provides basic taurus container widgets""" from __future__ import absolute_import -from builtins import map __all__ = ["TaurusFrame"] __docformat__ = 'restructuredtext' @@ -148,7 +147,7 @@ def main(): if len(args) == 0: w = demo() else: - models = list(map(str.lower, args)) + models = map(str.lower, args) w = Qt.QWidget() w.setWindowTitle(app.applicationName()) diff --git a/lib/taurus/qt/qtgui/container/taurusgroupbox.py b/lib/taurus/qt/qtgui/container/taurusgroupbox.py index c1d237081..da8635f49 100644 --- a/lib/taurus/qt/qtgui/container/taurusgroupbox.py +++ b/lib/taurus/qt/qtgui/container/taurusgroupbox.py @@ -26,8 +26,6 @@ """This module provides basic taurus group box widget""" from __future__ import absolute_import -from builtins import map -from builtins import str __all__ = ["TaurusGroupBox"] __docformat__ = 'restructuredtext' @@ -194,7 +192,7 @@ def main(): if len(args) == 0: w = demo() else: - models = list(map(str.lower, args)) + models = map(str.lower, args) w = Qt.QWidget() w.setWindowTitle(app.applicationName()) diff --git a/lib/taurus/qt/qtgui/container/taurusgroupwidget.py b/lib/taurus/qt/qtgui/container/taurusgroupwidget.py index a318ef912..3f8ab61ea 100644 --- a/lib/taurus/qt/qtgui/container/taurusgroupwidget.py +++ b/lib/taurus/qt/qtgui/container/taurusgroupwidget.py @@ -26,7 +26,6 @@ """This module provides a taurus group widget""" from __future__ import absolute_import -from builtins import map __all__ = ["TaurusGroupWidget"] __docformat__ = 'restructuredtext' @@ -190,7 +189,7 @@ def main(): if len(args) == 0: w = demo() else: - models = list(map(str.lower, args)) + models = map(str.lower, args) w = Qt.QWidget() w.setWindowTitle(app.applicationName()) diff --git a/lib/taurus/qt/qtgui/container/taurusmainwindow.py b/lib/taurus/qt/qtgui/container/taurusmainwindow.py index 8f9cf4fe2..6ca1cde0f 100644 --- a/lib/taurus/qt/qtgui/container/taurusmainwindow.py +++ b/lib/taurus/qt/qtgui/container/taurusmainwindow.py @@ -29,8 +29,6 @@ from __future__ import absolute_import from builtins import str -from builtins import range -from past.builtins import basestring __all__ = ["TaurusMainWindow"] __docformat__ = 'restructuredtext' @@ -111,13 +109,12 @@ def deleteExternalAppConfig(self, extapp): ''' from taurus.external.qt import Qt layout = self.externalAppsPage.widget().layout() - for cnt in reversed(list(range(layout.count()))): + for cnt in reversed(range(layout.count())): widget = layout.itemAt(cnt).widget() if widget is not None: text = str(widget.text()) # command1 if isinstance(widget, Qt.QLabel): - dialog_text = "Command line for %s" % str( - extapp.text()) + dialog_text = "Command line for %s" % str(extapp.text()) if text == dialog_text: layout.removeWidget(widget) widget.close() @@ -682,13 +679,19 @@ def savePerspective(self, name=None): ''' perspectives = self.getPerspectivesList() if name is None: - name, ok = Qt.QInputDialog.getItem(self, "Save Perspective", "Store current settings as the following perspective:", - perspectives, 0, True) + name, ok = Qt.QInputDialog.getItem( + self, "Save Perspective", + "Store current settings as the following perspective:", + perspectives, 0, True + ) if not ok: return if name in perspectives: - ans = Qt.QMessageBox.question(self, "Overwrite perspective?", "overwrite existing perspective %s?" % str(name), - Qt.QMessageBox.Yes, Qt.QMessageBox.No) + ans = Qt.QMessageBox.question( + self, "Overwrite perspective?", + "overwrite existing perspective %s?" % str(name), + Qt.QMessageBox.Yes, Qt.QMessageBox.No + ) if ans != Qt.QMessageBox.Yes: return self.saveSettings(group="Perspectives/%s" % name) @@ -765,8 +768,10 @@ def exportSettingsFile(self, fname=None): :param fname: (str) name of output file. If None given, a file dialog will be shown. ''' if fname is None: - fname = str(Qt.QFileDialog.getSaveFileName(self, 'Choose file where the current settings should be saved', - '', "Ini files (*.ini);;All files (*)")) + fname = str(Qt.QFileDialog.getSaveFileName( + self, 'Choose file where the current settings should be saved', + '', "Ini files (*.ini);;All files (*)") + ) if not fname: return self.saveSettings() @@ -785,8 +790,10 @@ def importSettingsFile(self, fname=None): :param fname: (str) name of ini file. If None given, a file dialog will be shown. ''' if fname is None: - fname = str(Qt.QFileDialog.getOpenFileName(self, 'Select a ini-format settings file', - '', "Ini files (*.ini);;All files (*)")) + fname = str(Qt.QFileDialog.getOpenFileName( + self, 'Select a ini-format settings file', + '', "Ini files (*.ini);;All files (*)") + ) if not fname: return s = Qt.QSettings(fname, Qt.QSettings.IniFormat) diff --git a/lib/taurus/qt/qtgui/container/taurusscrollarea.py b/lib/taurus/qt/qtgui/container/taurusscrollarea.py index d6ab2c68b..fdaacf26c 100644 --- a/lib/taurus/qt/qtgui/container/taurusscrollarea.py +++ b/lib/taurus/qt/qtgui/container/taurusscrollarea.py @@ -26,7 +26,6 @@ """This module provides basic taurus scroll area widget""" from __future__ import absolute_import -from builtins import map __all__ = ["TaurusScrollArea"] __docformat__ = 'restructuredtext' @@ -170,7 +169,7 @@ def main(): if len(args) == 0: w = demo() else: - models = list(map(str.lower, args)) + models = map(str.lower, args) w = Qt.QWidget() w.setWindowTitle(app.applicationName()) diff --git a/lib/taurus/qt/qtgui/display/qled.py b/lib/taurus/qt/qtgui/display/qled.py index 0163119be..0cb1e040f 100644 --- a/lib/taurus/qt/qtgui/display/qled.py +++ b/lib/taurus/qt/qtgui/display/qled.py @@ -25,7 +25,6 @@ """A pure Qt led widget""" -from builtins import str __all__ = ["LedColor", "LedStatus", "LedSize", "QLed", "QLedOld"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/display/qpixmapwidget.py b/lib/taurus/qt/qtgui/display/qpixmapwidget.py index 860e6c8d0..5659964c3 100644 --- a/lib/taurus/qt/qtgui/display/qpixmapwidget.py +++ b/lib/taurus/qt/qtgui/display/qpixmapwidget.py @@ -25,9 +25,7 @@ """This module contains a pure Qt widget that displays an image""" from __future__ import absolute_import -from __future__ import division -from past.utils import old_div __all__ = ["QPixmapWidget"] __docformat__ = 'restructuredtext' @@ -82,11 +80,11 @@ def paintEvent(self, paintEvent): vAlign = align & Qt.Qt.AlignVertical_Mask x, y = 0, 0 if hAlign & Qt.Qt.AlignHCenter: - x = old_div((w - pw), 2) + x = (w - pw) // 2 elif hAlign & Qt.Qt.AlignRight: x = w - pw if vAlign & Qt.Qt.AlignVCenter: - y = old_div((h - ph), 2) + y = (h - ph) // 2 elif vAlign & Qt.Qt.AlignBottom: y = h - ph x, y = max(0, x), max(0, y) diff --git a/lib/taurus/qt/qtgui/display/qsevensegment.py b/lib/taurus/qt/qtgui/display/qsevensegment.py index fd44b94c3..43bd86f8d 100644 --- a/lib/taurus/qt/qtgui/display/qsevensegment.py +++ b/lib/taurus/qt/qtgui/display/qsevensegment.py @@ -27,11 +27,7 @@ qsevensegmentdisplay.py """ from __future__ import print_function -from __future__ import division -from builtins import str -from builtins import range -from past.utils import old_div __all__ = ['Q7SegDigit'] __docformat__ = 'restructuredtext' @@ -138,7 +134,7 @@ class Q7SegDigit(Qt.QWidget): DftWidth = 300 DftHeight = 300 - DftAspectRatio = old_div(DftWidth, DftHeight) + DftAspectRatio = DftWidth // DftHeight DftUseFrame = True def __init__(self, parent=None, **kwargs): @@ -206,11 +202,11 @@ def paintEvent(self, evt): painter.setRenderHint(Qt.QPainter.Antialiasing) painter.setWindow(0, 0, self.DftWidth, self.DftHeight) w, h = float(self.width()), float(self.height()) - aspect = old_div(w, h) + aspect = w / h if aspect > 0.75: w = h * aspect else: - h = old_div(w, aspect) + h = w / aspect painter.setViewport(0, 0, w, h) self._paintBorder(painter) self._paintSegment(painter) diff --git a/lib/taurus/qt/qtgui/display/tauruslabel.py b/lib/taurus/qt/qtgui/display/tauruslabel.py index ba196647a..8392d47d2 100644 --- a/lib/taurus/qt/qtgui/display/tauruslabel.py +++ b/lib/taurus/qt/qtgui/display/tauruslabel.py @@ -32,7 +32,6 @@ __docformat__ = 'restructuredtext' -import operator import collections import re diff --git a/lib/taurus/qt/qtgui/display/tauruslcd.py b/lib/taurus/qt/qtgui/display/tauruslcd.py index adca578c3..1da087806 100644 --- a/lib/taurus/qt/qtgui/display/tauruslcd.py +++ b/lib/taurus/qt/qtgui/display/tauruslcd.py @@ -26,7 +26,6 @@ """This module provides a Taurus widget based on QLCDNumber""" from __future__ import absolute_import -from builtins import map from builtins import str from builtins import object __all__ = ["TaurusLCD"] @@ -34,7 +33,6 @@ __docformat__ = 'restructuredtext' import collections -import operator from taurus.core.taurusbasetypes import (TaurusElementType, TaurusEventType, AttrQuality, TaurusDevState) @@ -413,7 +411,7 @@ def main(): if len(args) == 0: w = demo() else: - models = list(map(str.lower, args)) + models = map(str.lower, args) w = Qt.QWidget() layout = Qt.QGridLayout() diff --git a/lib/taurus/qt/qtgui/display/taurusled.py b/lib/taurus/qt/qtgui/display/taurusled.py index d7b052d8a..54dbe31a1 100644 --- a/lib/taurus/qt/qtgui/display/taurusled.py +++ b/lib/taurus/qt/qtgui/display/taurusled.py @@ -27,7 +27,6 @@ """This module provides a set of basic Taurus widgets based on QLed""" from __future__ import absolute_import -from builtins import map from builtins import str from builtins import object __all__ = ["TaurusLed"] @@ -36,7 +35,6 @@ import weakref import collections -import operator from taurus.external.qt import Qt @@ -478,7 +476,7 @@ def main(): if len(args) == 0: w = demo() else: - models = list(map(str.lower, args)) + models = map(str.lower, args) w = Qt.QWidget() layout = Qt.QGridLayout() diff --git a/lib/taurus/qt/qtgui/display/test/test_tauruslabel.py b/lib/taurus/qt/qtgui/display/test/test_tauruslabel.py index da019f0aa..bedc02be4 100644 --- a/lib/taurus/qt/qtgui/display/test/test_tauruslabel.py +++ b/lib/taurus/qt/qtgui/display/test/test_tauruslabel.py @@ -25,7 +25,6 @@ """Unit tests for Taurus Label""" -from builtins import str import unittest from taurus.external.qt import Qt from taurus.test import insertTest diff --git a/lib/taurus/qt/qtgui/editor/tauruseditor.py b/lib/taurus/qt/qtgui/editor/tauruseditor.py index 3dadedaf8..bc472974b 100644 --- a/lib/taurus/qt/qtgui/editor/tauruseditor.py +++ b/lib/taurus/qt/qtgui/editor/tauruseditor.py @@ -25,7 +25,6 @@ """This module contains a taurus text editor widget.""" -from builtins import str __all__ = ["TaurusBaseEditor"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py index b3a4697ea..927d6c830 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py @@ -27,7 +27,6 @@ curvesmodel Model and view for new CurveItem configuration """ from __future__ import print_function -from builtins import map from builtins import next from builtins import str from builtins import range diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py index 436b25020..c4ce11f36 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py @@ -28,7 +28,6 @@ """ from builtins import next from builtins import str -from past.builtins import basestring __all__ = ["TaurusCurveDialog", "TaurusTrendDialog", "TaurusImageDialog"] import copy diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/scales.py b/lib/taurus/qt/qtgui/extra_guiqwt/scales.py index e0532299e..9b9b6e5c4 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/scales.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/scales.py @@ -27,11 +27,6 @@ scales.py: Custom scales used by taurus.qt.qtgui.plot module """ from __future__ import print_function -from __future__ import division -from builtins import map -from builtins import str -from builtins import range -from past.utils import old_div __all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", "FixedLabelsScaleDraw"] @@ -242,7 +237,7 @@ def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize): # make sure to comply with maxMajTicks L = len(majticks) if L > maxMajSteps: - majticks = majticks[::int(numpy.ceil(old_div(float(L), maxMajSteps)))] + majticks = majticks[::int(numpy.ceil(float(L) / maxMajSteps))] scaleDiv = qwt.QwtScaleDiv(interval, minticks, medticks, majticks) self.scaleDraw().setDatetimeLabelFormat(format) @@ -375,7 +370,7 @@ def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize): s = 86400 # 1 day # calculate a step size that respects the base step (s) and also # enforces the maxMajSteps - stepSize = s * int(numpy.ceil(old_div(float(d_range // s), maxMajSteps))) + stepSize = s * int(numpy.ceil(float(d_range // s) / maxMajSteps)) return qwt.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize) @staticmethod diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py b/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py index 03b7a85ae..af5649057 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py @@ -26,7 +26,6 @@ """ taurustrend.py: Generic trend widget for Taurus """ -from builtins import str __all__ = ["TaurusTrend2DDialog"] from guiqwt.plot import ImageDialog diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/tools.py b/lib/taurus/qt/qtgui/extra_guiqwt/tools.py index a861c3dc2..25920c4f4 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/tools.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/tools.py @@ -26,7 +26,6 @@ """Extension of :mod:`guiqwt.tools`""" -from builtins import zip __docformat__ = 'restructuredtext' import weakref @@ -174,7 +173,7 @@ def _getAxesUseTime(self, plot): def update_status(self, plot): active_scale = self._getAxesUseTime(plot) - for scale_type, scale_action in list(self.scale_menu.items()): + for scale_type, scale_action in self.scale_menu.items(): scale_action.setEnabled(True) if active_scale == scale_type: scale_action.setChecked(True) diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py index 1603188de..6ce3738c8 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py @@ -334,7 +334,7 @@ def set_common_params(self, item, params): params.get('extensions')["ignoreRepaint"] = "true" if self.alias: - for k, v in list(self.alias.items()): + for k, v in self.alias.items(): name = str(name).replace(k, v) # Forcing not-Taurus items to have a name and be able to trigger events diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py index eb6069b3c..3751441ad 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py @@ -27,12 +27,10 @@ from __future__ import absolute_import -from builtins import str __all__ = ["new_parser", "parse"] import os import re -import imp from ply import lex from ply import yacc diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py index 15b663e24..c62a08bbd 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py @@ -27,7 +27,6 @@ from __future__ import absolute_import from builtins import str -from past.builtins import basestring __all__ = ["TaurusJDrawSynopticsView"] __docformat__ = 'restructuredtext' @@ -144,7 +143,7 @@ def setAlias(self, alias): return def get_item_list(self): - return [item._name for item in list(self.scene().items()) if hasattr(item, '_name') and item._name] + return [item._name for item in self.scene().items() if hasattr(item, '_name') and item._name] def get_device_list(self): items = [(item, parseTangoUri(item)) for item in self.get_item_list()] @@ -153,7 +152,7 @@ def get_device_list(self): def get_item_colors(self, emit=False): item_colors = {} try: - for item in list(self.scene().items()): + for item in self.scene().items(): if not getattr(item, '_name', '') or not getattr(item, '_currBgBrush', None): continue item_colors[item._name] = item._currBgBrush.color().name() @@ -426,7 +425,7 @@ def closeEvent(self, event=None): def setModels(self): """ This method triggers item.setModel(item._name) in all internal items. """ - for item in list(self.scene().items()): + for item in self.scene().items(): if item._name and isinstance(item, TaurusGraphicsItem): self.debug( 'TaurusJDrawGraphicsFactory.setModels(): calling item.setModel(%s)' % (item._name)) diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py index 9c32f6bc0..8325f3ed0 100755 --- a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py +++ b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py @@ -26,7 +26,6 @@ taurusgraphic.py: """ from __future__ import print_function -from __future__ import division # TODO: Tango-centric @@ -34,9 +33,7 @@ standard_library.install_aliases() from builtins import str from builtins import range -from past.builtins import basestring from builtins import object -from past.utils import old_div __all__ = ['SynopticSelectionStyle', 'parseTangoUri', 'QEmitter', # TODO: QEmitter should probably be removed (kept priv) @@ -69,8 +66,6 @@ import subprocess import traceback import collections -import operator -import types from future.utils import string_types from queue import Queue @@ -699,7 +694,7 @@ def getSelectionMark(self, picture=None, w=10, h=10): else: if isinstance(picture, Qt.QPixmap): pixmap = picture - elif isinstance(picture, string_types) or isinstance(picture, Qt.QString): + elif isinstance(picture, string_types + (Qt.QString,)): picture = str(picture) pixmap = Qt.QPixmap(os.path.realpath(picture)) SelectionMark = Qt.QGraphicsPixmapItem() @@ -743,8 +738,8 @@ def bound(coords, bounds=LIMITS): if w > MAX_CIRCLE_SIZE[0] or h > MAX_CIRCLE_SIZE[1]: # Applying correction if the file is too big, half max # circle size around the center - x, y = (x + old_div(w, 2.)) - .5 * \ - MAX_CIRCLE_SIZE[0], (y + old_div(h, 2.)) - .5 * \ + x, y = (x + w / 2.) - .5 * \ + MAX_CIRCLE_SIZE[0], (y + h / 2.) - .5 * \ MAX_CIRCLE_SIZE[1], w, h = [.5 * t for t in MAX_CIRCLE_SIZE] else: @@ -1515,7 +1510,7 @@ def getGraphicsClassItem(self, cls, type_): def getGraphicsItem(self, type_, params): name = params.get(self.getNameParam()) # applying alias - for k, v in list(getattr(self, 'alias', {}).items()): + for k, v in getattr(self, 'alias', {}).items(): if k in name: name = str(name).replace(k, v) params[self.getNameParam()] = name diff --git a/lib/taurus/qt/qtgui/help/assistant.py b/lib/taurus/qt/qtgui/help/assistant.py index cb901aec4..e682fba86 100644 --- a/lib/taurus/qt/qtgui/help/assistant.py +++ b/lib/taurus/qt/qtgui/help/assistant.py @@ -39,7 +39,6 @@ app.exec_() """ -from builtins import str from builtins import object __all__ = ["Assistant", "Widgets"] diff --git a/lib/taurus/qt/qtgui/icon/catalog.py b/lib/taurus/qt/qtgui/icon/catalog.py index c97183977..b57e2c064 100644 --- a/lib/taurus/qt/qtgui/icon/catalog.py +++ b/lib/taurus/qt/qtgui/icon/catalog.py @@ -78,7 +78,7 @@ def __build_catalog(self, prefix, columns=10): pixmaps = {} choices = [] row = [] - for md5, choice in list(hashes.items()): + for md5, choice in hashes.items(): try: pixmaps[choice] = pixmaps_hashed[md5] except KeyError: diff --git a/lib/taurus/qt/qtgui/icon/icon.py b/lib/taurus/qt/qtgui/icon/icon.py index 13896c24b..0299849f6 100644 --- a/lib/taurus/qt/qtgui/icon/icon.py +++ b/lib/taurus/qt/qtgui/icon/icon.py @@ -25,7 +25,6 @@ """This module provides taurus-specific functions related to icons""" -from builtins import range __all__ = [ 'sanitizePrefix', 'registerPathFiles', diff --git a/lib/taurus/qt/qtgui/input/qwheel.py b/lib/taurus/qt/qtgui/input/qwheel.py index ffcb8459d..34caed12e 100755 --- a/lib/taurus/qt/qtgui/input/qwheel.py +++ b/lib/taurus/qt/qtgui/input/qwheel.py @@ -24,11 +24,9 @@ ############################################################################# """This module provides an arrow based widget.""" -from __future__ import division from builtins import map from builtins import range -from past.utils import old_div __all__ = ["QWheelEdit"] __docformat__ = 'restructuredtext' @@ -780,8 +778,8 @@ def hideEditWidget(self): self.setFocus() def wheelEvent(self, evt): - numDegrees = old_div(evt.delta(), 8) - numSteps = old_div(numDegrees, 15) + numDegrees = evt.delta() // 8 + numSteps = numDegrees // 15 #w = Qt.QApplication.focusWidget() w = self.focusWidget() if not isinstance(w, _DigitLabel): diff --git a/lib/taurus/qt/qtgui/input/tauruscheckbox.py b/lib/taurus/qt/qtgui/input/tauruscheckbox.py index 52777a9c2..923100c00 100644 --- a/lib/taurus/qt/qtgui/input/tauruscheckbox.py +++ b/lib/taurus/qt/qtgui/input/tauruscheckbox.py @@ -25,7 +25,6 @@ """This module provides a set of basic taurus widgets based on QCheckBox""" -from builtins import str __all__ = ["TaurusValueCheckBox"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/input/tauruscombobox.py b/lib/taurus/qt/qtgui/input/tauruscombobox.py index 9777af511..9baebcbca 100644 --- a/lib/taurus/qt/qtgui/input/tauruscombobox.py +++ b/lib/taurus/qt/qtgui/input/tauruscombobox.py @@ -26,7 +26,6 @@ """This module provides a set of basic taurus widgets based on QCheckBox""" -from builtins import str __all__ = ["TaurusAttrListComboBox", "TaurusValueComboBox"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/input/tauruslineedit.py b/lib/taurus/qt/qtgui/input/tauruslineedit.py index 887bf6488..4954a6ce4 100755 --- a/lib/taurus/qt/qtgui/input/tauruslineedit.py +++ b/lib/taurus/qt/qtgui/input/tauruslineedit.py @@ -26,11 +26,9 @@ """ This module provides a set of basic taurus widgets based on QLineEdit """ -from __future__ import division from builtins import bytes from builtins import str -from past.utils import old_div import sys import numpy from taurus.external.qt import Qt @@ -206,8 +204,8 @@ def wheelEvent(self, evt): return Qt.QLineEdit.wheelEvent(self, evt) evt.accept() - numDegrees = old_div(evt.delta(), 8) - numSteps = old_div(numDegrees, 15) + numDegrees = evt.delta() // 8 + numSteps = numDegrees // 15 self._stepBy(numSteps) def keyPressEvent(self, evt): diff --git a/lib/taurus/qt/qtgui/input/taurusspinbox.py b/lib/taurus/qt/qtgui/input/taurusspinbox.py index ab6c502c4..9700ef46e 100644 --- a/lib/taurus/qt/qtgui/input/taurusspinbox.py +++ b/lib/taurus/qt/qtgui/input/taurusspinbox.py @@ -28,7 +28,6 @@ """ from __future__ import absolute_import -from builtins import str from taurus.external.qt import Qt from .tauruslineedit import TaurusValueLineEdit diff --git a/lib/taurus/qt/qtgui/model/qbasemodel.py b/lib/taurus/qt/qtgui/model/qbasemodel.py index 958e1c2c6..e5b79cda8 100644 --- a/lib/taurus/qt/qtgui/model/qbasemodel.py +++ b/lib/taurus/qt/qtgui/model/qbasemodel.py @@ -236,7 +236,7 @@ def __init__(self, perspective, view=None, parent=None, designMode=False): menu = Qt.QMenu("Perspective", b) b.setMenu(menu) af = ActionFactory() - for persp, persp_data in list(view.KnownPerspectives.items()): + for persp, persp_data in view.KnownPerspectives.items(): label = persp_data["label"] icon = Qt.QIcon.fromTheme(persp_data["icon"]) tip = persp_data["tooltip"] diff --git a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py index e4079575a..19b72a09d 100755 --- a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py +++ b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py @@ -27,9 +27,6 @@ one or more curves""" from __future__ import print_function -from builtins import zip -from builtins import str -from builtins import range __all__ = ["QDataExportDialog"] import os.path @@ -155,7 +152,7 @@ def exportAllData(self, preffix=None): if not outputdir: return False preffix = os.path.join(str(outputdir), "set") - for i, k in zip(list(range(len(self.datadict))), self.sortedNames): + for i, k in zip(range(len(self.datadict)), self.sortedNames): ofile = "%s%03i.dat" % (preffix, i + 1) try: self.exportCurrentData( diff --git a/lib/taurus/qt/qtgui/panel/qrawdatachooser.py b/lib/taurus/qt/qtgui/panel/qrawdatachooser.py index 0b970acc6..90fe1fb50 100644 --- a/lib/taurus/qt/qtgui/panel/qrawdatachooser.py +++ b/lib/taurus/qt/qtgui/panel/qrawdatachooser.py @@ -27,7 +27,6 @@ RawDataChooser.py: widget for importing RawData (from file or from a function) """ -from builtins import str __all__ = ["QRawDataWidget"] import numpy diff --git a/lib/taurus/qt/qtgui/panel/report/albareport.py b/lib/taurus/qt/qtgui/panel/report/albareport.py index bf2227cfb..08a02f989 100644 --- a/lib/taurus/qt/qtgui/panel/report/albareport.py +++ b/lib/taurus/qt/qtgui/panel/report/albareport.py @@ -28,7 +28,6 @@ __package__ = 'taurus.qt.qtgui.panel.report' -from builtins import str __all__ = ["TicketReportHandler"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/panel/report/basicreport.py b/lib/taurus/qt/qtgui/panel/report/basicreport.py index 82fec5661..0bb51dc78 100644 --- a/lib/taurus/qt/qtgui/panel/report/basicreport.py +++ b/lib/taurus/qt/qtgui/panel/report/basicreport.py @@ -25,7 +25,6 @@ """This module provides a panel to display taurus messages""" -from builtins import str __all__ = ["ClipboardReportHandler", "SMTPReportHandler"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py index 127cc41c5..bee97269f 100644 --- a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py +++ b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py @@ -29,13 +29,12 @@ from future import standard_library standard_library.install_aliases() -from builtins import str __all__ = ["QConfigEditor"] __docformat__ = 'restructuredtext' from taurus.external.qt import Qt -import pickle as pickle +import pickle import os import tempfile from taurus.qt.qtcore.configuration import BaseConfigurableClass diff --git a/lib/taurus/qt/qtgui/panel/taurusconfigurationpanel.py b/lib/taurus/qt/qtgui/panel/taurusconfigurationpanel.py index 01392457b..06c8226ba 100755 --- a/lib/taurus/qt/qtgui/panel/taurusconfigurationpanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusconfigurationpanel.py @@ -25,7 +25,6 @@ """This module provides a set of basic taurus widgets based on QLineEdit""" -from builtins import str __all__ = ["TaurusConfigurationPanel", "TangoConfigLineEdit", "TaurusConfigLineEdit"] diff --git a/lib/taurus/qt/qtgui/panel/taurusdemo.py b/lib/taurus/qt/qtgui/panel/taurusdemo.py index f11de87f7..79e179e19 100644 --- a/lib/taurus/qt/qtgui/panel/taurusdemo.py +++ b/lib/taurus/qt/qtgui/panel/taurusdemo.py @@ -24,9 +24,7 @@ ############################################################################# from __future__ import print_function -from builtins import str import sys -import operator import taurus.core.util import taurus.qt.qtgui.util diff --git a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py index 2bcd4f1ff..023ed3971 100644 --- a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py @@ -28,7 +28,6 @@ """ from builtins import str -from past.builtins import basestring __all__ = ["TaurusDevicePanel", "TaurusDevPanel"] __docformat__ = 'restructuredtext' @@ -76,16 +75,16 @@ def searchCl(m, k): # TODO: Tango-centric def get_regexp_dict(dct, key, default=None): # TODO: Tango-centric - for k, v in list(dct.items()): # Trying regular expression match + for k, v in dct.items(): # Trying regular expression match if matchCl(k, key): return v - for k, v in list(dct.items()): # If failed, trying if key is contained + for k, v in dct.items(): # If failed, trying if key is contained if k.lower() in key.lower(): return v if default is not None: return default else: - raise Exception('KeyNotFound:%s' % k) + raise Exception('KeyNotFound:%s' % key) def get_eqtype(dev): # TODO: Tango-centric @@ -332,7 +331,7 @@ def setModel(self, model, pixmap=None): font.setPointSize(15) self._label.setFont(font) if pixmap is None and self.getIconMap(): - for k, v in list(self.getIconMap().items()): + for k, v in self.getIconMap().items(): if searchCl(k, model): pixmap = v if pixmap is not None: diff --git a/lib/taurus/qt/qtgui/panel/taurusform.py b/lib/taurus/qt/qtgui/panel/taurusform.py index 21c64a275..60de40378 100644 --- a/lib/taurus/qt/qtgui/panel/taurusform.py +++ b/lib/taurus/qt/qtgui/panel/taurusform.py @@ -27,10 +27,6 @@ from __future__ import print_function from __future__ import absolute_import -from builtins import zip -from builtins import filter -from builtins import str -from past.builtins import basestring __all__ = ["TaurusAttrForm", "TaurusCommandsForm", "TaurusForm"] __docformat__ = 'restructuredtext' @@ -773,7 +769,7 @@ def setDefaultParameters(self, params): ''' self._defaultParameters = dict((k.lower(), v) - for k, v in list(params.items())) + for k, v in params.items()) self._updateCommandWidgets() def setViewFilters(self, filterlist): diff --git a/lib/taurus/qt/qtgui/panel/taurusinputpanel.py b/lib/taurus/qt/qtgui/panel/taurusinputpanel.py index cfaacb545..98300d4e1 100644 --- a/lib/taurus/qt/qtgui/panel/taurusinputpanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusinputpanel.py @@ -26,7 +26,6 @@ """This module provides an Input panel (usually used inside a TaurusDialog)""" from __future__ import print_function -from builtins import map from builtins import str from builtins import object __all__ = ["TaurusInputPanel"] diff --git a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py index 382ca33f0..4df5b9b0f 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py @@ -27,7 +27,6 @@ from future import standard_library standard_library.install_aliases() -from builtins import str from builtins import object __all__ = ["TaurusMessagePanel", "TaurusMessageErrorHandler", "TangoMessageErrorHandler", "MacroServerMessageErrorHandler"] @@ -282,7 +281,7 @@ def __init__(self, err_type=None, err_value=None, err_traceback=None, parent=Non def _initReportCombo(self): report_handlers = get_report_handlers() combo = self.reportComboBox() - for name, report_handler in list(report_handlers.items()): + for name, report_handler in report_handlers.items(): name = Qt.QVariant(name) combo.addItem(report_handler.Label, name) @@ -508,7 +507,7 @@ def findErrorHandler(klass, err_type): :return: a message box error handler :rtype: TaurusMessageBoxErrorHandler class object""" - for exc, h_klass in list(klass.ErrorHandlers.items()): + for exc, h_klass in klass.ErrorHandlers.items(): if issubclass(err_type, exc): return h_klass return TaurusMessageErrorHandler diff --git a/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py b/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py index 61d09b1f0..7195843d1 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py +++ b/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py @@ -29,7 +29,6 @@ from __future__ import print_function from __future__ import absolute_import -from builtins import str __all__ = ["TaurusModelSelectorTree", "TaurusModelChooser"] import sys diff --git a/lib/taurus/qt/qtgui/panel/taurusmodellist.py b/lib/taurus/qt/qtgui/panel/taurusmodellist.py index 7f1474b2a..62b2fd36e 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmodellist.py +++ b/lib/taurus/qt/qtgui/panel/taurusmodellist.py @@ -26,9 +26,6 @@ """ itemsmodel Model and view for new CurveItem configuration """ -from builtins import str -from builtins import range -from past.builtins import basestring from builtins import object __all__ = ['TaurusModelModel', 'TaurusModelItem', 'TaurusModelList'] #raise UnimplementedError('Under Construction!') diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py index 40c18d44f..0f08fe269 100644 --- a/lib/taurus/qt/qtgui/panel/taurusvalue.py +++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py @@ -27,7 +27,6 @@ taurusvalue.py: """ -from builtins import str __all__ = ["TaurusValue", "TaurusValuesFrame", "DefaultTaurusValueCheckBox", "DefaultUnitsWidget", "TaurusPlotButton", "TaurusArrayEditorButton", "TaurusValuesTableButton", "TaurusValuesTableButton_W", diff --git a/lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py b/lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py index 6755955d7..7ec66e6e1 100644 --- a/lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py +++ b/lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py @@ -25,7 +25,6 @@ """Test for taurus.qt.qtgui.panel.taurusvalue""" -from builtins import str import unittest from taurus.test import insertTest from taurus.qt.qtgui.test import BaseWidgetTestCase diff --git a/lib/taurus/qt/qtgui/plot/arrayedit.py b/lib/taurus/qt/qtgui/plot/arrayedit.py index 61fd3a7d7..dd579025b 100644 --- a/lib/taurus/qt/qtgui/plot/arrayedit.py +++ b/lib/taurus/qt/qtgui/plot/arrayedit.py @@ -27,13 +27,8 @@ arrayedit.py: Widget for editing a spectrum/array via control points """ from __future__ import absolute_import -from __future__ import division - -from builtins import zip -from builtins import str from builtins import range -from past.utils import old_div import numpy from taurus.external.qt import Qt, Qwt5 from taurus.qt.qtgui.util.ui import UILoadable @@ -412,7 +407,7 @@ def onLScale(self, checked): Qt.QMessageBox.warning( self, 'Scaling Error', 'The master at this control point is zero-valued. This point cannot be used as reference for scaling') return - v = old_div(sender.corrSB.value(), (self.yp[index])) + v = sender.corrSB.value() / (self.yp[index]) for i in range(0, index): self._controllers[i].corrSB.setValue(v * self.yp[i]) @@ -425,7 +420,7 @@ def onRScale(self, checked): Qt.QMessageBox.warning( self, 'Scaling Error', 'The master at this control point is zero-valued. This point cannot be used as reference for scaling') return - v = old_div(sender.corrSB.value(), (self.yp[index])) + v = sender.corrSB.value() / (self.yp[index]) for i in range(index + 1, self.xp.size): self._controllers[i].corrSB.setValue(v * self.yp[i]) diff --git a/lib/taurus/qt/qtgui/plot/curveStatsDlg.py b/lib/taurus/qt/qtgui/plot/curveStatsDlg.py index 4896382f6..7250b2279 100644 --- a/lib/taurus/qt/qtgui/plot/curveStatsDlg.py +++ b/lib/taurus/qt/qtgui/plot/curveStatsDlg.py @@ -28,11 +28,8 @@ A Qt dialog for choosing plot appearance (symbols and lines) for a QwtPlot-derived widget (like Taurusplot) """ -from __future__ import division -from builtins import zip from builtins import range -from past.utils import old_div from taurus.external.qt import Qt, Qwt5 from datetime import datetime from taurus.qt.qtgui.util.ui import UILoadable @@ -72,7 +69,7 @@ def __init__(self, parent=None): cbs = (self.ui.npointsStatCB, self.ui.minStatCB, self.ui.maxStatCB, self.ui.meanStatCB, self.ui.stdStatCB, self.ui.rmsStatCB) - self._checkboxToColMap = dict(list(zip(cbs, range(len(self.statColumns))))) + self._checkboxToColMap = dict(zip(cbs, range(len(self.statColumns)))) self.minPicker = Qwt5.QwtPlotPicker(Qwt5.QwtPlot.xBottom, Qwt5.QwtPlot.yLeft, @@ -137,10 +134,11 @@ def __init__(self, parent=None): def _timestamptToQDateTime(self, ts): dt = datetime.fromtimestamp(ts) - return Qt.QDateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, old_div(dt.microsecond, 1000)) + return Qt.QDateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, + dt.second, dt.microsecond // 1000) def _QDateTimeToTimestamp(self, qdt): - return qdt.toTime_t() + old_div(qdt.time().msec(), 1000.) + return qdt.toTime_t() + qdt.time().msec() / 1000. def onSelectMin(self): '''slot called when the user clicks on the selectMin button''' @@ -253,14 +251,14 @@ def onCalculate(self): xmin, xmax = None, None if self.ui.minCB.isChecked(): if plot.getXIsTime(): - xmin = self.ui.minDTE.dateTime().toTime_t() + old_div(self.ui.minDTE.time().msec(), \ - 1000.) + xmin = (self.ui.minDTE.dateTime().toTime_t() + + self.ui.minDTE.time().msec() / 1000.) else: xmin = self.ui.minSB.value() if self.ui.maxCB.isChecked(): if plot.getXIsTime(): - xmax = self.ui.maxDTE.dateTime().toTime_t() + old_div(self.ui.maxDTE.time().msec(), \ - 1000.) + xmax = (self.ui.maxDTE.dateTime().toTime_t() + + self.ui.maxDTE.time().msec() / 1000.) else: xmax = self.ui.maxSB.value() limits = xmin, xmax diff --git a/lib/taurus/qt/qtgui/plot/curveprops.py b/lib/taurus/qt/qtgui/plot/curveprops.py index 59c4f3359..19bab37f6 100755 --- a/lib/taurus/qt/qtgui/plot/curveprops.py +++ b/lib/taurus/qt/qtgui/plot/curveprops.py @@ -28,7 +28,6 @@ """ from __future__ import absolute_import from builtins import str -from builtins import range from builtins import object __all__ = ['CurveConf', 'CurvesTableModel', 'ExtendedSelectionModel', 'CurvePropertiesView'] diff --git a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py index acb93654c..edd4d8352 100644 --- a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py +++ b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py @@ -30,7 +30,6 @@ """ from __future__ import print_function -from builtins import str from builtins import object import copy diff --git a/lib/taurus/qt/qtgui/plot/qwtdialog.py b/lib/taurus/qt/qtgui/plot/qwtdialog.py index f87614dd7..42e064c87 100644 --- a/lib/taurus/qt/qtgui/plot/qwtdialog.py +++ b/lib/taurus/qt/qtgui/plot/qwtdialog.py @@ -28,11 +28,6 @@ """ from __future__ import print_function from __future__ import absolute_import -from __future__ import division - -from builtins import str -from builtins import range -from past.utils import old_div __all__ = ["TaurusPlotConfigDialog"] import time @@ -267,11 +262,11 @@ def deltatime2str(self, dt, fuzzy=False): elif dt < 120: return "%g s" % round(dt, 0) elif dt < 7200: - return "%g m" % round(old_div(dt, 60), 0) + return "%g m" % round(dt / 60, 0) elif dt < 172800: - return "%g h" % round(old_div(dt, 3600), 0) + return "%g h" % round(dt / 3600, 0) else: - return "%g d" % round(old_div(dt, 86400), 0) + return "%g d" % round(dt / 86400, 0) def str2deltatime(self, strtime): '''Translates a time string to seconds diff --git a/lib/taurus/qt/qtgui/plot/scales.py b/lib/taurus/qt/qtgui/plot/scales.py index dd8ae0efb..20d7b9fec 100644 --- a/lib/taurus/qt/qtgui/plot/scales.py +++ b/lib/taurus/qt/qtgui/plot/scales.py @@ -27,10 +27,7 @@ scales.py: Custom scales used by taurus.qt.qtgui.plot module """ from __future__ import print_function -from __future__ import division -from builtins import str -from builtins import range -from past.utils import old_div + __all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", "FixedLabelsScaleDraw"] @@ -233,7 +230,7 @@ def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize): # make sure to comply with maxMajTicks L = len(majticks) if L > maxMajSteps: - majticks = majticks[::int(numpy.ceil(old_div(float(L), maxMajSteps)))] + majticks = majticks[::int(numpy.ceil(float(L) / maxMajSteps))] scaleDiv = Qwt5.QwtScaleDiv(interval, minticks, medticks, majticks) self.scaleDraw().setDatetimeLabelFormat(format) @@ -323,7 +320,7 @@ def label(self, val): t = datetime.fromtimestamp(val) try: # If the scaleDiv was created by a DateTimeScaleEngine it has a _datetimeLabelFormat s = t.strftime(self._datetimeLabelFormat) - except AttributeError as e: + except AttributeError: print("Warning: cannot get the datetime label format (Are you using a DateTimeScaleEngine?)") s = t.isoformat(' ') return Qwt5.QwtText(s) @@ -366,7 +363,7 @@ def divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize): s = 86400 # 1 day # calculate a step size that respects the base step (s) and also # enforces the maxMajSteps - stepSize = s * int(numpy.ceil(old_div(float(d_range // s), maxMajSteps))) + stepSize = s * int(numpy.ceil(float(d_range // s) / maxMajSteps)) return Qwt5.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize) @staticmethod diff --git a/lib/taurus/qt/qtgui/plot/taurusarrayedit.py b/lib/taurus/qt/qtgui/plot/taurusarrayedit.py index f82b7b25b..a42db4d51 100644 --- a/lib/taurus/qt/qtgui/plot/taurusarrayedit.py +++ b/lib/taurus/qt/qtgui/plot/taurusarrayedit.py @@ -25,7 +25,6 @@ from __future__ import absolute_import -from builtins import str from taurus.external.qt import Qt import taurus import numpy diff --git a/lib/taurus/qt/qtgui/plot/taurusplot.py b/lib/taurus/qt/qtgui/plot/taurusplot.py index a8643ebfb..ad11ca7da 100644 --- a/lib/taurus/qt/qtgui/plot/taurusplot.py +++ b/lib/taurus/qt/qtgui/plot/taurusplot.py @@ -28,15 +28,11 @@ """ from __future__ import print_function from __future__ import absolute_import -from __future__ import division from future import standard_library standard_library.install_aliases() -from builtins import zip from builtins import next from builtins import str from builtins import range -from past.builtins import basestring -from past.utils import old_div from builtins import object __all__ = ["TaurusCurve", "TaurusCurveMarker", "TaurusXValues", "TaurusPlot", "isodatestr2float"] @@ -45,10 +41,8 @@ import copy from datetime import datetime import time - import numpy from future.utils import string_types - from taurus.external.qt import Qt, Qwt5 import taurus @@ -157,9 +151,9 @@ def alignLabel(self): ''' xmap = self.plot().canvasMap(self.xAxis()) ymap = self.plot().canvasMap(self.yAxis()) - xmiddlepoint = xmap.p1() + old_div(xmap.pDist(), 2) # p1,p2 are left,right here + xmiddlepoint = xmap.p1() + xmap.pDist() / 2 # p1,p2 are left,right here # p1,p2 are bottom,top here (and pixel coords start from top!) - ymiddlepoint = ymap.p2() + old_div(ymap.pDist(), 2) + ymiddlepoint = ymap.p2() + ymap.pDist() / 2 xPaintPos = xmap.transform(self.xValue()) yPaintPos = ymap.transform(self.yValue()) @@ -1291,8 +1285,7 @@ def __initActions(self): def setFormat(self, format): """Reimplemented from TaurusBaseComponent""" - targetCurveNames = iter(self.curves.keys()) - for name in targetCurveNames: + for name in self.curves: curve = self.curves.get(name, None) w = getattr(curve, 'owner', curve) w.setFormat(format) @@ -1407,7 +1400,10 @@ def sortCurves(self, ordered=None): self.curves_lock.acquire() try: if ordered is None: - orderedObjs = sorted(self.curves.values(), key=lambda curve: curve.titleText(compiled=True)) + orderedObjs = sorted( + self.curves.values(), + key=lambda curve: curve.titleText(compiled=True) + ) else: #current = self.curves.keys() # if len(ordered) != len(current) or set(map(str.lower,current)) - set(map(str.lower, ordered)): @@ -2441,7 +2437,7 @@ def applyConfig(self, configdict, **kwargs): if not self.checkConfigVersion(configdict): return # attach the curves - for rd in list(configdict["RawData"].values()): + for rd in configdict["RawData"].values(): self.attachRawData(rd) # for backwards compatibility, if the ordered list of models is not # stored, it uses the unsorted dict values @@ -2498,7 +2494,7 @@ def saveConfig(self, ofile=None, curvenames=None): :return: (str) file name used """ - import pickle as pickle + import pickle if ofile is None: ofile = str(Qt.QFileDialog.getSaveFileName(self, 'Save Taurusplot Configuration', 'TaurusplotConfig.pck', 'TaurusPlot Curve Properties File (*.pck)')) @@ -2518,7 +2514,7 @@ def loadConfig(self, ifile=None): :return: (str) file name used """ - import pickle as pickle + import pickle if ifile is None: ifile = str(Qt.QFileDialog.getOpenFileName( self, 'Load Taurusplot Configuration', '', 'TaurusPlot Curve Properties File (*.pck)')) @@ -2535,7 +2531,7 @@ def setEventFilters(self, filters=None, curvenames=None, preqt=False): See :meth:`TaurusBaseComponent.setEventFilters` ''' if curvenames is None: - curvenames = list(self.curves) + curvenames = self.curves.keys() self.curves_lock.acquire() try: for name in curvenames: @@ -2997,7 +2993,7 @@ def pickDataPoint(self, pos, scope=20, showMarker=True, targetCurveNames=None): self.curves_lock.acquire() try: if targetCurveNames is None: - targetCurveNames = iter(self.curves.keys()) + targetCurveNames = self.curves.keys() for name in targetCurveNames: curve = self.curves.get(name, None) if curve is None: @@ -3640,7 +3636,7 @@ def setOptimizationEnabled(self, enable): self._optimizationEnabled = enable # make sure that already-created curves are also optimized try: - for curveName in self.curves.keys(): + for curveName in self.curves: curve = self.curves.get(str(curveName)) curve.setPaintAttribute(curve.PaintFiltered, enable) curve.setPaintAttribute(curve.ClipPolygons, enable) diff --git a/lib/taurus/qt/qtgui/plot/taurustrend.py b/lib/taurus/qt/qtgui/plot/taurustrend.py index d742a5257..e688e6404 100644 --- a/lib/taurus/qt/qtgui/plot/taurustrend.py +++ b/lib/taurus/qt/qtgui/plot/taurustrend.py @@ -27,10 +27,7 @@ taurustrend.py: Generic trend widget for Taurus """ from __future__ import print_function -from __future__ import division -from builtins import zip from builtins import str -from builtins import range __all__ = ["ScanTrendsSet", "TaurusTrend", "TaurusTrendsSet"] from datetime import datetime diff --git a/lib/taurus/qt/qtgui/table/qdictionary.py b/lib/taurus/qt/qtgui/table/qdictionary.py index a3fe4e9a2..c2cf1ee19 100644 --- a/lib/taurus/qt/qtgui/table/qdictionary.py +++ b/lib/taurus/qt/qtgui/table/qdictionary.py @@ -26,17 +26,11 @@ """This module provides basic python dictionary/list editor widgets""" from __future__ import print_function -from builtins import str -from builtins import range -from past.builtins import basestring __all__ = ["QDictionaryEditor", "QListEditor"] __docformat__ = 'restructuredtext' import sys -import taurus - -import numpy from future.utils import string_types from taurus.core.util.containers import SortedDict @@ -112,7 +106,7 @@ def expand(d, level): # ,nrows=nrows,ncols=ncols): [table.append([]) for r in range(data.pop('nrows'))] [table[r].append(None) for c in range(data.pop('ncols')) for r in range(len(table))] - for coord, value in list(data.items()): + for coord, value in data.items(): table[coord[0]][coord[1]] = value return table diff --git a/lib/taurus/qt/qtgui/table/qlogtable.py b/lib/taurus/qt/qtgui/table/qlogtable.py index c2ac27ace..f5c63e04e 100644 --- a/lib/taurus/qt/qtgui/table/qlogtable.py +++ b/lib/taurus/qt/qtgui/table/qlogtable.py @@ -27,9 +27,7 @@ python :mod:`logging` module""" from __future__ import absolute_import -from past.builtins import cmp -from builtins import map -from builtins import str +from operator import attrgetter from builtins import range __all__ = ["QLoggingTableModel", "QLoggingTable", "QLoggingWidget", "QRemoteLoggingTableModel"] @@ -85,15 +83,6 @@ def getBrushForLevel(level): return f, g -def _origin_cmp(rec1, rec2): - c1 = cmp(rec1.process, rec2.process) - if c1 == 0: - c2 = cmp(rec1.thread, rec2.thread) - if c2 == 0: - return cmp(rec1.name, rec2.name) - return c2 - return c1 - gethostname = memoized(socket.gethostname) @@ -169,17 +158,13 @@ def __init__(self, capacity=500000, freq=0.25): # --------------------------------- def sort(self, column, order=Qt.Qt.AscendingOrder): - if column == LEVEL: - f = lambda a, b: cmp(a.levelno, b.levelno) - elif column == TIME: - f = lambda a, b: cmp(a.created, b.created) - elif column == MSG: - f = lambda a, b: cmp(a.msg, b.msg) - elif column == NAME: - f = lambda a, b: cmp(a.name, b.name) - elif column == ORIGIN: - f = _origin_cmp - self._records = sorted(self._records, cmp=f, + column2key_map = {LEVEL: attrgetter('levelno'), + TIME: attrgetter('created'), + MSG: attrgetter('msg'), + NAME: attrgetter('name'), + ORIGIN: attrgetter('process', 'thread', 'name'), + } + self._records = sorted(self._records, key=column2key_map[column], reverse=order == Qt.Qt.DescendingOrder) def rowCount(self, index=Qt.QModelIndex()): diff --git a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py index 0e4cd7241..836210f3f 100755 --- a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py +++ b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py @@ -31,7 +31,6 @@ # todo: tango-centric from builtins import str -from builtins import range __all__ = ["TaurusPropTable"] from taurus.external.qt import Qt, QtCore, QtGui diff --git a/lib/taurus/qt/qtgui/table/taurusgrid.py b/lib/taurus/qt/qtgui/table/taurusgrid.py index 06021988f..8e59bb534 100644 --- a/lib/taurus/qt/qtgui/table/taurusgrid.py +++ b/lib/taurus/qt/qtgui/table/taurusgrid.py @@ -36,27 +36,20 @@ from future import standard_library standard_library.install_aliases() -from builtins import zip -from builtins import next from builtins import str -from builtins import range __all__ = ["TaurusGrid"] __docformat__ = 'restructuredtext' import re -import operator -import traceback from queue import Queue -from functools import partial from taurus.external.qt import Qt, QtGui, QtCore import taurus -from taurus.qt.qtcore.util.emitter import (modelSetter, TaurusEmitterThread, +from taurus.qt.qtcore.util.emitter import (modelSetter, SingletonWorker, MethodModel) from taurus.core.taurusmanager import TaurusManager -from taurus.core.util.log import Logger from taurus.qt.qtgui.base import TaurusBaseWidget from taurus.qt.qtgui.panel import TaurusValue diff --git a/lib/taurus/qt/qtgui/table/taurusvaluestable.py b/lib/taurus/qt/qtgui/table/taurusvaluestable.py index e01a8bffa..5e2bcf972 100755 --- a/lib/taurus/qt/qtgui/table/taurusvaluestable.py +++ b/lib/taurus/qt/qtgui/table/taurusvaluestable.py @@ -118,8 +118,8 @@ def data(self, index, role=Qt.Qt.DisplayRole): value = self.typeCastingMap[tabledata.dtype.kind](value) return Qt.QVariant(value) elif role == Qt.Qt.DecorationRole: - if ((index.row(), index.column()) in self._modifiedDict) and\ - (self._writeMode): + if ((index.row(), index.column()) in self._modifiedDict + and self._writeMode): if self.getAttr().type in [DataType.Integer, DataType.Float]: value = self._modifiedDict[(index.row(), index.column())] if not self.inAlarmRange(value): @@ -131,8 +131,8 @@ def data(self, index, role=Qt.Qt.DisplayRole): return Qt.QVariant(icon) elif role == Qt.Qt.EditRole: value = None - if (index.row(), index.column()) in self._modifiedDict and\ - (self._writeMode): + if ((index.row(), index.column()) in self._modifiedDict + and self._writeMode): value = self._modifiedDict[(index.row(), index.column())] else: value = tabledata[index.row(), index.column()] @@ -145,8 +145,8 @@ def data(self, index, role=Qt.Qt.DisplayRole): else: return Qt.QVariant(Qt.QColor('white')) elif role == Qt.Qt.ForegroundRole: - if (index.row(), index.column()) in self._modifiedDict and\ - (self._writeMode): + if ((index.row(), index.column()) in self._modifiedDict + and self._writeMode): if self.getAttr().type in [DataType.Integer, DataType.Float]: value = self._modifiedDict[(index.row(), index.column())] if not self.inAlarmRange(value): @@ -157,12 +157,12 @@ def data(self, index, role=Qt.Qt.DisplayRole): return Qt.QVariant(Qt.QColor('blue')) return Qt.QVariant(Qt.QColor('black')) elif role == Qt.Qt.FontRole: - if (index.row(), index.column()) in self._modifiedDict and\ - (self._writeMode): + if ((index.row(), index.column()) in self._modifiedDict + and self._writeMode): return Qt.QVariant(Qt.QFont("Arial", 10, Qt.QFont.Bold)) elif role == Qt.Qt.ToolTipRole: - if (index.row(), index.column()) in self._modifiedDict and\ - (self._writeMode): + if ((index.row(), index.column()) in self._modifiedDict + and self._writeMode): value = str(self._modifiedDict[(index.row(), index.column())]) msg = 'Original value: %s.\nNew value that will be saved: %s' %\ (str(tabledata[index.row(), index.column()]), value) @@ -266,11 +266,11 @@ def getModifiedWriteData(self): kind = table.dtype.kind if kind in 'SU': table = table.tolist() # we want to allow the strings to be larger than the original ones - for (r, c), v in list(self._modifiedDict.items()): + for (r, c), v in self._modifiedDict.items(): table[r][c] = Qt.from_qvariant(v, str) table = numpy.array(table, dtype=str) else: - for k, v in list(self._modifiedDict.items()): + for k, v in self._modifiedDict.items(): if kind in ['f', 'i', 'u']: units = self._parent.getCurrentUnits() q = _value2Quantity(v, units) diff --git a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py index fd4d9561e..6aad035e1 100644 --- a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py +++ b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py @@ -35,7 +35,6 @@ from __future__ import print_function from builtins import str -from builtins import range __all__ = ["AppSettingsWizard", "ExternalAppEditor"] import os @@ -1399,8 +1398,8 @@ def createProject(self): warnings = self.wizard().getProjectWarnings() if warnings: msg += '\n\nHowever, some fine-tuning may be needed. Please check the details:\n' - for short, int in warnings: - details += '- %s: %s\n\n' % (short, int) + for _short, _long in warnings: + details += '- %s: %s\n\n' % (_short, _long) logfile.write(msg + details) logfile.close() dlg = Qt.QMessageBox(Qt.QMessageBox.Information, @@ -1629,11 +1628,11 @@ def generateXml(self): refsrc = os.path.join(os.path.dirname(src), ref) refdst = self.substitutionName(refsrc, mod_dir) if ref != refdst: - short = 'Manual editing needed in "%s"' % dst - long = ('The synoptic file "%s" references a file that ' + _short = 'Manual editing needed in "%s"' % dst + _long = ('The synoptic file "%s" references a file that ' 'has been copied to the project dir in order to make the project portable. ' 'Please edit "%s" and replace "%s" by "%s"') % (dst, dst, ref, refdst) - self._projectWarnings.append((short, int)) + self._projectWarnings.append((_short, _long)) # macroserver page if self.SARDANA_INSTALLED and self.__getitem__("macroServerName"): diff --git a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py index 9241fe59b..fa36c186f 100644 --- a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py +++ b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py @@ -146,7 +146,7 @@ def onExpConfChanged(self, expconf): plots1d = {} images = {} - for chname, chdata in list(channels.items()): + for chname, chdata in channels.items(): ptype = chdata['plot_type'] if ptype == PlotType.No: continue @@ -196,7 +196,7 @@ def _updateTemporaryTrends1D(self, trends1d): ''' from taurus.qt.qtgui.plot import TaurusTrend newpanels = [] - for axes, plotables in list(trends1d.items()): + for axes, plotables in trends1d.items(): if not axes: continue if axes not in self._trends1d: @@ -251,7 +251,7 @@ def _updateTemporaryTrends2D(self, trends2d): raise return - for axes, plotables in list(trends2d.items()): + for axes, plotables in trends2d.items(): for chname in plotables: pname = u'Trend2D - %s' % chname if pname in self._trends2d: diff --git a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py index d204d4877..5a1ea765d 100644 --- a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py +++ b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py @@ -24,9 +24,6 @@ ########################################################################### from __future__ import print_function -from builtins import str -from builtins import zip -from builtins import range __all__ = ["PanelDescriptionWizard"] """ paneldescriptionwizard.py: @@ -698,6 +695,5 @@ def kk(d): if __name__ == "__main__": - import sys # test2() main() diff --git a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py index a55a55d12..3f233e27e 100644 --- a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py +++ b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py @@ -26,7 +26,6 @@ """This package provides the TaurusGui class""" from builtins import str -from past.builtins import basestring __all__ = ["DockWidgetPanel", "TaurusGui"] __docformat__ = 'restructuredtext' @@ -345,7 +344,7 @@ def closeEvent(self, event): except: pass TaurusMainWindow.closeEvent(self, event) - for n, panel in list(self.__panels.items()): + for n, panel in self.__panels.items(): panel.closeEvent(event) panel.widget().closeEvent(event) if not event.isAccepted(): @@ -364,7 +363,7 @@ def __updatePanelsMenu(self): permanent = (panelsmenu == self.__permPanelsMenu) panelsmenu.clear() panelnames = sorted( - [n for n, p in list(self.__panels.items()) if (p.isPermanent() == permanent)]) + [n for n, p in self.__panels.items() if (p.isPermanent() == permanent)]) for name in panelnames: panelsmenu.addAction(self.__panels[name].toggleViewAction()) @@ -882,7 +881,7 @@ def createInstrumentsFromPool(self, macroservername): ms = taurus.Device(macroservername) instruments = ms.getElementsOfType('Instrument') if instruments is None: - raise + raise Exception() except Exception as e: msg = 'Could not fetch Instrument list from "%s"' % macroservername self.error(msg) @@ -899,12 +898,12 @@ def createInstrumentsFromPool(self, macroservername): instrument_dict[i_name] = i_view from operator import attrgetter - pool_elements = sorted(list(ms.getElementsWithInterface( - 'Moveable').values()), key=attrgetter('name')) - pool_elements += sorted(list(ms.getElementsWithInterface( - 'ExpChannel').values()), key=attrgetter('name')) - pool_elements += sorted(list(ms.getElementsWithInterface( - 'IORegister').values()), key=attrgetter('name')) + pool_elements = sorted(ms.getElementsWithInterface( + 'Moveable').values(), key=attrgetter('name')) + pool_elements += sorted(ms.getElementsWithInterface( + 'ExpChannel').values(), key=attrgetter('name')) + pool_elements += sorted(ms.getElementsWithInterface( + 'IORegister').values(), key=attrgetter('name')) for elem in pool_elements: instrument = elem.instrument if instrument: @@ -993,7 +992,7 @@ def loadConfiguration(self, confname): else: # if confname is not a dir name, we assume it is a module name in the python path conf = self._importConfiguration(confname) self._confDirectory = os.path.dirname(conf.__file__) - except Exception as e: + except Exception: import traceback msg = 'Error loading configuration: %s' % traceback.format_exc() # repr(e) self.error(msg) @@ -1335,7 +1334,7 @@ def setModifiableByUser(self, modifiable): dwfeat = Qt.QDockWidget.AllDockWidgetFeatures else: dwfeat = Qt.QDockWidget.NoDockWidgetFeatures - for panel in list(self.__panels.values()): + for panel in self.__panels.values(): panel.toggleViewAction().setEnabled(modifiable) panel.setFeatures(dwfeat) for action in (self.newPanelAction, self.showAllPanelsAction, @@ -1493,9 +1492,9 @@ def findPanelsInArea(self, area): raise DeprecationWarning( 'findPanelsInArea is no longer supported (now all panels reside in the same DockWidget Area)') if area == 'FLOATING': - return [p for p in list(self.__panels.values()) if p.isFloating()] + return [p for p in self.__panels.values() if p.isFloating()] else: - return [p for p in list(self.__panels.values()) if self.dockWidgetArea(p) == area] + return [p for p in self.__panels.values() if self.dockWidgetArea(p) == area] @classmethod def getQtDesignerPluginInfo(cls): diff --git a/lib/taurus/qt/qtgui/taurusgui/utils.py b/lib/taurus/qt/qtgui/taurusgui/utils.py index 8ec5a6da4..e25fcb391 100644 --- a/lib/taurus/qt/qtgui/taurusgui/utils.py +++ b/lib/taurus/qt/qtgui/taurusgui/utils.py @@ -26,14 +26,9 @@ """This configuration contains base modules and classes that may be used by specific TaurusGui-based GUIs""" -from builtins import str -from past.builtins import basestring from builtins import object __docformat__ = 'restructuredtext' -import os -import sys - from lxml import etree from future.utils import string_types diff --git a/lib/taurus/qt/qtgui/test/base.py b/lib/taurus/qt/qtgui/test/base.py index 642fe92ab..678e27628 100644 --- a/lib/taurus/qt/qtgui/test/base.py +++ b/lib/taurus/qt/qtgui/test/base.py @@ -25,7 +25,6 @@ """Utilities for creating generic tests for Taurus widgets""" -from builtins import zip from builtins import range from builtins import object import time diff --git a/lib/taurus/qt/qtgui/tree/qtree.py b/lib/taurus/qt/qtgui/tree/qtree.py index c488b57e8..919e44995 100644 --- a/lib/taurus/qt/qtgui/tree/qtree.py +++ b/lib/taurus/qt/qtgui/tree/qtree.py @@ -25,7 +25,6 @@ """This module provides base tree widget""" -from builtins import range __all__ = ["QBaseTreeWidget"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py index ce3521ba8..27dfeec33 100644 --- a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py +++ b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py @@ -35,9 +35,6 @@ # ,"SearchEdit"] #"TaurusTreeNode"] from builtins import next -from builtins import str -from builtins import range -from past.builtins import basestring from builtins import object __all__ = ["TaurusDevTree", "TaurusSearchTree", "TaurusDevTreeOptions"] @@ -201,11 +198,11 @@ def getNodeIcon(self, node=None): node = self.getNode() try: name, url = self.getNodeText(node), '' - for k, v in list(self.getIconMap().items()): + for k, v in self.getIconMap().items(): if re.match(k.lower(), name.lower()): url = v if not url: - for k, v in list(self.getIconMap().items()): + for k, v in self.getIconMap().items(): if k.lower() in name.lower(): url = v # if name.count('/')==2: @@ -647,7 +644,7 @@ def loadTree(self, filters): dct = self.getTangoDict(filters) else: # if isMap(filters): self.setWindowTitle('TaurusDevTree:%s' % - ','.join(list(filters))) + ','.join(filters)) def expand_dict(d): return [x for v in d.values() for x in (expand_dict(v) if hasattr(v, 'values') else (v,))] @@ -658,7 +655,7 @@ def get_devs(f): return dict.fromkeys(t for t in targets if matchCl(f, t)) def expand_filter(f): - return dict((k, expand_filter(v) if hasattr(v, 'values') else get_devs(v)) for k, v in list(f.items()) if v) + return dict((k, expand_filter(v) if hasattr(v, 'values') else get_devs(v)) for k, v in f.items() if v) dct = expand_filter(filters) # self.Loader.next([self.setTree,dct,True]) self.setTree(dct, clear=True) @@ -807,7 +804,7 @@ def addAttrToNode(self, node=None, full=False): if alias: self.trace('Got aliases for %s: %s' % (aname, alias)) [setattr(natt, 'AttributeAlias', v) - for k, v in list(alias.items()) if k in aname.lower()] + for k, v in alias.items() if k in aname.lower()] else: natt.AttributeAlias = aname.split()[0].strip() node.setExpanded(True) @@ -876,9 +873,8 @@ def get_child_nodes(dct, node, fun=None): def unpackChildren(self): """ removes all nodes from the tree and returns them in a list, used for resorting """ allChildren = [] - nodes = list(self.getAllNodes().values()) - for node in nodes: + for node in self.getAllNodes().values(): allChildren.extend(node.takeChildren()) while self.topLevelItemCount(): allChildren.append(self.takeTopLevelItem(0)) @@ -1028,7 +1024,7 @@ def sortCustom(self, order): sorter = lambda k, ks=[re.compile(c) for c in order]: str( next((i for i, r in enumerate(ks) if r.match(k.lower())))) + str(k) - for c, it in sorted(list(allChildren.items()), key=lambda k: sorter(k[0])): + for c, it in sorted(allChildren.items(), key=lambda k: sorter(k[0])): self.debug('tree.sortCustom(%s): %s inserted at %d' % (order, it.text(0), self.topLevelItemCount())) self.insertTopLevelItem(self.topLevelItemCount(), it) @@ -1074,7 +1070,7 @@ def update_node(node, key, dct): if node.isHidden(): continue if regexps: - matches = [v for k, v in list(dct.items()) if re.match( + matches = [v for k, v in dct.items() if re.match( k.lower(), name.lower())] if matches: update_node(node, name, {name: matches[0]}) @@ -1667,7 +1663,7 @@ def defineStyle(self): self.layout().addWidget(self.tree) self.registerConfigDelegate(self.tree) # Slot forwarding ... - for k in list(TaurusDevTree.__dict__.keys()): + for k in TaurusDevTree.__dict__: # if k in ['__init__','defineStyle']: continue if k not in self.__slots__: continue diff --git a/lib/taurus/qt/qtgui/util/taurusaction.py b/lib/taurus/qt/qtgui/util/taurusaction.py index 816e5a0a8..ca969ee9e 100644 --- a/lib/taurus/qt/qtgui/util/taurusaction.py +++ b/lib/taurus/qt/qtgui/util/taurusaction.py @@ -27,7 +27,6 @@ from __future__ import absolute_import from builtins import str -from past.builtins import basestring __all__ = ["ExternalAppAction", "TaurusMenu", "TaurusAction", diff --git a/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py b/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py index 46dc195a0..24508269f 100644 --- a/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py +++ b/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py @@ -198,7 +198,7 @@ def getWidgetClassNames(self): return list(self._qt_widgets.keys()) def getWidgetClasses(self): - return [klass for mod_name, klass in list(self._qt_widgets.values())] + return [klass for mod_name, klass in self._qt_widgets.values()] def getWidgetClass(self, name): return self._qt_widgets[name][1] @@ -207,7 +207,7 @@ def getTaurusWidgetClassNames(self): return list(self._taurus_widgets.keys()) def getTaurusWidgetClasses(self): - return [klass for mod_name, klass in list(self._taurus_widgets.values())] + return [klass for mod_name, klass in self._taurus_widgets.values()] def getTaurusWidgetClass(self, name): return self._taurus_widgets.get(name)[1] diff --git a/lib/taurus/qt/qtgui/util/tauruswidgettree.py b/lib/taurus/qt/qtgui/util/tauruswidgettree.py index 50df72b03..77948d8a7 100644 --- a/lib/taurus/qt/qtgui/util/tauruswidgettree.py +++ b/lib/taurus/qt/qtgui/util/tauruswidgettree.py @@ -26,7 +26,6 @@ """ """ -from builtins import str __all__ = ["QObjectRepresentation", "get_qobject_tree", "get_qobject_tree_str", "TreeQObjectModel", "TreeQObjectWidget"] From e2557f491e6dccf1976bedbc29ebe69b35f4bd14 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 27 Sep 2018 10:50:07 +0200 Subject: [PATCH 112/252] Fix encoding issue in TaurusLineEdit TaurusValueLineEdit.getValue may attempt to create a bytes array from text without passing the encoding. Fix it by adding a `_bytesEncoding` class attribute to TaurusValueLineEdit (which by default is set to the system's encoding) and using it. --- lib/taurus/qt/qtgui/input/tauruslineedit.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/input/tauruslineedit.py b/lib/taurus/qt/qtgui/input/tauruslineedit.py index 4954a6ce4..135460ae5 100755 --- a/lib/taurus/qt/qtgui/input/tauruslineedit.py +++ b/lib/taurus/qt/qtgui/input/tauruslineedit.py @@ -67,6 +67,7 @@ class TaurusValueLineEdit(Qt.QLineEdit, TaurusBaseWritableWidget): """ + _bytesEncoding = sys.stdin.encoding def __init__(self, qt_parent=None, designMode=False): name = self.__class__.__name__ @@ -292,7 +293,7 @@ def getValue(self): else: return numpy.array(eval(text), dtype=str).tolist() elif model_type == DataType.Bytes: - return bytes(text) + return bytes(text, self._bytesEncoding) else: raise TypeError('Unsupported model type "%s"' % model_type) except Exception as e: From 7fcb1e0ecc49f30b7d52b74583eda31d0e269295 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 27 Sep 2018 16:19:55 +0200 Subject: [PATCH 113/252] Group imports The futurize call left some "messy" imports (e.g. blocks of imports before and after the `__all__` variable, etc. Clean that a bit. Also remove a few unused imports. --- doc/auto_rst4api.py | 1 - .../devel/examples/parentmodel_issue_demo.py | 1 - doc/source/sphinxext/taurusextension.py | 3 ++ lib/taurus/console/list.py | 13 +++--- lib/taurus/core/__init__.py | 3 +- lib/taurus/core/epics/__init__.py | 1 - lib/taurus/core/epics/epicsattribute.py | 14 +++--- lib/taurus/core/epics/epicsfactory.py | 12 ++--- .../core/epics/test/test_epicsvalidator.py | 1 - lib/taurus/core/evaluation/evalfactory.py | 7 ++- lib/taurus/core/evaluation/evalvalidator.py | 7 ++- .../core/evaluation/test/res/dev_example.py | 11 +++-- .../core/evaluation/test/res/ipap_example.py | 1 + lib/taurus/core/evaluation/test/res/mymod.py | 2 +- lib/taurus/core/init_bkcomp.py | 4 +- lib/taurus/core/release.py | 4 +- lib/taurus/core/resource/resfactory.py | 2 +- lib/taurus/core/resource/resvalidator.py | 5 +-- .../core/resource/test/test_resfactory.py | 3 +- lib/taurus/core/tango/__init__.py | 8 ++-- lib/taurus/core/tango/img/__init__.py | 3 +- lib/taurus/core/tango/img/img.py | 11 +++-- lib/taurus/core/tango/starter.py | 6 +-- lib/taurus/core/tango/tangoattribute.py | 16 +++---- lib/taurus/core/tango/tangodatabase.py | 12 ++--- lib/taurus/core/tango/tangodevice.py | 23 +++++----- lib/taurus/core/tango/tangofactory.py | 13 +++--- .../core/tango/test/res/TangoSchemeTest | 3 +- lib/taurus/core/tango/test/tgtestds.py | 9 ++-- lib/taurus/core/tango/util/__init__.py | 3 +- lib/taurus/core/taurusauthority.py | 8 ++-- lib/taurus/core/taurusbasetypes.py | 19 ++++---- lib/taurus/core/taurusconfiguration.py | 7 +-- lib/taurus/core/taurusfactory.py | 8 ++-- lib/taurus/core/taurushelper.py | 9 ++-- lib/taurus/core/tauruslistener.py | 7 +-- lib/taurus/core/taurusmanager.py | 8 ++-- lib/taurus/core/taurusmodel.py | 7 +-- lib/taurus/core/tauruspollingtimer.py | 11 +++-- lib/taurus/core/taurusvalidator.py | 9 ++-- lib/taurus/core/test/basevalidator.py | 7 ++- lib/taurus/core/test/modelequality.py | 1 - lib/taurus/core/util/__init__.py | 3 +- lib/taurus/core/util/codecs.py | 11 +++-- lib/taurus/core/util/colors.py | 2 +- lib/taurus/core/util/console.py | 1 + lib/taurus/core/util/constant.py | 1 + lib/taurus/core/util/containers.py | 14 +++--- lib/taurus/core/util/decorator/typecheck.py | 5 +-- lib/taurus/core/util/enumeration.py | 6 +-- lib/taurus/core/util/event.py | 15 +++---- lib/taurus/core/util/eventfilters.py | 3 +- lib/taurus/core/util/excepthook.py | 4 +- lib/taurus/core/util/init_bkcomp.py | 12 ++++- lib/taurus/core/util/lock.py | 6 +-- lib/taurus/core/util/log.py | 18 ++++---- lib/taurus/core/util/object.py | 1 + lib/taurus/core/util/prop.py | 1 + lib/taurus/core/util/property_parser.py | 5 +-- lib/taurus/core/util/propertyfile.py | 6 +-- lib/taurus/core/util/remotelogmonitor.py | 4 +- lib/taurus/core/util/report/report.py | 1 + lib/taurus/core/util/safeeval.py | 1 + lib/taurus/core/util/singleton.py | 1 + lib/taurus/core/util/tablepprint.py | 8 +--- lib/taurus/core/util/tb.py | 1 - lib/taurus/core/util/threadpool.py | 10 +++-- .../qt/qtcore/communication/communication.py | 1 + .../qt/qtcore/configuration/configuration.py | 4 +- lib/taurus/qt/qtcore/model/__init__.py | 6 +-- .../qt/qtcore/model/taurusdatabasemodel.py | 12 ++--- lib/taurus/qt/qtcore/model/taurusmodel.py | 7 +-- lib/taurus/qt/qtcore/util/__init__.py | 4 +- lib/taurus/qt/qtcore/util/emitter.py | 3 -- lib/taurus/qt/qtcore/util/signal.py | 3 +- lib/taurus/qt/qtdesigner/containerplugin.py | 4 +- .../qtdesigner/taurusplugin/taurusplugin.py | 1 + lib/taurus/qt/qtgui/__init__.py | 6 +-- .../qt/qtgui/application/taurusapplication.py | 9 ++-- lib/taurus/qt/qtgui/base/taurusbase.py | 19 ++++---- lib/taurus/qt/qtgui/base/tauruscontroller.py | 14 +++--- lib/taurus/qt/qtgui/button/taurusbutton.py | 9 ++-- .../qt/qtgui/compact/abstractswitcher.py | 5 ++- lib/taurus/qt/qtgui/compact/basicswitcher.py | 10 ++--- lib/taurus/qt/qtgui/container/qcontainer.py | 9 ++-- lib/taurus/qt/qtgui/container/taurusframe.py | 9 ++-- .../qt/qtgui/container/taurusgroupbox.py | 7 +-- .../qt/qtgui/container/taurusgroupwidget.py | 10 +++-- .../qt/qtgui/container/taurusmainwindow.py | 9 ++-- .../qt/qtgui/container/taurusscrollarea.py | 11 ++--- lib/taurus/qt/qtgui/container/tauruswidget.py | 8 ++-- .../qt/qtgui/dialog/taurusinputdialog.py | 5 ++- .../qt/qtgui/dialog/taurusmessagebox.py | 12 ++--- lib/taurus/qt/qtgui/display/qpixmapwidget.py | 6 ++- lib/taurus/qt/qtgui/display/qsevensegment.py | 6 ++- lib/taurus/qt/qtgui/display/tauruslabel.py | 8 ++-- lib/taurus/qt/qtgui/display/tauruslcd.py | 9 ++-- lib/taurus/qt/qtgui/display/taurusled.py | 8 ++-- lib/taurus/qt/qtgui/extra_guiqwt/builder.py | 11 ++--- lib/taurus/qt/qtgui/extra_guiqwt/curve.py | 3 +- .../qt/qtgui/extra_guiqwt/curvesmodel.py | 3 ++ lib/taurus/qt/qtgui/extra_guiqwt/plot.py | 4 +- lib/taurus/qt/qtgui/extra_guiqwt/scales.py | 7 +-- .../qt/qtgui/extra_nexus/taurusnexuswidget.py | 4 +- lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py | 9 ++-- .../qt/qtgui/graphic/jdraw/jdraw_parser.py | 5 ++- .../qt/qtgui/graphic/jdraw/jdraw_view.py | 8 ++-- lib/taurus/qt/qtgui/graphic/taurusgraphic.py | 44 ++++++++++--------- lib/taurus/qt/qtgui/help/assistant.py | 5 ++- lib/taurus/qt/qtgui/icon/__init__.py | 1 + lib/taurus/qt/qtgui/icon/catalog.py | 1 + lib/taurus/qt/qtgui/input/choicedlg.py | 6 ++- lib/taurus/qt/qtgui/input/qwheel.py | 9 ++-- lib/taurus/qt/qtgui/input/taurusspinbox.py | 2 + lib/taurus/qt/qtgui/input/tauruswheel.py | 11 ++--- .../qt/qtgui/panel/qdataexportdialog.py | 6 ++- lib/taurus/qt/qtgui/panel/qdoublelist.py | 9 ++-- .../qt/qtgui/panel/report/albareport.py | 7 +-- .../qt/qtgui/panel/taurusconfigeditor.py | 8 ++-- .../qt/qtgui/panel/taurusdevicepanel.py | 10 +++-- lib/taurus/qt/qtgui/panel/taurusform.py | 9 ++-- lib/taurus/qt/qtgui/panel/taurusinputpanel.py | 7 +-- .../qt/qtgui/panel/taurusmessagepanel.py | 10 +++-- .../qt/qtgui/panel/taurusmodelchooser.py | 5 ++- lib/taurus/qt/qtgui/panel/taurusmodellist.py | 9 ++-- lib/taurus/qt/qtgui/plot/curveprops.py | 10 +++-- .../qtgui/plot/curvesAppearanceChooserDlg.py | 1 + lib/taurus/qt/qtgui/plot/monitor.py | 1 + lib/taurus/qt/qtgui/plot/qwtdialog.py | 4 +- lib/taurus/qt/qtgui/plot/scales.py | 10 +++-- lib/taurus/qt/qtgui/plot/taurusplot.py | 7 ++- lib/taurus/qt/qtgui/plot/taurusplotconf.py | 5 ++- lib/taurus/qt/qtgui/plot/taurustrend.py | 5 ++- lib/taurus/qt/qtgui/resource/__init__.py | 1 + lib/taurus/qt/qtgui/table/qdictionary.py | 9 ++-- lib/taurus/qt/qtgui/table/qlogtable.py | 11 +++-- lib/taurus/qt/qtgui/table/taurusdbtable.py | 10 +++-- .../qtgui/table/taurusdevicepropertytable.py | 7 ++- lib/taurus/qt/qtgui/table/taurusgrid.py | 5 ++- lib/taurus/qt/qtgui/table/taurustable.py | 8 ++-- .../qt/qtgui/table/taurusvaluestable.py | 8 ++-- lib/taurus/qt/qtgui/taurusgui/__init__.py | 7 +-- .../qt/qtgui/taurusgui/appsettingswizard.py | 4 +- .../qt/qtgui/taurusgui/macrolistener.py | 9 ++-- .../qtgui/taurusgui/paneldescriptionwizard.py | 7 ++- lib/taurus/qt/qtgui/taurusgui/taurusgui.py | 10 ++--- lib/taurus/qt/qtgui/taurusgui/utils.py | 5 ++- lib/taurus/qt/qtgui/tree/taurusdbtree.py | 10 +++-- lib/taurus/qt/qtgui/tree/taurusdevicetree.py | 19 ++++---- lib/taurus/qt/qtgui/tree/taurustree.py | 8 ++-- lib/taurus/qt/qtgui/util/taurusaction.py | 21 +++++---- .../qt/qtgui/util/taurusactionfactory.py | 10 +++-- .../qt/qtgui/util/test/test_ui/test_ui.py | 1 + lib/taurus/qt/qtgui/util/ui.py | 8 ++-- lib/taurus/test/testsuite.py | 4 +- 155 files changed, 632 insertions(+), 483 deletions(-) diff --git a/doc/auto_rst4api.py b/doc/auto_rst4api.py index d182751b2..17f7f75b5 100644 --- a/doc/auto_rst4api.py +++ b/doc/auto_rst4api.py @@ -27,7 +27,6 @@ ''' Creates a tree of dirs and restructured text stub files for documenting the API of a python module with sphinx''' from __future__ import print_function - from builtins import zip from builtins import object import sys diff --git a/doc/source/devel/examples/parentmodel_issue_demo.py b/doc/source/devel/examples/parentmodel_issue_demo.py index 5075a3aeb..364daaac1 100644 --- a/doc/source/devel/examples/parentmodel_issue_demo.py +++ b/doc/source/devel/examples/parentmodel_issue_demo.py @@ -9,7 +9,6 @@ You can do it right after calling the setupUi method. ''' from __future__ import print_function - from taurus.external.qt import Qt from taurus.qt.qtgui.container import TaurusWidget from taurus.qt.qtgui.display import TaurusLabel diff --git a/doc/source/sphinxext/taurusextension.py b/doc/source/sphinxext/taurusextension.py index f864035e9..2a19beef9 100644 --- a/doc/source/sphinxext/taurusextension.py +++ b/doc/source/sphinxext/taurusextension.py @@ -24,7 +24,10 @@ ############################################################################## """helper methods for taurus sphinx documentation""" + from __future__ import print_function + + __expr = ('or',) diff --git a/lib/taurus/console/list.py b/lib/taurus/console/list.py index f31256dbe..4542980f4 100644 --- a/lib/taurus/console/list.py +++ b/lib/taurus/console/list.py @@ -24,23 +24,20 @@ ############################################################################# """ """ -from __future__ import absolute_import +from __future__ import absolute_import from builtins import map from builtins import range -__all__ = ["List"] - -__docformat__ = "restructuredtext" - import textwrap import collections -import operator - from future.utils import string_types - from .enums import Alignment +__all__ = ["List"] +__docformat__ = "restructuredtext" + + class List(list): HeaderSeparator = "-" diff --git a/lib/taurus/core/__init__.py b/lib/taurus/core/__init__.py index 4dd084d5b..82b5e5e76 100644 --- a/lib/taurus/core/__init__.py +++ b/lib/taurus/core/__init__.py @@ -26,9 +26,10 @@ """The core module""" from __future__ import absolute_import +import taurus.tauruscustomsettings + __docformat__ = "restructuredtext" -import taurus.tauruscustomsettings LIGHTWEIGHT_IMPORTS = getattr( taurus.tauruscustomsettings, 'LIGHTWEIGHT_IMPORTS', False) diff --git a/lib/taurus/core/epics/__init__.py b/lib/taurus/core/epics/__init__.py index 09f15fd32..b39cf4a27 100644 --- a/lib/taurus/core/epics/__init__.py +++ b/lib/taurus/core/epics/__init__.py @@ -67,5 +67,4 @@ Epics records may eventually be mapped as Devices. """ from __future__ import absolute_import - from .epicsfactory import * diff --git a/lib/taurus/core/epics/epicsattribute.py b/lib/taurus/core/epics/epicsattribute.py index 9de6f0e66..d545d69bc 100644 --- a/lib/taurus/core/epics/epicsattribute.py +++ b/lib/taurus/core/epics/epicsattribute.py @@ -22,26 +22,28 @@ ## ############################################################################# -''' +""" Epics module. See __init__.py for more detailed documentation -''' +""" + from __future__ import print_function from __future__ import absolute_import -__all__ = ['EpicsAttribute'] - import numpy from taurus.core.units import Quantity - from taurus.core.taurusbasetypes import (TaurusEventType, TaurusAttrValue, TaurusTimeVal, AttrQuality, DataType, DataFormat) from taurus.core.taurusattribute import TaurusAttribute - import epics from epics.ca import ChannelAccessException from epics import dbr + +__all__ = ['EpicsAttribute'] + + + # map for epics DBR types to Taurus Types. Dbr2TaurusType = {dbr.STRING: DataType.String, dbr.INT: DataType.Integer, diff --git a/lib/taurus/core/epics/epicsfactory.py b/lib/taurus/core/epics/epicsfactory.py index ebc101249..93cc43abe 100644 --- a/lib/taurus/core/epics/epicsfactory.py +++ b/lib/taurus/core/epics/epicsfactory.py @@ -22,15 +22,11 @@ ## ############################################################################# -''' +""" Epics module. See __init__.py for more detailed documentation -''' +""" from __future__ import absolute_import -__all__ = ['EpicsFactory'] - - import weakref - try: import epics except ImportError: @@ -38,17 +34,17 @@ debug('cannot import epics module. ' + 'Taurus will not support the "epics" scheme') raise - from taurus.core.taurusexception import TaurusException from taurus.core.util.singleton import Singleton from taurus.core.util.log import Logger from taurus.core.taurusbasetypes import TaurusElementType from taurus.core.taurusfactory import TaurusFactory - from .epicsattribute import EpicsAttribute from .epicsdevice import EpicsDevice from .epicsauthority import EpicsAuthority +__all__ = ['EpicsFactory'] + class EpicsFactory(Singleton, TaurusFactory, Logger): """ diff --git a/lib/taurus/core/epics/test/test_epicsvalidator.py b/lib/taurus/core/epics/test/test_epicsvalidator.py index 70c89c26c..889da1487 100644 --- a/lib/taurus/core/epics/test/test_epicsvalidator.py +++ b/lib/taurus/core/epics/test/test_epicsvalidator.py @@ -29,7 +29,6 @@ __docformat__ = 'restructuredtext' import sys - import unittest from taurus.core.test import (valid, invalid, names, AbstractNameValidatorTestCase) diff --git a/lib/taurus/core/evaluation/evalfactory.py b/lib/taurus/core/evaluation/evalfactory.py index 8ca09543b..f7bd6c5cf 100755 --- a/lib/taurus/core/evaluation/evalfactory.py +++ b/lib/taurus/core/evaluation/evalfactory.py @@ -25,12 +25,9 @@ ''' evaluation module. See __init__.py for more detailed documentation ''' -from __future__ import absolute_import -__all__ = ['EvaluationFactory'] - +from __future__ import absolute_import import weakref - from taurus.core.taurusbasetypes import TaurusElementType from .evalattribute import EvaluationAttribute from .evalauthority import EvaluationAuthority @@ -40,6 +37,8 @@ from taurus.core.util.singleton import Singleton from taurus.core.taurusfactory import TaurusFactory +__all__ = ['EvaluationFactory'] + class EvaluationFactory(Singleton, TaurusFactory, Logger): """ diff --git a/lib/taurus/core/evaluation/evalvalidator.py b/lib/taurus/core/evaluation/evalvalidator.py index e1c647003..4115fee14 100644 --- a/lib/taurus/core/evaluation/evalvalidator.py +++ b/lib/taurus/core/evaluation/evalvalidator.py @@ -24,12 +24,8 @@ from __future__ import absolute_import from builtins import zip -__all__ = ['EvaluationDeviceNameValidator', - 'EvaluationAttributeNameValidator'] - import re import hashlib - import taurus from taurus import isValidName, debug from taurus.core import TaurusElementType @@ -38,6 +34,9 @@ TaurusDeviceNameValidator, TaurusAuthorityNameValidator) +__all__ = ['EvaluationDeviceNameValidator', + 'EvaluationAttributeNameValidator'] + # Pattern for python variables PY_VAR = r'(?. ## ############################################################################# + from __future__ import print_function from future.utils import with_metaclass from distutils.version import LooseVersion -import numpy from time import (time, sleep) +import numpy import PyTango from PyTango import DeviceProxy, AttrWriteType, DevState, AttrQuality diff --git a/lib/taurus/core/tango/test/tgtestds.py b/lib/taurus/core/tango/test/tgtestds.py index 73372c413..3f9dab823 100644 --- a/lib/taurus/core/tango/test/tgtestds.py +++ b/lib/taurus/core/tango/test/tgtestds.py @@ -26,15 +26,14 @@ """Module containing base classes for using the TangoSchemeTest DS in tests""" from builtins import object -__all__ = ['TangoSchemeTestLauncher'] - -__docformat__ = 'restructuredtext' - import PyTango - from taurus.core.tango.starter import ProcessStarter from taurus.test import getResourcePath +__all__ = ['TangoSchemeTestLauncher'] + +__docformat__ = 'restructuredtext' + class TangoSchemeTestLauncher(object): """A base class for TestCase classes wishing to start a TangoSchemeTest. diff --git a/lib/taurus/core/tango/util/__init__.py b/lib/taurus/core/tango/util/__init__.py index fe277eaaf..2c9f7a68f 100644 --- a/lib/taurus/core/tango/util/__init__.py +++ b/lib/taurus/core/tango/util/__init__.py @@ -25,7 +25,6 @@ """The sardana package. It contains specific part of sardana""" from __future__ import absolute_import +from .formatter import tangoFormatter __docformat__ = 'restructuredtext' - -from .formatter import tangoFormatter \ No newline at end of file diff --git a/lib/taurus/core/taurusauthority.py b/lib/taurus/core/taurusauthority.py index 99f210120..4f700ff1e 100644 --- a/lib/taurus/core/taurusauthority.py +++ b/lib/taurus/core/taurusauthority.py @@ -24,17 +24,17 @@ ############################################################################# """This module contains the base class for a taurus database""" + from __future__ import absolute_import +from .taurusbasetypes import TaurusElementType +from .taurusmodel import TaurusModel + __all__ = ["TaurusAuthority"] __docformat__ = "restructuredtext" -from .taurusbasetypes import TaurusElementType -from .taurusmodel import TaurusModel - - class TaurusAuthority(TaurusModel): _description = "A Taurus Authority" diff --git a/lib/taurus/core/taurusbasetypes.py b/lib/taurus/core/taurusbasetypes.py index 711403ba5..0bce150c2 100644 --- a/lib/taurus/core/taurusbasetypes.py +++ b/lib/taurus/core/taurusbasetypes.py @@ -22,11 +22,19 @@ ## ############################################################################# -''' +""" a misc collection of basic types -''' +""" +import datetime + +from .util.enumeration import Enumeration +from .util.log import taurus4_deprecation +from enum import IntEnum +from future.utils import PY2 from builtins import object + + __all__ = ["TaurusSWDevState", "TaurusSWDevHealth", "OperationMode", "TaurusSerializationMode", "SubscriptionState", "TaurusEventType", "MatchLevel", "TaurusElementType", "LockStatus", "DataFormat", @@ -36,13 +44,6 @@ __docformat__ = "restructuredtext" -import datetime - -from .util.enumeration import Enumeration -from .util.log import taurus4_deprecation -from enum import IntEnum -from future.utils import PY2 - class TaurusDevState(IntEnum): """Enumeration of possible states of :class:`taurus.core.TaurusDevice` diff --git a/lib/taurus/core/taurusconfiguration.py b/lib/taurus/core/taurusconfiguration.py index 545189d60..f95b3856d 100644 --- a/lib/taurus/core/taurusconfiguration.py +++ b/lib/taurus/core/taurusconfiguration.py @@ -28,13 +28,14 @@ This module contains the base class for a taurus attribute configuration""" from builtins import object +from .taurusmodel import TaurusModel +from .util.log import taurus4_deprecation + + __all__ = ["TaurusConfigurationProxy", "TaurusConfiguration"] __docformat__ = "restructuredtext" -from .taurusmodel import TaurusModel -from .util.log import taurus4_deprecation - class TaurusConfigurationProxy(object): """ diff --git a/lib/taurus/core/taurusfactory.py b/lib/taurus/core/taurusfactory.py index 99561c264..01a481483 100644 --- a/lib/taurus/core/taurusfactory.py +++ b/lib/taurus/core/taurusfactory.py @@ -56,11 +56,7 @@ """ from __future__ import absolute_import - from builtins import object -__all__ = ["TaurusFactory"] - -__docformat__ = "restructuredtext" import atexit from weakref import WeakValueDictionary @@ -72,6 +68,10 @@ from .taurusexception import TaurusException from taurus.core.tauruspollingtimer import TaurusPollingTimer +__all__ = ["TaurusFactory"] + +__docformat__ = "restructuredtext" + class TaurusFactory(object): """The base class for valid Factories in Taurus.""" diff --git a/lib/taurus/core/taurushelper.py b/lib/taurus/core/taurushelper.py index 5fd8ad1bb..a6de167bd 100644 --- a/lib/taurus/core/taurushelper.py +++ b/lib/taurus/core/taurushelper.py @@ -24,10 +24,14 @@ ############################################################################# """a list of helper methods""" + from __future__ import print_function from builtins import str from future.utils import string_types +import re +from taurus import tauruscustomsettings +from .util.log import taurus4_deprecation __all__ = ['check_dependencies', 'log_dependencies', 'getSchemeFromName', 'getValidTypesForName', 'isValidName', 'makeSchemeExplicit', @@ -42,11 +46,6 @@ __docformat__ = "restructuredtext" -import re -from taurus import tauruscustomsettings -from .util.log import taurus4_deprecation - - # regexp for finding the scheme __SCHEME_RE = re.compile(r'([^:/?#]+):.*') diff --git a/lib/taurus/core/tauruslistener.py b/lib/taurus/core/tauruslistener.py index e04cb86c4..e232097dd 100644 --- a/lib/taurus/core/tauruslistener.py +++ b/lib/taurus/core/tauruslistener.py @@ -24,15 +24,16 @@ ############################################################################# """This module contains the taurus base listeners classes""" -from __future__ import print_function +from __future__ import print_function from builtins import object +from .util.log import Logger + + __all__ = ["TaurusListener", "TaurusExceptionListener"] __docformat__ = "restructuredtext" -from .util.log import Logger - class TaurusListener(Logger): """ TaurusListener Interface""" diff --git a/lib/taurus/core/taurusmanager.py b/lib/taurus/core/taurusmanager.py index 4f7ed119f..1a8dbfaa4 100755 --- a/lib/taurus/core/taurusmanager.py +++ b/lib/taurus/core/taurusmanager.py @@ -27,9 +27,6 @@ from __future__ import print_function from builtins import range -__all__ = ["TaurusManager"] - -__docformat__ = "restructuredtext" import os import atexit @@ -37,7 +34,6 @@ from .util.singleton import Singleton from .util.log import Logger, taurus4_deprecation from .util.threadpool import ThreadPool - from .taurusbasetypes import (OperationMode, ManagerState, TaurusSerializationMode) from .taurusauthority import TaurusAuthority @@ -48,6 +44,10 @@ from .taurushelper import getSchemeFromName from taurus import tauruscustomsettings +__all__ = ["TaurusManager"] + +__docformat__ = "restructuredtext" + class TaurusManager(Singleton, Logger): """A :class:`taurus.core.util.singleton.Singleton` class designed to provide Taurus management. diff --git a/lib/taurus/core/taurusmodel.py b/lib/taurus/core/taurusmodel.py index 45f92a68b..5fe9cc649 100644 --- a/lib/taurus/core/taurusmodel.py +++ b/lib/taurus/core/taurusmodel.py @@ -26,9 +26,6 @@ """This module contains the base TaurusModel class""" from builtins import object -__all__ = ["TaurusModel"] - -__docformat__ = "restructuredtext" import weakref import collections @@ -40,6 +37,10 @@ from .taurusbasetypes import TaurusEventType, MatchLevel from .taurushelper import Factory +__all__ = ["TaurusModel"] + +__docformat__ = "restructuredtext" + class TaurusModel(Logger): diff --git a/lib/taurus/core/tauruspollingtimer.py b/lib/taurus/core/tauruspollingtimer.py index cbba9cc4b..31f787d06 100644 --- a/lib/taurus/core/tauruspollingtimer.py +++ b/lib/taurus/core/tauruspollingtimer.py @@ -25,18 +25,17 @@ """This module contains the polling class""" -__all__ = ["TaurusPollingTimer"] - -__docformat__ = "restructuredtext" - -import time import weakref import threading -from .util.log import Logger, DebugIt +from .util.log import Logger from .util.containers import CaselessWeakValueDict from .util.timer import Timer +__all__ = ["TaurusPollingTimer"] + +__docformat__ = "restructuredtext" + class TaurusPollingTimer(Logger): """ Polling timer manages a list of attributes that have to be polled in diff --git a/lib/taurus/core/taurusvalidator.py b/lib/taurus/core/taurusvalidator.py index 33fdd695d..ef82b3870 100644 --- a/lib/taurus/core/taurusvalidator.py +++ b/lib/taurus/core/taurusvalidator.py @@ -26,6 +26,10 @@ """This module contains the base taurus name validator classes""" from __future__ import print_function +import re +from taurus import tauruscustomsettings +from taurus.core.util.singleton import Singleton +from taurus.core.taurushelper import makeSchemeExplicit __all__ = ["TaurusAuthorityNameValidator", "TaurusDeviceNameValidator", "TaurusAttributeNameValidator"] @@ -33,11 +37,6 @@ __docformat__ = "restructuredtext" -import re -from taurus import tauruscustomsettings -from taurus.core.util.singleton import Singleton -from taurus.core.taurushelper import makeSchemeExplicit - class _TaurusBaseValidator(Singleton): '''This is a private base class for taurus base validators. Do not derive diff --git a/lib/taurus/core/test/basevalidator.py b/lib/taurus/core/test/basevalidator.py index 5ae411b1b..215f92338 100644 --- a/lib/taurus/core/test/basevalidator.py +++ b/lib/taurus/core/test/basevalidator.py @@ -28,14 +28,13 @@ #__all__ = [] from builtins import object -__docformat__ = 'restructuredtext' - - from functools import partial from taurus.test import insertTest - from taurus.core.taurusvalidator import TaurusAttributeNameValidator +__docformat__ = 'restructuredtext' + + valid = partial(insertTest, helper_name='isValid') invalid = partial(insertTest, helper_name='isInvalid') names = partial(insertTest, helper_name='getNames') diff --git a/lib/taurus/core/test/modelequality.py b/lib/taurus/core/test/modelequality.py index dca36283b..9afd5ce78 100644 --- a/lib/taurus/core/test/modelequality.py +++ b/lib/taurus/core/test/modelequality.py @@ -24,7 +24,6 @@ from builtins import object import functools - from taurus import Device, Attribute # , Authority from taurus.test import insertTest diff --git a/lib/taurus/core/util/__init__.py b/lib/taurus/core/util/__init__.py index d74d2a2e1..336853193 100644 --- a/lib/taurus/core/util/__init__.py +++ b/lib/taurus/core/util/__init__.py @@ -34,11 +34,10 @@ #. otherwise use private implementation distributed with taurus """ from __future__ import absolute_import +import taurus.tauruscustomsettings __docformat__ = "restructuredtext" -import taurus.tauruscustomsettings - LIGHTWEIGHT_IMPORTS = getattr( taurus.tauruscustomsettings, 'LIGHTWEIGHT_IMPORTS', False) diff --git a/lib/taurus/core/util/codecs.py b/lib/taurus/core/util/codecs.py index 4009ff229..8ce4f26d5 100644 --- a/lib/taurus/core/util/codecs.py +++ b/lib/taurus/core/util/codecs.py @@ -63,12 +63,7 @@ >>> f, d = codec.decode((v.format, v.value)) """ from __future__ import absolute_import - from builtins import str -__all__ = ["Codec", "NullCodec", "ZIPCodec", "BZ2Codec", "JSONCodec", - "FunctionCodec", "PlotCodec", "CodecPipeline", "CodecFactory"] - -__docformat__ = "restructuredtext" import copy @@ -83,9 +78,13 @@ from .log import Logger from .containers import CaselessDict +__all__ = ["Codec", "NullCodec", "ZIPCodec", "BZ2Codec", "JSONCodec", + "FunctionCodec", "PlotCodec", "CodecPipeline", "CodecFactory"] + +__docformat__ = "restructuredtext" if PY2: - buffer_types = buffer, memoryview, + buffer_types = buffer, memoryview, else: buffer_types = memoryview, diff --git a/lib/taurus/core/util/colors.py b/lib/taurus/core/util/colors.py index d616aa14f..b0731aa42 100644 --- a/lib/taurus/core/util/colors.py +++ b/lib/taurus/core/util/colors.py @@ -25,8 +25,8 @@ """This module contains color codes for state and quality""" from __future__ import print_function - from builtins import object + __all__ = ["DEVICE_STATE_DATA", "ATTRIBUTE_QUALITY_DATA", "ColorPalette", "DEVICE_STATE_PALETTE", "ATTRIBUTE_QUALITY_PALETTE"] diff --git a/lib/taurus/core/util/console.py b/lib/taurus/core/util/console.py index 193eef4fe..051f721d3 100644 --- a/lib/taurus/core/util/console.py +++ b/lib/taurus/core/util/console.py @@ -26,6 +26,7 @@ """This module contains ANSI color codes""" from builtins import object + __all__ = ["make_color_table", "NoColors", "TermColors", "HTMLColors"] __docformat__ = "restructuredtext" diff --git a/lib/taurus/core/util/constant.py b/lib/taurus/core/util/constant.py index 829513640..c793322ea 100644 --- a/lib/taurus/core/util/constant.py +++ b/lib/taurus/core/util/constant.py @@ -47,6 +47,7 @@ """ from builtins import object + __docformat__ = "restructuredtext" diff --git a/lib/taurus/core/util/containers.py b/lib/taurus/core/util/containers.py index b5e3d22b8..bbc8d762b 100644 --- a/lib/taurus/core/util/containers.py +++ b/lib/taurus/core/util/containers.py @@ -31,12 +31,6 @@ from builtins import range from builtins import object -__all__ = ["CaselessList", "CaselessDict", "CaselessWeakValueDict", "LoopList", - "CircBuf", "LIFO", "TimedQueue", "self_locked", "ThreadDict", - "defaultdict", "defaultdict_fromkey", "CaselessDefaultDict", - "DefaultThreadDict", "getDictAsTree", "ArrayBuffer", ] - -__docformat__ = "restructuredtext" from future.utils import string_types @@ -46,6 +40,14 @@ import weakref +__all__ = ["CaselessList", "CaselessDict", "CaselessWeakValueDict", "LoopList", + "CircBuf", "LIFO", "TimedQueue", "self_locked", "ThreadDict", + "defaultdict", "defaultdict_fromkey", "CaselessDefaultDict", + "DefaultThreadDict", "getDictAsTree", "ArrayBuffer", ] + +__docformat__ = "restructuredtext" + + class CaselessList(list): """A case insensitive lists that has some caseless methods. Only allows strings as list members. Most methods that would normally return a list, diff --git a/lib/taurus/core/util/decorator/typecheck.py b/lib/taurus/core/util/decorator/typecheck.py index 2a1c27a0b..88ec269e3 100644 --- a/lib/taurus/core/util/decorator/typecheck.py +++ b/lib/taurus/core/util/decorator/typecheck.py @@ -62,15 +62,14 @@ TypeError: 'fib' method accepts (int), but was given (float) """ + from __future__ import print_function +import sys __all__ = ["accepts", "returns"] __docformat__ = "restructuredtext" -import sys - - def accepts(*types, **kw): """ Function decorator. Checks that inputs given to decorated function are of the expected type. diff --git a/lib/taurus/core/util/enumeration.py b/lib/taurus/core/util/enumeration.py index cdbfd8954..82f275a7e 100644 --- a/lib/taurus/core/util/enumeration.py +++ b/lib/taurus/core/util/enumeration.py @@ -36,11 +36,11 @@ from builtins import int from builtins import str from builtins import object -__all__ = ["EnumException", "Enumeration"] +from future.utils import string_types -__docformat__ = "restructuredtext" -from future.utils import string_types +__all__ = ["EnumException", "Enumeration"] +__docformat__ = "restructuredtext" class EnumException(Exception): diff --git a/lib/taurus/core/util/event.py b/lib/taurus/core/util/event.py index dde969b6a..42cc71483 100644 --- a/lib/taurus/core/util/event.py +++ b/lib/taurus/core/util/event.py @@ -28,24 +28,23 @@ """ from __future__ import print_function from __future__ import absolute_import - from builtins import range from builtins import object -__all__ = ["BoundMethodWeakref", "CallableRef", "EventGenerator", - "ConfigEventGenerator", "ListEventGenerator", "EventListener", - "AttributeEventWait", "AttributeEventIterator"] - -__docformat__ = "restructuredtext" - import sys import weakref import threading import time import collections - import taurus.core +__all__ = ["BoundMethodWeakref", "CallableRef", "EventGenerator", + "ConfigEventGenerator", "ListEventGenerator", "EventListener", + "AttributeEventWait", "AttributeEventIterator"] + +__docformat__ = "restructuredtext" + + class BoundMethodWeakref(object): """This class represents a weak reference to a method of an object since weak references to methods don't work by themselves""" diff --git a/lib/taurus/core/util/eventfilters.py b/lib/taurus/core/util/eventfilters.py index bc5c2bb63..f6067407c 100644 --- a/lib/taurus/core/util/eventfilters.py +++ b/lib/taurus/core/util/eventfilters.py @@ -26,8 +26,9 @@ """event filters library to be used with :meth:`taurus.qt.qtgui.base.TaurusBaseComponent.setFilters`""" - from builtins import object + + def IGNORE_ALL(s, t, v): '''Will discard all events''' return None diff --git a/lib/taurus/core/util/excepthook.py b/lib/taurus/core/util/excepthook.py index 2a48cedd9..e632775e5 100644 --- a/lib/taurus/core/util/excepthook.py +++ b/lib/taurus/core/util/excepthook.py @@ -25,13 +25,13 @@ """This module contains a base class for exception hooks""" +import sys from builtins import object + __all__ = ["BaseExceptHook"] __docformat__ = "restructuredtext" -import sys - class BaseExceptHook(object): """A callable class that acts as an excepthook that handles an exception. diff --git a/lib/taurus/core/util/init_bkcomp.py b/lib/taurus/core/util/init_bkcomp.py index 9a559b5b9..981ae1564 100644 --- a/lib/taurus/core/util/init_bkcomp.py +++ b/lib/taurus/core/util/init_bkcomp.py @@ -35,7 +35,6 @@ """ from __future__ import absolute_import -__docformat__ = "restructuredtext" # taurus cannot work properly without the following modules so # they are promptly imported here has a facility (also for backward @@ -69,6 +68,7 @@ except: etree = None +__docformat__ = "restructuredtext" def dictFromSequence(seq): """Translates a sequence into a dictionary by converting each to elements of @@ -82,3 +82,13 @@ def _pairwise(iterable): while True: yield itnext(), itnext() return dict(_pairwise(seq)) + + + + + + + + + + diff --git a/lib/taurus/core/util/lock.py b/lib/taurus/core/util/lock.py index 6306d1847..fb40ee8a9 100644 --- a/lib/taurus/core/util/lock.py +++ b/lib/taurus/core/util/lock.py @@ -27,13 +27,13 @@ information""" from builtins import object +import threading +import logging + __all__ = ["TaurusLock"] __docformat__ = 'restructuredtext' -import threading -import logging - _VERBOSE = False diff --git a/lib/taurus/core/util/log.py b/lib/taurus/core/util/log.py index 879fff401..7277b06de 100644 --- a/lib/taurus/core/util/log.py +++ b/lib/taurus/core/util/log.py @@ -30,14 +30,6 @@ from builtins import str from builtins import object -__all__ = ["LogIt", "TraceIt", "DebugIt", "InfoIt", "WarnIt", "ErrorIt", - "CriticalIt", "MemoryLogHandler", "LogExceptHook", "Logger", - "LogFilter", - "_log", "trace", "debug", "info", "warning", "error", "fatal", - "critical", "deprecated", "deprecation_decorator", - "taurus4_deprecation"] - -__docformat__ = "restructuredtext" import io import os @@ -59,6 +51,16 @@ from collections import defaultdict +__all__ = ["LogIt", "TraceIt", "DebugIt", "InfoIt", "WarnIt", "ErrorIt", + "CriticalIt", "MemoryLogHandler", "LogExceptHook", "Logger", + "LogFilter", + "_log", "trace", "debug", "info", "warning", "error", "fatal", + "critical", "deprecated", "deprecation_decorator", + "taurus4_deprecation"] + +__docformat__ = "restructuredtext" + + class _DeprecationCounter(defaultdict): def __init__(self): diff --git a/lib/taurus/core/util/object.py b/lib/taurus/core/util/object.py index 05d23fd4b..eb20003e5 100644 --- a/lib/taurus/core/util/object.py +++ b/lib/taurus/core/util/object.py @@ -26,6 +26,7 @@ """This module contains the base Object class for taurus.""" from builtins import object + __all__ = ["Object"] __docformat__ = "restructuredtext" diff --git a/lib/taurus/core/util/prop.py b/lib/taurus/core/util/prop.py index 304218d26..3f1d17076 100644 --- a/lib/taurus/core/util/prop.py +++ b/lib/taurus/core/util/prop.py @@ -27,6 +27,7 @@ from __future__ import print_function from __future__ import absolute_import + __all__ = ["propertx"] __docformat__ = "restructuredtext" diff --git a/lib/taurus/core/util/property_parser.py b/lib/taurus/core/util/property_parser.py index 1f72a6b4c..784055c2f 100644 --- a/lib/taurus/core/util/property_parser.py +++ b/lib/taurus/core/util/property_parser.py @@ -24,14 +24,13 @@ ############################################################################# """This is an experimental property parser""" -from __future__ import print_function +from __future__ import print_function from builtins import str -import os +import os import ply.lex as lex import ply.yacc as yacc - from .containers import CaselessDict from .log import Logger diff --git a/lib/taurus/core/util/propertyfile.py b/lib/taurus/core/util/propertyfile.py index 9d8701d82..a608b884a 100644 --- a/lib/taurus/core/util/propertyfile.py +++ b/lib/taurus/core/util/propertyfile.py @@ -36,14 +36,14 @@ from builtins import next from builtins import object -__all__ = ["Properties"] - -__docformat__ = "restructuredtext" import sys import re import time +__all__ = ["Properties"] + +__docformat__ = "restructuredtext" class Properties(object): """ A Python replacement for java.util.Properties """ diff --git a/lib/taurus/core/util/remotelogmonitor.py b/lib/taurus/core/util/remotelogmonitor.py index aeabd6fa4..9b7988bee 100644 --- a/lib/taurus/core/util/remotelogmonitor.py +++ b/lib/taurus/core/util/remotelogmonitor.py @@ -30,7 +30,6 @@ from future import standard_library standard_library.install_aliases() -__all__ = ["LogRecordStreamHandler", "LogRecordSocketReceiver", "log"] import time import socket @@ -43,6 +42,9 @@ import socketserver +_all__ = ["LogRecordStreamHandler", "LogRecordSocketReceiver", "log"] + + class LogRecordStreamHandler(socketserver.StreamRequestHandler): def handle(self): diff --git a/lib/taurus/core/util/report/report.py b/lib/taurus/core/util/report/report.py index 65615ebf0..b426a47e6 100644 --- a/lib/taurus/core/util/report/report.py +++ b/lib/taurus/core/util/report/report.py @@ -26,6 +26,7 @@ """This module provides a panel to display taurus messages""" from builtins import object + __all__ = ["TaurusMessageReportHandler"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/core/util/safeeval.py b/lib/taurus/core/util/safeeval.py index 2515e0f2d..43565643c 100644 --- a/lib/taurus/core/util/safeeval.py +++ b/lib/taurus/core/util/safeeval.py @@ -30,6 +30,7 @@ from builtins import range from builtins import object + __all__ = ["SafeEvaluator"] __docformat__ = "restructuredtext" diff --git a/lib/taurus/core/util/singleton.py b/lib/taurus/core/util/singleton.py index 9a897cb9b..67aeee093 100644 --- a/lib/taurus/core/util/singleton.py +++ b/lib/taurus/core/util/singleton.py @@ -27,6 +27,7 @@ classes that need to implement the Singleton design pattern.""" from builtins import object + __all__ = ["Singleton"] __docformat__ = "restructuredtext" diff --git a/lib/taurus/core/util/tablepprint.py b/lib/taurus/core/util/tablepprint.py index feefe65ed..cab4c13e5 100644 --- a/lib/taurus/core/util/tablepprint.py +++ b/lib/taurus/core/util/tablepprint.py @@ -31,14 +31,12 @@ from builtins import str from builtins import range from functools import reduce - -__docformat__ = "restructuredtext" - -import io import operator import re import math +__docformat__ = "restructuredtext" + def indent(rows, hasHeader=False, headerChar='-', delim=' | ', justify='left', separateRows=False, prefix='', postfix='', wrapfunc=lambda x: x): @@ -125,8 +123,6 @@ def wrap_onspace_strict(text, width): wordRegex = re.compile(r'\S{' + str(width) + r',}') return wrap_onspace(wordRegex.sub(lambda m: wrap_always(m.group(), width), text), width) -import math - def wrap_always(text, width): """A simple word-wrap function that wraps text on exactly width characters. diff --git a/lib/taurus/core/util/tb.py b/lib/taurus/core/util/tb.py index 92cb39260..aada3a004 100644 --- a/lib/taurus/core/util/tb.py +++ b/lib/taurus/core/util/tb.py @@ -28,7 +28,6 @@ from builtins import str import sys -import inspect import traceback import threading diff --git a/lib/taurus/core/util/threadpool.py b/lib/taurus/core/util/threadpool.py index 185348a1e..b4e9f806d 100644 --- a/lib/taurus/core/util/threadpool.py +++ b/lib/taurus/core/util/threadpool.py @@ -29,10 +29,8 @@ from future import standard_library standard_library.install_aliases() -from builtins import range -__all__ = ["ThreadPool", "Worker"] -__docformat__ = "restructuredtext" +from builtins import range from threading import Thread, currentThread from queue import Queue @@ -40,7 +38,11 @@ from traceback import extract_stack, format_list from .prop import propertx -from .log import Logger, DebugIt, TraceIt +from .log import Logger + +__all__ = ["ThreadPool", "Worker"] + +__docformat__ = "restructuredtext" class ThreadPool(Logger): diff --git a/lib/taurus/qt/qtcore/communication/communication.py b/lib/taurus/qt/qtcore/communication/communication.py index 2ac9f4b5a..e77715222 100644 --- a/lib/taurus/qt/qtcore/communication/communication.py +++ b/lib/taurus/qt/qtcore/communication/communication.py @@ -26,6 +26,7 @@ """ comunications.py: """ + from __future__ import print_function from taurus.external.qt import QtCore diff --git a/lib/taurus/qt/qtcore/configuration/configuration.py b/lib/taurus/qt/qtcore/configuration/configuration.py index dbc80ab75..23b73ffca 100644 --- a/lib/taurus/qt/qtcore/configuration/configuration.py +++ b/lib/taurus/qt/qtcore/configuration/configuration.py @@ -31,12 +31,12 @@ standard_library.install_aliases() from builtins import str from builtins import object +from future.utils import string_types + __all__ = ["configurableProperty", "BaseConfigurableClass"] __docformat__ = 'restructuredtext' -from future.utils import string_types - class configurableProperty(object): '''A dummy class used to handle properties with the configuration API diff --git a/lib/taurus/qt/qtcore/model/__init__.py b/lib/taurus/qt/qtcore/model/__init__.py index adf1ad8cd..f8326e5c5 100644 --- a/lib/taurus/qt/qtcore/model/__init__.py +++ b/lib/taurus/qt/qtcore/model/__init__.py @@ -54,8 +54,8 @@ """ from __future__ import absolute_import - -__docformat__ = 'restructuredtext' - from .taurusmodel import * from .taurusdatabasemodel import * + + +__docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py index e1f68d5d6..cf42778a9 100644 --- a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py +++ b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py @@ -27,6 +27,13 @@ # TODO: tango-centric from builtins import str + +from taurus.external.qt import Qt +from taurus.core.taurusbasetypes import TaurusElementType, TaurusDevState +import taurus.qt.qtcore.mimetypes +from .taurusmodel import TaurusBaseTreeItem, TaurusBaseModel, TaurusBaseProxyModel + + __all__ = ["TaurusTreeDevicePartItem", "TaurusTreeDeviceDomainItem", "TaurusTreeDeviceFamilyItem", "TaurusTreeDeviceMemberItem", "TaurusTreeSimpleDeviceItem", "TaurusTreeDeviceItem", "TaurusTreeAttributeItem", "TaurusTreeServerNameItem", @@ -40,11 +47,6 @@ __docformat__ = 'restructuredtext' -from taurus.external.qt import Qt -from taurus.core.taurusbasetypes import TaurusElementType, TaurusDevState -import taurus.qt.qtcore.mimetypes - -from .taurusmodel import TaurusBaseTreeItem, TaurusBaseModel, TaurusBaseProxyModel ElemType = TaurusElementType diff --git a/lib/taurus/qt/qtcore/model/taurusmodel.py b/lib/taurus/qt/qtcore/model/taurusmodel.py index 2e2591ebe..9239b0eed 100644 --- a/lib/taurus/qt/qtcore/model/taurusmodel.py +++ b/lib/taurus/qt/qtcore/model/taurusmodel.py @@ -26,9 +26,6 @@ """This module provides base taurus tree item and a base tree model""" from builtins import object -__all__ = ["TaurusBaseTreeItem", "TaurusBaseModel", "TaurusBaseProxyModel"] - -__docformat__ = 'restructuredtext' from taurus.external.qt import Qt from taurus.core.taurusbasetypes import TaurusElementType @@ -36,6 +33,10 @@ QtQt = Qt.Qt +__all__ = ["TaurusBaseTreeItem", "TaurusBaseModel", "TaurusBaseProxyModel"] + +__docformat__ = 'restructuredtext' + class TaurusBaseTreeItem(object): """A generic node""" diff --git a/lib/taurus/qt/qtcore/util/__init__.py b/lib/taurus/qt/qtcore/util/__init__.py index 75ea2c97d..64ccc147d 100644 --- a/lib/taurus/qt/qtcore/util/__init__.py +++ b/lib/taurus/qt/qtcore/util/__init__.py @@ -26,6 +26,6 @@ """This package provides a set of utilities (e.g. logging) to taurus qtcore""" from __future__ import absolute_import -__docformat__ = 'restructuredtext' - from .tauruslog import * + +__docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtcore/util/emitter.py b/lib/taurus/qt/qtcore/util/emitter.py index 0e6c430bc..6e46687ec 100644 --- a/lib/taurus/qt/qtcore/util/emitter.py +++ b/lib/taurus/qt/qtcore/util/emitter.py @@ -41,9 +41,6 @@ import taurus from taurus.external.qt import Qt from taurus.core.util.log import Logger -from taurus.core.util.singleton import Singleton - -from taurus.core.taurusbasetypes import SubscriptionState ############################################################################### diff --git a/lib/taurus/qt/qtcore/util/signal.py b/lib/taurus/qt/qtcore/util/signal.py index 20bdcd509..57ff3a46b 100644 --- a/lib/taurus/qt/qtcore/util/signal.py +++ b/lib/taurus/qt/qtcore/util/signal.py @@ -2,12 +2,13 @@ from __future__ import print_function from builtins import object -__all__ = ['baseSignal'] from PyQt4 import Qt from threading import Lock from weakref import WeakKeyDictionary +__all__ = ['baseSignal'] + def baseSignal(name, *args): """Signal class for non-Qobject objects. diff --git a/lib/taurus/qt/qtdesigner/containerplugin.py b/lib/taurus/qt/qtdesigner/containerplugin.py index 8a167b5d7..70009e0a0 100644 --- a/lib/taurus/qt/qtdesigner/containerplugin.py +++ b/lib/taurus/qt/qtdesigner/containerplugin.py @@ -36,14 +36,12 @@ - 'model' - will have a '...' button that will open a customized dialog for editing the widget model (same has 'Edit model...' task menu item """ + from __future__ import absolute_import -from taurus.external.qt import Qt from taurus.external.qt import QtDesigner - from taurus.qt.qtgui.container.qcontainer import QGroupWidget -#import sip Q_TYPEID = {'QPyDesignerContainerExtension': 'com.trolltech.Qt.Designer.Container', 'QPyDesignerPropertySheetExtension': 'com.trolltech.Qt.Designer.PropertySheet', diff --git a/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py b/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py index 4bdd0b0f5..d8d4dffd3 100644 --- a/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py +++ b/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py @@ -36,6 +36,7 @@ - 'model' - will have a '...' button that will open a customized dialog for editing the widget model (same has 'Edit model...' task menu item """ + from __future__ import print_function import inspect diff --git a/lib/taurus/qt/qtgui/__init__.py b/lib/taurus/qt/qtgui/__init__.py index 00029add9..85e7ce558 100644 --- a/lib/taurus/qt/qtgui/__init__.py +++ b/lib/taurus/qt/qtgui/__init__.py @@ -29,9 +29,6 @@ abstract model data.""" from __future__ import absolute_import -__docformat__ = 'restructuredtext' - - # register icon path files and icon theme on import of taurus.qt.qtgui from . import icon as __icon import os @@ -41,6 +38,9 @@ from taurus import tauruscustomsettings as __S from taurus import debug as __debug + +__docformat__ = 'restructuredtext' + icon_dir = os.path.join(os.path.dirname(os.path.abspath(__icon.__file__))) # TODO: get .path file glob pattern from tauruscustomsettings __icon.registerPathFiles(glob.glob(os.path.join(icon_dir,'*.path'))) diff --git a/lib/taurus/qt/qtgui/application/taurusapplication.py b/lib/taurus/qt/qtgui/application/taurusapplication.py index f7d9e19f6..07a6c127d 100644 --- a/lib/taurus/qt/qtgui/application/taurusapplication.py +++ b/lib/taurus/qt/qtgui/application/taurusapplication.py @@ -28,10 +28,6 @@ from builtins import str -__all__ = ["TaurusApplication"] - -__docformat__ = 'restructuredtext' - import os import sys import logging @@ -44,6 +40,11 @@ import taurus.core.util.argparse +__all__ = ["TaurusApplication"] + +__docformat__ = 'restructuredtext' + + class STD(Logger): FlushWaterMark = 1000 diff --git a/lib/taurus/qt/qtgui/base/taurusbase.py b/lib/taurus/qt/qtgui/base/taurusbase.py index 3e0e182bd..f51a933ee 100644 --- a/lib/taurus/qt/qtgui/base/taurusbase.py +++ b/lib/taurus/qt/qtgui/base/taurusbase.py @@ -27,11 +27,6 @@ """This module provides the set of base classes from which the Qt taurus widgets should inherit to be considered valid taurus widgets.""" -__all__ = ["TaurusBaseComponent", "TaurusBaseWidget", - "TaurusBaseWritableWidget", "defaultFormatter"] - -__docformat__ = 'restructuredtext' - import sys import threading from types import MethodType @@ -45,19 +40,27 @@ from taurus.core.taurusbasetypes import TaurusElementType, TaurusEventType from taurus.core.taurusattribute import TaurusAttribute from taurus.core.taurusdevice import TaurusDevice -from taurus.core.taurusconfiguration import (TaurusConfiguration, - TaurusConfigurationProxy) +from taurus.core.taurusconfiguration import TaurusConfigurationProxy from taurus.core.tauruslistener import TaurusListener, TaurusExceptionListener from taurus.core.taurusoperation import WriteAttrOperation from taurus.core.util.eventfilters import filterEvent from taurus.core.util.log import deprecation_decorator from taurus.qt.qtcore.util.signal import baseSignal from taurus.qt.qtcore.configuration import BaseConfigurableClass -from taurus.qt.qtcore.mimetypes import TAURUS_ATTR_MIME_TYPE, TAURUS_DEV_MIME_TYPE, TAURUS_MODEL_MIME_TYPE +from taurus.qt.qtcore.mimetypes import TAURUS_ATTR_MIME_TYPE +from taurus.qt.qtcore.mimetypes import TAURUS_DEV_MIME_TYPE +from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_MIME_TYPE from taurus.qt.qtgui.util import ActionFactory from taurus.core.units import Quantity + +__all__ = ["TaurusBaseComponent", "TaurusBaseWidget", + "TaurusBaseWritableWidget", "defaultFormatter"] + +__docformat__ = 'restructuredtext' + + DefaultNoneValue = "-----" diff --git a/lib/taurus/qt/qtgui/base/tauruscontroller.py b/lib/taurus/qt/qtgui/base/tauruscontroller.py index fd536cb85..da84afdf7 100644 --- a/lib/taurus/qt/qtgui/base/tauruscontroller.py +++ b/lib/taurus/qt/qtgui/base/tauruscontroller.py @@ -28,12 +28,6 @@ from builtins import str from builtins import object -__all__ = ["TaurusBaseController", "TaurusAttributeControllerHelper", - "TaurusScalarAttributeControllerHelper", - "TaurusConfigurationControllerHelper", - "updateLabelBackground"] - -__docformat__ = 'restructuredtext' import weakref @@ -45,6 +39,14 @@ from taurus.qt.qtgui.util import QT_DEVICE_STATE_PALETTE +__all__ = ["TaurusBaseController", "TaurusAttributeControllerHelper", + "TaurusScalarAttributeControllerHelper", + "TaurusConfigurationControllerHelper", + "updateLabelBackground"] + +__docformat__ = 'restructuredtext' + + class TaurusBaseController(object): """Base class for all taurus controllers""" diff --git a/lib/taurus/qt/qtgui/button/taurusbutton.py b/lib/taurus/qt/qtgui/button/taurusbutton.py index 2c059437f..aed923b6d 100644 --- a/lib/taurus/qt/qtgui/button/taurusbutton.py +++ b/lib/taurus/qt/qtgui/button/taurusbutton.py @@ -29,10 +29,6 @@ from builtins import map from builtins import str -__all__ = ["TaurusLauncherButton", "TaurusCommandButton", "TaurusLockButton"] - -__docformat__ = 'restructuredtext' - from future.utils import string_types from taurus.external.qt import Qt @@ -43,6 +39,11 @@ from taurus.qt.qtgui.dialog import ProtectTaurusMessageBox +__all__ = ["TaurusLauncherButton", "TaurusCommandButton", "TaurusLockButton"] + +__docformat__ = 'restructuredtext' + + class _ButtonDialog(Qt.QDialog): _widget = None deleteWidgetOnClose = False diff --git a/lib/taurus/qt/qtgui/compact/abstractswitcher.py b/lib/taurus/qt/qtgui/compact/abstractswitcher.py index a5e9ad5a2..4bdf299ee 100644 --- a/lib/taurus/qt/qtgui/compact/abstractswitcher.py +++ b/lib/taurus/qt/qtgui/compact/abstractswitcher.py @@ -23,7 +23,8 @@ ## ############################################################################# -"""This module provides base classes from which the compact widgets should inherit +""" +This module provides base classes from which the compact widgets should inherit """ __all__ = ["TaurusReadWriteSwitcher"] @@ -34,7 +35,7 @@ from taurus.external.qt import Qt from taurus.qt.qtgui.container import TaurusWidget -from taurus.qt.qtgui.base import TaurusBaseWritableWidget +# from taurus.qt.qtgui.base import TaurusBaseWritableWidget class TaurusReadWriteSwitcher(TaurusWidget): diff --git a/lib/taurus/qt/qtgui/compact/basicswitcher.py b/lib/taurus/qt/qtgui/compact/basicswitcher.py index e13fed3f2..b21f371fd 100644 --- a/lib/taurus/qt/qtgui/compact/basicswitcher.py +++ b/lib/taurus/qt/qtgui/compact/basicswitcher.py @@ -25,17 +25,17 @@ """This module provides some basic usable widgets based on TaurusReadWriteSwitcher """ -from __future__ import absolute_import - -__all__ = ["TaurusLabelEditRW", "TaurusBoolRW"] -__docformat__ = 'restructuredtext' +from __future__ import absolute_import -from taurus.external.qt import Qt from taurus.qt.qtgui.display import TaurusLabel, TaurusLed from taurus.qt.qtgui.input import TaurusValueLineEdit, TaurusValueCheckBox from .abstractswitcher import TaurusReadWriteSwitcher +__all__ = ["TaurusLabelEditRW", "TaurusBoolRW"] + +__docformat__ = 'restructuredtext' + class TaurusLabelEditRW(TaurusReadWriteSwitcher): '''A Switcher combining a TaurusLabel and a TaurusValueLineEdit''' diff --git a/lib/taurus/qt/qtgui/container/qcontainer.py b/lib/taurus/qt/qtgui/container/qcontainer.py index 6e2035501..3176bbf08 100644 --- a/lib/taurus/qt/qtgui/container/qcontainer.py +++ b/lib/taurus/qt/qtgui/container/qcontainer.py @@ -26,16 +26,17 @@ """This module provides basic pure Qt container widgets""" from builtins import str -__all__ = ["QGroupWidget"] - -__docformat__ = 'restructuredtext' -import sys import json from taurus.external.qt import Qt from taurus.qt.qtgui.icon import getStandardIcon +__all__ = ["QGroupWidget"] + +__docformat__ = 'restructuredtext' + + _TitleBarStyleExpanded = """.QFrame {{ border-width: 0px; border-style: solid; diff --git a/lib/taurus/qt/qtgui/container/taurusframe.py b/lib/taurus/qt/qtgui/container/taurusframe.py index fca07350c..1e20ca0ea 100644 --- a/lib/taurus/qt/qtgui/container/taurusframe.py +++ b/lib/taurus/qt/qtgui/container/taurusframe.py @@ -24,16 +24,17 @@ ############################################################################# """This module provides basic taurus container widgets""" + from __future__ import absolute_import +from taurus.external.qt import Qt +from .taurusbasecontainer import TaurusBaseContainer + + __all__ = ["TaurusFrame"] __docformat__ = 'restructuredtext' -from taurus.external.qt import Qt -from taurus.qt.qtgui.base import TaurusBaseComponent -from .taurusbasecontainer import TaurusBaseContainer - class TaurusFrame(Qt.QFrame, TaurusBaseContainer): """This is a Qt.QFrame that additionally accepts a model property. diff --git a/lib/taurus/qt/qtgui/container/taurusgroupbox.py b/lib/taurus/qt/qtgui/container/taurusgroupbox.py index da8635f49..8b87fff69 100644 --- a/lib/taurus/qt/qtgui/container/taurusgroupbox.py +++ b/lib/taurus/qt/qtgui/container/taurusgroupbox.py @@ -24,15 +24,16 @@ ############################################################################# """This module provides basic taurus group box widget""" + from __future__ import absolute_import +from taurus.external.qt import Qt +from .taurusbasecontainer import TaurusBaseContainer + __all__ = ["TaurusGroupBox"] __docformat__ = 'restructuredtext' -from taurus.external.qt import Qt -from .taurusbasecontainer import TaurusBaseContainer - class TaurusGroupBox(Qt.QGroupBox, TaurusBaseContainer): """This is a Qt.QGroupBox that additionally accepts a model property. diff --git a/lib/taurus/qt/qtgui/container/taurusgroupwidget.py b/lib/taurus/qt/qtgui/container/taurusgroupwidget.py index 3f8ab61ea..e0bf83575 100644 --- a/lib/taurus/qt/qtgui/container/taurusgroupwidget.py +++ b/lib/taurus/qt/qtgui/container/taurusgroupwidget.py @@ -24,17 +24,19 @@ ############################################################################# """This module provides a taurus group widget""" -from __future__ import absolute_import - -__all__ = ["TaurusGroupWidget"] -__docformat__ = 'restructuredtext' +from __future__ import absolute_import from taurus.external.qt import Qt from .qcontainer import QGroupWidget from .taurusbasecontainer import TaurusBaseContainer +__all__ = ["TaurusGroupWidget"] + +__docformat__ = 'restructuredtext' + + class TaurusGroupWidget(QGroupWidget, TaurusBaseContainer): """This is a :class:`taurus.qt.qtgui.container.QGroupWidget` that additionally accepts a model property. diff --git a/lib/taurus/qt/qtgui/container/taurusmainwindow.py b/lib/taurus/qt/qtgui/container/taurusmainwindow.py index 6ca1cde0f..d2c56be9e 100644 --- a/lib/taurus/qt/qtgui/container/taurusmainwindow.py +++ b/lib/taurus/qt/qtgui/container/taurusmainwindow.py @@ -26,12 +26,10 @@ """ mainwindow.py: a main window implementation with many added features by default """ + from __future__ import absolute_import from builtins import str -__all__ = ["TaurusMainWindow"] - -__docformat__ = 'restructuredtext' import os import sys @@ -48,6 +46,11 @@ from taurus.qt.qtgui.dialog import protectTaurusMessageBox +__all__ = ["TaurusMainWindow"] + +__docformat__ = 'restructuredtext' + + class CommandArgsLineEdit(Qt.QLineEdit): ''' An specialized QLineEdit that can transform its text from/to command argument lists''' diff --git a/lib/taurus/qt/qtgui/container/taurusscrollarea.py b/lib/taurus/qt/qtgui/container/taurusscrollarea.py index fdaacf26c..2dab74870 100644 --- a/lib/taurus/qt/qtgui/container/taurusscrollarea.py +++ b/lib/taurus/qt/qtgui/container/taurusscrollarea.py @@ -24,18 +24,19 @@ ############################################################################# """This module provides basic taurus scroll area widget""" -from __future__ import absolute_import - -__all__ = ["TaurusScrollArea"] -__docformat__ = 'restructuredtext' +from __future__ import absolute_import from taurus.external.qt import Qt from taurus.qt.qtgui.base import TaurusBaseComponent - from .taurusbasecontainer import TaurusBaseContainer +__all__ = ["TaurusScrollArea"] + +__docformat__ = 'restructuredtext' + + class TaurusScrollArea(Qt.QScrollArea, TaurusBaseContainer): """This is a Qt.QScrollArea that additionally accepts a model property. This type of taurus container classes are specially useful if you define diff --git a/lib/taurus/qt/qtgui/container/tauruswidget.py b/lib/taurus/qt/qtgui/container/tauruswidget.py index 76a6dd2ea..e09887bb6 100644 --- a/lib/taurus/qt/qtgui/container/tauruswidget.py +++ b/lib/taurus/qt/qtgui/container/tauruswidget.py @@ -24,15 +24,17 @@ ############################################################################# """This module provides basic taurus container widget""" + from __future__ import absolute_import +from taurus.external.qt import Qt +from .taurusbasecontainer import TaurusBaseContainer + + __all__ = ["TaurusWidget"] __docformat__ = 'restructuredtext' -from taurus.external.qt import Qt -from .taurusbasecontainer import TaurusBaseContainer - class TaurusWidget(Qt.QWidget, TaurusBaseContainer): """This is a Qt.QWidget that additionally accepts a model property. diff --git a/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py b/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py index 9965c4168..2bf93d434 100644 --- a/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py +++ b/lib/taurus/qt/qtgui/dialog/taurusinputdialog.py @@ -26,12 +26,13 @@ """This module provides a set of dialog based widgets""" from __future__ import print_function +from taurus.external.qt import Qt + + __all__ = ["TaurusInputDialog", "get_input"] __docformat__ = 'restructuredtext' -from taurus.external.qt import Qt - def get_input(input_data, parent=None, input_panel_klass=None): """Static convenience function to get an input from the user using a diff --git a/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py b/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py index a3361688d..e768c2c7c 100644 --- a/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py +++ b/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py @@ -27,21 +27,23 @@ from future import standard_library standard_library.install_aliases() -from builtins import object -__all__ = ["TaurusMessageBox", "protectTaurusMessageBox", - "ProtectTaurusMessageBox", "TaurusExceptHookMessageBox"] -__docformat__ = 'restructuredtext' +from builtins import object import sys from taurus.external.qt import Qt - from taurus.core.util.excepthook import BaseExceptHook from taurus.core.util.log import LogExceptHook from taurus.core.util.wrap import wraps +__all__ = ["TaurusMessageBox", "protectTaurusMessageBox", + "ProtectTaurusMessageBox", "TaurusExceptHookMessageBox"] + +__docformat__ = 'restructuredtext' + + class TaurusMessageBox(Qt.QDialog): """A panel intended to display a taurus error. Example:: diff --git a/lib/taurus/qt/qtgui/display/qpixmapwidget.py b/lib/taurus/qt/qtgui/display/qpixmapwidget.py index 5659964c3..81f54154e 100644 --- a/lib/taurus/qt/qtgui/display/qpixmapwidget.py +++ b/lib/taurus/qt/qtgui/display/qpixmapwidget.py @@ -24,14 +24,16 @@ ############################################################################# """This module contains a pure Qt widget that displays an image""" + from __future__ import absolute_import +from taurus.external.qt import Qt + + __all__ = ["QPixmapWidget"] __docformat__ = 'restructuredtext' -from taurus.external.qt import Qt - class QPixmapWidget(Qt.QWidget): """This widget displays an image (pixmap). By default the pixmap is diff --git a/lib/taurus/qt/qtgui/display/qsevensegment.py b/lib/taurus/qt/qtgui/display/qsevensegment.py index 43bd86f8d..e85dbff45 100644 --- a/lib/taurus/qt/qtgui/display/qsevensegment.py +++ b/lib/taurus/qt/qtgui/display/qsevensegment.py @@ -26,14 +26,16 @@ """ qsevensegmentdisplay.py """ + from __future__ import print_function +from taurus.external.qt import Qt + + __all__ = ['Q7SegDigit'] __docformat__ = 'restructuredtext' -from taurus.external.qt import Qt - POLY = Qt.QPolygonF P = Qt.QPointF diff --git a/lib/taurus/qt/qtgui/display/tauruslabel.py b/lib/taurus/qt/qtgui/display/tauruslabel.py index 8392d47d2..cee1ea040 100644 --- a/lib/taurus/qt/qtgui/display/tauruslabel.py +++ b/lib/taurus/qt/qtgui/display/tauruslabel.py @@ -28,9 +28,6 @@ from builtins import str from builtins import object -__all__ = ["TaurusLabel"] - -__docformat__ = 'restructuredtext' import collections import re @@ -44,6 +41,11 @@ from taurus.qt.qtgui.base import TaurusConfigurationControllerHelper from taurus.qt.qtgui.base import updateLabelBackground + +__all__ = ["TaurusLabel"] + +__docformat__ = 'restructuredtext' + _QT_PLUGIN_INFO = { 'module': 'taurus.qt.qtgui.display', 'group': 'Taurus Display', diff --git a/lib/taurus/qt/qtgui/display/tauruslcd.py b/lib/taurus/qt/qtgui/display/tauruslcd.py index 1da087806..50e2253c1 100644 --- a/lib/taurus/qt/qtgui/display/tauruslcd.py +++ b/lib/taurus/qt/qtgui/display/tauruslcd.py @@ -24,13 +24,11 @@ ############################################################################# """This module provides a Taurus widget based on QLCDNumber""" + from __future__ import absolute_import from builtins import str from builtins import object -__all__ = ["TaurusLCD"] - -__docformat__ = 'restructuredtext' import collections @@ -43,6 +41,11 @@ from taurus.qt.qtgui.base import TaurusConfigurationControllerHelper from taurus.qt.qtgui.base import updateLabelBackground + +__all__ = ["TaurusLCD"] + +__docformat__ = 'restructuredtext' + _QT_PLUGIN_INFO = { 'module': 'taurus.qt.qtgui.display', 'group': 'Taurus Display', diff --git a/lib/taurus/qt/qtgui/display/taurusled.py b/lib/taurus/qt/qtgui/display/taurusled.py index 54dbe31a1..5233f209b 100644 --- a/lib/taurus/qt/qtgui/display/taurusled.py +++ b/lib/taurus/qt/qtgui/display/taurusled.py @@ -29,9 +29,6 @@ from builtins import str from builtins import object -__all__ = ["TaurusLed"] - -__docformat__ = 'restructuredtext' import weakref import collections @@ -43,6 +40,11 @@ from taurus.qt.qtgui.base import TaurusBaseWidget from .qled import QLed + +__all__ = ["TaurusLed"] + +__docformat__ = 'restructuredtext' + _QT_PLUGIN_INFO = { 'module': 'taurus.qt.qtgui.display', 'group': 'Taurus Display', diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/builder.py b/lib/taurus/qt/qtgui/extra_guiqwt/builder.py index 3123ffd63..ffb06e990 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/builder.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/builder.py @@ -26,11 +26,8 @@ """Extension of :mod:`guiqwt.builder`""" from __future__ import absolute_import -__all__ = ["TaurusPlotItemBuilder", "make"] - -__docformat__ = 'restructuredtext' - import guiqwt.builder +import numpy from .curve import TaurusCurveItem, TaurusTrendItem from .image import (TaurusImageItem, TaurusRGBImageItem, TaurusEncodedImageItem, @@ -40,9 +37,13 @@ from guiqwt.styles import XYImageParam from guiqwt.config import _ from guiqwt.histogram import lut_range_threshold -import numpy from taurus.core.units import Quantity +__all__ = ["TaurusPlotItemBuilder", "make"] + +__docformat__ = 'restructuredtext' + + class TaurusPlotItemBuilder(guiqwt.builder.PlotItemBuilder): '''extension of :class:`guiqwt.builder.PlotItemBuilder` to provide tauruscurve and taurusimage items''' diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/curve.py b/lib/taurus/qt/qtgui/extra_guiqwt/curve.py index e30c80c69..18f3d6bf7 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/curve.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/curve.py @@ -27,7 +27,6 @@ from __future__ import print_function from builtins import next -__all__ = ["TaurusCurveItem"] from taurus.external.qt import Qt from taurus.qt.qtgui.base import TaurusBaseComponent @@ -39,6 +38,8 @@ from taurus.core.util.containers import ArrayBuffer import numpy +__all__ = ["TaurusCurveItem"] + class TaurusCurveItem(CurveItem, TaurusBaseComponent): '''A CurveItem that autoupdates its values & params when x or y components change''' diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py index 927d6c830..e2f1ae7b6 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py @@ -26,12 +26,15 @@ """ curvesmodel Model and view for new CurveItem configuration """ + from __future__ import print_function from builtins import next from builtins import str from builtins import range from builtins import object + __all__ = ['TaurusCurveItemTableModel', 'CurveItemConf', 'CurveItemConfDlg'] + #raise UnimplementedError('Under Construction!') import copy diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py index c4ce11f36..4cc7cde6a 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py @@ -28,7 +28,6 @@ """ from builtins import next from builtins import str -__all__ = ["TaurusCurveDialog", "TaurusTrendDialog", "TaurusImageDialog"] import copy @@ -45,6 +44,9 @@ from taurus.qt.qtgui.extra_guiqwt.curve import TaurusCurveItem, TaurusTrendParam, TaurusTrendItem +__all__ = ["TaurusCurveDialog", "TaurusTrendDialog", "TaurusImageDialog"] + + class TaurusCurveDialog(CurveDialog, TaurusBaseWidget): '''A taurus dialog for showing 1D data. It behaves as a regular :class:`guiqwt.plot.CurveDialog` but it also offers diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/scales.py b/lib/taurus/qt/qtgui/extra_guiqwt/scales.py index 9b9b6e5c4..d73af7213 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/scales.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/scales.py @@ -27,9 +27,6 @@ scales.py: Custom scales used by taurus.qt.qtgui.plot module """ from __future__ import print_function -__all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", - "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", - "FixedLabelsScaleDraw"] import numpy from datetime import datetime, timedelta @@ -44,6 +41,10 @@ else: import qwt +__all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", + "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", + "FixedLabelsScaleDraw"] + def _getDefaultAxisLabelsAlignment(axis, rotation): '''return a "smart" alignment for the axis labels depending on the axis diff --git a/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py b/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py index 0cc8e04fa..79a240df6 100644 --- a/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py +++ b/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py @@ -28,7 +28,6 @@ """ from builtins import str -__all__ = ["TaurusNexusBrowser"] import numpy import posixpath @@ -39,6 +38,9 @@ from taurus.qt.qtgui.container import TaurusWidget +__all__ = ["TaurusNexusBrowser"] + + class NeXusInfoWidget(Qt.QTabWidget): def __init__(self, parent=None, info=None): diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py index 6ce3738c8..f2a337a16 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py @@ -24,13 +24,11 @@ ############################################################################# """This module contains the graphics factory for the jdraw file format""" + from __future__ import absolute_import from builtins import str from builtins import range -__all__ = ["TaurusJDrawGraphicsFactory"] - -__docformat__ = 'restructuredtext' import os import traceback @@ -43,6 +41,11 @@ TaurusGraphicsScene, TaurusGraphicsItem) +__all__ = ["TaurusJDrawGraphicsFactory"] + +__docformat__ = 'restructuredtext' + + LINESTYLE_JDW2QT = {0: Qt.Qt.SolidLine, 1: Qt.Qt.DotLine, 2: Qt.Qt.DashLine, diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py index 3751441ad..5175be052 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py @@ -27,8 +27,6 @@ from __future__ import absolute_import -__all__ = ["new_parser", "parse"] - import os import re @@ -37,6 +35,9 @@ from taurus.core.util.log import Logger + +__all__ = ["new_parser", "parse"] + tokens = ('NUMBER', 'SYMBOL', 'LBRACKET', 'RBRACKET', 'TWOP', 'COMMA', 'JDFILE', 'GLOBAL', 'JDLINE', 'JDRECTANGLE', 'JDROUNDRECTANGLE', 'JDGROUP', 'JDELLIPSE', 'JDBAR', 'JDSWINGOBJECT', 'JDLABEL', 'JDPOLYLINE', diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py index c62a08bbd..52a741e85 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py @@ -27,9 +27,6 @@ from __future__ import absolute_import from builtins import str -__all__ = ["TaurusJDrawSynopticsView"] - -__docformat__ = 'restructuredtext' import os import traceback @@ -47,6 +44,11 @@ from . import jdraw_parser +__all__ = ["TaurusJDrawSynopticsView"] + +__docformat__ = 'restructuredtext' + + class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget): ''' Taurus Class that visualizes Synoptics drawn with the JDraw tool (by ESRF). It is equivalent to ATK Synoptic Player (Java). diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py index 8325f3ed0..d42ed28bb 100755 --- a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py +++ b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py @@ -34,6 +34,29 @@ from builtins import str from builtins import range from builtins import object + +import re +import os +import subprocess +import traceback +import collections + +from future.utils import string_types +from queue import Queue + +from taurus import Manager +from taurus.core import AttrQuality, DataType +from taurus.core.util.containers import CaselessDefaultDict +from taurus.core.util.log import Logger, deprecation_decorator +from taurus.core.taurusdevice import TaurusDevice +from taurus.core.taurusattribute import TaurusAttribute +from taurus.core.util.enumeration import Enumeration +from taurus.external.qt import Qt +from taurus.qt.qtgui.base import TaurusBaseComponent +from taurus.qt.qtgui.util import (QT_ATTRIBUTE_QUALITY_PALETTE, QT_DEVICE_STATE_PALETTE, + ExternalAppAction, TaurusWidgetFactory) + + __all__ = ['SynopticSelectionStyle', 'parseTangoUri', 'QEmitter', # TODO: QEmitter should probably be removed (kept priv) @@ -61,27 +84,6 @@ __docformat__ = 'restructuredtext' -import re -import os -import subprocess -import traceback -import collections - -from future.utils import string_types -from queue import Queue - -from taurus import Manager -from taurus.core import AttrQuality, DataType -from taurus.core.util.containers import CaselessDefaultDict -from taurus.core.util.log import Logger, deprecation_decorator -from taurus.core.taurusdevice import TaurusDevice -from taurus.core.taurusattribute import TaurusAttribute -from taurus.core.util.enumeration import Enumeration -from taurus.external.qt import Qt -from taurus.qt.qtgui.base import TaurusBaseComponent -from taurus.qt.qtgui.util import (QT_ATTRIBUTE_QUALITY_PALETTE, QT_DEVICE_STATE_PALETTE, - ExternalAppAction, TaurusWidgetFactory) - SynopticSelectionStyle = Enumeration("SynopticSelectionStyle", [ # A blue ellipse is displayed around the selected objects diff --git a/lib/taurus/qt/qtgui/help/assistant.py b/lib/taurus/qt/qtgui/help/assistant.py index e682fba86..64545ad06 100644 --- a/lib/taurus/qt/qtgui/help/assistant.py +++ b/lib/taurus/qt/qtgui/help/assistant.py @@ -40,12 +40,13 @@ """ from builtins import object -__all__ = ["Assistant", "Widgets"] - from taurus.external.qt import Qt +__all__ = ["Assistant", "Widgets"] + + class Widgets(object): contents = "contents" index = "index" diff --git a/lib/taurus/qt/qtgui/icon/__init__.py b/lib/taurus/qt/qtgui/icon/__init__.py index 1c43a4a5f..cbffb2896 100644 --- a/lib/taurus/qt/qtgui/icon/__init__.py +++ b/lib/taurus/qt/qtgui/icon/__init__.py @@ -27,6 +27,7 @@ Utilities for using the bundled icons in Taurus and for registering external sources of icons. """ + from __future__ import absolute_import from .icon import * diff --git a/lib/taurus/qt/qtgui/icon/catalog.py b/lib/taurus/qt/qtgui/icon/catalog.py index b57e2c064..1fe080ed3 100644 --- a/lib/taurus/qt/qtgui/icon/catalog.py +++ b/lib/taurus/qt/qtgui/icon/catalog.py @@ -24,6 +24,7 @@ """ This module provides an icon catalog widget """ + from __future__ import print_function import os diff --git a/lib/taurus/qt/qtgui/input/choicedlg.py b/lib/taurus/qt/qtgui/input/choicedlg.py index fc391d577..4effd0493 100644 --- a/lib/taurus/qt/qtgui/input/choicedlg.py +++ b/lib/taurus/qt/qtgui/input/choicedlg.py @@ -27,12 +27,14 @@ from __future__ import print_function from builtins import str + +from taurus.external.qt import Qt + + __all__ = ["GraphicalChoiceDlg", "GraphicalChoiceWidget"] __docformat__ = 'restructuredtext' -from taurus.external.qt import Qt - class GraphicalChoiceDlg(Qt.QDialog): ''' diff --git a/lib/taurus/qt/qtgui/input/qwheel.py b/lib/taurus/qt/qtgui/input/qwheel.py index 34caed12e..48dd9da0e 100755 --- a/lib/taurus/qt/qtgui/input/qwheel.py +++ b/lib/taurus/qt/qtgui/input/qwheel.py @@ -27,9 +27,6 @@ from builtins import map from builtins import range -__all__ = ["QWheelEdit"] - -__docformat__ = 'restructuredtext' import os import math @@ -38,6 +35,12 @@ from taurus.external.qt import Qt from taurus.core.units import Q_ + +__all__ = ["QWheelEdit"] + +__docformat__ = 'restructuredtext' + + class _ArrowButton(Qt.QPushButton): """Private class to be used by QWheelEdit for an arrow button""" diff --git a/lib/taurus/qt/qtgui/input/taurusspinbox.py b/lib/taurus/qt/qtgui/input/taurusspinbox.py index 9700ef46e..cddfc5562 100644 --- a/lib/taurus/qt/qtgui/input/taurusspinbox.py +++ b/lib/taurus/qt/qtgui/input/taurusspinbox.py @@ -26,6 +26,7 @@ """ This module provides a set of basic taurus widgets based on QAbstractSpinBox """ + from __future__ import absolute_import from taurus.external.qt import Qt @@ -35,6 +36,7 @@ from taurus.core.units import Quantity from taurus.qt.qtgui.util import PintValidator + __all__ = ["TaurusValueSpinBox", "TaurusValueSpinBoxEx"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/input/tauruswheel.py b/lib/taurus/qt/qtgui/input/tauruswheel.py index 1d669767b..69901fd7e 100644 --- a/lib/taurus/qt/qtgui/input/tauruswheel.py +++ b/lib/taurus/qt/qtgui/input/tauruswheel.py @@ -24,13 +24,9 @@ ############################################################################# """This module provides a set of basic taurus widgets based on QWheelEdit""" -from __future__ import absolute_import - -__all__ = ["TaurusWheelEdit"] -__docformat__ = 'restructuredtext' +from __future__ import absolute_import -import taurus from taurus.external.qt import Qt from taurus.core.taurusbasetypes import TaurusEventType @@ -38,6 +34,11 @@ from .qwheel import QWheelEdit +__all__ = ["TaurusWheelEdit"] + +__docformat__ = 'restructuredtext' + + class TaurusWheelEdit(QWheelEdit, TaurusBaseWritableWidget): def __init__(self, qt_parent=None, designMode=False): diff --git a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py index 19b72a09d..3740a547d 100755 --- a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py +++ b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py @@ -25,9 +25,8 @@ """DataExportDlg.py: A Qt dialog for showing and exporting x-y Ascii data from one or more curves""" -from __future__ import print_function -__all__ = ["QDataExportDialog"] +from __future__ import print_function import os.path from datetime import datetime @@ -36,6 +35,9 @@ from taurus.qt.qtgui.util.ui import UILoadable +__all__ = ["QDataExportDialog"] + + @UILoadable class QDataExportDialog(Qt.QDialog): """ diff --git a/lib/taurus/qt/qtgui/panel/qdoublelist.py b/lib/taurus/qt/qtgui/panel/qdoublelist.py index 87baa056f..5d7b69a54 100644 --- a/lib/taurus/qt/qtgui/panel/qdoublelist.py +++ b/lib/taurus/qt/qtgui/panel/qdoublelist.py @@ -28,18 +28,21 @@ qdoublelist.py: Provides a generic dialog containing two list which can move items from one to the other """ + from __future__ import print_function from builtins import str from builtins import range -__all__ = ["QDoubleListDlg"] - -__docformat__ = 'restructuredtext' from taurus.external.qt import Qt from taurus.qt.qtgui.util.ui import UILoadable +__all__ = ["QDoubleListDlg"] + +__docformat__ = 'restructuredtext' + + @UILoadable(with_ui='ui') class QDoubleListDlg(Qt.QDialog): '''Generic dialog providing two lists. Items can be moved from one to the other diff --git a/lib/taurus/qt/qtgui/panel/report/albareport.py b/lib/taurus/qt/qtgui/panel/report/albareport.py index 08a02f989..df4c0e335 100644 --- a/lib/taurus/qt/qtgui/panel/report/albareport.py +++ b/lib/taurus/qt/qtgui/panel/report/albareport.py @@ -26,15 +26,16 @@ """This module provides a panel to display taurus messages""" from __future__ import absolute_import +from taurus.external.qt import Qt +from .basicreport import SendMailDialog, SMTPReportHandler + + __package__ = 'taurus.qt.qtgui.panel.report' __all__ = ["TicketReportHandler"] __docformat__ = 'restructuredtext' -from taurus.external.qt import Qt -from .basicreport import SendMailDialog, SMTPReportHandler - class SendTicketDialog(SendMailDialog): diff --git a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py index bee97269f..4e53771c9 100644 --- a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py +++ b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py @@ -29,9 +29,6 @@ from future import standard_library standard_library.install_aliases() -__all__ = ["QConfigEditor"] - -__docformat__ = 'restructuredtext' from taurus.external.qt import Qt import pickle @@ -42,6 +39,11 @@ import shutil +__all__ = ["QConfigEditor"] + +__docformat__ = 'restructuredtext' + + class QConfigEditorModel(Qt.QStandardItemModel): '''A custom Model for QConfigEditor''' diff --git a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py index 023ed3971..d923f73c0 100644 --- a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py @@ -28,9 +28,6 @@ """ from builtins import str -__all__ = ["TaurusDevicePanel", "TaurusDevPanel"] - -__docformat__ = 'restructuredtext' import re import traceback @@ -46,12 +43,17 @@ from taurus.core.taurusdevice import TaurusDevice from taurus.qt.qtgui.container import TaurusWidget, TaurusMainWindow from taurus.qt.qtgui.display import TaurusLabel -from taurus.qt.qtgui.display import TaurusLed from taurus.qt.qtgui.panel.taurusform import TaurusForm from taurus.qt.qtgui.panel.taurusform import TaurusCommandsForm from taurus.qt.qtgui.util.ui import UILoadable from taurus.qt.qtgui.icon import getCachedPixmap + +__all__ = ["TaurusDevicePanel", "TaurusDevPanel"] + +__docformat__ = 'restructuredtext' + + ############################################################################### # TaurusDevicePanel (from Vacca) diff --git a/lib/taurus/qt/qtgui/panel/taurusform.py b/lib/taurus/qt/qtgui/panel/taurusform.py index 60de40378..ff63b514e 100644 --- a/lib/taurus/qt/qtgui/panel/taurusform.py +++ b/lib/taurus/qt/qtgui/panel/taurusform.py @@ -24,13 +24,10 @@ ############################################################################# """This module contains taurus Qt form widgets""" + from __future__ import print_function from __future__ import absolute_import -__all__ = ["TaurusAttrForm", "TaurusCommandsForm", "TaurusForm"] - -__docformat__ = 'restructuredtext' - from datetime import datetime from future.utils import string_types @@ -46,6 +43,10 @@ from taurus.qt.qtgui.button import QButtonBox, TaurusCommandButton from .taurusmodelchooser import TaurusModelChooser +__all__ = ["TaurusAttrForm", "TaurusCommandsForm", "TaurusForm"] + +__docformat__ = 'restructuredtext' + def _normalize_model_name_case(modelname): """ diff --git a/lib/taurus/qt/qtgui/panel/taurusinputpanel.py b/lib/taurus/qt/qtgui/panel/taurusinputpanel.py index 98300d4e1..e1fbedb12 100644 --- a/lib/taurus/qt/qtgui/panel/taurusinputpanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusinputpanel.py @@ -28,9 +28,6 @@ from builtins import str from builtins import object -__all__ = ["TaurusInputPanel"] - -__docformat__ = 'restructuredtext' import collections import numpy @@ -40,6 +37,10 @@ from taurus.external.qt import Qt from taurus.qt.qtgui.util.ui import UILoadable +__all__ = ["TaurusInputPanel"] + +__docformat__ = 'restructuredtext' + @UILoadable(with_ui='_ui') class TaurusInputPanel(Qt.QWidget): diff --git a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py index 4df5b9b0f..14db4c838 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py @@ -28,10 +28,6 @@ from future import standard_library standard_library.install_aliases() from builtins import object -__all__ = ["TaurusMessagePanel", "TaurusMessageErrorHandler", - "TangoMessageErrorHandler", "MacroServerMessageErrorHandler"] - -__docformat__ = 'restructuredtext' import sys import traceback @@ -50,6 +46,12 @@ from taurus.qt.qtgui.util.ui import UILoadable +__all__ = ["TaurusMessagePanel", "TaurusMessageErrorHandler", + "TangoMessageErrorHandler", "MacroServerMessageErrorHandler"] + +__docformat__ = 'restructuredtext' + + class TaurusMessageErrorHandler(object): """This class is designed to handle a generic error into a :class:`TaurusMessagePanel`""" diff --git a/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py b/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py index 7195843d1..e505715e5 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py +++ b/lib/taurus/qt/qtgui/panel/taurusmodelchooser.py @@ -29,8 +29,6 @@ from __future__ import print_function from __future__ import absolute_import -__all__ = ["TaurusModelSelectorTree", "TaurusModelChooser"] - import sys from taurus.external.qt import Qt import taurus.core @@ -40,6 +38,9 @@ from .taurusmodellist import TaurusModelList +__all__ = ["TaurusModelSelectorTree", "TaurusModelChooser"] + + class TaurusModelSelectorTree(TaurusWidget): addModels = Qt.pyqtSignal('QStringList') diff --git a/lib/taurus/qt/qtgui/panel/taurusmodellist.py b/lib/taurus/qt/qtgui/panel/taurusmodellist.py index 62b2fd36e..49677870b 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmodellist.py +++ b/lib/taurus/qt/qtgui/panel/taurusmodellist.py @@ -27,7 +27,6 @@ itemsmodel Model and view for new CurveItem configuration """ from builtins import object -__all__ = ['TaurusModelModel', 'TaurusModelItem', 'TaurusModelList'] #raise UnimplementedError('Under Construction!') import copy @@ -39,9 +38,13 @@ from taurus.core.taurushelper import getSchemeFromName from taurus.core.taurusbasetypes import TaurusElementType from taurus.core.taurusexception import TaurusException -from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE, TAURUS_MODEL_MIME_TYPE +from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE +from taurus.qt.qtcore.mimetypes import TAURUS_ATTR_MIME_TYPE +from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_MIME_TYPE from taurus.qt.qtgui.icon import getElementTypeIcon -from taurus.qt.qtcore.util.signal import baseSignal + + +__all__ = ['TaurusModelModel', 'TaurusModelItem', 'TaurusModelList'] # set some named constants SRC_ROLE = Qt.Qt.UserRole + 1 diff --git a/lib/taurus/qt/qtgui/plot/curveprops.py b/lib/taurus/qt/qtgui/plot/curveprops.py index 19bab37f6..845686e7b 100755 --- a/lib/taurus/qt/qtgui/plot/curveprops.py +++ b/lib/taurus/qt/qtgui/plot/curveprops.py @@ -26,15 +26,14 @@ """ curveprops: Model and view for curve properties """ + +#raise NotImplementedError('Under Construction!') + from __future__ import absolute_import from builtins import str from builtins import object -__all__ = ['CurveConf', 'CurvesTableModel', - 'ExtendedSelectionModel', 'CurvePropertiesView'] -#raise NotImplementedError('Under Construction!') import copy -import re from taurus.external.qt import Qt, Qwt5 import taurus @@ -49,6 +48,9 @@ NamedColors, CurveAppearanceProperties +__all__ = ['CurveConf', 'CurvesTableModel', + 'ExtendedSelectionModel', 'CurvePropertiesView'] + # set some named constants # columns: NUMCOLS = 4 diff --git a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py index edd4d8352..e11e9b149 100644 --- a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py +++ b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py @@ -28,6 +28,7 @@ A Qt dialog for choosing plot appearance (symbols and lines) for a QwtPlot-derived widget (like Taurusplot) """ + from __future__ import print_function from builtins import object diff --git a/lib/taurus/qt/qtgui/plot/monitor.py b/lib/taurus/qt/qtgui/plot/monitor.py index 8d9ba2c31..2843bcce4 100644 --- a/lib/taurus/qt/qtgui/plot/monitor.py +++ b/lib/taurus/qt/qtgui/plot/monitor.py @@ -26,6 +26,7 @@ """ monitor.py: Specialized mini-trend widget to monitor some scalar value """ + from __future__ import print_function from taurus.external.qt import Qt diff --git a/lib/taurus/qt/qtgui/plot/qwtdialog.py b/lib/taurus/qt/qtgui/plot/qwtdialog.py index 42e064c87..36f4ce005 100644 --- a/lib/taurus/qt/qtgui/plot/qwtdialog.py +++ b/lib/taurus/qt/qtgui/plot/qwtdialog.py @@ -28,7 +28,6 @@ """ from __future__ import print_function from __future__ import absolute_import -__all__ = ["TaurusPlotConfigDialog"] import time @@ -36,6 +35,9 @@ from taurus.qt.qtgui.util.ui import UILoadable +__all__ = ["TaurusPlotConfigDialog"] + + # class TaurusPlotConfigCapable: # """This class is aimed to act as an interface for class TaurusPlot. Every class that uses # TaurusPlotConfigDialog class (as TaurusPlot does) should inherit TaurusPlotConfigCapable class diff --git a/lib/taurus/qt/qtgui/plot/scales.py b/lib/taurus/qt/qtgui/plot/scales.py index 20d7b9fec..1297ef81a 100644 --- a/lib/taurus/qt/qtgui/plot/scales.py +++ b/lib/taurus/qt/qtgui/plot/scales.py @@ -26,11 +26,8 @@ """ scales.py: Custom scales used by taurus.qt.qtgui.plot module """ -from __future__ import print_function -__all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", - "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", - "FixedLabelsScaleDraw"] +from __future__ import print_function import numpy from datetime import datetime, timedelta @@ -38,6 +35,11 @@ from taurus.external.qt import Qt, Qwt5 +__all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", + "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", + "FixedLabelsScaleDraw"] + + def _getDefaultAxisLabelsAlignment(axis, rotation): '''return a "smart" alignment for the axis labels depending on the axis and the label rotation diff --git a/lib/taurus/qt/qtgui/plot/taurusplot.py b/lib/taurus/qt/qtgui/plot/taurusplot.py index ad11ca7da..351f775e2 100644 --- a/lib/taurus/qt/qtgui/plot/taurusplot.py +++ b/lib/taurus/qt/qtgui/plot/taurusplot.py @@ -26,6 +26,7 @@ """ taurusplot.py: Generic graphical plotting widget for Taurus """ + from __future__ import print_function from __future__ import absolute_import from future import standard_library @@ -34,8 +35,6 @@ from builtins import str from builtins import range from builtins import object -__all__ = ["TaurusCurve", "TaurusCurveMarker", - "TaurusXValues", "TaurusPlot", "isodatestr2float"] import os import copy @@ -60,6 +59,10 @@ from .curvesAppearanceChooserDlg import CurveAppearanceProperties +__all__ = ["TaurusCurve", "TaurusCurveMarker", + "TaurusXValues", "TaurusPlot", "isodatestr2float"] + + def isodatestr2float(s, sep='_'): """ converts a date string in iso format to a timestamp (seconds since epoch) diff --git a/lib/taurus/qt/qtgui/plot/taurusplotconf.py b/lib/taurus/qt/qtgui/plot/taurusplotconf.py index 5ade1b8f9..1a7c5f022 100644 --- a/lib/taurus/qt/qtgui/plot/taurusplotconf.py +++ b/lib/taurus/qt/qtgui/plot/taurusplotconf.py @@ -29,8 +29,6 @@ from __future__ import print_function from __future__ import absolute_import -__all__ = ['TaurusPlotConfDlg'] - raise NotImplementedError('Under Construction!') import taurus.core @@ -44,6 +42,9 @@ extra_nexus = None +__all__ = ['TaurusPlotConfDlg'] + + @UILoadable(with_ui='ui') class TaurusPlotConfDlg(Qt.QWidget): ''' A configuration dialog for TaurusPlot. diff --git a/lib/taurus/qt/qtgui/plot/taurustrend.py b/lib/taurus/qt/qtgui/plot/taurustrend.py index e688e6404..3ef34e130 100644 --- a/lib/taurus/qt/qtgui/plot/taurustrend.py +++ b/lib/taurus/qt/qtgui/plot/taurustrend.py @@ -26,9 +26,9 @@ """ taurustrend.py: Generic trend widget for Taurus """ + from __future__ import print_function from builtins import str -__all__ = ["ScanTrendsSet", "TaurusTrend", "TaurusTrendsSet"] from datetime import datetime import time @@ -45,6 +45,9 @@ from taurus.qt.qtgui.plot import TaurusPlot +__all__ = ["ScanTrendsSet", "TaurusTrend", "TaurusTrendsSet"] + + def getArchivedTrendValues(*args, **kwargs): try: import PyTangoArchiving # TODO: tango-centric diff --git a/lib/taurus/qt/qtgui/resource/__init__.py b/lib/taurus/qt/qtgui/resource/__init__.py index 8cc9e87f0..2aec1eba9 100644 --- a/lib/taurus/qt/qtgui/resource/__init__.py +++ b/lib/taurus/qt/qtgui/resource/__init__.py @@ -27,6 +27,7 @@ Old module supporting resources (now it just contains a reimplementation based on taurus.qt.qtgui.icon for bck-compat) """ + from __future__ import absolute_import from taurus.core.util.log import deprecated as __deprecated diff --git a/lib/taurus/qt/qtgui/table/qdictionary.py b/lib/taurus/qt/qtgui/table/qdictionary.py index c2cf1ee19..9063e1425 100644 --- a/lib/taurus/qt/qtgui/table/qdictionary.py +++ b/lib/taurus/qt/qtgui/table/qdictionary.py @@ -26,10 +26,6 @@ """This module provides basic python dictionary/list editor widgets""" from __future__ import print_function -__all__ = ["QDictionaryEditor", "QListEditor"] - -__docformat__ = 'restructuredtext' - import sys from future.utils import string_types @@ -38,6 +34,11 @@ from taurus.qt.qtgui.container import TaurusBaseContainer, TaurusWidget from taurus.qt.qtcore.util.properties import join, djoin + +__all__ = ["QDictionaryEditor", "QListEditor"] + +__docformat__ = 'restructuredtext' + ############################################################################### # Methods borrowed from fandango modules diff --git a/lib/taurus/qt/qtgui/table/qlogtable.py b/lib/taurus/qt/qtgui/table/qlogtable.py index f5c63e04e..6bbd6c955 100644 --- a/lib/taurus/qt/qtgui/table/qlogtable.py +++ b/lib/taurus/qt/qtgui/table/qlogtable.py @@ -25,14 +25,11 @@ """This module provides Qt table widgets which display logging messages from the python :mod:`logging` module""" + from __future__ import absolute_import from operator import attrgetter from builtins import range -__all__ = ["QLoggingTableModel", "QLoggingTable", "QLoggingWidget", - "QRemoteLoggingTableModel"] - -__docformat__ = 'restructuredtext' import logging import logging.handlers @@ -52,6 +49,12 @@ from .qtable import QBaseTableWidget + +__all__ = ["QLoggingTableModel", "QLoggingTable", "QLoggingWidget", + "QRemoteLoggingTableModel"] + +__docformat__ = 'restructuredtext' + LEVEL, TIME, MSG, NAME, ORIGIN = list(range(5)) HORIZ_HEADER = 'Level', 'Time', 'Message', 'By', 'Origin' diff --git a/lib/taurus/qt/qtgui/table/taurusdbtable.py b/lib/taurus/qt/qtgui/table/taurusdbtable.py index 58aab8469..75b27c308 100644 --- a/lib/taurus/qt/qtgui/table/taurusdbtable.py +++ b/lib/taurus/qt/qtgui/table/taurusdbtable.py @@ -25,13 +25,10 @@ """This module provides a base widget that can be used to display a taurus model in a table widget""" -from __future__ import absolute_import # todo: tango-centric!!! -__all__ = ["TaurusDbTableWidget"] - -__docformat__ = 'restructuredtext' +from __future__ import absolute_import from taurus.external.qt import Qt from taurus.core.taurusbasetypes import TaurusElementType @@ -41,6 +38,11 @@ from .taurustable import TaurusBaseTableWidget +__all__ = ["TaurusDbTableWidget"] + +__docformat__ = 'restructuredtext' + + class TaurusDbTableWidget(TaurusBaseTableWidget): """A class:`taurus.qt.qtgui.tree.TaurusBaseTableWidget` that connects to a :class:`taurus.core.taurusauthority.TaurusAuthority` model. It can show diff --git a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py index 836210f3f..1c8280d5d 100755 --- a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py +++ b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py @@ -26,18 +26,21 @@ """ taurusdevicepropertytable.py: """ -from __future__ import print_function # todo: tango-centric +from __future__ import print_function + from builtins import str -__all__ = ["TaurusPropTable"] from taurus.external.qt import Qt, QtCore, QtGui from taurus.qt.qtgui.base import TaurusBaseWidget from taurus.core.taurusdevice import TaurusDevice +__all__ = ["TaurusPropTable"] + + class TaurusPropTable(QtGui.QTableWidget, TaurusBaseWidget): ''' This widget will show a list of properties of device and the list of values. diff --git a/lib/taurus/qt/qtgui/table/taurusgrid.py b/lib/taurus/qt/qtgui/table/taurusgrid.py index 8e59bb534..c67a6daf7 100644 --- a/lib/taurus/qt/qtgui/table/taurusgrid.py +++ b/lib/taurus/qt/qtgui/table/taurusgrid.py @@ -29,14 +29,17 @@ integrated with taurus and regular expressions by srubio alba, 2009 """ -from __future__ import print_function # This module needs a total cleanup. Both re. code conventions and algorithms. # --cpascual 20140827 +from __future__ import print_function + from future import standard_library standard_library.install_aliases() from builtins import str + + __all__ = ["TaurusGrid"] __docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/table/taurustable.py b/lib/taurus/qt/qtgui/table/taurustable.py index bf08ae05e..1b2cd5985 100644 --- a/lib/taurus/qt/qtgui/table/taurustable.py +++ b/lib/taurus/qt/qtgui/table/taurustable.py @@ -25,15 +25,17 @@ """This module provides a base widget that can be used to display a taurus model in a table widget""" + from __future__ import absolute_import +from taurus.qt.qtgui.model import TaurusBaseModelWidget +from .qtable import QBaseTableWidget + + __all__ = ["TaurusBaseTableWidget"] __docformat__ = 'restructuredtext' -from taurus.qt.qtgui.model import TaurusBaseModelWidget -from .qtable import QBaseTableWidget - class TaurusBaseTableWidget(QBaseTableWidget, TaurusBaseModelWidget): """A class:`taurus.qt.qtgui.tree.QBaseTableWidget` that connects to a diff --git a/lib/taurus/qt/qtgui/table/taurusvaluestable.py b/lib/taurus/qt/qtgui/table/taurusvaluestable.py index 5e2bcf972..81a64421e 100755 --- a/lib/taurus/qt/qtgui/table/taurusvaluestable.py +++ b/lib/taurus/qt/qtgui/table/taurusvaluestable.py @@ -24,9 +24,6 @@ ############################################################################# from builtins import str -__all__ = ["TaurusValuesTable"] - -__docformat__ = 'restructuredtext' from taurus.external.qt import Qt from taurus.core.units import Quantity @@ -42,6 +39,11 @@ from taurus.core.util.enumeration import Enumeration +__all__ = ["TaurusValuesTable"] + +__docformat__ = 'restructuredtext' + + def _value2Quantity(value, units): ''' Creates a Quantity from value and forces units if the vaule is unitless diff --git a/lib/taurus/qt/qtgui/taurusgui/__init__.py b/lib/taurus/qt/qtgui/taurusgui/__init__.py index 27c8c9fa6..4e4dddf02 100644 --- a/lib/taurus/qt/qtgui/taurusgui/__init__.py +++ b/lib/taurus/qt/qtgui/taurusgui/__init__.py @@ -51,8 +51,6 @@ """ from __future__ import absolute_import -__docformat__ = 'restructuredtext' - from . import utils from .paneldescriptionwizard import * from .taurusgui import * @@ -60,4 +58,7 @@ try: from .macrolistener import * except ImportError: - pass # allow for sardana not being installed + pass + + +__docformat__ = 'restructuredtext' diff --git a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py index 6aad035e1..f4c6080a4 100644 --- a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py +++ b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py @@ -35,7 +35,6 @@ from __future__ import print_function from builtins import str -__all__ = ["AppSettingsWizard", "ExternalAppEditor"] import os import re @@ -56,6 +55,9 @@ from taurus.qt.qtgui.util import ExternalAppAction +__all__ = ["AppSettingsWizard", "ExternalAppEditor"] + + class BooleanWidget(Qt.QWidget): """ This class represents the simple boolean widget with two RadioButtons diff --git a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py index fa36c186f..34184f9a4 100644 --- a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py +++ b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py @@ -33,13 +33,12 @@ .. note:: This module will be moved to sardana.taurus at some point. """ -from __future__ import print_function # TODO: move to sardana.taurus +from __future__ import print_function + from builtins import object -__all__ = ['MacroBroker', 'DynamicPlotManager'] -__docformat__ = 'restructuredtext' import datetime @@ -48,6 +47,10 @@ from taurus.qt.qtgui.base import TaurusBaseComponent +__all__ = ['MacroBroker', 'DynamicPlotManager'] +__docformat__ = 'restructuredtext' + + class ChannelFilter(object): def __init__(self, chlist): diff --git a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py index 5a1ea765d..e3d8432f1 100644 --- a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py +++ b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py @@ -23,12 +23,12 @@ ## ########################################################################### -from __future__ import print_function -__all__ = ["PanelDescriptionWizard"] """ paneldescriptionwizard.py: """ +from __future__ import print_function + from taurus.external.qt import Qt import sys import weakref @@ -45,6 +45,9 @@ import copy +__all__ = ["PanelDescriptionWizard"] + + class ExpertWidgetChooserDlg(Qt.QDialog): CHOOSE_TYPE_TXT = '(choose type)' diff --git a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py index 3f233e27e..66c0d53ac 100644 --- a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py +++ b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py @@ -26,11 +26,6 @@ """This package provides the TaurusGui class""" from builtins import str -__all__ = ["DockWidgetPanel", "TaurusGui"] - -__docformat__ = 'restructuredtext' - - import os import sys import copy @@ -57,6 +52,11 @@ from taurus.qt.qtgui.taurusgui.utils import ExternalAppAction +__all__ = ["DockWidgetPanel", "TaurusGui"] + +__docformat__ = 'restructuredtext' + + @UILoadable(with_ui='ui') class AssociationDialog(Qt.QDialog): '''A dialog for viewing and editing the associations between instruments diff --git a/lib/taurus/qt/qtgui/taurusgui/utils.py b/lib/taurus/qt/qtgui/taurusgui/utils.py index e25fcb391..6812fd315 100644 --- a/lib/taurus/qt/qtgui/taurusgui/utils.py +++ b/lib/taurus/qt/qtgui/taurusgui/utils.py @@ -27,15 +27,16 @@ by specific TaurusGui-based GUIs""" from builtins import object -__docformat__ = 'restructuredtext' from lxml import etree from future.utils import string_types - from taurus.qt.qtgui.util import ExternalAppAction from taurus.qt.qtgui.util import TaurusWidgetFactory from taurus.core.util.log import Logger + +__docformat__ = 'restructuredtext' + # this is here only for backwards compatibility. It should not be used at all diff --git a/lib/taurus/qt/qtgui/tree/taurusdbtree.py b/lib/taurus/qt/qtgui/tree/taurusdbtree.py index fc2d2b1e3..945b52f52 100644 --- a/lib/taurus/qt/qtgui/tree/taurusdbtree.py +++ b/lib/taurus/qt/qtgui/tree/taurusdbtree.py @@ -24,13 +24,10 @@ ############################################################################# """This module provides widgets that display the database in a tree format""" -from __future__ import absolute_import # todo: tango-centric!! -__all__ = ["TaurusDbTreeWidget"] - -__docformat__ = 'restructuredtext' +from __future__ import absolute_import from taurus.external.qt import Qt from taurus.core.taurusbasetypes import TaurusElementType @@ -41,6 +38,11 @@ from .taurustree import TaurusBaseTreeWidget +__all__ = ["TaurusDbTreeWidget"] + +__docformat__ = 'restructuredtext' + + class TaurusDbTreeWidget(TaurusBaseTreeWidget): """A class:`taurus.qt.qtgui.tree.TaurusBaseTreeWidget` that connects to a :class:`taurus.core.taurusauthority.TaurusAuthority` model. It can show the list of database diff --git a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py index 27dfeec33..ea702417e 100644 --- a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py +++ b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py @@ -26,17 +26,16 @@ """ taurusdevicetree.py: """ -from __future__ import print_function # @todo: This module is not being used anywhere in Taurus and depends on # non-standard and non-provided modules. It is also quite specific and # tango-centric, so it should be removed from Taurus or merged with # Taurusdbtree -# ,"SearchEdit"] #"TaurusTreeNode"] +from __future__ import print_function + from builtins import next from builtins import object -__all__ = ["TaurusDevTree", "TaurusSearchTree", "TaurusDevTreeOptions"] import time import os @@ -73,6 +72,8 @@ from taurus.qt.qtgui.base import TaurusBaseComponent, TaurusBaseWidget from taurus.qt.qtgui.container import TaurusWidget + +__all__ = ["TaurusDevTree", "TaurusSearchTree", "TaurusDevTreeOptions"] TREE_ITEM_MIME_TYPE = 'application/x-qabstractitemmodeldatalist' ############################################################################### @@ -206,14 +207,14 @@ def getNodeIcon(self, node=None): if k.lower() in name.lower(): url = v # if name.count('/')==2: - # if any(a.startswith(name+'/') for a in getArchivedAttributes()): - #url = wdir('image/icons/clock.png') - # else: - #url = wdir('image/equips/icon-%s.gif'%name.split('/')[2].split('-')[0].lower()) + # if any(a.startswith(name+'/') for a in getArchivedAttributes()): + #url = wdir('image/icons/clock.png') + # else: + #url = wdir('image/equips/icon-%s.gif'%name.split('/')[2].split('-')[0].lower()) # elif name.count('/')==3: - #url = filterAttributes(name) or wdir('image/icons/closetab.png') + #url = filterAttributes(name) or wdir('image/icons/closetab.png') # else: - #url = wdir('image/equips/icon-%s.gif'%name.lower()) + #url = wdir('image/equips/icon-%s.gif'%name.lower()) except: self.warning(traceback.format_exc()) if not url or not os.path.isfile(url): diff --git a/lib/taurus/qt/qtgui/tree/taurustree.py b/lib/taurus/qt/qtgui/tree/taurustree.py index 57f610c11..91b8d5e16 100644 --- a/lib/taurus/qt/qtgui/tree/taurustree.py +++ b/lib/taurus/qt/qtgui/tree/taurustree.py @@ -25,15 +25,17 @@ """This module provides a base widget that can be used to display a taurus model in a tree widget""" + from __future__ import absolute_import +from taurus.qt.qtgui.model import TaurusBaseModelWidget +from .qtree import QBaseTreeWidget + + __all__ = ["TaurusBaseTreeWidget"] __docformat__ = 'restructuredtext' -from taurus.qt.qtgui.model import TaurusBaseModelWidget -from .qtree import QBaseTreeWidget - class TaurusBaseTreeWidget(QBaseTreeWidget, TaurusBaseModelWidget): diff --git a/lib/taurus/qt/qtgui/util/taurusaction.py b/lib/taurus/qt/qtgui/util/taurusaction.py index ca969ee9e..6e99b0d50 100644 --- a/lib/taurus/qt/qtgui/util/taurusaction.py +++ b/lib/taurus/qt/qtgui/util/taurusaction.py @@ -24,9 +24,21 @@ ############################################################################# """This module is designed to provide a library of taurus Qt actions""" + from __future__ import absolute_import from builtins import str + +import os +import xml.dom.minidom + +from future.utils import string_types + +from taurus.external.qt import Qt +from taurus.core.taurushelper import getSchemeFromName +from taurus.qt.qtcore.configuration import BaseConfigurableClass + + __all__ = ["ExternalAppAction", "TaurusMenu", "TaurusAction", @@ -41,15 +53,6 @@ __docformat__ = 'restructuredtext' -import os -import xml.dom.minidom - -from future.utils import string_types - -from taurus.external.qt import Qt -from taurus.core.taurushelper import getSchemeFromName -from taurus.qt.qtcore.configuration import BaseConfigurableClass - class ExternalAppAction(Qt.QAction, BaseConfigurableClass): """ An specialized QAction for launching external applications diff --git a/lib/taurus/qt/qtgui/util/taurusactionfactory.py b/lib/taurus/qt/qtgui/util/taurusactionfactory.py index a123b71f0..43015cbbb 100644 --- a/lib/taurus/qt/qtgui/util/taurusactionfactory.py +++ b/lib/taurus/qt/qtgui/util/taurusactionfactory.py @@ -24,11 +24,8 @@ ############################################################################# """This module is designed to provide a factory class for taurus Qt actions """ -from __future__ import absolute_import - -__all__ = ["ActionFactory"] -__docformat__ = 'restructuredtext' +from __future__ import absolute_import from future.utils import string_types @@ -39,6 +36,11 @@ from . import taurusaction +__all__ = ["ActionFactory"] + +__docformat__ = 'restructuredtext' + + class ActionFactory(Singleton, Logger): """A Singleton class designed to provide Action related objects.""" diff --git a/lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py b/lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py index 4319300c4..b5726f906 100644 --- a/lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py +++ b/lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py @@ -24,6 +24,7 @@ ############################################################################# """Unit tests for UILoadable decorator""" + from __future__ import absolute_import import os.path diff --git a/lib/taurus/qt/qtgui/util/ui.py b/lib/taurus/qt/qtgui/util/ui.py index 3f8492005..b4bc93a23 100644 --- a/lib/taurus/qt/qtgui/util/ui.py +++ b/lib/taurus/qt/qtgui/util/ui.py @@ -26,9 +26,6 @@ """utilities to load ui files for widgets""" from builtins import object -__all__ = ["loadUi", - "UILoadable", - ] import os import sys @@ -38,6 +35,11 @@ from taurus.external.qt import uic +__all__ = ["loadUi", + "UILoadable", + ] + + class __UI(object): pass diff --git a/lib/taurus/test/testsuite.py b/lib/taurus/test/testsuite.py index ebc82a9c4..19d9fe9be 100644 --- a/lib/taurus/test/testsuite.py +++ b/lib/taurus/test/testsuite.py @@ -33,8 +33,6 @@ """ from __future__ import print_function -__docformat__ = 'restructuredtext' - import os import sys import re @@ -42,6 +40,8 @@ import taurus +__docformat__ = 'restructuredtext' + PY3_EXCLUDED = ( 'unittest.loader._FailedTest.taurus.qt.qtgui.plot', 'unittest.loader._FailedTest.taurus.qt.qtgui.extra_sardana', From f6d0a4df1c083a09557342f343efbd5a451930eb Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 27 Sep 2018 22:06:46 +0200 Subject: [PATCH 114/252] Fix import error The previous commit introduced a an error in the tango module imports. Fix it. --- lib/taurus/core/tango/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/taurus/core/tango/__init__.py b/lib/taurus/core/tango/__init__.py index 4eb47a0b8..c08839447 100644 --- a/lib/taurus/core/tango/__init__.py +++ b/lib/taurus/core/tango/__init__.py @@ -102,13 +102,15 @@ This syntax is now deprecated and should not be used. Taurus will issue warnings if detected. """ + +from __future__ import absolute_import + from .enums import * from .tangodatabase import * from .tangodevice import * from .tangofactory import * from .tangoattribute import * from .tangoconfiguration import * -from __future__ import absolute_import __docformat__ = "restructuredtext" From cc448d567a784e613d5000a32e0af7abb79be1cf Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 3 Oct 2018 08:27:36 +0200 Subject: [PATCH 115/252] First draft of TEP18 --- doc/TEP18.md | 344 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 344 insertions(+) create mode 100644 doc/TEP18.md diff --git a/doc/TEP18.md b/doc/TEP18.md new file mode 100644 index 000000000..32f5f8d11 --- /dev/null +++ b/doc/TEP18.md @@ -0,0 +1,344 @@ + Title: Implement support for Qt5 in taurus + TEP: 18 + State: DRAFT + Date: 2018-10-04 + Drivers: Carlos Pascual-Izarra cpascual@cells.es + URL: XXXXX (TODO) + License: http://www.jclark.com/xml/copying.txt + Abstract: + Implement support for Qt5 in taurus. Also efine the + migration strategy for applications using taurus. + + +## Intro + +PyQt4 has been deprecated and unsupported for quite some time. + +Support for Qt is going to be dropped in debian buster (freeze +coming in Jan2019) and packages depending on Qt4 will be dropped. +A release critical bug on taurus is already pending (see [taurus_bug]) + +### Current situation + +Taurus currently provides a shim module (`taurus.external.qt`) which is +used throughout the taurus and which is recommended for apps using taurus. + +The current implementation of `taurus.external.qt` was adapted +from an early version in spyder and heavily modified by +us, but it is definitely buggy for bindings other than PyQt4. +It is also "dirty" due to legacy code related to sip API 1 +(which is no longer supported in Taurus 4). + +The taurus files (and the apps using taurus 4) are currently written in PyQt4 style, +(e.g. without differentiating QtGui and QtWidgets). + +### Goals + +These are **desired** goals in rough order of importance. They are **not** +all compatible with each other: + +1. Allow taurus to run with PyQt5 binding +2. Do not force apps using taurus to migrate to Qt5 (i.e. still support + the PyQt4 binding and respect the app choice of bindings) +3. Keep backwards-compat (do not impose code changes on apps that use`taurus.external.qt`) +4. Avoid patching the loaded binding (or at most make only "inoquous" patches) +5. Use existing solution. Avoid reinventing / maintaining our own solution. +6. Modernice the code style in taurus (use Qt5 code style throughout taurus) +7. Minimize the amount of changes needed in the taurus code +8. Avoid introducing heavy dependencies in the `taurus.qt` submodule + + +## Considerations about implementation + +We studied shims implemented by other projects: + +- spyder: [qtpy] : Emulates PyQt5 PySide2 binding for the other bindings. It may patch the + existing binding in incompatible ways (side-effects). It provides some wrappers. + It is popular and has an active and responsive community. It is intended to be used by other projects. +- Qt.py: [Qt.py] : Emulates PySide2 binding for the other bindings. It avoids patching by + design in favour of wrappers. It is intended to be used by other projects. +- silx: [silx.qt] : Provides a custom consolidated module that is uniform across bindings + (e.g. the `silx.qt` module provides all classes from QtCore, QtGui, QtWidgets, ....). + It also provides some wrappers and does limited inocuous patching. It is more of a + custom solution, not designed to be used by other projects. +- pyqtgraph [pyqtgraph.Qt] : Emulates PyQt4 binding for the other bindings. It patches existing bindings + adding members (e.g. if using the PyQt5 module, it monkey-patches all QtWidgets into QtGui). + It is more of a custom solution, not designed to be used by other projects. + +### Consequences of goals 1, 2 and 3 on the implementation decisions (and on goal 5) + +After studying all the mentioned implementations, we conclude that all of them fulfill +goals 1 and 2 but none of them , if used directly as it is fulfills goal 3. + +Some custom wrapping is necessary in all cases. For example: qtpy +and Qt.py impose using PySide2 style (e.g. they do not expose pyqtSignal). In the case +of silx.qt, the layout of the consolidated `silx.qt` does not provide, e.g. `QtGui` or `QtCore`, +which is expected by apps that use `taurus.external.qt.QtGui`. In the case of `pyqtgraph.Qt`, +since it does not separate the submodules into subpackages, something like +`from pyqtgraph.Qt.QtCore import QObject` fails. + +Therefore we are forced to do some custom shimming if we want to keep backwards compatibility +for apps using `taurus.external.qt`. While this necessarily implies renouncing to fulfill +goal 5, we can still borrow most of the solutions implemented in the above projects. + +### Patching vs wrapping + +Regarding the way of smoothing binding incompatibilities, we should avoid patching existing +bindings (goal 4). In this regard, the approaches of Qt.py and silx.gui.qt should be our +reference. The preferred solutions are to use adapters `taurus.external.qt.Qt*` +and provide compatibility wrappers whenever this cannot be done. In the worst case, we could +accept patching patching an existing binding, but only if the result never introduces +a side-efect in an application that uses valid code (similar to the compromise taken in +[qtpy_issue121]). + +### Plugin support + +The priority is on adding PyQt5 binding support while maintaining the PyQt4 binding support. +PySide and PySide2 support is also desirable (and probably easy since we already have the +examples of the existing implementations that do so), but it is not the main goal of this +propossal and therefore the TEP may get accepted even if the support for PiSide/PySide2 is +not complete. + +### Support for multiple Qt styles within taurus.external.qt + +A related but not identical decision to the previous one. Independently of which plugins +are supported as backends, we need to decide on which programming style(s) will be supported. +For example, qtpy supports all 4 plugins but only on programming style (that of PySide2). + +In our case, the goal 3 immediately dictates that we must support at least the PyQt4 style. +Also, by guaranteeing backwards compatibility for the apps using `taurus.external.qt`, we +are also allowing `taurus.qt` itself to keep using the old style (fulfilling goal 7). + +On the other hand, Goal 6 demands that we also support PyQt5 or PySide2 style but +for simplicity, we propose to focus this TEP in providing good support for the currently +supported style (PyQt4) regardless of the binding, and just keep the design flexible enough to +possibilitate the support of a more modern style in the future. In other words, fulfilling +goal 6 would be optional for this TEP but the chosen design should not block its +implementation in the future). + +Similarly, the same conclusion from the previous paragraph is valid for the PySide and +PySide2 style support. + +### Reusing existim shims + +Another implementation decission revolves around whether importing some of the existing shims +*within our own shim* to simplify the implementation and maintenance of our own shim +(i.e., to partially comply with Goal 5). + +In this case, importing `silx.gui.qt` or `pyqtgraph.Qt` would go against goal 8 +(even if both silx and pyqtgraph are dependencies for some submodules of `taurus.qt.qtgui`, +we would like to avoid making them mandatory at the `taurus.qt` level +since they are relatively heavy). + +On the other hand, qtpy and Qt.py are probably light +enough to consider using them but the fact that Qt.py is not yet packaged for +debian and that the version of qtpy packaged in debian9 introduces disruptive patching +of the PyQt4 binding ([qtpy_issue119]). The final decision on this aspect can be left to +the implementation phase itself and tested in practice. + + +## Some examples of code that should work + +### code that currently works: + +The following snippets work on taurus 4.4. They should also work after refactoring. + +Most common use of `taurus.external.qt` (with implicit selection of PyQt4 binding): + +```python +# emulate an application that has previously imported PyQt4 (with API 2) +import sip +API_NAMES = ["QDate", "QDateTime", "QString", "QTextStream", "QTime", "QUrl", + "QVariant"] +for name in API_NAMES: + sip.setapi(name, 2) + +import PyQt4.QtGui + +from taurus.external.qt import Qt, QtGui, QtCore +from taurus.qt.qtgui.display import TaurusLabel + +a = Qt.QApplication([]) +o = QtCore.QObject() +w = QtGui.QLabel() +l = TaurusLabel() +``` + +Most common use of `taurus.external.qt` (with explicit selection of PyQt4 binding) : + +```python + +from taurus import tauruscustomsettings +tauruscustomsettings.DEFAULT_QT_API = 'pyqt' + +from taurus.external.qt import Qt, QtGui, QtCore +from taurus.qt.qtgui.display import TaurusLabel + +a = Qt.QApplication([]) +o = QtCore.QObject() +w = QtGui.QLabel() +l = TaurusLabel() +``` + +Exotic (but allowed) use of `taurus.external.qt` (with implicit selection of PyQt4 binding): + +```python +# emulate an application that has previously imported PyQt4 (with API 2) +import sip +API_NAMES = ["QDate", "QDateTime", "QString", "QTextStream", "QTime", "QUrl", + "QVariant"] +for name in API_NAMES: + sip.setapi(name, 2) + +import PyQt4.QtGui + +import taurus.external.qt.Qt +import taurus.external.qt.QtCore +import taurus.external.qt.QtGui +from taurus.qt.qtgui.display import TaurusLabel + +a = taurus.external.qt.Qt.QApplication([]) +o = taurus.external.qt.QtCore.QObject() +w = taurus.external.qt.QtGui.QLabel() +l = TaurusLabel() +``` + +### code that should work after the refactoring: + +Most common use of `taurus.external.qt` (with implicit selection of PyQt5 binding) : + +```python +import PyQt5.QtWidgets # force using PyQt5 + +from taurus.external.qt import Qt, QtGui, QtCore +from taurus.qt.qtgui.display import TaurusLabel + +a = Qt.QApplication([]) +o = QtCore.QObject() +w = QtGui.QLabel() +l = TaurusLabel() + +assert(QtGui.QLabel is PyQt5.QtWidgets.QLabel) +``` + +Most common use of `taurus.external.qt` (with explicit selection of PyQt5 binding) : + +```python + +from taurus import tauruscustomsettings +tauruscustomsettings.DEFAULT_QT_API = 'pyqt5' + +from taurus.external.qt import Qt, QtGui, QtCore +from taurus.qt.qtgui.display import TaurusLabel + +a = Qt.QApplication([]) +o = QtCore.QObject() +w = QtGui.QLabel() +l = TaurusLabel() + +import PyQt5.QtWidgets +assert(QtGui.QLabel is PyQt5.QtWidgets.QLabel) +``` + + +Exotic (but allowed) use of `taurus.external.qt`: + +```python +import PyQt5.QtWidgets # force using PyQt5 + +import taurus.external.qt.Qt +import taurus.external.qt.QtCore +import taurus.external.qt.QtGui +from taurus.qt.qtgui.display import TaurusLabel + +a = taurus.external.qt.Qt.QApplication([]) +o = taurus.external.qt.QtCore.QObject() +w = taurus.external.qt.QtGui.QLabel() +l = TaurusLabel() +``` + +## Code that would be nice if it worked, but which is optional + +Using `taurus.external.qt` with PyQt5 style and Pyqt5 binding: + +```python +from taurus import tauruscustomsettings +tauruscustomsettings.DEFAULT_QT_API = 'pyqt5' + +from taurus.external.qt import Qt, QtGui, QtCore, QtWidgets +from taurus.qt.qtgui.display import TaurusLabel + +g = QtGui.QGuiApplication([]) +a = Qt.QApplication([]) +o = QtCore.QObject() +w = QtWidgets.QLabel() +l = TaurusLabel() +``` + +Using `taurus.external.qt` with PyQt5 style and Pyqt4 binding: + +```python +from taurus import tauruscustomsettings +tauruscustomsettings.DEFAULT_QT_API = 'pyqt' + +from taurus.external.qt import Qt, QtGui, QtCore, QtWidgets +from taurus.qt.qtgui.display import TaurusLabel + +g = QtGui.QGuiApplication([]) +a = Qt.QApplication([]) +o = QtCore.QObject() +w = QtWidgets.QLabel() +l = TaurusLabel() +``` + +## Links to more details and discussions + +Discussions for this TEP are conducted in its associated Pull Request: + +https://github.com/taurus-org/taurus/pull/XXXXX (TODO) + +Related issues are: + +https://github.com/taurus-org/taurus/issues/203 +https://github.com/taurus-org/taurus/issues/148 + + +## License + +Copyright (c) 2018 Carlos Pascual-Izarra + +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. + +## Changes + +- 2018-10-04 [cpascual][]. Initial version + + + +[taurus_bug]: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=875202 +[qtpy_issue119]: https://github.com/spyder-ide/qtpy/issues/119 +[qtpy_issue121]: https://github.com/spyder-ide/qtpy/issues/121 + +[qtpy]: https://github.com/spyder-ide/qtpy +[silx.qt]: https://github.com/silx-kit/silx/blob/master/silx/gui/qt +[pyqtgraph.Qt]: https://github.com/pyqtgraph/pyqtgraph/blob/develop/pyqtgraph/Qt.py +[Qt.py]: https://github.com/mottosso/Qt.py + +[cpascual]: https://github.com/cpascual \ No newline at end of file From b1bc40c7a6f296b7942ffcc782bea2552a852f77 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 4 Oct 2018 13:05:59 +0200 Subject: [PATCH 116/252] Move TEP18.md to proper location --- doc/{ => source/tep}/TEP18.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename doc/{ => source/tep}/TEP18.md (100%) diff --git a/doc/TEP18.md b/doc/source/tep/TEP18.md similarity index 100% rename from doc/TEP18.md rename to doc/source/tep/TEP18.md From bd9848a5d62218d778fa64a9728f26ed6caf253d Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 4 Oct 2018 14:33:19 +0200 Subject: [PATCH 117/252] Update TEP18.md --- doc/source/tep/TEP18.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index 32f5f8d11..2d2870ce9 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -6,7 +6,7 @@ URL: XXXXX (TODO) License: http://www.jclark.com/xml/copying.txt Abstract: - Implement support for Qt5 in taurus. Also efine the + Implement support for Qt5 in taurus. Also define the migration strategy for applications using taurus. @@ -341,4 +341,4 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. [pyqtgraph.Qt]: https://github.com/pyqtgraph/pyqtgraph/blob/develop/pyqtgraph/Qt.py [Qt.py]: https://github.com/mottosso/Qt.py -[cpascual]: https://github.com/cpascual \ No newline at end of file +[cpascual]: https://github.com/cpascual From 841d55782ff03ea5e05fd5aa7b8f68a045169d79 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 5 Oct 2018 09:08:01 +0200 Subject: [PATCH 118/252] Update TEP18.md --- doc/source/tep/TEP18.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index 2d2870ce9..8ad2ec5d8 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -14,7 +14,7 @@ PyQt4 has been deprecated and unsupported for quite some time. -Support for Qt is going to be dropped in debian buster (freeze +Support for Qt4 is going to be dropped in debian buster (freeze coming in Jan2019) and packages depending on Qt4 will be dropped. A release critical bug on taurus is already pending (see [taurus_bug]) From 28940aefc842dbd47b233bc97b1efec512e9ccd0 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 5 Oct 2018 09:14:45 +0200 Subject: [PATCH 119/252] Update TEP18.md --- doc/source/tep/TEP18.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index 8ad2ec5d8..4a95ef194 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -85,9 +85,9 @@ goal 5, we can still borrow most of the solutions implemented in the above proje Regarding the way of smoothing binding incompatibilities, we should avoid patching existing bindings (goal 4). In this regard, the approaches of Qt.py and silx.gui.qt should be our -reference. The preferred solutions are to use adapters `taurus.external.qt.Qt*` +reference. The preferred solutions are to use adapters (`taurus.external.qt.Qt*`) and provide compatibility wrappers whenever this cannot be done. In the worst case, we could -accept patching patching an existing binding, but only if the result never introduces +accept patching an existing binding, but only if the result never introduces a side-efect in an application that uses valid code (similar to the compromise taken in [qtpy_issue121]). From 17fe2a1d4e63e7b42da375011e8fcd5c2f63c228 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 5 Oct 2018 09:15:36 +0200 Subject: [PATCH 120/252] Update TEP18.md --- doc/source/tep/TEP18.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index 4a95ef194..757e02a06 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -96,7 +96,7 @@ a side-efect in an application that uses valid code (similar to the compromise t The priority is on adding PyQt5 binding support while maintaining the PyQt4 binding support. PySide and PySide2 support is also desirable (and probably easy since we already have the examples of the existing implementations that do so), but it is not the main goal of this -propossal and therefore the TEP may get accepted even if the support for PiSide/PySide2 is +propossal and therefore the TEP may get accepted even if the support for PySide/PySide2 is not complete. ### Support for multiple Qt styles within taurus.external.qt From 3772808317e3ff6c939f219c35aa42628f655d18 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 5 Oct 2018 09:17:06 +0200 Subject: [PATCH 121/252] Update TEP18.md --- doc/source/tep/TEP18.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index 757e02a06..8c30db748 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -103,7 +103,7 @@ not complete. A related but not identical decision to the previous one. Independently of which plugins are supported as backends, we need to decide on which programming style(s) will be supported. -For example, qtpy supports all 4 plugins but only on programming style (that of PySide2). +For example, qtpy supports all 4 plugins but only one programming style (that of PySide2). In our case, the goal 3 immediately dictates that we must support at least the PyQt4 style. Also, by guaranteeing backwards compatibility for the apps using `taurus.external.qt`, we From 5a9efa094cbb7070bc3aae1fc71c61ab020b3171 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 5 Oct 2018 09:24:01 +0200 Subject: [PATCH 122/252] Update TEP18.md --- doc/source/tep/TEP18.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index 8c30db748..9c8080515 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -65,10 +65,10 @@ We studied shims implemented by other projects: adding members (e.g. if using the PyQt5 module, it monkey-patches all QtWidgets into QtGui). It is more of a custom solution, not designed to be used by other projects. -### Consequences of goals 1, 2 and 3 on the implementation decisions (and on goal 5) +### Consequences of Goals 1, 2 and 3 on the implementation decisions (and on Goal 5) After studying all the mentioned implementations, we conclude that all of them fulfill -goals 1 and 2 but none of them , if used directly as it is fulfills goal 3. +Goals 1 and 2 but none of them , if used directly as it is fulfills Goal 3. Some custom wrapping is necessary in all cases. For example: qtpy and Qt.py impose using PySide2 style (e.g. they do not expose pyqtSignal). In the case @@ -79,12 +79,12 @@ since it does not separate the submodules into subpackages, something like Therefore we are forced to do some custom shimming if we want to keep backwards compatibility for apps using `taurus.external.qt`. While this necessarily implies renouncing to fulfill -goal 5, we can still borrow most of the solutions implemented in the above projects. +Goal 5, we can still borrow most of the solutions implemented in the above projects. ### Patching vs wrapping Regarding the way of smoothing binding incompatibilities, we should avoid patching existing -bindings (goal 4). In this regard, the approaches of Qt.py and silx.gui.qt should be our +bindings (Goal 4). In this regard, the approaches of Qt.py and silx.gui.qt should be our reference. The preferred solutions are to use adapters (`taurus.external.qt.Qt*`) and provide compatibility wrappers whenever this cannot be done. In the worst case, we could accept patching an existing binding, but only if the result never introduces @@ -105,16 +105,16 @@ A related but not identical decision to the previous one. Independently of which are supported as backends, we need to decide on which programming style(s) will be supported. For example, qtpy supports all 4 plugins but only one programming style (that of PySide2). -In our case, the goal 3 immediately dictates that we must support at least the PyQt4 style. +In our case, the Goal 3 immediately dictates that we must support at least the PyQt4 style. Also, by guaranteeing backwards compatibility for the apps using `taurus.external.qt`, we -are also allowing `taurus.qt` itself to keep using the old style (fulfilling goal 7). +are also allowing `taurus.qt` itself to keep using the old style (fulfilling Goal 7). On the other hand, Goal 6 demands that we also support PyQt5 or PySide2 style but for simplicity, we propose to focus this TEP in providing good support for the currently supported style (PyQt4) regardless of the binding, and just keep the design flexible enough to possibilitate the support of a more modern style in the future. In other words, fulfilling -goal 6 would be optional for this TEP but the chosen design should not block its -implementation in the future). +Goal 6 would be optional for this TEP but the chosen design should not block its +implementation in the future. Similarly, the same conclusion from the previous paragraph is valid for the PySide and PySide2 style support. @@ -125,16 +125,16 @@ Another implementation decission revolves around whether importing some of the e *within our own shim* to simplify the implementation and maintenance of our own shim (i.e., to partially comply with Goal 5). -In this case, importing `silx.gui.qt` or `pyqtgraph.Qt` would go against goal 8 +In this case, importing `silx.gui.qt` or `pyqtgraph.Qt` would go against Goal 8 (even if both silx and pyqtgraph are dependencies for some submodules of `taurus.qt.qtgui`, we would like to avoid making them mandatory at the `taurus.qt` level since they are relatively heavy). -On the other hand, qtpy and Qt.py are probably light -enough to consider using them but the fact that Qt.py is not yet packaged for -debian and that the version of qtpy packaged in debian9 introduces disruptive patching -of the PyQt4 binding ([qtpy_issue119]). The final decision on this aspect can be left to -the implementation phase itself and tested in practice. +On the other hand, qtpy and Qt.py are probably light enough to consider using them but +the fact that Qt.py is not yet packaged for debian and that the version of qtpy packaged +in debian9 introduces disruptive patching of the PyQt4 binding ([qtpy_issue119]) should +also be weighted in the decision. The final decision on this aspect can be left to +the implementation phase itself where the various options can be tested in practice. ## Some examples of code that should work From e875467aac9afc825316313d5d1a4f66f632effc Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 5 Oct 2018 09:29:16 +0200 Subject: [PATCH 123/252] Add TEP18 link to TEP index Also update TEP15 url --- doc/source/tep/index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/source/tep/index.md b/doc/source/tep/index.md index 56cccb6c7..f0c77a377 100644 --- a/doc/source/tep/index.md +++ b/doc/source/tep/index.md @@ -24,6 +24,7 @@ Proposals list [TEP15][] | ACCEPTED | fragment-based slicing support in URIs [TEP16][] | ACCEPTED | Moving Taurus to Github [TEP17][] | DRAFT | Implement plots with pyqtgraph + [TEP18][] | DRAFT | Implement support for Qt5 in taurus [TEP0]: http://www.taurus-scada.org/tep/?TEP0.md [TEP3]: http://www.taurus-scada.org/tep/?TEP3.md @@ -36,6 +37,7 @@ Proposals list [SEP12]: http:/www.sardana-controls.org/sep/?SEP12.md [TEP13]: http://www.taurus-scada.org/tep/?TEP13.md [TEP14]: http://www.taurus-scada.org/tep/?TEP14.md -[TEP15]: https://github.com/cpascual/taurus/blob/tep15/doc/source/tep/TEP15.md +[TEP15]: http://www.taurus-scada.org/tep/?TEP15.md [TEP16]: http://www.taurus-scada.org/tep/?TEP16.md [TEP17]: https://github.com/cpascual/taurus/blob/tep17/doc/source/tep/TEP17.md +[TEP18]: https://github.com/cpascual/taurus/blob/tep18/doc/source/tep/TEP18.md From a26fdf9431d340f3cc55c0818ff6690d48af5c42 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 5 Oct 2018 09:35:30 +0200 Subject: [PATCH 124/252] Update TEP18.md --- doc/source/tep/TEP18.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index 9c8080515..857473a6a 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -293,9 +293,10 @@ l = TaurusLabel() ## Links to more details and discussions -Discussions for this TEP are conducted in its associated Pull Request: +Discussions for this TEP (and eventually the candidate implementation) +are conducted in its associated Pull Request: -https://github.com/taurus-org/taurus/pull/XXXXX (TODO) +https://github.com/taurus-org/taurus/pull/814 Related issues are: From 087f689159c5ceeb74e26d897fe5db8e070f23f2 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 5 Oct 2018 09:36:12 +0200 Subject: [PATCH 125/252] Update TEP18.md --- doc/source/tep/TEP18.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index 857473a6a..948ecef28 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -3,7 +3,7 @@ State: DRAFT Date: 2018-10-04 Drivers: Carlos Pascual-Izarra cpascual@cells.es - URL: XXXXX (TODO) + URL: https://github.com/cpascual/taurus/edit/tep18/doc/source/tep/TEP18.md (provisional) License: http://www.jclark.com/xml/copying.txt Abstract: Implement support for Qt5 in taurus. Also define the From 1750a6668badffaf2907c606de23383238d6d104 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 5 Oct 2018 09:37:02 +0200 Subject: [PATCH 126/252] Update TEP18.md --- doc/source/tep/TEP18.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index 948ecef28..40a0b8ef2 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -3,7 +3,7 @@ State: DRAFT Date: 2018-10-04 Drivers: Carlos Pascual-Izarra cpascual@cells.es - URL: https://github.com/cpascual/taurus/edit/tep18/doc/source/tep/TEP18.md (provisional) + URL: https://github.com/cpascual/taurus/blob/tep18/doc/source/tep/TEP18.md (provisional) License: http://www.jclark.com/xml/copying.txt Abstract: Implement support for Qt5 in taurus. Also define the From 0bacfd336c82277ec18c0badda3c5732972ea330 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 9 Oct 2018 09:54:32 +0200 Subject: [PATCH 127/252] Fix Qt API collision in taurusnexuswidget running `python -m taurus.qt.qtgui.extra_nexus.taurusnexuswidget` fails because the early import of PyMCA sets the Qt API to 1. Do the taurus.external.qt import before to avoid it. --- lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py b/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py index 69e862afe..2e4607ec8 100644 --- a/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py +++ b/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py @@ -32,8 +32,8 @@ import numpy import posixpath -from PyMca5.PyMcaGui.io.hdf5 import HDF5Widget, HDF5Info, HDF5DatasetTable from taurus.external.qt import Qt +from PyMca5.PyMcaGui.io.hdf5 import HDF5Widget, HDF5Info, HDF5DatasetTable from taurus.qt.qtgui.container import TaurusWidget from taurus.qt.qtgui.plot import TaurusPlot From 60080fc247f2fb8f6055c518b60d52dfc5c5cf7d Mon Sep 17 00:00:00 2001 From: cfalcon Date: Tue, 9 Oct 2018 14:33:32 +0200 Subject: [PATCH 128/252] Fix issue with SetFormatter after py3 support refactoring Add missing import and fix the calls of isinstance with string. Use with future.utils.string_types instead of str. --- lib/taurus/qt/qtgui/base/taurusbase.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/taurus/qt/qtgui/base/taurusbase.py b/lib/taurus/qt/qtgui/base/taurusbase.py index f51a933ee..22cb359ee 100644 --- a/lib/taurus/qt/qtgui/base/taurusbase.py +++ b/lib/taurus/qt/qtgui/base/taurusbase.py @@ -30,6 +30,8 @@ import sys import threading from types import MethodType +from future.builtins import str +from future.utils import string_types from taurus.external.qt import Qt from enum import Enum @@ -765,7 +767,7 @@ def _updateFormat(self, dtype, **kwargs): :param kwargs: keyword arguments that will be passed to :attribute:`FORMAT` if it is a callable """ - if not isinstance(self.FORMAT, str): + if not isinstance(self.FORMAT, string_types): # unbound method to callable if isinstance(self.FORMAT, MethodType): self.FORMAT = self.FORMAT.__func__ @@ -784,7 +786,7 @@ def setFormat(self, format): "full.module.callable" format) """ # Check if the format is a callable string representation - if isinstance(format, str): + if isinstance(format, string_types): try: moduleName, formatterName = format.rsplit('.', 1) __import__(moduleName) @@ -801,7 +803,7 @@ def getFormat(self): :return: (str) a string of the current format. It could be a python format string or a callable string representation. """ - if isinstance(self.FORMAT, str): + if isinstance(self.FORMAT, string_types): formatter = self.FORMAT else: formatter = '{0}.{1}'.format(self.FORMAT.__module__, From c16db5b443cdbc9dc632c75a777f174822efb37a Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 9 Oct 2018 15:24:23 +0200 Subject: [PATCH 129/252] Fix regresion on taurusdemo buttons The for Label, LCD, and LED buttons functionality was broken by the futurize steps. The problem is related to absolute imports. Fix them. --- lib/taurus/qt/qtgui/display/tauruslabel.py | 4 ++-- lib/taurus/qt/qtgui/display/tauruslcd.py | 4 ++-- lib/taurus/qt/qtgui/display/taurusled.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/taurus/qt/qtgui/display/tauruslabel.py b/lib/taurus/qt/qtgui/display/tauruslabel.py index cee1ea040..999f09bc0 100644 --- a/lib/taurus/qt/qtgui/display/tauruslabel.py +++ b/lib/taurus/qt/qtgui/display/tauruslabel.py @@ -651,8 +651,8 @@ def getQtDesignerPluginInfo(cls): def demo(): "Label" - from . import demo - return demo.tauruslabeldemo.main() + from .demo import tauruslabeldemo + return tauruslabeldemo.main() def main(): diff --git a/lib/taurus/qt/qtgui/display/tauruslcd.py b/lib/taurus/qt/qtgui/display/tauruslcd.py index 50e2253c1..dcc395ad5 100644 --- a/lib/taurus/qt/qtgui/display/tauruslcd.py +++ b/lib/taurus/qt/qtgui/display/tauruslcd.py @@ -389,8 +389,8 @@ def getQtDesignerPluginInfo(cls): def demo(): "LCD" - from . import demo - return demo.tauruslcddemo.main() + from .demo import tauruslcddemo + return tauruslcddemo.main() def main(): diff --git a/lib/taurus/qt/qtgui/display/taurusled.py b/lib/taurus/qt/qtgui/display/taurusled.py index 5233f209b..b4195a7a6 100644 --- a/lib/taurus/qt/qtgui/display/taurusled.py +++ b/lib/taurus/qt/qtgui/display/taurusled.py @@ -453,8 +453,8 @@ def getQtDesignerPluginInfo(cls): def demo(): "Led" - from . import demo - return demo.taurusleddemo.main() + from .demo import taurusleddemo + return taurusleddemo.main() def main(): From bcaee83d40e1b82aa5903901dfebc6934e80bcd8 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 10 Oct 2018 12:10:16 +0200 Subject: [PATCH 130/252] Fix regresions on taurusmessagebox/panel Taurusmessagebox and Taurusmessagepanel are affected by a bug introduced by futurize. The change from StrinIO -> io seems to be problematic on py2 in our case. As a workaround, just use the old StringIO module if available. --- lib/taurus/qt/qtgui/dialog/taurusmessagebox.py | 9 ++++++++- lib/taurus/qt/qtgui/panel/taurusmessagepanel.py | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py b/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py index e768c2c7c..cef60f27b 100644 --- a/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py +++ b/lib/taurus/qt/qtgui/dialog/taurusmessagebox.py @@ -342,7 +342,14 @@ def py_tg_serv_exc(): except PyTango.DevFailed as df1: try: import traceback - import io + # --------------------------------------------------------------- + # workaround for unicode issues on py2 when using io instead of + # StringIO + try: + import StringIO as io # py2 + except ImportError: + import io # py3 + # ---------------------------------------------------------------- origin = io.StringIO() traceback.print_stack(file=origin) origin.seek(0) diff --git a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py index 14db4c838..ff9a1f504 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py @@ -594,7 +594,14 @@ def py_tg_serv_exc(): except PyTango.DevFailed as df1: try: import traceback - import io + # --------------------------------------------------------------- + # workaround for unicode issues on py2 when using io instead of + # StringIO + try: + import StringIO as io # py2 + except ImportError: + import io # py3 + # ---------------------------------------------------------------- origin = io.StringIO() traceback.print_stack(file=origin) origin.seek(0) From 833ee5acfc0663608c39162496dea1562c0a137a Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 10 Oct 2018 12:10:59 +0200 Subject: [PATCH 131/252] Fix regresion on albareport Fix import issue introduced by futurize in albareport.py. --- lib/taurus/qt/qtgui/panel/report/albareport.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/taurus/qt/qtgui/panel/report/albareport.py b/lib/taurus/qt/qtgui/panel/report/albareport.py index df4c0e335..e9a3c5d8c 100644 --- a/lib/taurus/qt/qtgui/panel/report/albareport.py +++ b/lib/taurus/qt/qtgui/panel/report/albareport.py @@ -24,10 +24,10 @@ ############################################################################# """This module provides a panel to display taurus messages""" -from __future__ import absolute_import from taurus.external.qt import Qt -from .basicreport import SendMailDialog, SMTPReportHandler +from taurus.qt.qtgui.panel.report.basicreport import (SendMailDialog, + SMTPReportHandler) __package__ = 'taurus.qt.qtgui.panel.report' From 8fd1e4200ee495019edda41b57ad75c2ed591cb5 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 10 Oct 2018 13:26:33 +0200 Subject: [PATCH 132/252] Fix regresion on icons catalog Fix import str issue introduced in a recent commit --- lib/taurus/qt/qtgui/icon/catalog.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/taurus/qt/qtgui/icon/catalog.py b/lib/taurus/qt/qtgui/icon/catalog.py index 1fe080ed3..1f4e81ccf 100644 --- a/lib/taurus/qt/qtgui/icon/catalog.py +++ b/lib/taurus/qt/qtgui/icon/catalog.py @@ -27,6 +27,8 @@ from __future__ import print_function +from builtins import str + import os import hashlib from taurus.qt.qtgui.application import TaurusApplication From 9cef4a8e717ea3dbe773524f9a617cfb1cfd5e2c Mon Sep 17 00:00:00 2001 From: cfalcon Date: Tue, 16 Oct 2018 11:44:06 +0200 Subject: [PATCH 133/252] Fix BoundMethodWeakref __eq__ and __ne__ methods The current implementation of these methods are not compatible for py2 and py3 and cause troubles with the test. CallableRef method is also wrong adapted Reimplement the methods --- lib/taurus/core/util/event.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/taurus/core/util/event.py b/lib/taurus/core/util/event.py index 42cc71483..391a4200d 100644 --- a/lib/taurus/core/util/event.py +++ b/lib/taurus/core/util/event.py @@ -83,16 +83,13 @@ def __cmp__(self, other): return 1 def __eq__(self, other): - if other.__class__ != self.__class__: + if hasattr(other, 'func_ref') and hasattr(other, 'obj_ref'): return ((self.func_ref, self.obj_ref) == (other.func_ref, other.obj_ref)) return False def __ne__(self, other): - if other.__class__ != self.__class__: - return ((self.func_ref, self.obj_ref) - != (other.func_ref, other.obj_ref)) - return True + return not self.__eq__(other) def __repr__(self): obj, func = self.obj_ref(), self.func_ref() @@ -110,9 +107,14 @@ def CallableRef(object, del_cb=None): :return: a weak reference for the given callable :rtype: BoundMethodWeakref or weakref.ref""" - if hasattr(object, 'im_self'): - if object.__self__ is not None: - return BoundMethodWeakref(object, del_cb) + im_self = None + if hasattr(object, '__self__'): + im_self = object.__self__ + elif hasattr(object, 'im_self'): + im_self = object.im_self + + if im_self is not None: + return BoundMethodWeakref(object, del_cb) return weakref.ref(object, del_cb) From 342044226ec55bb236cc40d505c6b83e5f90d6ee Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 16 Oct 2018 16:04:46 +0200 Subject: [PATCH 134/252] Implement __ne__ based on == instead of __eq__ See rationale of the change in https://stackoverflow.com/a/35781654 --- lib/taurus/core/util/event.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/core/util/event.py b/lib/taurus/core/util/event.py index 391a4200d..d2e67449a 100644 --- a/lib/taurus/core/util/event.py +++ b/lib/taurus/core/util/event.py @@ -89,7 +89,7 @@ def __eq__(self, other): return False def __ne__(self, other): - return not self.__eq__(other) + return not self == other def __repr__(self): obj, func = self.obj_ref(), self.func_ref() From c6c3c56c9e8d2ba4c1f8fa6da176c2dc94851eda Mon Sep 17 00:00:00 2001 From: cfalcon Date: Wed, 17 Oct 2018 12:53:59 +0200 Subject: [PATCH 135/252] Replace pyqt.Signal str signature To be compatible between Py2 and Py3 we should use 'QString' instead of str in the signature of the signals. Do it. --- lib/taurus/qt/qtgui/container/taurusmainwindow.py | 2 +- lib/taurus/qt/qtgui/extra_guiqwt/plot.py | 4 ++-- lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py | 2 +- lib/taurus/qt/qtgui/icon/catalog.py | 2 +- lib/taurus/qt/qtgui/input/choicedlg.py | 2 +- lib/taurus/qt/qtgui/panel/taurusconfigeditor.py | 2 +- lib/taurus/qt/qtgui/taurusgui/macrolistener.py | 2 +- lib/taurus/qt/qtgui/taurusgui/taurusgui.py | 8 ++++---- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/taurus/qt/qtgui/container/taurusmainwindow.py b/lib/taurus/qt/qtgui/container/taurusmainwindow.py index d2c56be9e..2cf251ce9 100644 --- a/lib/taurus/qt/qtgui/container/taurusmainwindow.py +++ b/lib/taurus/qt/qtgui/container/taurusmainwindow.py @@ -182,7 +182,7 @@ class TaurusMainWindow(Qt.QMainWindow, TaurusBaseContainer): ''' modelChanged = Qt.pyqtSignal('const QString &') - perspectiveChanged = Qt.pyqtSignal(str) + perspectiveChanged = Qt.pyqtSignal('QString') # customization options: # blinking semi-period in ms. Set to None for not showing the Heart beat diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py index 4cc7cde6a..895a33476 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py @@ -56,7 +56,7 @@ class TaurusCurveDialog(CurveDialog, TaurusBaseWidget): .. seealso:: :class:`TaurusCurveWidget` ''' _modifiableByUser = True - modelChanged = Qt.pyqtSignal([], ['QStringList'], [str]) + modelChanged = Qt.pyqtSignal([], ['QStringList'], ['QString']) def __init__(self, parent=None, designMode=False, toolbar=True, **kwargs): '''see :class:`guiqwt.plot.CurveDialog` for other valid initialization parameters''' @@ -203,7 +203,7 @@ class TaurusTrendDialog(CurveDialog, TaurusBaseWidget): ''' _modifiableByUser = True - modelChanged = Qt.pyqtSignal([], ['QStringList'], [str]) + modelChanged = Qt.pyqtSignal([], ['QStringList'], ['QString']) def __init__(self, parent=None, designMode=False, taurusparam=None, toolbar=True, **kwargs): '''see :class:`guiqwt.plot.CurveDialog` for other valid initialization parameters''' diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py index 52a741e85..fb8bbd683 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py @@ -81,7 +81,7 @@ class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget): allows to configure custom context menus for graphic items using a list of tuples. Empty tuples will insert separators in the menu. ''' - itemsChanged = Qt.pyqtSignal(str, dict) + itemsChanged = Qt.pyqtSignal('QString', dict) modelsChanged = Qt.pyqtSignal(list) graphicItemSelected = Qt.pyqtSignal('QString') graphicSceneClicked = Qt.pyqtSignal('QPoint') diff --git a/lib/taurus/qt/qtgui/icon/catalog.py b/lib/taurus/qt/qtgui/icon/catalog.py index 1f4e81ccf..71c066e23 100644 --- a/lib/taurus/qt/qtgui/icon/catalog.py +++ b/lib/taurus/qt/qtgui/icon/catalog.py @@ -140,7 +140,7 @@ class QIconCatalog(Qt.QTabWidget): application. """ - iconSelected = Qt.pyqtSignal(str) + iconSelected = Qt.pyqtSignal('QString') def __init__(self, parent=None): Qt.QTabWidget.__init__(self) diff --git a/lib/taurus/qt/qtgui/input/choicedlg.py b/lib/taurus/qt/qtgui/input/choicedlg.py index 4effd0493..28da00623 100644 --- a/lib/taurus/qt/qtgui/input/choicedlg.py +++ b/lib/taurus/qt/qtgui/input/choicedlg.py @@ -123,7 +123,7 @@ def getChoice(parent=None, title='', msg='', choices=None, pixmaps=None, iconSiz class GraphicalChoiceWidget(Qt.QScrollArea): '''A widget that presents a 2D grid of buttons''' - choiceMade = Qt.pyqtSignal(str) + choiceMade = Qt.pyqtSignal('QString') def __init__(self, parent=None, designMode=False, choices=None, pixmaps=None, iconSize=128, defaultPixmap=None, horizontalScrollBarPolicy=Qt.Qt.ScrollBarAsNeeded, diff --git a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py index 4e53771c9..bd38fea32 100644 --- a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py +++ b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py @@ -47,7 +47,7 @@ class QConfigEditorModel(Qt.QStandardItemModel): '''A custom Model for QConfigEditor''' - showError = Qt.pyqtSignal(str, str) + showError = Qt.pyqtSignal('QString', 'QString') def __init__(self, parent=None, designMode=False): super(Qt.QStandardItemModel, self).__init__() diff --git a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py index 34184f9a4..a04bb70b5 100644 --- a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py +++ b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py @@ -72,7 +72,7 @@ class DynamicPlotManager(Qt.QObject, TaurusBaseComponent): used. ''' - newShortMessage = Qt.pyqtSignal(str) + newShortMessage = Qt.pyqtSignal('QString') def __init__(self, parent=None): Qt.QObject.__init__(self, parent) diff --git a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py index 66c0d53ac..c130236aa 100644 --- a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py +++ b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py @@ -274,10 +274,10 @@ class TaurusGui(TaurusMainWindow): ''' - SelectedInstrument = Qt.pyqtSignal(str) - doorNameChanged = Qt.pyqtSignal(str) - macroserverNameChanged = Qt.pyqtSignal(str) - newShortMessage = Qt.pyqtSignal(str) + SelectedInstrument = Qt.pyqtSignal('QString') + doorNameChanged = Qt.pyqtSignal('QString') + macroserverNameChanged = Qt.pyqtSignal('QString') + newShortMessage = Qt.pyqtSignal('QString') IMPLICIT_ASSOCIATION = '__[IMPLICIT]__' From a819948fd61c00ec97489dbbf5a722ba74235cb2 Mon Sep 17 00:00:00 2001 From: cfalcon Date: Thu, 18 Oct 2018 09:55:39 +0200 Subject: [PATCH 136/252] Replace isinstance(obj, str) The uses of isinstance with str causes troubles with Py2 and Py3 code compatibility. This problem can be avoided using `string_types` (from future.utils) instead of `str`. --- lib/taurus/console/list.py | 4 +++- lib/taurus/core/evaluation/evalvalidator.py | 6 ++++-- lib/taurus/core/resource/resfactory.py | 3 ++- lib/taurus/core/tango/img/img.py | 3 ++- lib/taurus/core/tango/tangofactory.py | 3 ++- lib/taurus/core/util/codecs.py | 6 +++--- lib/taurus/qt/qtcore/configuration/configuration.py | 3 ++- lib/taurus/qt/qtgui/graphic/taurusgraphic.py | 4 ++-- lib/taurus/qt/qtgui/panel/taurusdevicepanel.py | 3 ++- lib/taurus/qt/qtgui/panel/taurusvalue.py | 5 ++++- lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py | 8 ++++---- lib/taurus/qt/qtgui/table/taurusgrid.py | 8 ++++---- lib/taurus/test/fuzzytest.py | 3 ++- 13 files changed, 36 insertions(+), 23 deletions(-) diff --git a/lib/taurus/console/list.py b/lib/taurus/console/list.py index 4542980f4..9ebdf7bc2 100644 --- a/lib/taurus/console/list.py +++ b/lib/taurus/console/list.py @@ -26,6 +26,8 @@ """ """ from __future__ import absolute_import +from future.utils import string_types + from builtins import map from builtins import range import textwrap @@ -138,7 +140,7 @@ def genOutput(self): def _get_separator_row(self, separator): columns = [] for i, width in enumerate(self.cur_col_width): - if isinstance(separator[i], str): + if isinstance(separator[i], string_types): column = " " + (width - 1) * separator[i] else: column = " " + separator[i][:width - 1] diff --git a/lib/taurus/core/evaluation/evalvalidator.py b/lib/taurus/core/evaluation/evalvalidator.py index 4115fee14..be91ca10f 100644 --- a/lib/taurus/core/evaluation/evalvalidator.py +++ b/lib/taurus/core/evaluation/evalvalidator.py @@ -23,6 +23,8 @@ ############################################################################# from __future__ import absolute_import +from future.utils import string_types + from builtins import zip import re import hashlib @@ -250,7 +252,7 @@ def expandExpr(expr, substmap): string containing a semi-colon separated list of symbol=value pairs can also be passed. ''' - if isinstance(substmap, str): + if isinstance(substmap, string_types): substmap = dict(K_EQUALS_V_RE.findall(substmap)) ret = expr protected = {} @@ -363,7 +365,7 @@ def getUriGroups(self, name, strict=None): # create the groups dict with unmangled refs in its values groups = {} for n, g in _groups.items(): - if isinstance(g, str): # avoid None or boolean values + if isinstance(g, string_types): # avoid None or boolean values g = g.format(**refs_dict) groups[n] = g diff --git a/lib/taurus/core/resource/resfactory.py b/lib/taurus/core/resource/resfactory.py index f58d64606..564164d48 100644 --- a/lib/taurus/core/resource/resfactory.py +++ b/lib/taurus/core/resource/resfactory.py @@ -27,6 +27,7 @@ resfactory.py: """ from __future__ import absolute_import +from future.utils import string_types import os import imp @@ -90,7 +91,7 @@ def reloadResource(self, obj=None, priority=1, name=None): name, mod = self.__reloadResource(obj) obj = {} for k, v in mod.__dict__.items(): - if not k.startswith('_') and isinstance(v, str): + if not k.startswith('_') and isinstance(v, string_types): obj[k] = v else: raise TypeError diff --git a/lib/taurus/core/tango/img/img.py b/lib/taurus/core/tango/img/img.py index 0bb94bfe2..29fbe80a4 100644 --- a/lib/taurus/core/tango/img/img.py +++ b/lib/taurus/core/tango/img/img.py @@ -25,6 +25,7 @@ """The img submodule. It contains specific device implementation for CCDs and 2D detectors""" +from future.utils import string_types from taurus.core.taurusbasetypes import TaurusEventType from taurus.core.tango import TangoDevice @@ -137,7 +138,7 @@ def _emitImageEvents(self, evt_type, images): def getImageData(self, names=None): if names is None: names = self.getImageAttrNames() - elif isinstance(names, str): + elif isinstance(names, string_types): names = (names,) fetch = self._getDirty(names) diff --git a/lib/taurus/core/tango/tangofactory.py b/lib/taurus/core/tango/tangofactory.py index 1eb939bbc..57b2dbbf5 100644 --- a/lib/taurus/core/tango/tangofactory.py +++ b/lib/taurus/core/tango/tangofactory.py @@ -26,6 +26,7 @@ """This module provides the `TangoFactory` object""" from __future__ import absolute_import +from future.utils import string_types try: pass @@ -451,7 +452,7 @@ def getConfiguration(self, param): :return: (taurus.core.tango.TangoAttribute) configuration object """ - if isinstance(param, str): + if isinstance(param, string_types): return self.getAttribute(param) return param diff --git a/lib/taurus/core/util/codecs.py b/lib/taurus/core/util/codecs.py index 8ce4f26d5..0b91df54a 100644 --- a/lib/taurus/core/util/codecs.py +++ b/lib/taurus/core/util/codecs.py @@ -72,7 +72,7 @@ import sys import numpy -from future.utils import PY2 +from future.utils import (PY2, string_types) from .singleton import Singleton from .log import Logger @@ -359,7 +359,7 @@ def decode(self, data, *args, **kwargs): return format, data def _transform_ascii(self, data): - if isinstance(data, str): + if isinstance(data, string_types): return data.encode('utf-8') elif isinstance(data, dict): return self._transform_dict(data) @@ -437,7 +437,7 @@ def decode(self, data, *args, **kwargs): return format, data def _transform_ascii(self, data): - if isinstance(data, str): + if isinstance(data, string_types): return data.encode('utf-8') elif isinstance(data, dict): return self._transform_dict(data) diff --git a/lib/taurus/qt/qtcore/configuration/configuration.py b/lib/taurus/qt/qtcore/configuration/configuration.py index 23b73ffca..683790669 100644 --- a/lib/taurus/qt/qtcore/configuration/configuration.py +++ b/lib/taurus/qt/qtcore/configuration/configuration.py @@ -298,7 +298,7 @@ def registerConfigProperty(self, fget, fset, name): .. seealso:: :meth:`unregisterConfigurableItem`, :meth:`registerConfigDelegate`, :meth:`createConfig` ''' - if isinstance(fget, str) or isinstance(fset, str): + if isinstance(fget, string_types) or isinstance(fset, string_types): import weakref obj = weakref.proxy(self) else: @@ -464,6 +464,7 @@ def loadConfigFile(self, ifile=None): return if not isinstance(ifile, file): ifile = open(ifile, 'r') + configdict = pickle.load(ifile) self.applyConfig(configdict) return ifile.name diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py index d42ed28bb..6a19554f6 100755 --- a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py +++ b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py @@ -227,7 +227,7 @@ def __init__(self, parent=None, strt=True): try: if parent and parent.panelClass() is not None: defaultClass = parent.panelClass() - if defaultClass and isinstance(defaultClass, str): + if defaultClass and isinstance(defaultClass, string_types): self.panel_launcher = self.getClass(defaultClass) if self.panel_launcher is None: self.panel_launcher = ExternalAppAction( @@ -268,7 +268,7 @@ def showNewPanel(self, args=None, standAlone=False): clName.actionTriggered(clParam if isinstance( clParam, (list, tuple)) else [clParam]) else: - if isinstance(clName, str): + if isinstance(clName, string_types): klass = self.getClass(clName) if klass is None: self.warning("%s Class not found!" % clName) diff --git a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py index d923f73c0..b38a0143a 100644 --- a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py @@ -28,6 +28,7 @@ """ from builtins import str +from future.utils import string_types import re import traceback @@ -276,7 +277,7 @@ def __init__(self, parent=None, model=None, palette=None, bound=True): def loadConfigFile(self, ifile=None): self.info('In TaurusDevicePanel.loadConfigFile(%s)' % ifile) - if isinstance(ifile, file) or isinstance(ifile, str) and not ifile.endswith('.py'): + if isinstance(ifile, file) or isinstance(ifile, string_types) and not ifile.endswith('.py'): TaurusWidget.loadConfigFile(self, ifile) else: from imp import load_source diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py index 0f08fe269..1b7c49569 100644 --- a/lib/taurus/qt/qtgui/panel/taurusvalue.py +++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py @@ -35,6 +35,8 @@ __docformat__ = 'restructuredtext' +from future.utils import string_types + import weakref import re from taurus.external.qt import Qt @@ -1145,7 +1147,8 @@ def createConfig(self, allowUnpickable=False): for key in ('LabelWidget', 'ReadWidget', 'WriteWidget', 'UnitsWidget', 'CustomWidget', 'ExtraWidget'): # calls self.getLabelWidgetClass, self.getReadWidgetClass,... classID = getattr(self, 'get%sClass' % key)() - if isinstance(classID, (str, Qt.QString)) or allowUnpickable: + if (isinstance(classID, string_types + (Qt.QString,)) + or allowUnpickable): #configdict[key] = classID configdict[key] = {'classid': classID} widget = getattr(self, key[0].lower() + key[1:])() diff --git a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py index 1c8280d5d..eb4d2c4b4 100755 --- a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py +++ b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py @@ -30,7 +30,7 @@ # todo: tango-centric from __future__ import print_function - +from future.utils import string_types from builtins import str from taurus.external.qt import Qt, QtCore, QtGui @@ -152,7 +152,7 @@ def setTable(self, dev_name): if USE_TABLES: self.setPropertyValue(value, i, 1) else: - if not isinstance(value, str): # not something like an string + if not isinstance(value, string_types): # not something like an string # adding new lines in between elements in the list value = '\n'.join(str(v) for v in value) self.setText(str(value), i, 1) @@ -336,9 +336,9 @@ def setPropertyValue(self, value, i, j): ''' This method inserts a new table widget inside the cell @deprecated ... use setText() and editProperty() event call instead!!! ''' - if len(value) == 1 and isinstance(value[0], str): + if len(value) == 1 and isinstance(value[0], string_types): value = value[0] - if isinstance(value, str): # and '\n' in value: + if isinstance(value, string_types): # and '\n' in value: value = value.split('\n') if False: # isinstance(value,str): item = QtGui.QTableWidgetItem() diff --git a/lib/taurus/qt/qtgui/table/taurusgrid.py b/lib/taurus/qt/qtgui/table/taurusgrid.py index c67a6daf7..8e5c082e5 100644 --- a/lib/taurus/qt/qtgui/table/taurusgrid.py +++ b/lib/taurus/qt/qtgui/table/taurusgrid.py @@ -34,7 +34,7 @@ # --cpascual 20140827 from __future__ import print_function - +from future.utils import string_types from future import standard_library standard_library.install_aliases() from builtins import str @@ -76,7 +76,7 @@ def get_all_models(expressions, limit=1000): Move this method to taurus.core.tango.search ''' # print( 'In TaurusGrid.get_all_models(%s:"%s") ...' % (type(expressions),expressions)) - if isinstance(expressions, str): + if isinstance(expressions, string_types): # if any(re.match(s,expressions) for s in ('\{.*\}','\(.*\)','\[.*\]')): ##self.debug( 'evaluating expressions ....') # expressions = list(eval(expressions)) @@ -150,7 +150,7 @@ def get_readwrite_models(expressions, limit=1000): For each device only the good attributes are read. ''' # self.debug( 'In TaurusGrid.get_all_models(%s:"%s") ...' % (type(expressions),expressions)) - if isinstance(expressions, str): + if isinstance(expressions, string_types): if any(re.match(s, expressions) for s in ('\{.*\}', '\(.*\)', '\[.*\]')): # self.trace( 'evaluating expressions ....') @@ -435,7 +435,7 @@ def setModel(self, model, devsInRows=False, delayed=False, append=False, if isinstance(model, dict): self.load(model) else: - model = isinstance(model, (str, QtCore.QString)) and [ + model = isinstance(model, string_types + (QtCore.QString,)) and [ model] or list(model) self.trace('#' * 80) self.trace('In TaurusGrid.setModel(%s)' % str(model)[:100]) diff --git a/lib/taurus/test/fuzzytest.py b/lib/taurus/test/fuzzytest.py index 145fef489..ca1949039 100644 --- a/lib/taurus/test/fuzzytest.py +++ b/lib/taurus/test/fuzzytest.py @@ -25,6 +25,7 @@ '''Utility functions to deal with non-ideal (fuzzy) tests''' from __future__ import print_function +from future.utils import string_types def loopTest(testname, maxtries=100, maxfails=10): @@ -102,7 +103,7 @@ def calculateTestFuzziness(test, maxtries=100, maxfails=10, **kwargs): "to estimate the failure rate") % (maxtries, maxfails)) import numpy - if isinstance(test, str): + if isinstance(test, string_types): tries, fails = loopTest(test, maxtries=maxtries, maxfails=maxfails) else: tries, fails = loopSubprocess(test, maxtries=maxtries, From beb01cb3bfbd89ad168513d188ef6a3cf6bc4fc2 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 19 Oct 2018 13:27:41 +0200 Subject: [PATCH 137/252] Remove futurize logs --- futurize.log | 4878 ------------------------------------------ futurize2.log | 5652 ------------------------------------------------- 2 files changed, 10530 deletions(-) delete mode 100644 futurize.log delete mode 100644 futurize2.log diff --git a/futurize.log b/futurize.log deleted file mode 100644 index 4f2613efb..000000000 --- a/futurize.log +++ /dev/null @@ -1,4878 +0,0 @@ ---- doc/auto_rst4api.py (original) -+++ doc/auto_rst4api.py (refactored) -@@ -26,6 +26,7 @@ - - ''' Creates a tree of dirs and restructured text stub files for documenting - the API of a python module with sphinx''' -+from __future__ import print_function - - import sys - import os -@@ -93,10 +94,10 @@ - fullname = os.path.join(dirpath, f) - try: - if self._isautogeneratedfile(fullname): -- print "Removing %s" % fullname -+ print("Removing %s" % fullname) - os.remove(fullname) -- except Exception, e: -- print 'Error accessing %s:%s' % (fullname, repr(e)) -+ except Exception as e: -+ print('Error accessing %s:%s' % (fullname, repr(e))) - - def createClassIndex(self, info, ofname): - ''' -@@ -114,17 +115,17 @@ - classes = ['.'.join((m, c)) - for m, c in classes] # make a full classname - if self.verbose: -- print 'creating "%s" ...' % ofname, -+ print('creating "%s" ...' % ofname, end=' ') - if not os.path.exists(ofname) or (self.overwrite_old and self._isautogeneratedfile(ofname)): - text = self.classindextemplate.render(info=info, classes=classes) - f = open(ofname, "w") - f.write('\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text))) - f.close() - if self.verbose: -- print ' ok.' -+ print(' ok.') - else: - if self.verbose: -- print ' skipping (file already exists)' -+ print(' skipping (file already exists)') - - def createStubs(self, info, docparentpath): - '''creates rst stub files for modules and classes according to the -@@ -139,26 +140,26 @@ - # create the module doc dir if it didn't exist - absdocpath = os.path.join(docparentpath, info['basemodulename']) - if not os.path.exists(absdocpath): -- os.makedirs(absdocpath, mode=0755) -+ os.makedirs(absdocpath, mode=0o755) - # create module index stub in doc parent dir - ofname = os.path.join(docparentpath, "%s.rst" % info['basemodulename']) - if self.verbose: -- print 'creating "%s" ...' % ofname, -+ print('creating "%s" ...' % ofname, end=' ') - if not os.path.exists(ofname) or (self.overwrite_old and self._isautogeneratedfile(ofname)): - text = self.moduletemplate.render(info=info) - f = open(ofname, "w") - f.write('\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text))) - f.close() - if self.verbose: -- print ' ok.' -+ print(' ok.') - else: - if self.verbose: -- print ' skipping (file already exists)' -+ print(' skipping (file already exists)') - # create class stubs - for name in info['localclassnames']: - ofname = os.path.join(absdocpath, "_%s.rst" % name) - if self.verbose: -- print 'creating "%s" ...' % ofname, -+ print('creating "%s" ...' % ofname, end=' ') - if not os.path.exists(ofname) or (self.overwrite_old and self._isautogeneratedfile(ofname)): - text = self.classtemplate.render(info=info, classname=name) - f = open(ofname, "w") -@@ -166,10 +167,10 @@ - '\n'.join((self.AUTOGEN_SIGNATURE, self.AUTOGEN_MESSAGE, text))) - f.close() - if self.verbose: -- print ' ok.' -+ print(' ok.') - else: - if self.verbose: -- print ' skipping (file already exists)' -+ print(' skipping (file already exists)') - # recurse for submodules - for sminfo in info['submodules'].itervalues(): - self.createStubs(sminfo, absdocpath) -@@ -191,7 +192,7 @@ - :return: (list) list of warning messages - ''' - if self.verbose: -- print "\nDocumenting %s..." % modulename -+ print("\nDocumenting %s..." % modulename) - if exclude_patterns is None: - exclude_patterns = self.exclude_patterns - moduleinfo, w = ModuleExplorer.explore(modulename, -@@ -209,16 +210,16 @@ - def main(): - import sys - if len(sys.argv) != 3: -- print 'Usage:\n\t%s modulename docpreffix\n\n' % sys.argv[0] -+ print('Usage:\n\t%s modulename docpreffix\n\n' % sys.argv[0]) - sys.exit(1) - modulename, docparentpath = sys.argv[1:] - creator = Auto_rst4API_Creator(verbose=True) - r = creator.documentModule( - modulename, docparentpath, exclude_patterns=['.*\.test']) -- print '\n\n' + '*' * 50 -- print "Auto Creation of API docs for %s Finished with %i warnings:" % (modulename, len(r)) -- print '\n'.join(r) -- print '*' * 50 + '\n' -+ print('\n\n' + '*' * 50) -+ print("Auto Creation of API docs for %s Finished with %i warnings:" % (modulename, len(r))) -+ print('\n'.join(r)) -+ print('*' * 50 + '\n') - - if __name__ == "__main__": - main() ---- doc/buildmock.py (original) -+++ doc/buildmock.py (refactored) -@@ -36,6 +36,7 @@ - the API of a python module with sphinx''' - - from __future__ import with_statement -+from __future__ import print_function - - import os - import sys -@@ -268,11 +269,11 @@ - continue - # check if the module is indeed importable - try: -- print name -+ print(name) - _import(name) - full_module_names.append(name) - except: -- print '!' -+ print('!') - pass - return full_module_names - -@@ -338,7 +339,7 @@ - if zfile: - _zipdir(outdir, zfile) # compress the dir into the zip file - shutil.rmtree(outdir) # delete the dir -- print '\nMocks written in %s' % output -+ print('\nMocks written in %s' % output) - - - if __name__ == "__main__": ---- doc/source/conf.py (original) -+++ doc/source/conf.py (refactored) -@@ -23,6 +23,7 @@ - # along with Taurus. If not, see . - ## - ############################################################################## -+from __future__ import print_function - import sys - import os - ---- doc/source/devel/examples/parentmodel_issue_demo.py (original) -+++ doc/source/devel/examples/parentmodel_issue_demo.py (refactored) -@@ -8,6 +8,7 @@ - call recheckTaurusParent for all designer created widgets that use TaurusParentModel. - You can do it right after calling the setupUi method. - ''' -+from __future__ import print_function - - from taurus.external.qt import Qt - from taurus.qt.qtgui.container import TaurusWidget -@@ -60,8 +61,8 @@ - # c.recheckTaurusParent() - - p.setModel('sys/tg_test/1/state') --print 'p model:', p.getModelName() --print 'c model:', c.getModelName() -+print('p model:', p.getModelName()) -+print('c model:', c.getModelName()) - - - p.show() ---- doc/source/devel/examples/pyqwt_issue_test.py (original) -+++ doc/source/devel/examples/pyqwt_issue_test.py (refactored) -@@ -15,6 +15,7 @@ - https://bugs.launchpad.net/ubuntu/+source/pyqwt5/+bug/672509 - http://www.esrf.eu/mail_archives/tango/archive/msg04025.html - ''' -+from __future__ import print_function - - from PyQt4 import Qt, Qwt5 - -@@ -39,14 +40,14 @@ - def __init__(self, parent=None): - Qwt5.QwtPlot.__init__(self, parent) - self.setAxisScaleDraw(Qwt5.QwtPlot.xBottom, MyScaleDrawSafe()) -- print "Replotting with MyScaleDrawSafe:..." -+ print("Replotting with MyScaleDrawSafe:...") - self.replot() -- print "ok" -+ print("ok") - self.setAxisScaleDraw(Qwt5.QwtPlot.xBottom, MyScaleDrawDanger()) -- print "Replotting with MyScaleDrawDanger (if it crashes now you are affected by the bug) :..." -+ print("Replotting with MyScaleDrawDanger (if it crashes now you are affected by the bug) :...") - self.replot() -- print "SAFE!!!" -- print "if this is printed, the sip/PyQwt bug does not affect you" -+ print("SAFE!!!") -+ print("if this is printed, the sip/PyQwt bug does not affect you") - - app = Qt.QApplication([]) - p = MyPlot() ---- doc/source/devel/examples/TaurusTest.py (original) -+++ doc/source/devel/examples/TaurusTest.py (refactored) -@@ -1,3 +1,4 @@ -+from __future__ import print_function - import PyTango - import sys - import math -@@ -10,10 +11,10 @@ - TaurusTest.init_device(self) - - def delete_device(self): -- print "[Device delete_device method] for device", self.get_name() -+ print("[Device delete_device method] for device", self.get_name()) - - def init_device(self): -- print "In ", self.get_name(), "::init_device()" -+ print("In ", self.get_name(), "::init_device()") - self.set_state(PyTango.DevState.ON) - self.get_device_properties(self.get_device_class()) - self._position = 50.0 -@@ -24,10 +25,10 @@ - self._curve = [math.sin(x) for x in self._abscissas] - - def always_executed_hook(self): -- print "In ", self.get_name(), "::always_excuted_hook()" -+ print("In ", self.get_name(), "::always_excuted_hook()") - - def read_attr_hardware(self, data): -- print "In ", self.get_name(), "::read_attr_hardware()" -+ print("In ", self.get_name(), "::read_attr_hardware()") - - def read_Position(self, attr): - attr.set_value(self._position) -@@ -68,7 +69,7 @@ - self._curve = attr.get_write_value() - - def create_device_cb(self, device_name): -- print "About to create device", device_name -+ print("About to create device", device_name) - - def CreateTaurusTestDevice(self, device_name): - klass = self.get_device_class() -@@ -173,7 +174,7 @@ - def __init__(self, name): - PyTango.DeviceClass.__init__(self, name) - self.set_type(name) -- print "In TaurusTestClass constructor" -+ print("In TaurusTestClass constructor") - - - if __name__ == '__main__': -@@ -185,7 +186,7 @@ - U.server_init() - U.server_run() - -- except PyTango.DevFailed, e: -- print '-------> Received a DevFailed exception:', e -- except Exception, e: -- print '-------> An unforeseen exception occured....', e -+ except PyTango.DevFailed as e: -+ print('-------> Received a DevFailed exception:', e) -+ except Exception as e: -+ print('-------> An unforeseen exception occured....', e) ---- doc/source/sphinxext/taurusextension.py (original) -+++ doc/source/sphinxext/taurusextension.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################## - - """helper methods for taurus sphinx documentation""" -+from __future__ import print_function - - __expr = ('or',) - -@@ -65,9 +66,9 @@ - new_lines.append('%s:type %s: %s' % - (prefix, param_name, klass)) - new_lines.append('%s:param %s: %s' % (prefix, param_name, desc)) -- except Exception, e: -- print "Taurus sphinx extension: Not able to process param: '%s'" % line -- print " Reason:", str(e) -+ except Exception as e: -+ print("Taurus sphinx extension: Not able to process param: '%s'" % line) -+ print(" Reason:", str(e)) - new_lines.append(line) - return new_lines - -@@ -85,9 +86,9 @@ - desc = desc[pos + 1:] - new_lines.append('%s:rtype: %s' % (prefix, klass)) - new_lines.append('%s:return: %s' % (prefix, desc)) -- except Exception, e: -- print "TaurusExtension: Not able to process 'return': '%s'" % line -- print " Reason:", str(e) -+ except Exception as e: -+ print("TaurusExtension: Not able to process 'return': '%s'" % line) -+ print(" Reason:", str(e)) - new_lines.append(line) - return new_lines - -@@ -105,9 +106,9 @@ - klass = "(" + process_type(elem_type, obj_type='exc') + ")" - desc = desc[pos + 1:] - new_lines.append('%s:raise: %s %s' % (prefix, klass, desc)) -- except Exception, e: -- print "TaurusExtension: Not able to process 'raise': '%s'" % line -- print " Reason:", str(e) -+ except Exception as e: -+ print("TaurusExtension: Not able to process 'raise': '%s'" % line) -+ print(" Reason:", str(e)) - new_lines.append(line) - return new_lines - ---- lib/taurus/console/list.py (original) -+++ lib/taurus/console/list.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """ """ -+from __future__ import absolute_import - - __all__ = ["List"] - -@@ -32,7 +33,7 @@ - import textwrap - import operator - --from enums import Alignment -+from .enums import Alignment - - - class List(list): ---- lib/taurus/console/table.py (original) -+++ lib/taurus/console/table.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """ """ -+from functools import reduce - - __all__ = ["Table"] - -@@ -64,7 +65,7 @@ - if row_head_str is not None and len(row_head_str) != self.nr_row: - msg = 'RowHeadStr nr (%d) and RowNr (%d) mistmatch' % \ - (len(row_head_str), self.nr_row) -- raise ValueError, msg -+ raise ValueError(msg) - if row_head_width is None: - if row_head_str is not None: - row_head_width = max_len_fn(row_head_str) -@@ -77,7 +78,7 @@ - if col_head_str is not None and len(col_head_str) != self.nr_col: - msg = 'ColHeadStr nr (%d) and ColNr (%d) mistmatch' % \ - len(col_head_str), self.nr_col -- raise ValueError, msg -+ raise ValueError(msg) - if col_head_width is None: - if col_head_str is not None: - col_head_width = reduce(max, map(max_len_fn, col_head_str)) ---- lib/taurus/core/epics/epicsattribute.py (original) -+++ lib/taurus/core/epics/epicsattribute.py (refactored) -@@ -25,6 +25,8 @@ - ''' - Epics module. See __init__.py for more detailed documentation - ''' -+from __future__ import print_function -+from __future__ import absolute_import - __all__ = ['EpicsAttribute'] - - -@@ -233,12 +235,12 @@ - # ------------------------------------------------------------------------------ - - def factory(self): -- from epicsfactory import EpicsFactory -+ from .epicsfactory import EpicsFactory - return EpicsFactory() - - @classmethod - def getNameValidator(cls): -- from epicsvalidator import EpicsAttributeNameValidator -+ from .epicsvalidator import EpicsAttributeNameValidator - return EpicsAttributeNameValidator() - - -@@ -251,6 +253,6 @@ - b.write(4.) - s.read() - -- print "!$!", s.read(cache=False) -- print "a,b,s", a.read().rvalue, b.read().rvalue, s.read().rvalue -- print "DF=", a.getDataFormat(), DataFormat.whatis(a.getDataFormat()) -+ print("!$!", s.read(cache=False)) -+ print("a,b,s", a.read().rvalue, b.read().rvalue, s.read().rvalue) -+ print("DF=", a.getDataFormat(), DataFormat.whatis(a.getDataFormat())) ---- lib/taurus/core/epics/epicsfactory.py (original) -+++ lib/taurus/core/epics/epicsfactory.py (refactored) -@@ -25,6 +25,7 @@ - ''' - Epics module. See __init__.py for more detailed documentation - ''' -+from __future__ import absolute_import - __all__ = ['EpicsFactory'] - - -@@ -44,9 +45,9 @@ - from taurus.core.taurusbasetypes import TaurusElementType - from taurus.core.taurusfactory import TaurusFactory - --from epicsattribute import EpicsAttribute --from epicsdevice import EpicsDevice --from epicsauthority import EpicsAuthority -+from .epicsattribute import EpicsAttribute -+from .epicsdevice import EpicsDevice -+from .epicsauthority import EpicsAuthority - - - class EpicsFactory(Singleton, TaurusFactory, Logger): -@@ -145,17 +146,17 @@ - - def getAuthorityNameValidator(self): - """Return EpicsAuthorityNameValidator""" -- import epicsvalidator -+ from . import epicsvalidator - return epicsvalidator.EpicsAuthorityNameValidator() - - def getDeviceNameValidator(self): - """Return EpicsDeviceNameValidator""" -- import epicsvalidator -+ from . import epicsvalidator - return epicsvalidator.EpicsDeviceNameValidator() - - def getAttributeNameValidator(self): - """Return EpicsAttributeNameValidator""" -- import epicsvalidator -+ from . import epicsvalidator - return epicsvalidator.EpicsAttributeNameValidator() - - if __name__ == "__main__": ---- lib/taurus/core/epics/__init__.py (original) -+++ lib/taurus/core/epics/__init__.py (refactored) -@@ -66,5 +66,6 @@ - are just convenience dummy objects in the epics scheme at this point. - Epics records may eventually be mapped as Devices. - """ -+from __future__ import absolute_import - --from epicsfactory import * -+from .epicsfactory import * ---- lib/taurus/core/epics/test/test_epicsattribute.py (original) -+++ lib/taurus/core/epics/test/test_epicsattribute.py (refactored) -@@ -56,7 +56,7 @@ - error=None, - ) - ) --@unittest.skipIf(sys.modules.has_key('epics') is False, -+@unittest.skipIf(('epics' in sys.modules) is False, - "epics module is not available") - class AttributeTestCase(unittest.TestCase): - """TestCase for the taurus.Attribute helper""" ---- lib/taurus/core/epics/test/test_epicsvalidator.py (original) -+++ lib/taurus/core/epics/test/test_epicsvalidator.py (refactored) -@@ -47,7 +47,7 @@ - @invalid(name='ca:/') - @invalid(name='ca:///') - @invalid(name='ca://a') --@unittest.skipIf(sys.modules.has_key('epics') is False, -+@unittest.skipIf(('epics' in sys.modules) is False, - "epics module is not available") - class EpicsAuthValidatorTestCase(AbstractNameValidatorTestCase, - unittest.TestCase): -@@ -66,7 +66,7 @@ - @invalid(name='ca:foo') # device requires absolute path - @invalid(name='ca:/foo') # devname must be empty (for now) - @invalid(name='ca:@foo') --@unittest.skipIf(sys.modules.has_key('epics') is False, -+@unittest.skipIf(('epics' in sys.modules) is False, - "epics module is not available") - class EpicsDevValidatorTestCase(AbstractNameValidatorTestCase, - unittest.TestCase): -@@ -129,7 +129,7 @@ - @valid(name='ca:1#units', groups={'fragment': 'units'}) - @valid(name='ca:a') - @names(name='ca:XXX:sum', out=('ca:XXX:sum', 'XXX:sum', 'XXX:sum')) --@unittest.skipIf(sys.modules.has_key('epics') is False, -+@unittest.skipIf(('epics' in sys.modules) is False, - "epics module is not available") - class EpicsAttrValidatorTestCase(AbstractNameValidatorTestCase, - unittest.TestCase): ---- lib/taurus/core/evaluation/evalattribute.py (original) -+++ lib/taurus/core/evaluation/evalattribute.py (refactored) -@@ -200,7 +200,7 @@ - for n in names[1:-1]: - obj = getattr(obj, n) - obj = getattr(obj.__class__, names[-1]) -- except Exception, e: -+ except Exception as e: - # self.info("%r", e) - return - ###################################################################### -@@ -359,7 +359,7 @@ -#TODO: da qua - self._value.rvalue = rvalue - self._value.time = TaurusTimeVal.now() - self._value.quality = AttrQuality.ATTR_VALID -- except Exception, e: -+ except Exception as e: - self._value.quality = AttrQuality.ATTR_INVALID - msg = " the function '%s' could not be evaluated. Reason: %s" \ - % (self._transformation, repr(e)) ---- lib/taurus/core/evaluation/evalfactory.py (original) -+++ lib/taurus/core/evaluation/evalfactory.py (refactored) -@@ -25,15 +25,16 @@ - ''' - evaluation module. See __init__.py for more detailed documentation - ''' -+from __future__ import absolute_import - __all__ = ['EvaluationFactory'] - - - import weakref - - from taurus.core.taurusbasetypes import TaurusElementType --from evalattribute import EvaluationAttribute --from evalauthority import EvaluationAuthority --from evaldevice import EvaluationDevice -+from .evalattribute import EvaluationAttribute -+from .evalauthority import EvaluationAuthority -+from .evaldevice import EvaluationDevice - from taurus.core.taurusexception import TaurusException, DoubleRegistration - from taurus.core.util.log import Logger - from taurus.core.util.singleton import Singleton -@@ -195,7 +196,7 @@ - if a is None: # if the full name is not there, create one - dev = self.getDevice(validator.getDeviceName(attr_name)) - kwargs['storeCallback'] = self._storeAttr -- if not kwargs.has_key('pollingPeriod'): -+ if 'pollingPeriod' not in kwargs: - kwargs['pollingPeriod'] = self.getDefaultPollingPeriod() - a = EvaluationAttribute(fullname, parent=dev, **kwargs) - return a -@@ -242,15 +243,15 @@ - - def getAuthorityNameValidator(self): - """Return EvaluationAuthorityNameValidator""" -- import evalvalidator -+ from . import evalvalidator - return evalvalidator.EvaluationAuthorityNameValidator() - - def getDeviceNameValidator(self): - """Return EvaluationDeviceNameValidator""" -- import evalvalidator -+ from . import evalvalidator - return evalvalidator.EvaluationDeviceNameValidator() - - def getAttributeNameValidator(self): - """Return EvaluationAttributeNameValidator""" -- import evalvalidator -+ from . import evalvalidator - return evalvalidator.EvaluationAttributeNameValidator() ---- lib/taurus/core/evaluation/evalvalidator.py (original) -+++ lib/taurus/core/evaluation/evalvalidator.py (refactored) -@@ -22,6 +22,7 @@ - ## - ############################################################################# - -+from __future__ import absolute_import - __all__ = ['EvaluationDeviceNameValidator', - 'EvaluationAttributeNameValidator'] - -@@ -180,7 +181,7 @@ - - def getNames(self, fullname, factory=None): - '''reimplemented from :class:`TaurusDeviceNameValidator`''' -- from evalfactory import EvaluationFactory -+ from .evalfactory import EvaluationFactory - # TODO: add mechanism to select strict mode instead of hardcoding here - groups = self.getUriGroups(fullname) - if groups is None: -@@ -424,7 +425,7 @@ - - def getNames(self, fullname, factory=None, fragment=False): - '''reimplemented from :class:`TaurusDeviceNameValidator`''' -- from evalfactory import EvaluationFactory -+ from .evalfactory import EvaluationFactory - groups = self.getUriGroups(fullname) - if groups is None: - return None -@@ -497,7 +498,7 @@ - def getDeviceName(self, name): - #@TODO: Maybe this belongs to the factory, not the validator - '''Obtain the fullname of the device from the attribute name''' -- from evalfactory import EvaluationFactory -+ from .evalfactory import EvaluationFactory - groups = self.getUriGroups(name) - if groups is None: - return None -@@ -512,7 +513,7 @@ - def getDBName(self, s): - #@TODO: Maybe this belongs to the factory, not the validator - '''returns the full data base name for the given attribute name''' -- from evalfactory import EvaluationFactory -+ from .evalfactory import EvaluationFactory - m = self.name_re.match(s) - if m is None: - return None ---- lib/taurus/core/evaluation/__init__.py (original) -+++ lib/taurus/core/evaluation/__init__.py (refactored) -@@ -176,8 +176,9 @@ - This syntax is now deprecated and should not be used. Taurus will - issue warnings if detected. - """ -+from __future__ import absolute_import - --from evalfactory import EvaluationFactory --from evalattribute import EvaluationAttribute --from evalauthority import EvaluationAuthority --from evaldevice import EvaluationDevice -+from .evalfactory import EvaluationFactory -+from .evalattribute import EvaluationAttribute -+from .evalauthority import EvaluationAuthority -+from .evaldevice import EvaluationDevice ---- lib/taurus/core/evaluation/test/res/dev_example.py (original) -+++ lib/taurus/core/evaluation/test/res/dev_example.py (refactored) -@@ -25,6 +25,7 @@ - ''' - Examples on using the evaluation scheme for exposing arbitrary non-tango quantities as taurus attributes - ''' -+from __future__ import print_function - - __all__ = ['FreeSpaceDevice'] - -@@ -70,7 +71,7 @@ - # calculates free space in Gb - a = taurus.Attribute( - 'eval:@taurus.core.evaluation.test.res.dev_example.FreeSpaceDevice/getFreeSpace("/").to("GiB")') -- print "Free space: {:s}".format(a.read().rvalue), a.read().rvalue.units -+ print("Free space: {:s}".format(a.read().rvalue), a.read().rvalue.units) - - - def test2(): ---- lib/taurus/core/evaluation/test/res/ipap_example.py (original) -+++ lib/taurus/core/evaluation/test/res/ipap_example.py (refactored) -@@ -26,6 +26,7 @@ - Examples on using the evaluation scheme for exposing icepap driver values - as taurus attributes - """ -+from __future__ import print_function - - - ATTR_IPAP_POS = ( 'eval:@ipap=pyIcePAP.EthIcePAP("icepap06", port=5000)' + -@@ -35,7 +36,7 @@ - def _test1(): - import taurus.core - a = taurus.Attribute(ATTR_IPAP_POS) -- print "axis pos:", a.read().rvalue -+ print("axis pos:", a.read().rvalue) - - - def _test2(): ---- lib/taurus/core/evaluation/test/res/mymod.py (original) -+++ lib/taurus/core/evaluation/test/res/mymod.py (refactored) -@@ -26,6 +26,7 @@ - """ - This module is used for the tests of custom evaluation devices. - """ -+from __future__ import print_function - - import os - from taurus.external.pint import Quantity -@@ -82,16 +83,16 @@ - def test1(): - n = 'eval:@c=taurus.core.evaluation.test.res.mymod.MyClass(987)/c.foo' - a = taurus.Attribute(n) -- print "READ 1: ", a.read() -+ print("READ 1: ", a.read()) - # print a.range -- print "WRITE+READ", a.write(Quantity(999, "m")) -- print "READ 2: ", a.read(cache=False) -+ print("WRITE+READ", a.write(Quantity(999, "m"))) -+ print("READ 2: ", a.read(cache=False)) - - def test2(models): - for m in models: -- print m -+ print(m) - a = taurus.Attribute(m) -- print " -->", a.writable, a.read().rvalue -+ print(" -->", a.writable, a.read().rvalue) - - models = [ - # instance models ---- lib/taurus/core/init_bkcomp.py (original) -+++ lib/taurus/core/init_bkcomp.py (refactored) -@@ -24,10 +24,11 @@ - ############################################################################# - - """The core module""" -+from __future__ import absolute_import - - __docformat__ = "restructuredtext" - --import release as Release -+from . import release as Release - # from .enums import * #note: all the enums from enums.py were moved to - # taurusbasetypes.py - from .taurusbasetypes import * ---- lib/taurus/core/__init__.py (original) -+++ lib/taurus/core/__init__.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """The core module""" -+from __future__ import absolute_import - - __docformat__ = "restructuredtext" - -@@ -33,6 +34,6 @@ - taurus.tauruscustomsettings, 'LIGHTWEIGHT_IMPORTS', False) - - if LIGHTWEIGHT_IMPORTS: -- from init_lightweight import * -+ from .init_lightweight import * - else: -- from init_bkcomp import * -+ from .init_bkcomp import * ---- lib/taurus/core/resource/__init__.py (original) -+++ lib/taurus/core/resource/__init__.py (refactored) -@@ -99,5 +99,6 @@ - is not even defined). - - """ -+from __future__ import absolute_import - --from resfactory import * -+from .resfactory import * ---- lib/taurus/core/resource/resfactory.py (original) -+++ lib/taurus/core/resource/resfactory.py (refactored) -@@ -26,6 +26,7 @@ - """ - resfactory.py: - """ -+from __future__ import absolute_import - - import os - import imp -@@ -86,7 +87,7 @@ - raise ValueError('priority must be >=1') - if operator.isMappingType(obj): - name = name or 'DICT%02d' % priority -- elif type(obj) in types.StringTypes or obj is None: -+ elif type(obj) in (str,) or obj is None: - name, mod = self.__reloadResource(obj) - obj = {} - for k, v in mod.__dict__.items(): -@@ -136,7 +137,7 @@ - m = imp.load_module(module_name, file_, pathname, desc) - if file_: - file_.close() -- except Exception, e: -+ except Exception as e: - if file_: - file_.close() - raise e -@@ -246,15 +247,15 @@ - - def getAuthorityNameValidator(self): - """Return ResourceAuthorityNameValidator""" -- import resvalidator -+ from . import resvalidator - return resvalidator.ResourceAuthorityNameValidator() - - def getDeviceNameValidator(self): - """Return ResourceDeviceNameValidator""" -- import resvalidator -+ from . import resvalidator - return resvalidator.ResourceDeviceNameValidator() - - def getAttributeNameValidator(self): - """Return ResourceAttributeNameValidator""" -- import resvalidator -+ from . import resvalidator - return resvalidator.ResourceAttributeNameValidator() ---- lib/taurus/core/resource/test/test_resfactory.py (original) -+++ lib/taurus/core/resource/test/test_resfactory.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """Test for taurus.core.resource.test.test_resfactory...""" -+from __future__ import print_function - __all__ = ["ResourceFactoryTestCase"] - - import os.path as osp -@@ -68,7 +69,7 @@ - - file_name1 = osp.join(osp.dirname(osp.abspath(__file__)), - 'res', 'attr_resources_file.py') --print file_name1 -+print(file_name1) - - # TODO: the same key can be defined in different dictionaries (with different - # priority) but getValue method can not access to the less priority values in ---- lib/taurus/core/tango/img/__init__.py (original) -+++ lib/taurus/core/tango/img/__init__.py (refactored) -@@ -25,10 +25,11 @@ - - """The img package. It contains specific part of tango devices dedicated to - images (CCDs, detectors, etc)""" -+from __future__ import absolute_import - - __docformat__ = 'restructuredtext' - --from img import * -+from .img import * - - - def registerExtensions(): ---- lib/taurus/core/tango/__init__.py (original) -+++ lib/taurus/core/tango/__init__.py (refactored) -@@ -102,12 +102,13 @@ - This syntax is now deprecated and should not be used. Taurus will - issue warnings if detected. - """ -+from __future__ import absolute_import - - __docformat__ = "restructuredtext" - --from enums import * --from tangodatabase import * --from tangodevice import * --from tangofactory import * --from tangoattribute import * --from tangoconfiguration import * -+from .enums import * -+from .tangodatabase import * -+from .tangodevice import * -+from .tangofactory import * -+from .tangoattribute import * -+from .tangoconfiguration import * ---- lib/taurus/core/tango/starter.py (original) -+++ lib/taurus/core/tango/starter.py (refactored) -@@ -29,6 +29,7 @@ - It is not a replacement of the Tango Starter Device Server since this is much - more limited in scope. - """ -+from __future__ import print_function - - __docformat__ = 'restructuredtext' - -@@ -236,9 +237,9 @@ - s.addNewDevice(devname, klass='Timeout') - s.startDs() - try: -- print 'Is running:', s.isRunning() -- print "ping:", PyTango.DeviceProxy(devname).ping() -- except Exception, e: -- print e -+ print('Is running:', s.isRunning()) -+ print("ping:", PyTango.DeviceProxy(devname).ping()) -+ except Exception as e: -+ print(e) - s.stopDs() - s.cleanDb(force=False) ---- lib/taurus/core/tango/tangoattribute.py (original) -+++ lib/taurus/core/tango/tangoattribute.py (refactored) -@@ -425,7 +425,7 @@ - # handle old PyTango - dev.write_attribute(name, value) - result = dev.read_attribute(name) -- except PyTango.DevFailed, df: -+ except PyTango.DevFailed as df: - for err in df: - # Handle old device servers - if err.reason == 'API_UnsupportedFeature': -@@ -439,12 +439,12 @@ - else: - dev.write_attribute(name, value) - return None -- except PyTango.DevFailed, df: -+ except PyTango.DevFailed as df: - err = df[0] - self.error("[Tango] write failed (%s): %s" % - (err.reason, err.desc)) - raise df -- except Exception, e: -+ except Exception as e: - self.error("[Tango] write failed: %s" % str(e)) - raise e - -@@ -473,12 +473,12 @@ - ): - return - self.__attr_value = value -- except PyTango.DevFailed, df: -+ except PyTango.DevFailed as df: - self.__subscription_event.set() - self.debug("Error polling: %s" % df[0].desc) - self.traceback() - self.fireEvent(TaurusEventType.Error, self.__attr_err) -- except Exception, e: -+ except Exception as e: - self.__subscription_event.set() - self.debug("Error polling: %s" % str(e)) - self.fireEvent(TaurusEventType.Error, self.__attr_err) -@@ -686,7 +686,7 @@ - try: - self.__dev_hw_obj.unsubscribe_event(self.__chg_evt_id) - self.__chg_evt_id = None -- except PyTango.DevFailed, df: -+ except PyTango.DevFailed as df: - if len(df.args) and df[0].reason == 'API_EventNotFound': - # probably tango shutdown has been initiated before and - # it unsubscribed from events itself -@@ -751,7 +751,7 @@ - try: - self.__dev_hw_obj.unsubscribe_event(self.__cfg_evt_id) - self.__cfg_evt_id = None -- except PyTango.DevFailed, e: -+ except PyTango.DevFailed as e: - self.debug("Error trying to unsubscribe configuration events") - self.trace(str(e)) - ---- lib/taurus/core/tango/tangodatabase.py (original) -+++ lib/taurus/core/tango/tangodatabase.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module contains all taurus tango authority""" -+from __future__ import print_function - - __all__ = ["TangoInfo", "TangoAttrInfo", "TangoDevInfo", "TangoServInfo", - "TangoDevClassInfo", "TangoDatabaseCache", "TangoDatabase", -@@ -288,8 +289,8 @@ - if not alive: - break - self._alive = alive -- except Exception, e: -- print "except", e -+ except Exception as e: -+ print("except", e) - self._alive = False - self._alivePending = False - return self._alive -@@ -514,9 +515,9 @@ - for dev in other: - try: - self.addDevice(dev) -- except Exception, e: -- print e -- except Exception, e: -+ except Exception as e: -+ print(e) -+ except Exception as e: - raise Exception( - "Must give dict or sequence") - -@@ -560,9 +561,9 @@ - for serv in other: - try: - self.addServer(serv) -- except Exception, e: -- print e -- except Exception, e: -+ except Exception as e: -+ print(e) -+ except Exception as e: - raise Exception( - "Must give dict or sequence") - -@@ -666,7 +667,7 @@ - try: - host, port = TangoAuthority.get_default_tango_host().rsplit(':', 1) - pars = host, port -- except Exception, e: -+ except Exception as e: - from taurus import warning - warning("Error getting default Tango host") - else: ---- lib/taurus/core/tango/tangodevice.py (original) -+++ lib/taurus/core/tango/tangodevice.py (refactored) -@@ -201,7 +201,7 @@ - def _createHWObject(self): - try: - return DeviceProxy(self.getFullName()) -- except DevFailed, e: -+ except DevFailed as e: - self.warning('Could not create HW object: %s' % (e[0].desc)) - self.traceback() - ---- lib/taurus/core/tango/tangofactory.py (original) -+++ lib/taurus/core/tango/tangofactory.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module provides the `TangoFactory` object""" -+from __future__ import absolute_import - - __all__ = ["TangoFactory"] - -@@ -220,7 +221,7 @@ - - :param attr_name: (str) attribute name - """ -- if self.tango_attr_klasses.has_key(attr_name): -+ if attr_name in self.tango_attr_klasses: - del self.tango_attr_klasses[attr_name] - - def registerDeviceClass(self, dev_klass_name, dev_klass): -@@ -239,7 +240,7 @@ - - :param dev_klass_name: (str) tango device class name - """ -- if self.tango_dev_klasses.has_key(dev_klass_name): -+ if dev_klass_name in self.tango_dev_klasses: - del self.tango_dev_klasses[dev_klass_name] - - def getDatabase(self, name=None): -@@ -398,7 +399,7 @@ - attr_klass = self._getAttributeClass( - attr_name=attr_name) - kwargs['storeCallback'] = self._storeAttribute -- if not kwargs.has_key('pollingPeriod'): -+ if 'pollingPeriod' not in kwargs: - kwargs[ - 'pollingPeriod'] = self.getDefaultPollingPeriod() - attr = attr_klass(full_attr_name, dev, **kwargs) -@@ -514,10 +515,10 @@ - raise KeyError("Device %s not found" % dev_or_dev_name) - dev.cleanUp() - full_name = dev.getFullName() -- if self.tango_devs.has_key(full_name): -+ if full_name in self.tango_devs: - del self.tango_devs[full_name] - simp_name = dev.getSimpleName() -- if self.tango_alias_devs.has_key(simp_name): -+ if simp_name in self.tango_alias_devs: - del self.tango_alias_devs[simp_name] - - def removeExistingAttribute(self, attr_or_attr_name): -@@ -533,7 +534,7 @@ - raise KeyError("Attribute %s not found" % attr_or_attr_name) - attr.cleanUp() - full_name = attr.getFullName() -- if self.tango_attrs.has_key(full_name): -+ if full_name in self.tango_attrs: - del self.tango_attrs[full_name] - - def isPollingEnabled(self): -@@ -567,17 +568,17 @@ - - def getAuthorityNameValidator(self): - """Return TangoAuthorityNameValidator""" -- import tangovalidator -+ from . import tangovalidator - return tangovalidator.TangoAuthorityNameValidator() - - def getDeviceNameValidator(self): - """Return TangoDeviceNameValidator""" -- import tangovalidator -+ from . import tangovalidator - return tangovalidator.TangoDeviceNameValidator() - - def getAttributeNameValidator(self): - """Return TangoAttributeNameValidator""" -- import tangovalidator -+ from . import tangovalidator - return tangovalidator.TangoAttributeNameValidator() - - def setOperationMode(self, mode): ---- lib/taurus/core/tango/test/__init__.py (original) -+++ lib/taurus/core/tango/test/__init__.py (refactored) -@@ -23,4 +23,5 @@ - ## - ############################################################################# - --from tgtestds import TangoSchemeTestLauncher -+from __future__ import absolute_import -+from .tgtestds import TangoSchemeTestLauncher ---- lib/taurus/core/tango/util/__init__.py (original) -+++ lib/taurus/core/tango/util/__init__.py (refactored) -@@ -24,7 +24,8 @@ - ############################################################################# - - """The sardana package. It contains specific part of sardana""" -+from __future__ import absolute_import - - __docformat__ = 'restructuredtext' - --from formatter import tangoFormatter -+from .formatter import tangoFormatter ---- lib/taurus/core/taurusauthority.py (original) -+++ lib/taurus/core/taurusauthority.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module contains the base class for a taurus database""" -+from __future__ import absolute_import - - __all__ = ["TaurusAuthority"] - -@@ -87,7 +88,7 @@ - - def getDevice(self, devname): - """Returns the device object given its name""" -- import taurusdevice -+ from . import taurusdevice - return self.factory().getObject(taurusdevice.TaurusDevice, devname) - - @property ---- lib/taurus/core/taurusfactory.py (original) -+++ lib/taurus/core/taurusfactory.py (refactored) -@@ -55,6 +55,7 @@ - ) - - """ -+from __future__ import absolute_import - - __all__ = ["TaurusFactory"] - -@@ -62,12 +63,12 @@ - - import atexit - from weakref import WeakValueDictionary --from taurusbasetypes import TaurusElementType --from taurusauthority import TaurusAuthority --from taurusdevice import TaurusDevice --from taurusattribute import TaurusAttribute --from taurusconfiguration import TaurusConfiguration, TaurusConfigurationProxy --from taurusexception import TaurusException -+from .taurusbasetypes import TaurusElementType -+from .taurusauthority import TaurusAuthority -+from .taurusdevice import TaurusDevice -+from .taurusattribute import TaurusAttribute -+from .taurusconfiguration import TaurusConfiguration, TaurusConfigurationProxy -+from .taurusexception import TaurusException - from taurus.core.tauruspollingtimer import TaurusPollingTimer - - -@@ -93,7 +94,7 @@ - self._devs = WeakValueDictionary() - self._auths = WeakValueDictionary() - -- import taurusmanager -+ from . import taurusmanager - manager = taurusmanager.TaurusManager() - self._serialization_mode = manager.getSerializationMode() - ---- lib/taurus/core/taurushelper.py (original) -+++ lib/taurus/core/taurushelper.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """a list of helper methods""" -+from __future__ import print_function - - __all__ = ['check_dependencies', 'log_dependencies', 'getSchemeFromName', - 'getValidTypesForName', 'isValidName', 'makeSchemeExplicit', -@@ -74,36 +75,36 @@ - } - import pkg_resources - d = pkg_resources.get_distribution('taurus') -- print "Dependencies for %s:" % d -+ print("Dependencies for %s:" % d) - # minimum requirements (without extras) - for r in d.requires(): - try: - pkg_resources.require(str(r)) -- print '\t[*]', -+ print('\t[*]', end=' ') - except Exception: -- print '\t[ ]', -- print '%s' % r -+ print('\t[ ]', end=' ') -+ print('%s' % r) - # requirements for the extras -- print '\nExtras:' -+ print('\nExtras:') - for extra in sorted(d.extras): -- print "Dependencies for taurus[%s]:" % extra -+ print("Dependencies for taurus[%s]:" % extra) - # requirements from PyPI - for r in d.requires(extras=[extra]): - try: - r = str(r).split(';')[0] # remove marker if present (see #612) - pkg_resources.require(r) -- print '\t[*]', -+ print('\t[*]', end=' ') - except Exception: -- print '\t[ ]', -- print '%s' % r -+ print('\t[ ]', end=' ') -+ print('%s' % r) - # requirements outside PyPI - for r, check in non_pypi.get(extra, ()): - try: - check() -- print '\t[*]', -+ print('\t[*]', end=' ') - except Exception: -- print '\t[ ]', -- print '%s (not in PyPI)' % r -+ print('\t[ ]', end=' ') -+ print('%s (not in PyPI)' % r) - - - def log_dependencies(): -@@ -296,7 +297,7 @@ - if attr_name is None: - return Factory(scheme=getSchemeFromName(dev_or_attr_name)).getAttribute(dev_or_attr_name) - else: -- if type(dev_or_attr_name) in types.StringTypes: -+ if type(dev_or_attr_name) in (str,): - dev = Device(dev_or_attr_name) - else: - dev = dev_or_attr_name ---- lib/taurus/core/tauruslistener.py (original) -+++ lib/taurus/core/tauruslistener.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module contains the taurus base listeners classes""" -+from __future__ import print_function - - __all__ = ["TaurusListener", "TaurusExceptionListener"] - -@@ -70,4 +71,4 @@ - self._printException(exception) - - def _printException(self, exception): -- print self.__class__.__name__, "received", exception.__class__.__name__, str(exception) -+ print(self.__class__.__name__, "received", exception.__class__.__name__, str(exception)) ---- lib/taurus/core/taurusmanager.py (original) -+++ lib/taurus/core/taurusmanager.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module contains the taurus base manager class""" -+from __future__ import print_function - - __all__ = ["TaurusManager"] - -@@ -291,7 +292,7 @@ - for plugin_class in plugin_classes: - schemes = list(plugin_class.schemes) - for scheme in schemes: -- if plugins.has_key(scheme): -+ if scheme in plugins: - k = plugins[scheme] - self.warning("Conflicting plugins: %s and %s both implement " - "scheme %s. Will keep using %s" % (k.__name__, -@@ -336,7 +337,7 @@ - for full_module_name in full_module_names: - try: - m = __import__(full_module_name, fromlist=['*'], level=0) -- except Exception, imp1: -+ except Exception as imp1: - # just in case we are in python 2.4 - try: - m = __import__(full_module_name, -@@ -397,4 +398,4 @@ - - if __name__ == '__main__': - manager = TaurusManager() -- print manager.getPlugins() -+ print(manager.getPlugins()) ---- lib/taurus/core/tauruspollingtimer.py (original) -+++ lib/taurus/core/tauruspollingtimer.py (refactored) -@@ -75,7 +75,7 @@ - self.lock.acquire() - try: - attr_dict = self.dev_dict.get(dev) -- return attr_dict and attr_dict.has_key(attr_name) -+ return attr_dict and attr_name in attr_dict - finally: - self.lock.release() - ---- lib/taurus/core/taurusvalidator.py (original) -+++ lib/taurus/core/taurusvalidator.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module contains the base taurus name validator classes""" -+from __future__ import print_function - - - __all__ = ["TaurusAuthorityNameValidator", "TaurusDeviceNameValidator", -@@ -313,5 +314,5 @@ - - v = FooAttributeNameValidator() - name = 'foo://bar#label' -- print v.isValid(name) -- print v.getUriGroups(name) -+ print(v.isValid(name)) -+ print(v.getUriGroups(name)) ---- lib/taurus/core/util/argparse/taurusargparse.py (original) -+++ lib/taurus/core/util/argparse/taurusargparse.py (refactored) -@@ -198,7 +198,7 @@ - rfoo.utils.rconsole.spawn_server(port=options.remote_console_port) - taurus.info("rconsole started. You can connect to it by typing: rconsole -p %d", - options.remote_console_port) -- except Exception, e: -+ except Exception as e: - taurus.warning("Cannot spawn debugger. Reason: %s", str(e)) - - # initialize default formatter ---- lib/taurus/core/util/codecs.py (original) -+++ lib/taurus/core/util/codecs.py (refactored) -@@ -62,6 +62,7 @@ - >>> codec = CodecFactory().getCodec(v.format) - >>> f, d = codec.decode((v.format, v.value)) - """ -+from __future__ import absolute_import - - __all__ = ["Codec", "NullCodec", "ZIPCodec", "BZ2Codec", "JSONCodec", - "FunctionCodec", "PlotCodec", "CodecPipeline", "CodecFactory"] -@@ -74,9 +75,9 @@ - import struct - import numpy - --from singleton import Singleton --from log import Logger --from containers import CaselessDict -+from .singleton import Singleton -+from .log import Logger -+from .containers import CaselessDict - - - class Codec(Logger): -@@ -879,7 +880,7 @@ - self._codec_klasses[format] = klass - - # del old codec if exists -- if self._codecs.has_key(format): -+ if format in self._codecs: - del self._codecs[format] - - def unregisterCodec(self, format): -@@ -889,10 +890,10 @@ - :param format: (str) the codec id - - :raises: KeyError""" -- if self._codec_klasses.has_key(format): -+ if format in self._codec_klasses: - del self._codec_klasses[format] - -- if self._codecs.has_key(format): -+ if format in self._codecs: - del self._codecs[format] - - def getCodec(self, format): ---- lib/taurus/core/util/colors.py (original) -+++ lib/taurus/core/util/colors.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module contains color codes for state and quality""" -+from __future__ import print_function - - __all__ = ["DEVICE_STATE_DATA", "ATTRIBUTE_QUALITY_DATA", "ColorPalette", - "DEVICE_STATE_PALETTE", "ATTRIBUTE_QUALITY_PALETTE"] -@@ -94,7 +95,7 @@ - self._int_decoder_dict = int_decoder_dict - - def _decoder(self, elem): -- if type(elem) == types.IntType or type(elem) == types.LongType: -+ if type(elem) == int or type(elem) == int: - elem = self._int_decoder_dict.get(elem) - return str(elem) - -@@ -133,7 +134,7 @@ - return self._rgb_data[name][0] - - def has(self, name): -- return self._rgb_data.has_key(name) -+ return name in self._rgb_data - - def size(self): - return len(self._rgb_data) -@@ -215,7 +216,7 @@ - bg_color = pal.name(stoq) - rgb = "(%3.3d, %3.3d, %3.3d)" % pal.rgb(stoq) - hx = pal.hex(stoq) -- print "%7s %5s on %13s %15s #%s" % (stoq, fg_color, bg_color, rgb, hx) -+ print("%7s %5s on %13s %15s #%s" % (stoq, fg_color, bg_color, rgb, hx)) - - - if __name__ == "__main__": -@@ -223,8 +224,8 @@ - print_color_palette(ATTRIBUTE_QUALITY_PALETTE) - from taurus.core import TaurusDevState - import PyTango -- print -- print DEVICE_STATE_PALETTE.rgb(TaurusDevState.Ready) -- print DEVICE_STATE_PALETTE.rgb('TaurusDevState.Ready') -- print DEVICE_STATE_PALETTE.rgb(PyTango.DevState.ON) -- print DEVICE_STATE_PALETTE.rgb(0) -+ print() -+ print(DEVICE_STATE_PALETTE.rgb(TaurusDevState.Ready)) -+ print(DEVICE_STATE_PALETTE.rgb('TaurusDevState.Ready')) -+ print(DEVICE_STATE_PALETTE.rgb(PyTango.DevState.ON)) -+ print(DEVICE_STATE_PALETTE.rgb(0)) ---- lib/taurus/core/util/constant.py (original) -+++ lib/taurus/core/util/constant.py (refactored) -@@ -60,8 +60,8 @@ - def __setattr__(self, name, value): - v = self.__dict__.get(name, value) - if type(v) is not type(value): -- raise self._ConstTypeError, "Can't rebind %s to %s" % ( -- type(v), type(value)) -+ raise self._ConstTypeError("Can't rebind %s to %s" % ( -+ type(v), type(value))) - self.__dict__[name] = value - - def __del__(self): ---- lib/taurus/core/util/containers.py (original) -+++ lib/taurus/core/util/containers.py (refactored) -@@ -27,6 +27,7 @@ - This module contains a set of useful containers that are not part of the standard - python distribution. - """ -+from __future__ import print_function - - __all__ = ["CaselessList", "CaselessDict", "CaselessWeakValueDict", "LoopList", - "CircBuf", "LIFO", "TimedQueue", "self_locked", "ThreadDict", -@@ -682,12 +683,12 @@ - self.lock.acquire() - try: - if self.trace: -- print "locked: %s" % self.lock -+ print("locked: %s" % self.lock) - result = func(self, *args, **kwargs) - finally: - self.lock.release() - if self.trace: -- print "released: %s" % self.lock -+ print("released: %s" % self.lock) - return result - return lock_fun - -@@ -721,7 +722,7 @@ - self.parent = type(self).mro()[1] - - def tracer(self, text): -- print text -+ print(text) - - def start(self): - import threading -@@ -1052,7 +1053,7 @@ - lines = [] - if isinstance(d, dict): - for k, v in d.items(): -- print 'with key "%s"' % k -+ print('with key "%s"' % k) - lines.append([''] * l + [str(k)]) - lines += add_to_level(l + 1, v) - elif type(d) in [list, set]: # End of recursion -@@ -1065,7 +1066,7 @@ - lines.append([''] * l + [str(d)]) - return lines - ls = ['\t'.join(line) for line in add_to_level(0, dct)] -- print 'lines are : \n', ls -+ print('lines are : \n', ls) - return '\n'.join(ls) - - ---- lib/taurus/core/util/decorator/typecheck.py (original) -+++ lib/taurus/core/util/decorator/typecheck.py (refactored) -@@ -62,6 +62,7 @@ - TypeError: 'fib' method accepts (int), but was given (float) - - """ -+from __future__ import print_function - - __all__ = ["accepts", "returns"] - -@@ -97,17 +98,17 @@ - if argtypes != types: - msg = info(f.__name__, types, argtypes, 0) - if debug == 1: -- print >> sys.stderr, 'TypeWarning: ', msg -+ print('TypeWarning: ', msg, file=sys.stderr) - elif debug == 2: -- raise TypeError, msg -+ raise TypeError(msg) - return f(*args) - newf.__name__ = f.__name__ - return newf - return decorator -- except KeyError, key: -- raise KeyError, key + "is not a valid keyword argument" -- except TypeError, msg: -- raise TypeError, msg -+ except KeyError as key: -+ raise KeyError(key + "is not a valid keyword argument") -+ except TypeError as msg: -+ raise TypeError(msg) - - - def returns(ret_type, **kw): -@@ -138,17 +139,17 @@ - if res_type != ret_type: - msg = info(f.__name__, (ret_type,), (res_type,), 1) - if debug == 1: -- print >> sys.stderr, 'TypeWarning: ', msg -+ print('TypeWarning: ', msg, file=sys.stderr) - elif debug == 2: -- raise TypeError, msg -+ raise TypeError(msg) - return result - newf.__name__ = f.__name__ - return newf - return decorator -- except KeyError, key: -- raise KeyError, key + "is not a valid keyword argument" -- except TypeError, msg: -- raise TypeError, msg -+ except KeyError as key: -+ raise KeyError(key + "is not a valid keyword argument") -+ except TypeError as msg: -+ raise TypeError(msg) - - - def info(fname, expected, actual, flag): ---- lib/taurus/core/util/enumeration.py (original) -+++ lib/taurus/core/util/enumeration.py (refactored) -@@ -149,7 +149,7 @@ - return self.lookup[i] - - def __getattr__(self, attr): -- if not self.has_key(attr): -+ if attr not in self: - raise AttributeError - return self.lookup[attr] - ---- lib/taurus/core/util/event.py (original) -+++ lib/taurus/core/util/event.py (refactored) -@@ -26,6 +26,8 @@ - """ - event.py: - """ -+from __future__ import print_function -+from __future__ import absolute_import - - __all__ = ["BoundMethodWeakref", "CallableRef", "EventGenerator", - "ConfigEventGenerator", "ListEventGenerator", "EventListener", -@@ -95,7 +97,7 @@ - :return: a weak reference for the given callable - :rtype: BoundMethodWeakref or weakref.ref""" - if hasattr(object, 'im_self'): -- if object.im_self is not None: -+ if object.__self__ is not None: - return BoundMethodWeakref(object, del_cb) - return weakref.ref(object, del_cb) - -@@ -151,7 +153,7 @@ - return read - - --from object import Object -+from .object import Object - - - class EventGenerator(Object): -@@ -202,7 +204,7 @@ - :type data: boolean - """ - if not self.events_active: -- raise RuntimeError, ('%s does not have ' -+ raise RuntimeError('%s does not have ' - 'events/polling active' % self.event_name) - - cb_ref = CallableRef(cb, self.unsubscribeDeletedEvent) -@@ -210,7 +212,7 @@ - try: - self.lock() - if (cb_ref, data) in self.cb_list: -- raise RuntimeError, ('Callback %s(%s) already reg. on %s' % -+ raise RuntimeError('Callback %s(%s) already reg. on %s' % - (cb, data, self.event_name)) - self.cb_list.append((cb_ref, data)) - if with_first_event: -@@ -314,7 +316,7 @@ - :return: the value of the event that unblocked the wait - :rtype: object""" - if not self.events_active: -- raise RuntimeError, ('%s does not have ' -+ raise RuntimeError('%s does not have ' - 'events/polling active' % self.event_name) - try: - self.lock() -@@ -539,8 +541,8 @@ - name = th.name - else: - name = "" -- print "WARNING: Thread %s trying to unlock condition previously " \ -- "locked by thread %s" % (curr_th.name, name) -+ print("WARNING: Thread %s trying to unlock condition previously " \ -+ "locked by thread %s" % (curr_th.name, name)) - - def clearEventSet(self): - "Clears the internal event buffer" -@@ -652,7 +654,7 @@ - return - self._cond.wait(timeout) - retries -= 1 -- except Exception, e: -+ except Exception as e: - sys.stderr.write( - "AttributeEventWait: Caught exception while waitting: %s\n" % str(e)) - raise e -@@ -693,8 +695,8 @@ - lock = getattr(self._cond, "_Condition__lock") - th = getattr(lock, "_RLock__owner") - curr_th = threading.current_thread() -- print "WARNING: Thread %s trying to unlock condition previously " \ -- "locked by thread %s" % (curr_th.name, th.name) -+ print("WARNING: Thread %s trying to unlock condition previously " \ -+ "locked by thread %s" % (curr_th.name, th.name)) - - def eventReceived(self, s, t, v): - if t not in (taurus.core.taurusbasetypes.TaurusEventType.Change, taurus.core.taurusbasetypes.TaurusEventType.Periodic): -@@ -716,7 +718,7 @@ - while True: - self._cond.wait(timeout) - yield self._data -- except Exception, e: -- print "INFO: Caught exception while waiting", str(e) -- finally: -- self.unlock() -+ except Exception as e: -+ print("INFO: Caught exception while waiting", str(e)) -+ finally: -+ self.unlock() ---- lib/taurus/core/util/fandango_search.py (original) -+++ lib/taurus/core/util/fandango_search.py (refactored) -@@ -125,7 +125,7 @@ - db = taurus.Authority() - try: - return db.get_device_alias(alias) -- except Exception, e: -+ except Exception as e: - if 'no device found' in str(e).lower(): - return None - return None # raise e -@@ -137,7 +137,7 @@ - # .get_database_device().DbGetDeviceAlias(dev) - result = db.get_alias(dev) - return result -- except Exception, e: -+ except Exception as e: - if 'no alias found' in str(e).lower(): - return None - return None # raise e ---- lib/taurus/core/util/init_bkcomp.py (original) -+++ lib/taurus/core/util/init_bkcomp.py (refactored) -@@ -33,6 +33,7 @@ - #. if python >= 2.6 use standard json from python distribution - #. otherwise use private implementation distributed with taurus - """ -+from __future__ import absolute_import - - __docformat__ = "restructuredtext" - -@@ -61,7 +62,7 @@ - from .threadpool import * - from .user import * - --import eventfilters -+from . import eventfilters - - try: - from lxml import etree ---- lib/taurus/core/util/__init__.py (original) -+++ lib/taurus/core/util/__init__.py (refactored) -@@ -33,6 +33,7 @@ - #. if python >= 2.6 use standard json from python distribution - #. otherwise use private implementation distributed with taurus - """ -+from __future__ import absolute_import - - __docformat__ = "restructuredtext" - -@@ -42,6 +43,6 @@ - taurus.tauruscustomsettings, 'LIGHTWEIGHT_IMPORTS', False) - - if LIGHTWEIGHT_IMPORTS: -- from init_lightweight import * -+ from .init_lightweight import * - else: -- from init_bkcomp import * -+ from .init_bkcomp import * ---- lib/taurus/core/util/log.py (original) -+++ lib/taurus/core/util/log.py (refactored) -@@ -25,6 +25,8 @@ - - """This module contains a set of useful logging elements based on python's - :mod:`logging` system.""" -+from __future__ import print_function -+from __future__ import absolute_import - - __all__ = ["LogIt", "TraceIt", "DebugIt", "InfoIt", "WarnIt", "ErrorIt", - "CriticalIt", "MemoryLogHandler", "LogExceptHook", "Logger", -@@ -45,9 +47,9 @@ - import threading - import functools - --from object import Object --from wrap import wraps --from excepthook import BaseExceptHook -+from .object import Object -+from .wrap import wraps -+from .excepthook import BaseExceptHook - - # ------------------------------------------------------------------------------ - # TODO: substitute this ugly hack (below) by a more general mechanism -@@ -168,7 +170,7 @@ - return f(*args, **kwargs) - - has_log = hasattr(f_self, "log") -- fname = f.func_name -+ fname = f.__name__ - log_obj = f_self - if not has_log: - log_obj = logging.getLogger() -@@ -188,7 +190,7 @@ - out_msg = "<-" - try: - ret = f(*args, **kwargs) -- except Exception, e: -+ except Exception as e: - exc_info = sys.exc_info() - out_msg += " (with %s) %s" % (e.__class__.__name__, fname) - log_obj.log(self._level, out_msg, exc_info=exc_info) -@@ -325,27 +327,27 @@ - def __call__(self, f): - @wraps(f) - def wrapper(*args, **kwargs): -- fname = f.func_name -+ fname = f.__name__ - in_msg = "-> %s" % fname - if self._showargs: - if len(args) > 1: - in_msg += str(args[1:]) - if len(kwargs): - in_msg += str(kwargs) -- print -- print in_msg -+ print() -+ print(in_msg) - out_msg = "<-" - try: - ret = f(*args, **kwargs) -- except Exception, e: -+ except Exception as e: - out_msg += " (with %s) %s" % (e.__class__.__name__, fname) -- print out_msg -+ print(out_msg) - raise - out_msg += " %s" % fname - if not ret is None and self._showret: - out_msg += " = %s" % str(ret) -- print out_msg -- print -+ print(out_msg) -+ print() - return ret - return wrapper - -@@ -1070,4 +1072,4 @@ - - zab - """ - -- print foo.__doc__ -+ print(foo.__doc__) ---- lib/taurus/core/util/parse_args.py (original) -+++ lib/taurus/core/util/parse_args.py (refactored) -@@ -23,6 +23,7 @@ - ## - ############################################################################# - -+from __future__ import print_function - from ast import literal_eval - - -@@ -60,7 +61,7 @@ - - if __name__ == "__main__": - -- print parse_args('1, 2, b=3, c=4') -- print parse_args(' (1, 2, b=3, c=4 )', strip_pars=True) -+ print(parse_args('1, 2, b=3, c=4')) -+ print(parse_args(' (1, 2, b=3, c=4 )', strip_pars=True)) - -- print parse_args('1, 2, b=3, c=4, 5') # <--this should raise a SyntaxError -+ print(parse_args('1, 2, b=3, c=4, 5')) # <--this should raise a SyntaxError ---- lib/taurus/core/util/propertyfile.py (original) -+++ lib/taurus/core/util/propertyfile.py (refactored) -@@ -170,7 +170,7 @@ - # same property - while line[-1] == '\\': - # Read next line -- nextline = i.next() -+ nextline = next(i) - nextline = nextline.strip() - lineno += 1 - # This line will become part of the value -@@ -216,7 +216,7 @@ - self._props[key] = value.strip() - - # Check if an entry exists in pristine keys -- if self._keymap.has_key(key): -+ if key in self._keymap: - oldkey = self._keymap.get(key) - self._origprops[oldkey] = oldvalue.strip() - else: -@@ -247,15 +247,15 @@ - - # For the time being only accept file input streams - if type(stream) is not file: -- raise TypeError, 'Argument should be a file object!' -+ raise TypeError('Argument should be a file object!') - # Check for the opened mode - if stream.mode != 'r': -- raise ValueError, 'Stream should be opened in read-only mode!' -+ raise ValueError('Stream should be opened in read-only mode!') - - try: - lines = stream.readlines() - self.__parse(lines) -- except IOError, e: -+ except IOError as e: - raise - - def getProperty(self, key): -@@ -269,7 +269,7 @@ - if type(key) is str and type(value) is str: - self.processPair(key, value) - else: -- raise TypeError, 'both key and value should be strings!' -+ raise TypeError('both key and value should be strings!') - - def propertyNames(self): - """ Return an iterator over all the keys of the property -@@ -290,7 +290,7 @@ - with the optional 'header' """ - - if out.mode[0] != 'w': -- raise ValueError, 'Steam should be opened in write mode!' -+ raise ValueError('Steam should be opened in write mode!') - - try: - out.write(''.join(('#', header, '\n'))) -@@ -302,7 +302,7 @@ - out.write(''.join((prop, '=', self.escape(val), '\n'))) - - out.close() -- except IOError, e: -+ except IOError as e: - raise - - def getPropertyDict(self): ---- lib/taurus/core/util/property_parser.py (original) -+++ lib/taurus/core/util/property_parser.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This is an experimental property parser""" -+from __future__ import print_function - - import os - -@@ -68,7 +69,7 @@ - else: - t.value = float(t.value) - except: -- print "[%d]: Number %s is not valid!" % (t.lineno, t.value) -+ print("[%d]: Number %s is not valid!" % (t.lineno, t.value)) - t.value = 0 - return t - -@@ -117,12 +118,12 @@ - - - def t_error(t): -- print "[%d]: Illegal character '%s'" % (t.lexer.lineno, t.value[0]) -+ print("[%d]: Illegal character '%s'" % (t.lexer.lineno, t.value[0])) - t.lexer.skip(1) - - - def p_error(p): -- print "[%d]: Syntax error in input [%s]" % (p.lineno, (str(p))) -+ print("[%d]: Syntax error in input [%s]" % (p.lineno, (str(p)))) - - #------------------------------------------------------------------------- - # Yacc Starting symbol -@@ -228,7 +229,7 @@ - res = self.parse_file( - f, logger=logger, debug=debug, optimize=optimize) - f.close() -- except IOError, e: -+ except IOError as e: - if f: - f.close() - raise -@@ -241,4 +242,4 @@ - import sys - pp = PropertyParser() - res = pp.parse(sys.argv[1]) -- print res -+ print(res) ---- lib/taurus/core/util/prop.py (original) -+++ lib/taurus/core/util/prop.py (refactored) -@@ -24,6 +24,8 @@ - ############################################################################# - - """This module contains a decorator to simplify the use of property.""" -+from __future__ import print_function -+from __future__ import absolute_import - - __all__ = ["propertx"] - -@@ -47,7 +49,7 @@ - - if __name__ == '__main__': - -- from log import Logger -+ from .log import Logger - - class example(object, Logger): - -@@ -60,15 +62,15 @@ - def bar(): - # BAR doc - def get(self): -- print "\tgetting", self._a -+ print("\tgetting", self._a) - return self._a - - def set(self, val): -- print "\tsetting", val -+ print("\tsetting", val) - self._a = val - return get, set - - foo = example() -- print foo.bar -+ print(foo.bar) - # foo.bar='egg' - # print foo.bar ---- lib/taurus/core/util/safeeval.py (original) -+++ lib/taurus/core/util/safeeval.py (refactored) -@@ -26,6 +26,7 @@ - """ - safeeval.py: Safe eval replacement with whitelist support - """ -+from __future__ import print_function - - __all__ = ["SafeEvaluator"] - -@@ -117,12 +118,12 @@ - - x = range(6) - sev = SafeEvaluator() -- print "trying to evaluate a variable that has not been registered" -+ print("trying to evaluate a variable that has not been registered") - try: - # This will fail because 'x' is not registered in sev -- print sev.safeEval('x+2') -+ print(sev.safeEval('x+2')) - except: -- print "failed!!" -+ print("failed!!") - - sev.addSafe({'x': x}) # After registering x, we can use it... - f0 = 'x' -@@ -134,16 +135,16 @@ - f5 = 'open("/etc/passwd")' - - for f in [f0, f1, f2, f3, f4, f5]: -- print 'Evaluating "%s":' % f -+ print('Evaluating "%s":' % f) - try: -- print sev.eval(f) -+ print(sev.eval(f)) - except: -- print 'ERROR: %s cannot be evaluated' % f -+ print('ERROR: %s cannot be evaluated' % f) - - vector = numpy.arange(6) - # Another way of registering a variable is using the init method... - sev2 = SafeEvaluator({'x': x, 'y': vector}, defaultSafe=False) -- print 'x*y=', sev2.eval('x*y') -+ print('x*y=', sev2.eval('x*y')) - y = 0 # note that the registered variable is local to the evaluator!! - # here, y still has the previously registered value instead of 0 -- print 'x*y=', sev2.eval('x*y') -+ print('x*y=', sev2.eval('x*y')) ---- lib/taurus/core/util/tablepprint.py (original) -+++ lib/taurus/core/util/tablepprint.py (refactored) -@@ -24,6 +24,8 @@ - ############################################################################# - - """Adapted from http://code.activestate.com/recipes/267662/""" -+from __future__ import print_function -+from functools import reduce - - __docformat__ = "restructuredtext" - -@@ -135,19 +137,19 @@ - Aristidis,Papageorgopoulos,28,Senior Reseacher''' - rows = [row.strip().split(',') for row in data.splitlines()] - -- print 'Without wrapping function\n' -+ print('Without wrapping function\n') - for l in indent([labels] + rows, hasHeader=True): -- print l -+ print(l) - - # test indent with different wrapping functions - width = 10 - for wrapper in (wrap_always, wrap_onspace, wrap_onspace_strict): -- print 'Wrapping function: %s(x,width=%d)\n' % (wrapper.__name__, width) -+ print('Wrapping function: %s(x,width=%d)\n' % (wrapper.__name__, width)) - o = indent([labels] + rows, headerChar='=', hasHeader=True, separateRows=False, - prefix='|', postfix='|', delim=' ', - wrapfunc=lambda x: wrapper(x, width)) - for l in o: -- print l -+ print(l) - - # output: - # ---- lib/taurus/core/util/threadpool.py (original) -+++ lib/taurus/core/util/threadpool.py (refactored) -@@ -24,6 +24,8 @@ - ############################################################################# - - """adapted from http://code.activestate.com/recipes/576576/""" -+from __future__ import print_function -+from __future__ import absolute_import - - __all__ = ["ThreadPool", "Worker"] - -@@ -34,8 +36,8 @@ - from time import sleep, time - from traceback import extract_stack, format_list - --from prop import propertx --from log import Logger, DebugIt, TraceIt -+from .prop import propertx -+from .log import Logger, DebugIt, TraceIt - - - class ThreadPool(Logger): -@@ -152,44 +154,44 @@ - - def easyJob(*arg, **kw): - n = arg[0] -- print '\tSleep\t\t', n -+ print('\tSleep\t\t', n) - sleep(n) - return 'Slept\t%d' % n - - def longJob(*arg, **kw): -- print "\tStart\t\t\t", arg, kw -+ print("\tStart\t\t\t", arg, kw) - n = arg[0] * 3 - sleep(n) - return "Job done in %d" % n - - def badJob(*a, **k): -- print '\n !!! OOOPS !!!\n' -+ print('\n !!! OOOPS !!!\n') - a = 1 / 0 - - def show(*arg, **kw): -- print 'callback : %s' % arg[0] -+ print('callback : %s' % arg[0]) - - def test_1(**kwargs): - workers = kwargs.pop('workers', 5) - jobqueue = kwargs.pop('jobqueue', 10) - pool = ThreadPool(name='ThreadPool', Psize=workers, Qsize=jobqueue) -- print "\n\t\t... let's add some jobs ...\n" -+ print("\n\t\t... let's add some jobs ...\n") - for j in range(5): - if j == 1: - pool.add(badJob) - for i in range(5, 0, -1): - pool.add(longJob, show, i) - pool.add(easyJob, show, i) -- print ''' -+ print(''' - \t\t... and now, we're waiting for the %i workers to get the %i jobs done ... -- ''' % (pool.size, pool.qsize) -+ ''' % (pool.size, pool.qsize)) - sleep(15) -- print "\n\t\t... ok, that may take a while, let's get some reinforcement ...\n" -+ print("\n\t\t... ok, that may take a while, let's get some reinforcement ...\n") - sleep(5) - pool.size = 50 -- print '\n\t\t... Joining ...\n' -+ print('\n\t\t... Joining ...\n') - pool.join() -- print '\n\t\t... Ok ...\n' -+ print('\n\t\t... Ok ...\n') - - def test_2(**kwargs): - workers = kwargs.pop('workers', 5) -@@ -198,21 +200,21 @@ - sleep_t = kwargs.pop('sleep_t', 1) - #from taurus.core.util.threadpool import ThreadPool - pool = ThreadPool(name='ThreadPool', Psize=workers, Qsize=jobqueue) -- print "\n\t\t... Check the number of busy workers ...\n" -- print "Num of busy workers = %s" % (pool.getNumOfBusyWorkers()) -- print "\n\t\t... let's add some jobs ...\n" -+ print("\n\t\t... Check the number of busy workers ...\n") -+ print("Num of busy workers = %s" % (pool.getNumOfBusyWorkers())) -+ print("\n\t\t... let's add some jobs ...\n") - for i in range(numjobs): - pool.add(easyJob, None, sleep_t) -- print '\n\t\t... Monitoring the busy workers ...\n' -+ print('\n\t\t... Monitoring the busy workers ...\n') - t0 = time() - while pool.getNumOfBusyWorkers() > 0: -- print "busy workers = %s" % (pool.getNumOfBusyWorkers()) -+ print("busy workers = %s" % (pool.getNumOfBusyWorkers())) - sleep(0.5) - t1 = time() -- print "Run %s jobs of 1 second took %.3f" % (numjobs, t1 - t0) -- print '\n\t\t... Joining ...\n' -+ print("Run %s jobs of 1 second took %.3f" % (numjobs, t1 - t0)) -+ print('\n\t\t... Joining ...\n') - pool.join() -- print '\n\t\t... Ok ...\n' -+ print('\n\t\t... Ok ...\n') - - def main(argv): - kwargs = {} ---- lib/taurus/qt/qtcore/communication/communication.py (original) -+++ lib/taurus/qt/qtcore/communication/communication.py (refactored) -@@ -26,6 +26,7 @@ - """ - comunications.py: - """ -+from __future__ import print_function - - from taurus.external.qt import QtCore - import weakref -@@ -333,7 +334,7 @@ - ''' - A slot which you can connect as a reader for debugging. It will print info to the stdout - ''' -- print "SharedDataManager: \n\tSender=: %s\n\tData=%s" % (self.sender(), repr(data)) -+ print("SharedDataManager: \n\tSender=: %s\n\tData=%s" % (self.sender(), repr(data))) - - def info(self): - s = "" ---- lib/taurus/qt/qtcore/configuration/configuration.py (original) -+++ lib/taurus/qt/qtcore/configuration/configuration.py (refactored) -@@ -25,6 +25,7 @@ - - """This module provides the set of base classes designed to provide - configuration features to the classes that inherit from them""" -+from __future__ import print_function - - __all__ = ["configurableProperty", "BaseConfigurableClass"] - -@@ -149,7 +150,7 @@ - - for k in x['__orderedConfigNames__']: - if k not in x['__itemConfigurations__']: -- print 'missing configuration for "%s" in %s' % (k, repr(x)) -+ print('missing configuration for "%s" in %s' % (k, repr(x))) - return True - - def createConfig(self, allowUnpickable=False): -@@ -250,7 +251,7 @@ - self.__configurableItems = {} - - def registerConfigurableItem(self, item, name=None): -- print "Deprecation WARNING: %s.registerConfigurableItem() has been deprecated. Use registerConfigDelegate() instead" % repr(self) -+ print("Deprecation WARNING: %s.registerConfigurableItem() has been deprecated. Use registerConfigDelegate() instead" % repr(self)) - self._registerConfigurableItem(item, name=name) - - def registerConfigDelegate(self, delegate, name=None): ---- lib/taurus/qt/qtcore/model/__init__.py (original) -+++ lib/taurus/qt/qtcore/model/__init__.py (refactored) -@@ -53,8 +53,9 @@ - view.setModel(model) - - """ -+from __future__ import absolute_import - - __docformat__ = 'restructuredtext' - --from taurusmodel import * --from taurusdatabasemodel import * -+from .taurusmodel import * -+from .taurusdatabasemodel import * ---- lib/taurus/qt/qtcore/util/emitter.py (original) -+++ lib/taurus/qt/qtcore/util/emitter.py (refactored) -@@ -225,7 +225,7 @@ - size = self.getQueue().qsize() - if size: - self.log.info('onRefresh(%s)' % size) -- self.next() -+ next(self) - else: - self.log.debug('onRefresh()') - except: -@@ -266,7 +266,7 @@ - nqueue.put(i) - while not nqueue.empty(): - self.queue.put(nqueue.get()) -- self.next() -+ next(self) - - def _doSomething(self, params): - self.log.debug('At TaurusEmitterThread._doSomething(%s)' % str(params)) -@@ -317,7 +317,7 @@ - Qt.QApplication.instance().thread().msleep(self.timewait) - self.log.info('#' * 80) - self.log.info('At TaurusEmitterThread.run()') -- self.next() -+ next(self) - - if self.refreshTimer: - self.refreshTimer.start(self.polling) -@@ -394,7 +394,7 @@ - self.info('addUnsubscribedAttributes([%d])' % len(items)) - for attr in items: - self._addModelObj(attr) -- self._modelsThread.next() -+ next(self._modelsThread) - self.info('Thread queue: [%d]' % (self._modelsQueue.qsize())) - except: - self.warning(traceback.format_exc()) -@@ -504,7 +504,7 @@ - self.thread.start() - except: - pass -- self.next() -+ next(self) - self._running = True - return - -@@ -535,7 +535,7 @@ - nqueue.put(i) - while not nqueue.empty(): - self.queue.put(nqueue.get()) -- self.next() -+ next(self) - - def isRunning(self): - return self._running ---- lib/taurus/qt/qtcore/util/__init__.py (original) -+++ lib/taurus/qt/qtcore/util/__init__.py (refactored) -@@ -24,7 +24,8 @@ - ############################################################################# - - """This package provides a set of utilities (e.g. logging) to taurus qtcore""" -+from __future__ import absolute_import - - __docformat__ = 'restructuredtext' - --from tauruslog import * -+from .tauruslog import * ---- lib/taurus/qt/qtcore/util/signal.py (original) -+++ lib/taurus/qt/qtcore/util/signal.py (refactored) -@@ -1,4 +1,5 @@ - """Provide a Signal class for non-QObject objects""" -+from __future__ import print_function - - __all__ = ['baseSignal'] - ---- lib/taurus/qt/qtdesigner/containerplugin.py (original) -+++ lib/taurus/qt/qtdesigner/containerplugin.py (refactored) -@@ -36,6 +36,7 @@ - - 'model' - will have a '...' button that will open a customized dialog for - editing the widget model (same has 'Edit model...' task menu item - """ -+from __future__ import absolute_import - - from taurus.core.util.log import Logger - from taurus.external.qt import Qt -@@ -105,7 +106,7 @@ - - - def create_plugin(): -- from taurusplugin.taurusplugin import TaurusWidgetPlugin -+ from .taurusplugin.taurusplugin import TaurusWidgetPlugin - - class QGroupWidgetPlugin(TaurusWidgetPlugin): - ---- lib/taurus/qt/qtdesigner/tauruspluginplugin.py (original) -+++ lib/taurus/qt/qtdesigner/tauruspluginplugin.py (refactored) -@@ -26,12 +26,13 @@ - """ - tauruspluginplugin.py: - """ -+from __future__ import absolute_import - - from taurus.external.qt import QtDesigner - - - def build_qtdesigner_widget_plugin(klass): -- import taurusplugin -+ from . import taurusplugin - - class Plugin(taurusplugin.TaurusWidgetPlugin): - WidgetClass = klass -@@ -74,7 +75,7 @@ - #_log.debug("E2: Canceled %s (widget doesn't have getQtDesignerPluginInfo())" % name) - e2_nb += 1 - cont = True -- except Exception, e: -+ except Exception as e: - #_log.debug("E3: Canceled %s (%s)" % (name, str(e))) - e3_nb += 1 - cont = True -@@ -82,7 +83,7 @@ - if cont: - continue - for k in ('module', ): -- if not qt_info.has_key(k): -+ if k not in qt_info: - #_log.debug("E4: Canceled %s (getQtDesignerPluginInfo doesn't have key %s)" % (name, k)) - e4_nb += 1 - cont = True ---- lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py (original) -+++ lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py (refactored) -@@ -36,6 +36,7 @@ - - 'model' - will have a '...' button that will open a customized dialog for - editing the widget model (same has 'Edit model...' task menu item - """ -+from __future__ import print_function - - import inspect - -@@ -103,11 +104,11 @@ - designMode=True, - parent=parent) - w = klass(*args, **kwargs) -- except Exception, e: -+ except Exception as e: - name = self._getWidgetClassName() -- print 100 * "=" -- print "taurus designer plugin error creating %s: %s" % (name, str(e)) -- print 100 * "-" -+ print(100 * "=") -+ print("taurus designer plugin error creating %s: %s" % (name, str(e))) -+ print(100 * "-") - import traceback - traceback.print_exc() - w = None ---- lib/taurus/qt/qtgui/base/taurusbase.py (original) -+++ lib/taurus/qt/qtgui/base/taurusbase.py (refactored) -@@ -736,7 +736,7 @@ - if self._format is None: - try: - self._updateFormat(type(v)) -- except Exception, e: -+ except Exception as e: - self.warning(('Cannot update format. Reverting to default.' + - ' Reason: %r'), e) - self.setFormat(defaultFormatter) -@@ -2147,9 +2147,9 @@ - bottom = evt_value.min_value - top = evt_value.max_value - bottom = int( -- bottom) if bottom != TaurusConfiguration.no_min_value else -sys.maxint -+ bottom) if bottom != TaurusConfiguration.no_min_value else -sys.maxsize - top = int( -- top) if top != TaurusConfiguration.no_max_value else sys.maxint -+ top) if top != TaurusConfiguration.no_max_value else sys.maxsize - v.setRange(bottom, top) - self.debug("Validator range set to %i-%i" % (bottom, top)) - elif isinstance(v, Qt.QDoubleValidator): ---- lib/taurus/qt/qtgui/base/tauruscontroller.py (original) -+++ lib/taurus/qt/qtgui/base/tauruscontroller.py (refactored) -@@ -204,7 +204,7 @@ - for i in idx: - value = value[i] - return widget.displayValue(value) -- except Exception, e: -+ except Exception as e: - return widget.getNoneValue() - - def displayValue(self, value): ---- lib/taurus/qt/qtgui/button/qbuttonbox.py (original) -+++ lib/taurus/qt/qtgui/button/qbuttonbox.py (refactored) -@@ -26,6 +26,7 @@ - """ - qbuttonbox.py: - """ -+from __future__ import print_function - - __all__ = ["QButtonBox"] - ---- lib/taurus/qt/qtgui/button/taurusbutton.py (original) -+++ lib/taurus/qt/qtgui/button/taurusbutton.py (refactored) -@@ -25,6 +25,7 @@ - ############################################################################# - - """This module provides a taurus QPushButton based widgets""" -+from __future__ import print_function - - __all__ = ["TaurusLauncherButton", "TaurusCommandButton", "TaurusLockButton"] - -@@ -179,7 +180,7 @@ - if self._dialog.previousWidgetConfig is not None: - try: - widget.applyConfig(self._dialog.previousWidgetConfig) -- except Exception, e: -+ except Exception as e: - self.warning( - 'Cannot apply previous configuration to widget. Reason: %s', repr(e)) - -@@ -347,7 +348,7 @@ - modelobj.set_timeout_millis(int(self._timeout * 1000)) - result = modelobj.command_inout(self._command, self._castParameters( - self._parameters, self._command, modelobj)) -- except Exception, e: -+ except Exception as e: - self.error('Unexpected error when executing command %s of %s: %s' % ( - self._command, modelobj.getNormalName(), str(e))) - raise -@@ -381,7 +382,7 @@ - - try: - param_type = dev.command_query(command).in_type -- except Exception, e: -+ except Exception as e: - self.warning( - 'Cannot get parameters info for command %s:%s' % (command, str(e))) - return parameters -@@ -666,7 +667,7 @@ - 'Booo scary command!!\n Maybe you should think twice!') - - def f(*a): -- print a -+ print(a) - form.commandExecuted.connect(f) - form.show() - sys.exit(app.exec_()) ---- lib/taurus/qt/qtgui/compact/abstractswitcher.py (original) -+++ lib/taurus/qt/qtgui/compact/abstractswitcher.py (refactored) -@@ -193,7 +193,7 @@ - for sig in self.enterEditSignals: - try: - getattr(self.readWidget, sig).connect(self.enterEdit) -- except Exception, e: -+ except Exception as e: - self.debug('Cannot connect signal. Reason: %s', e) - # update size policy - self._updateSizePolicy() -@@ -220,7 +220,7 @@ - for sig in self.exitEditSignals: - try: - getattr(self.writeWidget, sig).connect(self.exitEdit) -- except Exception, e: -+ except Exception as e: - if isinstance(e, AttributeError) and hasattr(Qt, "SIGNAL"): - # Support old-style signal - self.connect(self.writeWidget, Qt.SIGNAL(sig), ---- lib/taurus/qt/qtgui/compact/basicswitcher.py (original) -+++ lib/taurus/qt/qtgui/compact/basicswitcher.py (refactored) -@@ -25,6 +25,7 @@ - - """This module provides some basic usable widgets based on TaurusReadWriteSwitcher - """ -+from __future__ import absolute_import - - __all__ = ["TaurusLabelEditRW", "TaurusBoolRW"] - -@@ -33,7 +34,7 @@ - from taurus.external.qt import Qt - from taurus.qt.qtgui.display import TaurusLabel, TaurusLed - from taurus.qt.qtgui.input import TaurusValueLineEdit, TaurusValueCheckBox --from abstractswitcher import TaurusReadWriteSwitcher -+from .abstractswitcher import TaurusReadWriteSwitcher - - - class TaurusLabelEditRW(TaurusReadWriteSwitcher): ---- lib/taurus/qt/qtgui/console/__init__.py (original) -+++ lib/taurus/qt/qtgui/console/__init__.py (refactored) -@@ -35,7 +35,7 @@ - - try: - from silx.gui.console import IPythonWidget as TaurusConsole --except Exception, e: -+except Exception as e: - from taurus.qt.qtgui.display import TaurusFallBackWidget - - class TaurusConsole(TaurusFallBackWidget): ---- lib/taurus/qt/qtgui/container/taurusframe.py (original) -+++ lib/taurus/qt/qtgui/container/taurusframe.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module provides basic taurus container widgets""" -+from __future__ import absolute_import - - __all__ = ["TaurusFrame"] - -@@ -31,7 +32,7 @@ - - from taurus.external.qt import Qt - from taurus.qt.qtgui.base import TaurusBaseComponent --from taurusbasecontainer import TaurusBaseContainer -+from .taurusbasecontainer import TaurusBaseContainer - - - class TaurusFrame(Qt.QFrame, TaurusBaseContainer): ---- lib/taurus/qt/qtgui/container/taurusgroupbox.py (original) -+++ lib/taurus/qt/qtgui/container/taurusgroupbox.py (refactored) -@@ -24,13 +24,14 @@ - ############################################################################# - - """This module provides basic taurus group box widget""" -+from __future__ import absolute_import - - __all__ = ["TaurusGroupBox"] - - __docformat__ = 'restructuredtext' - - from taurus.external.qt import Qt --from taurusbasecontainer import TaurusBaseContainer -+from .taurusbasecontainer import TaurusBaseContainer - - - class TaurusGroupBox(Qt.QGroupBox, TaurusBaseContainer): ---- lib/taurus/qt/qtgui/container/taurusgroupwidget.py (original) -+++ lib/taurus/qt/qtgui/container/taurusgroupwidget.py (refactored) -@@ -24,14 +24,15 @@ - ############################################################################# - - """This module provides a taurus group widget""" -+from __future__ import absolute_import - - __all__ = ["TaurusGroupWidget"] - - __docformat__ = 'restructuredtext' - - from taurus.external.qt import Qt --from qcontainer import QGroupWidget --from taurusbasecontainer import TaurusBaseContainer -+from .qcontainer import QGroupWidget -+from .taurusbasecontainer import TaurusBaseContainer - - - class TaurusGroupWidget(QGroupWidget, TaurusBaseContainer): ---- lib/taurus/qt/qtgui/container/taurusmainwindow.py (original) -+++ lib/taurus/qt/qtgui/container/taurusmainwindow.py (refactored) -@@ -26,6 +26,7 @@ - """ - mainwindow.py: a main window implementation with many added features by default - """ -+from __future__ import absolute_import - - __all__ = ["TaurusMainWindow"] - -@@ -37,7 +38,7 @@ - from taurus import tauruscustomsettings - from taurus.core.util import deprecation_decorator - from taurus.external.qt import Qt --from taurusbasecontainer import TaurusBaseContainer -+from .taurusbasecontainer import TaurusBaseContainer - - from taurus.qt.qtcore.configuration import BaseConfigurableClass - from taurus.qt.qtgui.util import ExternalAppAction -@@ -620,7 +621,7 @@ - ba = Qt.from_qvariant(settings.value( - "TaurusConfig"), 'toByteArray') or Qt.QByteArray() - self.applyQConfig(ba) -- except Exception, e: -+ except Exception as e: - msg = 'Problem loading configuration from "%s". Some settings may not be restored.\n Details: %s' % ( - unicode(settings.fileName()), repr(e)) - self.error(msg) ---- lib/taurus/qt/qtgui/container/taurusscrollarea.py (original) -+++ lib/taurus/qt/qtgui/container/taurusscrollarea.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module provides basic taurus scroll area widget""" -+from __future__ import absolute_import - - __all__ = ["TaurusScrollArea"] - -@@ -32,7 +33,7 @@ - from taurus.external.qt import Qt - from taurus.qt.qtgui.base import TaurusBaseComponent - --from taurusbasecontainer import TaurusBaseContainer -+from .taurusbasecontainer import TaurusBaseContainer - - - class TaurusScrollArea(Qt.QScrollArea, TaurusBaseContainer): ---- lib/taurus/qt/qtgui/container/tauruswidget.py (original) -+++ lib/taurus/qt/qtgui/container/tauruswidget.py (refactored) -@@ -24,13 +24,14 @@ - ############################################################################# - - """This module provides basic taurus container widget""" -+from __future__ import absolute_import - - __all__ = ["TaurusWidget"] - - __docformat__ = 'restructuredtext' - - from taurus.external.qt import Qt --from taurusbasecontainer import TaurusBaseContainer -+from .taurusbasecontainer import TaurusBaseContainer - - - class TaurusWidget(Qt.QWidget, TaurusBaseContainer): ---- lib/taurus/qt/qtgui/dialog/taurusinputdialog.py (original) -+++ lib/taurus/qt/qtgui/dialog/taurusinputdialog.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module provides a set of dialog based widgets""" -+from __future__ import print_function - - __all__ = ["TaurusInputDialog", "get_input"] - -@@ -199,7 +200,7 @@ - data_type='Text', key="Memo", default_value="By default a memo is\na long thing") - - for d in [d1, d2, d3, d4, d5, d6, d7, d8]: -- print get_input(input_data=d, title=d['prompt']) -+ print(get_input(input_data=d, title=d['prompt'])) - - if __name__ == "__main__": - main() ---- lib/taurus/qt/qtgui/dialog/taurusmessagebox.py (original) -+++ lib/taurus/qt/qtgui/dialog/taurusmessagebox.py (refactored) -@@ -334,7 +334,7 @@ - try: - PyTango.Except.throw_exception('TangoException', - 'A simple tango exception', 'right here') -- except PyTango.DevFailed, df1: -+ except PyTango.DevFailed as df1: - try: - import traceback - import StringIO ---- lib/taurus/qt/qtgui/display/qled.py (original) -+++ lib/taurus/qt/qtgui/display/qled.py (refactored) -@@ -98,7 +98,7 @@ - :type color: str - :return: True is the given color name is valid or False otherwise - :rtype: bool""" -- return LedColor.has_key(name.upper()) -+ return name.upper() in LedColor - - def _refresh(self): - """internal usage only""" ---- lib/taurus/qt/qtgui/display/qpixmapwidget.py (original) -+++ lib/taurus/qt/qtgui/display/qpixmapwidget.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module contains a pure Qt widget that displays an image""" -+from __future__ import absolute_import - - __all__ = ["QPixmapWidget"] - -@@ -225,7 +226,7 @@ - - def demo(): - "QPixmap Widget" -- import demo.qpixmapwidgetdemo -+ from . import demo.qpixmapwidgetdemo - return demo.qpixmapwidgetdemo.main() - - ---- lib/taurus/qt/qtgui/display/qsevensegment.py (original) -+++ lib/taurus/qt/qtgui/display/qsevensegment.py (refactored) -@@ -26,6 +26,7 @@ - """ - qsevensegmentdisplay.py - """ -+from __future__ import print_function - - __all__ = ['Q7SegDigit'] - -@@ -574,7 +575,7 @@ - dw = Q7SegDigit() - dw.setValue(int(sys.argv[1])) - dw.setVisible(True) -- print dw -+ print(dw) - a.exec_() - - ---- lib/taurus/qt/qtgui/display/tauruslabel.py (original) -+++ lib/taurus/qt/qtgui/display/tauruslabel.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module provides a set of basic Taurus widgets based on QLabel""" -+from __future__ import absolute_import - - __all__ = ["TaurusLabel"] - -@@ -619,7 +620,7 @@ - - def demo(): - "Label" -- import demo.tauruslabeldemo -+ from . import demo.tauruslabeldemo - return demo.tauruslabeldemo.main() - - ---- lib/taurus/qt/qtgui/display/tauruslcd.py (original) -+++ lib/taurus/qt/qtgui/display/tauruslcd.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module provides a Taurus widget based on QLCDNumber""" -+from __future__ import absolute_import - - __all__ = ["TaurusLCD"] - -@@ -106,7 +107,7 @@ - for i in idx: - value = value[i] - return widget.displayValue(value) -- except Exception, e: -+ except Exception as e: - return widget.getNoneValue() - - -@@ -386,7 +387,7 @@ - - def demo(): - "LCD" -- import demo.tauruslcddemo -+ from . import demo.tauruslcddemo - return demo.tauruslcddemo.main() - - ---- lib/taurus/qt/qtgui/display/taurusled.py (original) -+++ lib/taurus/qt/qtgui/display/taurusled.py (refactored) -@@ -25,6 +25,7 @@ - ############################################################################# - - """This module provides a set of basic Taurus widgets based on QLed""" -+from __future__ import absolute_import - - __all__ = ["TaurusLed"] - -@@ -38,7 +39,7 @@ - from taurus.core import DataFormat, AttrQuality, DataType - - from taurus.qt.qtgui.base import TaurusBaseWidget --from qled import QLed -+from .qled import QLed - - _QT_PLUGIN_INFO = { - 'module': 'taurus.qt.qtgui.display', -@@ -454,7 +455,7 @@ - - def demo(): - "Led" -- import demo.taurusleddemo -+ from . import demo.taurusleddemo - return demo.taurusleddemo.main() - - ---- lib/taurus/qt/qtgui/extra_guiqwt/builder.py (original) -+++ lib/taurus/qt/qtgui/extra_guiqwt/builder.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """Extension of :mod:`guiqwt.builder`""" -+from __future__ import absolute_import - - __all__ = ["TaurusPlotItemBuilder", "make"] - -@@ -31,8 +32,8 @@ - - import guiqwt.builder - --from curve import TaurusCurveItem, TaurusTrendItem --from image import (TaurusImageItem, TaurusRGBImageItem, TaurusEncodedImageItem, -+from .curve import TaurusCurveItem, TaurusTrendItem -+from .image import (TaurusImageItem, TaurusRGBImageItem, TaurusEncodedImageItem, - TaurusEncodedRGBImageItem, TaurusXYImageItem) - from guiqwt.curve import CurveParam - from guiqwt.image import ImageParam, XYImageItem ---- lib/taurus/qt/qtgui/extra_guiqwt/curve.py (original) -+++ lib/taurus/qt/qtgui/extra_guiqwt/curve.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """Extension of :mod:`guiqwt.curve`""" -+from __future__ import print_function - - __all__ = ["TaurusCurveItem"] - -@@ -356,11 +357,11 @@ - elif n == 2: - mx, my = mx_my - else: -- print "Invalid model: %s\n" % mx_my -+ print("Invalid model: %s\n" % mx_my) - parser.print_help(sys.stderr) - sys.exit(1) - # cycle colors -- style = make.style.next() -+ style = next(make.style) - color = style[0] - linestyle = style[1:] - plot.add_item(make.curve(mx, my, color=color, ---- lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py (original) -+++ lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py (refactored) -@@ -26,6 +26,7 @@ - """ - curvesmodel Model and view for new CurveItem configuration - """ -+from __future__ import print_function - __all__ = ['TaurusCurveItemTableModel', 'CurveItemConf', 'CurveItemConfDlg'] - #raise UnimplementedError('Under Construction!') - -@@ -108,7 +109,7 @@ - self.taurusparam = taurusparam - if curveparam is None: - curveparam = CurveParam() -- style = make.style.next() # cycle through colors and linestyles -+ style = next(make.style) # cycle through colors and linestyles - update_style_attr(style, curveparam) - curveparam.line.width = 2 - self.curveparam = curveparam -@@ -488,7 +489,7 @@ - self.applied.emit() - - def onReload(self): -- print "RELOAD!!! (todo)" -+ print("RELOAD!!! (todo)") - - - # ---- lib/taurus/qt/qtgui/extra_guiqwt/image.py (original) -+++ lib/taurus/qt/qtgui/extra_guiqwt/image.py (refactored) -@@ -69,7 +69,7 @@ - # TODO: units should be used for setting some title in the colorbar - try: - v = self.filterData(v) -- except Exception, e: -+ except Exception as e: - self.info('Ignoring event. Reason: %s', e.message) - return - # this is the range of the z axis (color scale) -@@ -143,7 +143,7 @@ - - try: - fmt, decoded_data = codec.decode(data) -- except Exception, e: -+ except Exception as e: - self.info('Decoder error: %s', e.message) - raise e - ---- lib/taurus/qt/qtgui/extra_guiqwt/plot.py (original) -+++ lib/taurus/qt/qtgui/extra_guiqwt/plot.py (refactored) -@@ -152,7 +152,7 @@ - else: - self.warning('Invalid model "%s" (Skipping)' % mx_my) - # cycle styles -- style = self.style.next() -+ style = next(self.style) - color = style[0] - linestyle = style[1:] - # add the item -@@ -289,7 +289,7 @@ - # create and attach new TaurusCurveItems - for m in modelNames: - # cycle styles -- style = self.style.next() -+ style = next(self.style) - # add the item - item = make.ttrend(m, color=style[0], linestyle=style[ - 1:], linewidth=2, taurusparam=copy.deepcopy(self.defaultTaurusparam)) ---- lib/taurus/qt/qtgui/extra_guiqwt/scales.py (original) -+++ lib/taurus/qt/qtgui/extra_guiqwt/scales.py (refactored) -@@ -26,6 +26,7 @@ - """ - scales.py: Custom scales used by taurus.qt.qtgui.plot module - """ -+from __future__ import print_function - __all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", - "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", - "FixedLabelsScaleDraw"] -@@ -326,8 +327,8 @@ - t = datetime.fromtimestamp(val) - try: # If the scaleDiv was created by a DateTimeScaleEngine it has a _datetimeLabelFormat - s = t.strftime(self._datetimeLabelFormat) -- except AttributeError, e: -- print "Warning: cannot get the datetime label format (Are you using a DateTimeScaleEngine?)" -+ except AttributeError as e: -+ print("Warning: cannot get the datetime label format (Are you using a DateTimeScaleEngine?)") - s = t.isoformat(' ') - return qwt.QwtText(s) - ---- lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py (original) -+++ lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py (refactored) -@@ -325,7 +325,7 @@ - try: - p = yacc.yacc(tabmodule=jdraw_yacctab, debugfile=None, write_tables=1, - **common_kwargs) -- except Exception, e: -+ except Exception as e: - msg = ('Error creating jdraw parser.\n' + - 'HINT: Try removing jdraw_lextab.* and jdraw_yacctab.* from %s' % - outputdir) ---- lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py (original) -+++ lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module contains the graphics factory for the jdraw file format""" -+from __future__ import absolute_import - - __all__ = ["TaurusJDrawGraphicsFactory"] - -@@ -371,9 +372,9 @@ - pen.setWidth(lineWidth) - pen.setStyle(LINESTYLE_JDW2QT[params.get("lineStyle", 0)]) - item.setPen(pen) -- except AttributeError, ae: -+ except AttributeError as ae: - pass -- except Exception, e: -+ except Exception as e: - self.warning('jdraw.set_common_params(%s(%s)).(foreground,width,style) failed!: \n\t%s' % ( - type(item).__name__, name, traceback.format_exc())) - -@@ -419,5 +420,5 @@ - return - - if __name__ == "__main__": -- import jdraw_view -+ from . import jdraw_view - jdraw_view.jdraw_view_main() ---- lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py (original) -+++ lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module contains the graphics view widget for jdraw files""" -+from __future__ import absolute_import - - __all__ = ["TaurusJDrawSynopticsView"] - -@@ -39,7 +40,7 @@ - from taurus.qt.qtcore.mimetypes import TAURUS_ATTR_MIME_TYPE, TAURUS_DEV_MIME_TYPE, TAURUS_MODEL_MIME_TYPE - from taurus.qt.qtgui.base import TaurusBaseWidget - --import jdraw_parser -+from . import jdraw_parser - - - class TaurusJDrawSynopticsView(Qt.QGraphicsView, TaurusBaseWidget): -@@ -268,7 +269,7 @@ - # self.fitting() - - def getGraphicsFactory(self, delayed=False): -- import jdraw -+ from . import jdraw - # self.parent()) - return jdraw.TaurusJDrawGraphicsFactory(self, alias=(self.alias or None), delayed=delayed) - ---- lib/taurus/qt/qtgui/graphic/taurusgraphic.py (original) -+++ lib/taurus/qt/qtgui/graphic/taurusgraphic.py (refactored) -@@ -25,6 +25,7 @@ - """ - taurusgraphic.py: - """ -+from __future__ import print_function - - # TODO: Tango-centric - -@@ -140,7 +141,7 @@ - p = self.parent() - while True: - item = p.getQueue().get(True) -- if type(item) in types.StringTypes: -+ if type(item) in (str,): - if item == "exit": - break - else: -@@ -214,7 +215,7 @@ - self.debug = self.info = self.warning = self.error = lambda l: self.logger.warning( - l) - except: -- print 'Unable to initialize TaurusGraphicsSceneLogger: %s' % traceback.format_exc() -+ print('Unable to initialize TaurusGraphicsSceneLogger: %s' % traceback.format_exc()) - - try: - if parent and parent.panelClass() is not None: -@@ -439,7 +440,7 @@ - elif not last_was_separator: - menu.addSeparator() - last_was_separator = True -- except Exception, e: -+ except Exception as e: - self.warning('Unable to add Menu Action: %s:%s' % (k, e)) - return last_was_separator - if (mouseEvent.button() == Qt.Qt.RightButton): -@@ -575,7 +576,7 @@ - if item not in self._selectedItems: - self._selectedItems.append(item) - retval = True -- except Exception, e: -+ except Exception as e: - self.warning('selectGraphicsItem(%s) failed! %s' % - (getattr(item, '_name', item), str(e))) - self.warning(traceback.format_exc()) ---- lib/taurus/qt/qtgui/icon/catalog.py (original) -+++ lib/taurus/qt/qtgui/icon/catalog.py (refactored) -@@ -24,6 +24,7 @@ - """ - This module provides an icon catalog widget - """ -+from __future__ import print_function - - import os - import hashlib -@@ -57,7 +58,7 @@ - - for path in Qt.QDir.searchPaths(prefix): - if not os.path.exists(path): -- print " %s not found. Skipping.!" % path -+ print(" %s not found. Skipping.!" % path) - continue - - for fname in os.listdir(path): ---- lib/taurus/qt/qtgui/icon/icon.py (original) -+++ lib/taurus/qt/qtgui/icon/icon.py (refactored) -@@ -135,7 +135,7 @@ - for filename in pathfilenames: - try: - pathmap = json.load(open(filename)) -- except Exception, e: -+ except Exception as e: - __LOGGER.error('Error registering "%s": %r', filename, e) - pathmap = [] - ---- lib/taurus/qt/qtgui/icon/__init__.py (original) -+++ lib/taurus/qt/qtgui/icon/__init__.py (refactored) -@@ -27,6 +27,7 @@ - Utilities for using the bundled icons in Taurus and for registering external - sources of icons. - """ -+from __future__ import absolute_import - --from icon import * --from catalog import QIconCatalog -+from .icon import * -+from .catalog import QIconCatalog ---- lib/taurus/qt/qtgui/__init__.py (original) -+++ lib/taurus/qt/qtgui/__init__.py (refactored) -@@ -27,12 +27,13 @@ - taurus models. The widgets are generic in the sence that they do not assume any - behavior associated with a specific HW device. They intend to represent only - abstract model data.""" -+from __future__ import absolute_import - - __docformat__ = 'restructuredtext' - - - # register icon path files and icon theme on import of taurus.qt.qtgui --import icon as __icon -+from . import icon as __icon - import os - import sys - import glob ---- lib/taurus/qt/qtgui/input/choicedlg.py (original) -+++ lib/taurus/qt/qtgui/input/choicedlg.py (refactored) -@@ -24,6 +24,7 @@ - ########################################################################### - - """This package provides a dialog for graphically choosing a Taurus class""" -+from __future__ import print_function - - __all__ = ["GraphicalChoiceDlg", "GraphicalChoiceWidget"] - -@@ -255,7 +256,7 @@ - for k in row: - pixmaps[k] = getCachedPixmap('snapshot:%s.png' % k) - -- print GraphicalChoiceDlg.getChoice(parent=None, title='Panel chooser', msg='Choose the type of Panel:', choices=choices, pixmaps=pixmaps) -+ print(GraphicalChoiceDlg.getChoice(parent=None, title='Panel chooser', msg='Choose the type of Panel:', choices=choices, pixmaps=pixmaps)) - - sys.exit() - ---- lib/taurus/qt/qtgui/input/taurusspinbox.py (original) -+++ lib/taurus/qt/qtgui/input/taurusspinbox.py (refactored) -@@ -26,10 +26,11 @@ - """ - This module provides a set of basic taurus widgets based on QAbstractSpinBox - """ -+from __future__ import absolute_import - - from taurus.external.qt import Qt - --from tauruslineedit import TaurusValueLineEdit -+from .tauruslineedit import TaurusValueLineEdit - from taurus.qt.qtgui.icon import getStandardIcon - from taurus.external.pint import Quantity - ---- lib/taurus/qt/qtgui/input/tauruswheel.py (original) -+++ lib/taurus/qt/qtgui/input/tauruswheel.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module provides a set of basic taurus widgets based on QWheelEdit""" -+from __future__ import absolute_import - - __all__ = ["TaurusWheelEdit"] - -@@ -34,7 +35,7 @@ - - from taurus.core.taurusbasetypes import TaurusEventType - from taurus.qt.qtgui.base import TaurusBaseWritableWidget --from qwheel import QWheelEdit -+from .qwheel import QWheelEdit - - - class TaurusWheelEdit(QWheelEdit, TaurusBaseWritableWidget): ---- lib/taurus/qt/qtgui/panel/qdataexportdialog.py (original) -+++ lib/taurus/qt/qtgui/panel/qdataexportdialog.py (refactored) -@@ -25,6 +25,7 @@ - - """DataExportDlg.py: A Qt dialog for showing and exporting x-y Ascii data from - one or more curves""" -+from __future__ import print_function - - __all__ = ["QDataExportDialog"] - -@@ -123,9 +124,9 @@ - else: - for x,y in zip(xdata, ydata): - text+="%r\t%r\n" % (x, y) -- print >> ofile, str(text) -- else: -- print >> ofile, str(self.dataTE.toPlainText()) -+ print(str(text), file=ofile) -+ else: -+ print(str(self.dataTE.toPlainText()), file=ofile) - except: - Qt.QMessageBox.warning(self, - "File saving failed", ---- lib/taurus/qt/qtgui/panel/qdoublelist.py (original) -+++ lib/taurus/qt/qtgui/panel/qdoublelist.py (refactored) -@@ -28,6 +28,7 @@ - qdoublelist.py: Provides a generic dialog containing two list which can move - items from one to the other - """ -+from __future__ import print_function - - __all__ = ["QDoubleListDlg"] - -@@ -132,9 +133,9 @@ - list1=['11', '22'], list2=['123', '33']) - result = dlg.exec_() - -- print "Result", result -- print "list1", dlg.getAll1() -- print "list2", dlg.getAll2() -+ print("Result", result) -+ print("list1", dlg.getAll1()) -+ print("list2", dlg.getAll2()) - - - if __name__ == "__main__": ---- lib/taurus/qt/qtgui/panel/report/albareport.py (original) -+++ lib/taurus/qt/qtgui/panel/report/albareport.py (refactored) -@@ -24,13 +24,14 @@ - ############################################################################# - - """This module provides a panel to display taurus messages""" -+from __future__ import absolute_import - - __all__ = ["TicketReportHandler"] - - __docformat__ = 'restructuredtext' - - from taurus.external.qt import Qt --from basicreport import SendMailDialog, SMTPReportHandler -+from .basicreport import SendMailDialog, SMTPReportHandler - - - class SendTicketDialog(SendMailDialog): ---- lib/taurus/qt/qtgui/panel/taurusconfigeditor.py (original) -+++ lib/taurus/qt/qtgui/panel/taurusconfigeditor.py (refactored) -@@ -138,7 +138,7 @@ - key = val[0] - dict[key] = self.removeBranch(dict[key], path) - if self._delete == True: -- if not dict.has_key('__orderedConfigNames__'): -+ if '__orderedConfigNames__' not in dict: - return dict - dict['__orderedConfigNames__'] = self.removeBranch( - dict['__orderedConfigNames__'], path) -@@ -150,7 +150,7 @@ - return dict - dict.remove(val[0]) - return dict -- if not dict.has_key('__orderedConfigNames__'): -+ if '__orderedConfigNames__' not in dict: - self._delete = True - dict.pop(val[0]) - return dict -@@ -346,7 +346,7 @@ - if qstate is not None and not qstate.isNull(): - try: - result = pickle.loads(qstate.data()) -- except Exception, e: -+ except Exception as e: - msg = 'problems loading TaurusConfig: \n%s' % repr(e) - Qt.QMessageBox.critical(None, 'Error loading settings', msg) - return result ---- lib/taurus/qt/qtgui/panel/taurusdemo.py (original) -+++ lib/taurus/qt/qtgui/panel/taurusdemo.py (refactored) -@@ -23,6 +23,7 @@ - ## - ############################################################################# - -+from __future__ import print_function - import sys - import operator - -@@ -75,10 +76,10 @@ - continue - try: - self.addDemo(demo_func.__doc__, demo_func, group) -- except Exception, e: -- print 80 * "-" -- print "Problems adding demo", demo_name -- print e -+ except Exception as e: -+ print(80 * "-") -+ print("Problems adding demo", demo_name) -+ print(e) - - def addGroup(self, name): - g = Qt.QGroupBox(name) -@@ -111,12 +112,12 @@ - dialog.setLayout(layout) - layout.addWidget(w) - dialog.exec_() -- except Exception, e: -+ except Exception as e: - if dialog is not None: - dialog.done(0) - dialog.hide() - dialog = None -- print str(e) -+ print(str(e)) - return - d = Qt.QErrorMessage() - d.showMessage(str(e)) ---- lib/taurus/qt/qtgui/panel/taurusform.py (original) -+++ lib/taurus/qt/qtgui/panel/taurusform.py (refactored) -@@ -24,6 +24,8 @@ - ############################################################################# - - """This module contains taurus Qt form widgets""" -+from __future__ import print_function -+from __future__ import absolute_import - - __all__ = ["TaurusAttrForm", "TaurusCommandsForm", "TaurusForm"] - -@@ -40,7 +42,7 @@ - TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_MODEL_MIME_TYPE) - from taurus.qt.qtgui.container import TaurusWidget, TaurusScrollArea - from taurus.qt.qtgui.button import QButtonBox, TaurusCommandButton --from taurusmodelchooser import TaurusModelChooser -+from .taurusmodelchooser import TaurusModelChooser - - - class ParameterCB(Qt.QComboBox): -@@ -979,7 +981,7 @@ - class DummyCW(TaurusValue): - - def setModel(self, model): -- print "!!!!! IN DUMMYCW.SETMODEL", model -+ print("!!!!! IN DUMMYCW.SETMODEL", model) - TaurusValue.setModel(self, model + '/double_scalar') - - models = ['sys/database/2', 'sys/tg_test/1', 'sys/tg_test/1/short_spectrum', ---- lib/taurus/qt/qtgui/panel/taurusinputpanel.py (original) -+++ lib/taurus/qt/qtgui/panel/taurusinputpanel.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module provides an Input panel (usually used inside a TaurusDialog)""" -+from __future__ import print_function - - __all__ = ["TaurusInputPanel"] - -@@ -402,7 +403,7 @@ - class Listener(object): - - def on_accept(self): -- print "user selected", self.panel.value() -+ print("user selected", self.panel.value()) - - d = dict(prompt="What's your favourite car brand?", - data_type=["Mazda", "Skoda", "Citroen", ---- lib/taurus/qt/qtgui/panel/taurusmessagepanel.py (original) -+++ lib/taurus/qt/qtgui/panel/taurusmessagepanel.py (refactored) -@@ -580,7 +580,7 @@ - try: - PyTango.Except.throw_exception( - 'TangoException', 'A simple tango exception', 'right here') -- except PyTango.DevFailed, df1: -+ except PyTango.DevFailed as df1: - try: - import traceback - import StringIO ---- lib/taurus/qt/qtgui/panel/taurusmodelchooser.py (original) -+++ lib/taurus/qt/qtgui/panel/taurusmodelchooser.py (refactored) -@@ -26,6 +26,8 @@ - """ - AttributeChooser.py: widget for choosing (a list of) attributes from a tango DB - """ -+from __future__ import print_function -+from __future__ import absolute_import - - __all__ = ["TaurusModelSelectorTree", "TaurusModelChooser"] - -@@ -35,7 +37,7 @@ - from taurus.qt.qtgui.container import TaurusWidget - from taurus.qt.qtgui.tree import TaurusDbTreeWidget - from taurus.core.util.containers import CaselessList --from taurusmodellist import TaurusModelList -+from .taurusmodellist import TaurusModelList - - - class TaurusModelSelectorTree(TaurusWidget): -@@ -358,7 +360,7 @@ - host = None - - app = Qt.QApplication(args) -- print TaurusModelChooser.modelChooserDlg(host=host) -+ print(TaurusModelChooser.modelChooserDlg(host=host)) - sys.exit() - - if __name__ == "__main__": ---- lib/taurus/qt/qtgui/panel/taurusvalue.py (original) -+++ lib/taurus/qt/qtgui/panel/taurusvalue.py (refactored) -@@ -820,7 +820,7 @@ - try: - klass = self.readWidgetClassFactory(self.readWidgetClassID) - self._readWidget = self._newSubwidget(self._readWidget, klass) -- except Exception, e: -+ except Exception as e: - self._destroyWidget(self._readWidget) - self._readWidget = Qt.QLabel('[Error]') - msg = 'Error creating read widget:\n' + str(e) -@@ -1145,7 +1145,7 @@ - widget_configdict = configdict[key] - getattr(self, 'set%sClass' % key)( - widget_configdict.get('classid', None)) -- if widget_configdict.has_key('delegate'): -+ if 'delegate' in widget_configdict: - widget = getattr(self, key[0].lower() + key[1:])() - if isinstance(widget, BaseConfigurableClass): - widget.applyConfig(widget_configdict[ ---- lib/taurus/qt/qtgui/plot/arrayedit.py (original) -+++ lib/taurus/qt/qtgui/plot/arrayedit.py (refactored) -@@ -26,12 +26,13 @@ - """ - arrayedit.py: Widget for editing a spectrum/array via control points - """ -+from __future__ import absolute_import - - - import numpy - from taurus.external.qt import Qt, Qwt5 - from taurus.qt.qtgui.util.ui import UILoadable --from curvesAppearanceChooserDlg import CurveAppearanceProperties -+from .curvesAppearanceChooserDlg import CurveAppearanceProperties - - - @UILoadable ---- lib/taurus/qt/qtgui/plot/curveprops.py (original) -+++ lib/taurus/qt/qtgui/plot/curveprops.py (refactored) -@@ -26,6 +26,7 @@ - """ - curveprops: Model and view for curve properties - """ -+from __future__ import absolute_import - __all__ = ['CurveConf', 'CurvesTableModel', - 'ExtendedSelectionModel', 'CurvePropertiesView'] - #raise NotImplementedError('Under Construction!') -@@ -40,7 +41,7 @@ - from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE - from taurus.qt.qtgui.util.ui import UILoadable - --from curvesAppearanceChooserDlg import NamedLineStyles, ReverseNamedLineStyles, \ -+from .curvesAppearanceChooserDlg import NamedLineStyles, ReverseNamedLineStyles, \ - NamedCurveStyles, ReverseNamedCurveStyles, \ - NamedSymbolStyles, ReverseNamedSymbolStyles, \ - NamedColors, CurveAppearanceProperties ---- lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py (original) -+++ lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py (refactored) -@@ -28,6 +28,7 @@ - A Qt dialog for choosing plot appearance (symbols and lines) - for a QwtPlot-derived widget (like Taurusplot) - """ -+from __future__ import print_function - - import copy - -@@ -430,10 +431,10 @@ - - def _print(self): - """Just for debug""" -- print "-" * 77 -+ print("-" * 77) - for k in self.propertyList: -- print k + "= ", self.__getattribute__(k) -- print "-" * 77 -+ print(k + "= ", self.__getattribute__(k)) -+ print("-" * 77) - - @staticmethod - def inConflict_update_a(a, b): ---- lib/taurus/qt/qtgui/plot/monitor.py (original) -+++ lib/taurus/qt/qtgui/plot/monitor.py (refactored) -@@ -26,6 +26,7 @@ - """ - monitor.py: Specialized mini-trend widget to monitor some scalar value - """ -+from __future__ import print_function - - from taurus.external.qt import Qt - from taurus.qt.qtgui.plot import TaurusTrend -@@ -109,7 +110,7 @@ - elif a.startswith('-config='): - CONFIG = a.split('=')[-1] - elif a.startswith('-'): # whatever other argument starting by "-" -- print "\n Usage: \n%s [-xe|-xt] [-config=configfilename] [model1 [model2] ...]\n" % sys.argv[0] -+ print("\n Usage: \n%s [-xe|-xt] [-config=configfilename] [model1 [model2] ...]\n" % sys.argv[0]) - sys.exit(1) - else: # anything that is not a parameter is interpreted as a model - MODELS.append(a) ---- lib/taurus/qt/qtgui/plot/qwtdialog.py (original) -+++ lib/taurus/qt/qtgui/plot/qwtdialog.py (refactored) -@@ -26,6 +26,8 @@ - """ - qwtdialog.py: Dialogs for Taurusplot - """ -+from __future__ import print_function -+from __future__ import absolute_import - - __all__ = ["TaurusPlotConfigDialog"] - -@@ -72,7 +74,7 @@ - - # insert the CurvesAppearanceWidget - #(@TODO:must be changed to be done directly in the ui, but I couldn't make the widget available to TaurusDesigner) -- from curvesAppearanceChooserDlg import CurvesAppearanceChooser -+ from .curvesAppearanceChooserDlg import CurvesAppearanceChooser - layout = Qt.QVBoxLayout() - self.curvesAppearanceChooser = CurvesAppearanceChooser(None) - layout.addWidget(self.curvesAppearanceChooser) -@@ -165,7 +167,7 @@ - elif scaleType == Qwt5.QwtScaleTransformation.Log10: - axes[axis].setCurrentIndex(1) - else: -- raise TypeError, "TaurusPlotConfigDialog::__init__(): unexpected axis scale type (linear or logarihtmic expected)" -+ raise TypeError("TaurusPlotConfigDialog::__init__(): unexpected axis scale type (linear or logarihtmic expected)") - self.ui.xModeComboBox.setEnabled(not self.parent.getXIsTime()) - - # determine which axes are visible -@@ -268,11 +270,11 @@ - if strtime[-1] in timeunits.keys(): - try: - return float(strtime[:-1]) * timeunits[strtime[-1]] -- except Exception, e: -- print '[str2deltatime] No format could be applied to "%s"' % strtime -+ except Exception as e: -+ print('[str2deltatime] No format could be applied to "%s"' % strtime) - return None - else: -- print '[str2deltatime] Non-supported unit "%s"' % strtime[-1] -+ print('[str2deltatime] Non-supported unit "%s"' % strtime[-1]) - return None - - def strtime2epoch(self, strtime): -@@ -321,12 +323,12 @@ - t = (lt[0], lt[1], lt[2], t[3], t[ - 4], lt[5], lt[6], lt[7], lt[8]) - break -- except Exception, e: -+ except Exception as e: - pass - if t: - return time.mktime(t) - else: -- print 'No format could be applied to "%s"' % strtime -+ print('No format could be applied to "%s"' % strtime) - return None - - def validate(self): ---- lib/taurus/qt/qtgui/plot/qwtplot.py (original) -+++ lib/taurus/qt/qtgui/plot/qwtplot.py (refactored) -@@ -23,9 +23,9 @@ - ## - ############################################################################# - --print "*" * 77 --print \ -- """ -+from __future__ import print_function -+print("*" * 77) -+print(""" - If you are seeing this, it is because you tried to access qwtplot.py directly. - All funcionality has been moved to taurusplot.py, taurustrend.py and scales.py - -@@ -34,5 +34,5 @@ - - If you were trying to launch a stand-alone Taurusplot or TaurusTrend from a script, - you should update such script. --""" --print "*" * 77 -+""") -+print("*" * 77) ---- lib/taurus/qt/qtgui/plot/scales.py (original) -+++ lib/taurus/qt/qtgui/plot/scales.py (refactored) -@@ -26,6 +26,7 @@ - """ - scales.py: Custom scales used by taurus.qt.qtgui.plot module - """ -+from __future__ import print_function - __all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", - "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", - "FixedLabelsScaleDraw"] -@@ -318,8 +319,8 @@ - t = datetime.fromtimestamp(val) - try: # If the scaleDiv was created by a DateTimeScaleEngine it has a _datetimeLabelFormat - s = t.strftime(self._datetimeLabelFormat) -- except AttributeError, e: -- print "Warning: cannot get the datetime label format (Are you using a DateTimeScaleEngine?)" -+ except AttributeError as e: -+ print("Warning: cannot get the datetime label format (Are you using a DateTimeScaleEngine?)") - s = t.isoformat(' ') - return Qwt5.QwtText(s) - ---- lib/taurus/qt/qtgui/plot/taurusarrayedit.py (original) -+++ lib/taurus/qt/qtgui/plot/taurusarrayedit.py (refactored) -@@ -24,12 +24,13 @@ - ############################################################################# - - -+from __future__ import absolute_import - from taurus.external.qt import Qt - import taurus - import numpy - - from taurus.qt.qtgui.container import TaurusWidget --from arrayedit import ArrayEditor -+from .arrayedit import ArrayEditor - - - class TaurusArrayEditor(TaurusWidget): -@@ -137,7 +138,7 @@ - x = numpy.arange(y.size) - else: - x = numpy.array(self._xAttr.read().rvalue) -- except Exception, e: -+ except Exception as e: - self.error('Error reading from attribute(s): %s' % (str(e))) - if not quiet: - Qt.QMessageBox.warning( -@@ -182,7 +183,7 @@ - if self._xAttr is not None and numpy.any(self._xAttr.read(cache=False).wvalue != x): - raise IOError('Unexpected Write error: %s' % - self._xAttr.getFullName()) -- except Exception, e: -+ except Exception as e: - self.error('Error writing to attribute(s): %s' % (str(e))) - if not quiet: - Qt.QMessageBox.warning( ---- lib/taurus/qt/qtgui/plot/taurusplotconf.py (original) -+++ lib/taurus/qt/qtgui/plot/taurusplotconf.py (refactored) -@@ -26,6 +26,8 @@ - """ - TaurusPlotConf: widget for configurating the contents and appearance of a TaurusPlot - """ -+from __future__ import print_function -+from __future__ import absolute_import - - __all__ = ['TaurusPlotConfDlg'] - -@@ -35,7 +37,7 @@ - from taurus.external.qt import Qt, Qwt5 - from taurus.qt.qtgui.util.ui import UILoadable - --import curveprops -+from . import curveprops - try: - import taurus.qt.qtgui.extra_nexus as extra_nexus - except: -@@ -121,7 +123,7 @@ - return new - - def onModelsAdded(self, models): -- print models -+ print(models) - nmodels = len(models) - rowcount = self.model.rowCount() - self.model.insertRows(rowcount, nmodels) -@@ -130,14 +132,14 @@ - value=Qt.QVariant(m)) - - def onApply(self): -- print "APPLY!!! (todo)" -+ print("APPLY!!! (todo)") - curveConfs = self.model.dumpData() - - for c in curveConfs: -- print repr(c) -+ print(repr(c)) - - def onReload(self): -- print "RELOAD!!! (todo)" -+ print("RELOAD!!! (todo)") - - - class demo(Qt.QDialog): -@@ -200,7 +202,7 @@ - - def onData(self): - cmds = self.model.dumpData() -- print self.model.curves -+ print(self.model.curves) - - - def main1(): ---- lib/taurus/qt/qtgui/plot/taurusplot.py (original) -+++ lib/taurus/qt/qtgui/plot/taurusplot.py (refactored) -@@ -26,6 +26,8 @@ - """ - taurusplot.py: Generic graphical plotting widget for Taurus - """ -+from __future__ import print_function -+from __future__ import absolute_import - __all__ = ["TaurusCurve", "TaurusCurveMarker", - "TaurusXValues", "TaurusPlot", "isodatestr2float"] - -@@ -48,7 +50,7 @@ - from taurus.qt.qtgui.base import TaurusBaseComponent, TaurusBaseWidget - from taurus.qt.qtgui.plot import TaurusPlotConfigDialog, FancyScaleDraw,\ - DateTimeScaleEngine, FixedLabelsScaleEngine, FixedLabelsScaleDraw --from curvesAppearanceChooserDlg import CurveAppearanceProperties -+from .curvesAppearanceChooserDlg import CurveAppearanceProperties - - - def isodatestr2float(s, sep='_'): -@@ -535,7 +537,7 @@ - ''' - if self.isRawData: - #self.warning('fireEvent of a RawData curve has been called by %s'%repr(self.sender())) -- raise StandardError('called handleEvent of a RawData curve') -+ raise Exception('called handleEvent of a RawData curve') - return - model = src if src is not None else self.getModelObj() - if model is None: -@@ -554,7 +556,7 @@ - return - try: - self.setXYFromModel(value) -- except Exception, e: -+ except Exception as e: - self._onDroppedEvent(reason=str(e)) - return - self._updateMarkers() -@@ -1457,7 +1459,7 @@ - - def __debug(self, *args, **kwargs): - '''put code here that you want to debug''' -- print "!!!!!!!!!!!!!!!1", self.pos() -+ print("!!!!!!!!!!!!!!!1", self.pos()) - Qt.QToolTip.showText(self.mapToGlobal(self.pos()), - "ASDASDASDASD DASDAS ASDA", self) - -@@ -1568,7 +1570,7 @@ - TaurusPlot.getPlot()''' - self.info( - 'DEPRECATION WARNING!: Calling TaurusPlot.getPlot() is deprecated. Use the TaurusPlot object itself instead') -- print self.sender() -+ print(self.sender()) - return self - - def getCurve(self, name): -@@ -1807,11 +1809,11 @@ - properties = CurveAppearanceProperties( - lColor=self._curvePens.next().color(), lWidth=2) - # Deprecation Warning: -- if rawdata.has_key("pen") or rawdata.has_key("style"): -+ if "pen" in rawdata or "style" in rawdata: - raise DeprecationWarning( - "'pen' or 'style' are no longer supported. Use the properties parameter instead") -- if rawdata.has_key("name"): -- if rawdata.has_key("title"): -+ if "name" in rawdata: -+ if "title" in rawdata: - self.error( - 'Inconsistence: both "name" and "title" passed for rawdata. Use "title" only') - else: -@@ -1861,7 +1863,7 @@ - name = id - self.curves_lock.acquire() - try: -- if self.curves.has_key(name): -+ if name in self.curves: - curve = self.curves.get(name) - if curve.isRawData: - self.detachRawData(name) -@@ -1942,7 +1944,7 @@ - """ - self.curves_lock.acquire() - try: -- if self.curves.has_key(curvename): -+ if curvename in self.curves: - data = self.curves[curvename].data() - x = [data.x(i) for i in xrange(data.size())] - y = [data.y(i) for i in xrange(data.size())] -@@ -1992,7 +1994,7 @@ - xname = xnames[i] - name = str(name) - self.debug('updating curve %s' % name) -- if not self.curves.has_key(name): -+ if name not in self.curves: - curve = TaurusCurve(name, xname, self, - optimized=self.isOptimizationEnabled()) - curve.attach(self) -@@ -2003,7 +2005,7 @@ - curve.attachMaxMarker(self) - if self._showMinPeaks: - curve.attachMinMarker(self) -- curve.setPen(self._curvePens.next()) -+ curve.setPen(next(self._curvePens)) - curve.setUseParentModel(self.getUseParentModel()) - curve.setTitleText(self.getDefaultCurvesTitle()) - curve.registerDataChanged(self, self.curveDataChanged) -@@ -2399,7 +2401,7 @@ - rawdatadict[name] = curve.getRawData() - else: - tangodict[name] = curve.getModel() -- except Exception, e: -+ except Exception as e: - self.error( - 'Exception while gathering curves configuration info' + str(e)) - finally: -@@ -2889,8 +2891,8 @@ - :param axis: (Qwt5.QwtPlot.Axis) the axis - """ - if not Qwt5.QwtPlot.axisValid(axis): -- raise ValueError, "TaurusPlot::setCurvesYAxis. Invalid axis ID: " + \ -- repr(axis) -+ raise ValueError("TaurusPlot::setCurvesYAxis. Invalid axis ID: " + \ -+ repr(axis)) - self.curves_lock.acquire() - try: - for curveName in curvesNamesList: -@@ -3725,12 +3727,12 @@ - - def exportIfAllCurves(curve, trend=w, counters=curves): - curve = str(curve) -- print '*' * 10 + ' %s: Event received for %s ' % (datetime.now().isoformat(), curve) + '*' * 10 -+ print('*' * 10 + ' %s: Event received for %s ' % (datetime.now().isoformat(), curve) + '*' * 10) - if curve in counters: - counters[curve] += 1 - if all(counters.values()): - trend.exportPdf(options.export_file) -- print '*' * 10 + ' %s: Exported to : %s ' % (datetime.now().isoformat(), options.export_file) + '*' * 10 -+ print('*' * 10 + ' %s: Exported to : %s ' % (datetime.now().isoformat(), options.export_file) + '*' * 10) - trend.close() - return - if not curves: ---- lib/taurus/qt/qtgui/plot/taurustrend.py (original) -+++ lib/taurus/qt/qtgui/plot/taurustrend.py (refactored) -@@ -26,6 +26,7 @@ - """ - taurustrend.py: Generic trend widget for Taurus - """ -+from __future__ import print_function - __all__ = ["ScanTrendsSet", "TaurusTrend", "TaurusTrendsSet"] - - from datetime import datetime -@@ -338,7 +339,7 @@ - v = value.rvalue - try: - self._yBuffer.append(v) -- except Exception, e: -+ except Exception as e: - self.warning('Problem updating history (%s=%s):%s', - model, v, e) - value = None -@@ -354,7 +355,7 @@ - if self.parent().getXDynScale() or not self.parent().axisAutoScale(Qwt5.QwtPlot.xBottom): - try: - getArchivedTrendValues(self, model, insert=True) -- except Exception, e: -+ except Exception as e: - import traceback - self.warning('%s: reading from archiving failed: %s' % ( - datetime.now().isoformat('_'), traceback.format_exc())) -@@ -438,7 +439,7 @@ - try: - self._xValues, self._yValues = self._updateHistory( - model=model or self.getModel(), value=value) -- except Exception, e: -+ except Exception as e: - self._onDroppedEvent(reason=str(e)) - raise - -@@ -1171,7 +1172,7 @@ - raise ValueError( - 'composed ("X|Y") models are not supported by TaurusTrend') - # create a new TrendSet if not already there -- if not self.trendSets.has_key(name): -+ if name not in self.trendSets: - # check if the model name is of scan type and provides a - # door - matchScan = re.search(r"scan:\/\/(.*)", name) -@@ -1926,12 +1927,12 @@ - - def exportIfAllCurves(curve, trend=w, counters=curves): - curve = str(curve) -- print '*' * 10 + ' %s: Event received for %s ' % (datetime.now().isoformat(), curve) + '*' * 10 -+ print('*' * 10 + ' %s: Event received for %s ' % (datetime.now().isoformat(), curve) + '*' * 10) - if curve in counters: - counters[curve] += 1 - if all(counters.values()): - trend.exportPdf(options.export_file) -- print '*' * 10 + ' %s: Exported to : %s ' % (datetime.now().isoformat(), options.export_file) + '*' * 10 -+ print('*' * 10 + ' %s: Exported to : %s ' % (datetime.now().isoformat(), options.export_file) + '*' * 10) - trend.close() - return - if not curves: ---- lib/taurus/qt/qtgui/resource/__init__.py (original) -+++ lib/taurus/qt/qtgui/resource/__init__.py (refactored) -@@ -27,6 +27,7 @@ - Old module supporting resources (now it just contains a reimplementation - based on taurus.qt.qtgui.icon for bck-compat) - """ -+from __future__ import absolute_import - - from taurus.core.util.log import deprecated as __deprecated - -@@ -34,4 +35,4 @@ - alt='taurus.qt.qtgui.icon', - rel='4.0') - --from taurus_resource_utils import * -+from .taurus_resource_utils import * ---- lib/taurus/qt/qtgui/table/qdictionary.py (original) -+++ lib/taurus/qt/qtgui/table/qdictionary.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module provides basic python dictionary/list editor widgets""" -+from __future__ import print_function - - __all__ = ["QDictionaryEditor", "QListEditor"] - ---- lib/taurus/qt/qtgui/table/qlogtable.py (original) -+++ lib/taurus/qt/qtgui/table/qlogtable.py (refactored) -@@ -25,6 +25,7 @@ - - """This module provides Qt table widgets which display logging messages from the - python :mod:`logging` module""" -+from __future__ import absolute_import - - __all__ = ["QLoggingTableModel", "QLoggingTable", "QLoggingWidget", - "QRemoteLoggingTableModel"] -@@ -47,7 +48,7 @@ - from taurus.qt.qtgui.model import FilterToolBar - from taurus.qt.qtgui.util import ActionFactory - --from qtable import QBaseTableWidget -+from .qtable import QBaseTableWidget - - LEVEL, TIME, MSG, NAME, ORIGIN = range(5) - HORIZ_HEADER = 'Level', 'Time', 'Message', 'By', 'Origin' ---- lib/taurus/qt/qtgui/table/taurusdbtable.py (original) -+++ lib/taurus/qt/qtgui/table/taurusdbtable.py (refactored) -@@ -25,6 +25,7 @@ - - """This module provides a base widget that can be used to display a taurus - model in a table widget""" -+from __future__ import absolute_import - - # todo: tango-centric!!! - -@@ -37,7 +38,7 @@ - from taurus.qt.qtcore.model import * - from taurus.core.taurusauthority import TaurusAuthority - from taurus.qt.qtgui.icon import getElementTypeIcon, getElementTypeIconName --from taurustable import TaurusBaseTableWidget -+from .taurustable import TaurusBaseTableWidget - - - class TaurusDbTableWidget(TaurusBaseTableWidget): ---- lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py (original) -+++ lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py (refactored) -@@ -26,6 +26,7 @@ - """ - taurusdevicepropertytable.py: - """ -+from __future__ import print_function - - # todo: tango-centric - -@@ -54,7 +55,7 @@ - self.defineStyle() - self.db = None - -- except Exception, e: -+ except Exception as e: - self.traceback() - - #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- ---- lib/taurus/qt/qtgui/table/taurusgrid.py (original) -+++ lib/taurus/qt/qtgui/table/taurusgrid.py (refactored) -@@ -29,6 +29,7 @@ - integrated with taurus and regular expressions by srubio - alba, 2009 - """ -+from __future__ import print_function - - # This module needs a total cleanup. Both re. code conventions and algorithms. - # --cpascual 20140827 -@@ -128,7 +129,7 @@ - taurus_dp.attribute_list_query( - ) if re_match_low(attribute, att.name)] - targets.extend(dev + '/' + att for att in attrs) -- except Exception, e: -+ except Exception as e: - # self.warning( 'ERROR! TaurusGrid.get_all_models(): Unable to get attributes for device %s: %s' % (dev,str(e))) - pass - else: -@@ -195,7 +196,7 @@ - ) if re_match_low(attribute, - att.name) and att.isReadOnly()] - targets.extend(dev + '/' + att for att in attrs) -- except Exception, e: -+ except Exception as e: - pass - else: - targets.append(dev + '/' + attribute) -@@ -494,7 +495,7 @@ - else: - # print 'In setModel(): Thread already started! (%d - # objs in queue)'%(self.modelsThread.queue.qsize()) -- self.modelsThread.next() -+ next(self.modelsThread) - else: - self.trace('In setModel(): models loading delayed!') - pass -@@ -526,7 +527,7 @@ - try: - labels = eval(text) - return labels -- except Exception, e: -+ except Exception as e: - self.warning( - 'ERROR! Unable to parse labels property: %s' % str(e)) - return [] -@@ -546,7 +547,7 @@ - section = self.rows[i] - self.table.setVerticalHeaderItem( - i, QtGui.QTableWidgetItem(section)) -- except Exception, e: -+ except Exception as e: - self.debug("setRowLabels(): Exception! %s" % e) - # self.create_widgets_table(self._columnsNames) - -@@ -567,7 +568,7 @@ - equipment = self.columns[i] - self.table.setHorizontalHeaderItem( - i, QtGui.QTableWidgetItem(equipment)) -- except Exception, e: -+ except Exception as e: - self.debug("setColumnLabels(): Exception! %s" % e) - # self.create_widgets_table(self._columnsNames) - -@@ -1022,9 +1023,9 @@ - from taurus.qt.qtgui.application import TaurusApplication - - if len(sys.argv) < 2: -- print "The format of the call is something like:" -- print '\t/usr/bin/python taurusgrid.py grid.pickle.file' -- print '\t/usr/bin/python taurusgrid.py "model=lt.*/VC.*/.*/((C*)|(P*)|(I*))" cols=IP,CCG,PNV rows=LT01,LT02 others=False rowframe=True colframe=False' -+ print("The format of the call is something like:") -+ print('\t/usr/bin/python taurusgrid.py grid.pickle.file') -+ print('\t/usr/bin/python taurusgrid.py "model=lt.*/VC.*/.*/((C*)|(P*)|(I*))" cols=IP,CCG,PNV rows=LT01,LT02 others=False rowframe=True colframe=False') - exit() - - app = TaurusApplication(sys.argv[0:1]) -@@ -1037,7 +1038,7 @@ - except: - args = sysargs_to_dict( - ['model', 'rows', 'cols', 'others', 'rowframe', 'colframe']) -- print "args = %s" % args -+ print("args = %s" % args) - if args.get('rows'): - gui.setRowLabels(args['rows']) - if args.get('cols'): -@@ -1048,6 +1049,6 @@ - gui.showColumnFrame('colframe' in args and args['colframe'] and True) - gui.showOthers('others' in args and args['others'] or True) - -- print "current TaurusGrid model= %s" % (gui.getModel()) -+ print("current TaurusGrid model= %s" % (gui.getModel())) - gui.show() - sys.exit(app.exec_()) ---- lib/taurus/qt/qtgui/table/taurustable.py (original) -+++ lib/taurus/qt/qtgui/table/taurustable.py (refactored) -@@ -25,13 +25,14 @@ - - """This module provides a base widget that can be used to display a taurus - model in a table widget""" -+from __future__ import absolute_import - - __all__ = ["TaurusBaseTableWidget"] - - __docformat__ = 'restructuredtext' - - from taurus.qt.qtgui.model import TaurusBaseModelWidget --from qtable import QBaseTableWidget -+from .qtable import QBaseTableWidget - - - class TaurusBaseTableWidget(QBaseTableWidget, TaurusBaseModelWidget): ---- lib/taurus/qt/qtgui/table/taurusvaluestable.py (original) -+++ lib/taurus/qt/qtgui/table/taurusvaluestable.py (refactored) -@@ -117,7 +117,7 @@ - value = self.typeCastingMap[tabledata.dtype.kind](value) - return Qt.QVariant(value) - elif role == Qt.Qt.DecorationRole: -- if (self._modifiedDict.has_key((index.row(), index.column()))) and\ -+ if ((index.row(), index.column()) in self._modifiedDict) and\ - (self._writeMode): - if self.getAttr().type in [DataType.Integer, DataType.Float]: - value = self._modifiedDict[(index.row(), index.column())] -@@ -130,7 +130,7 @@ - return Qt.QVariant(icon) - elif role == Qt.Qt.EditRole: - value = None -- if self._modifiedDict.has_key((index.row(), index.column())) and\ -+ if (index.row(), index.column()) in self._modifiedDict and\ - (self._writeMode): - value = self._modifiedDict[(index.row(), index.column())] - else: -@@ -144,7 +144,7 @@ - else: - return Qt.QVariant(Qt.QColor('white')) - elif role == Qt.Qt.ForegroundRole: -- if self._modifiedDict.has_key((index.row(), index.column())) and\ -+ if (index.row(), index.column()) in self._modifiedDict and\ - (self._writeMode): - if self.getAttr().type in [DataType.Integer, DataType.Float]: - value = self._modifiedDict[(index.row(), index.column())] -@@ -156,11 +156,11 @@ - return Qt.QVariant(Qt.QColor('blue')) - return Qt.QVariant(Qt.QColor('black')) - elif role == Qt.Qt.FontRole: -- if self._modifiedDict.has_key((index.row(), index.column())) and\ -+ if (index.row(), index.column()) in self._modifiedDict and\ - (self._writeMode): - return Qt.QVariant(Qt.QFont("Arial", 10, Qt.QFont.Bold)) - elif role == Qt.Qt.ToolTipRole: -- if self._modifiedDict.has_key((index.row(), index.column())) and\ -+ if (index.row(), index.column()) in self._modifiedDict and\ - (self._writeMode): - value = str(self._modifiedDict[(index.row(), index.column())]) - msg = 'Original value: %s.\nNew value that will be saved: %s' %\ -@@ -243,7 +243,7 @@ - - :param index: (QModelIndex) table index - ''' -- if self._modifiedDict.has_key((index.row(), index.column())): -+ if (index.row(), index.column()) in self._modifiedDict: - self._modifiedDict.pop((index.row(), index.column())) - - def flags(self, index): -@@ -748,7 +748,7 @@ - index = self._tableView.selectedIndexes()[0] - if index.isValid(): - val = self._tableView.model().getReadValue(index) -- if self._tableView.model().getModifiedDict().has_key((index.row(), index.column())): -+ if (index.row(), index.column()) in self._tableView.model().getModifiedDict(): - menu.addAction(Qt.QIcon.fromTheme( - 'edit-undo'), "Reset to original value (%s) " % repr(val), self._tableView.removeChange) - menu.addSeparator() ---- lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py (original) -+++ lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py (refactored) -@@ -32,6 +32,7 @@ - time and those customizations will also be stored, this file defines what a - user will find when launching the GUI for the first time. - """ -+from __future__ import print_function - - __all__ = ["AppSettingsWizard", "ExternalAppEditor"] - -@@ -241,7 +242,7 @@ - if not os.path.exists(dirname): - try: - os.makedirs(dirname) -- except Exception, e: -+ except Exception as e: - Qt.QMessageBox.warning(self, 'Error creating project directory', - 'Could not create the project directory.\nReason:%s' % repr( - e), -@@ -260,7 +261,7 @@ - if option == Qt.QMessageBox.Yes: - try: - self.wizard().loadXml(fname) -- except Exception, e: -+ except Exception as e: - Qt.QMessageBox.warning(self, 'Error loading project configuration', - 'Could not load the existing configuration.\nReason:%s' % repr( - e), -@@ -1304,7 +1305,7 @@ - def validatePage(self): - try: - self.createProject() -- except Exception, e: -+ except Exception as e: - Qt.QMessageBox.warning(self, 'Error creating project', - 'Could not create project files. \nReason:%s' % repr( - e), -@@ -1398,9 +1399,9 @@ - 'Application project created', msg, Qt.QMessageBox.Ok, self) - dlg.setDetailedText(details) - dlg.exec_() -- print -- print msg + details -- print -+ print() -+ print(msg + details) -+ print() - - - class AppSettingsWizard(Qt.QWizard): -@@ -1487,7 +1488,7 @@ - def getXml(self): - try: - return self.__getitem__("xml") -- except Exception, e: -+ except Exception as e: - return None - - def __setitem__(self, name, value): -@@ -1499,7 +1500,7 @@ - if isinstance(p, BasePage): - try: - return p[name]() -- except Exception, e: -+ except Exception as e: - pass - return self._item_funcs[name]() - ---- lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/__init__.py (original) -+++ lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/__init__.py (refactored) -@@ -23,4 +23,5 @@ - ## - ########################################################################### - --from config import * -+from __future__ import absolute_import -+from .config import * ---- lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/__init__.py (original) -+++ lib/taurus/qt/qtgui/taurusgui/conf/tgconf_macrogui/__init__.py (refactored) -@@ -23,4 +23,5 @@ - ## - ########################################################################### - --from config import * -+from __future__ import absolute_import -+from .config import * ---- lib/taurus/qt/qtgui/taurusgui/__init__.py (original) -+++ lib/taurus/qt/qtgui/taurusgui/__init__.py (refactored) -@@ -49,14 +49,15 @@ - prevail). - - """ -+from __future__ import absolute_import - - __docformat__ = 'restructuredtext' - --import utils --from paneldescriptionwizard import * --from taurusgui import * --from appsettingswizard import * -+from . import utils -+from .paneldescriptionwizard import * -+from .taurusgui import * -+from .appsettingswizard import * - try: -- from macrolistener import * -+ from .macrolistener import * - except ImportError: - pass # allow for sardana not being installed ---- lib/taurus/qt/qtgui/taurusgui/macrolistener.py (original) -+++ lib/taurus/qt/qtgui/taurusgui/macrolistener.py (refactored) -@@ -33,6 +33,7 @@ - - .. note:: This module will be moved to sardana.taurus at some point. - """ -+from __future__ import print_function - - # TODO: move to sardana.taurus - -@@ -596,5 +597,5 @@ - - b.setModel('door/cp1/1') - -- print '...' -+ print('...') - sys.exit(app.exec_()) ---- lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py (original) -+++ lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py (refactored) -@@ -23,6 +23,7 @@ - ## - ########################################################################### - -+from __future__ import print_function - __all__ = ["PanelDescriptionWizard"] - """ - paneldescriptionwizard.py: -@@ -99,7 +100,7 @@ - # We use this because __import__('x.y') returns x instead of y !! - self.module = sys.modules[modulename] - self.moduleNameLE.setStyleSheet('QLineEdit {color: green}') -- except Exception, e: -+ except Exception as e: - Logger().debug(repr(e)) - self.moduleNameLE.setStyleSheet('QLineEdit {color: red}') - return -@@ -129,7 +130,7 @@ - membername = str(self.membersCB.currentText()) - member = getattr(self.module, membername, None) - result = {'modulename': self.module.__name__} -- except Exception, e: -+ except Exception as e: - Logger().debug('Cannot get member description: %s', repr(e)) - return None - if inspect.isclass(member): -@@ -307,7 +308,7 @@ - paneldesc.name = Qt.from_qvariant(self.field('panelname'), str) - # allow the wizard to proceed - return True -- except Exception, e: -+ except Exception as e: - Qt.QMessageBox.warning( - self, 'Invalid panel', 'The requested panel cannot be created. \nReason:\n%s' % repr(e)) - return False -@@ -406,7 +407,7 @@ - def initializePage(self): - try: - widget = self.wizard().getPanelDescription().getWidget() -- except Exception, e: -+ except Exception as e: - Logger().debug(repr(e)) - widget = None - # prevent the user from changing the model if it was already set -@@ -417,7 +418,7 @@ - try: - if isinstance(Qt.qApp.SDM, SharedDataManager): - sdm = Qt.qApp.SDM -- except Exception, e: -+ except Exception as e: - Logger().debug(repr(e)) - sdm = None - #@todo set selection filter in modelChooser based on the widget's modelclass -@@ -652,7 +653,7 @@ - form = PanelDescriptionWizard() - - def kk(d): -- print d -+ print(d) - Qt.qApp.SDM = SharedDataManager(form) - Qt.qApp.SDM.connectReader('111111', kk) - Qt.qApp.SDM.connectWriter('222222', form, 'thisisasignalname') -@@ -664,7 +665,7 @@ - def test2(): - from taurus.qt.qtgui.application import TaurusApplication - app = TaurusApplication(sys.argv) -- print ExpertWidgetChooserDlg.getDialog() -+ print(ExpertWidgetChooserDlg.getDialog()) - sys.exit() - - -@@ -675,7 +676,7 @@ - form = Qt.QMainWindow() - - def kk(d): -- print d -+ print(d) - Qt.qApp.SDM = SharedDataManager(form) - Qt.qApp.SDM.connectReader('someUID', kk) - Qt.qApp.SDM.connectWriter('anotherUID', form, 'thisisasignalname') -@@ -688,7 +689,7 @@ - w = paneldesc.getWidget(sdm=Qt.qApp.SDM) - form.setCentralWidget(w) - form.setWindowTitle(paneldesc.name) -- print Qt.qApp.SDM.info() -+ print(Qt.qApp.SDM.info()) - - sys.exit(app.exec_()) - ---- lib/taurus/qt/qtgui/taurusgui/taurusgui.py (original) -+++ lib/taurus/qt/qtgui/taurusgui/taurusgui.py (refactored) -@@ -162,7 +162,7 @@ - module = __import__(modulename, fromlist=['']) - klass = getattr(module, classname) - w = klass() -- except Exception, e: -+ except Exception as e: - raise RuntimeError( - 'Cannot create widget from classname "%s". Reason: %s' % (classname, repr(e))) - # set customwidgetmap if necessary -@@ -191,7 +191,7 @@ - 'widgetClassName'), modulename=configdict.get('widgetModuleName', None)) - if isinstance(self.widget(), BaseConfigurableClass): - self.widget().applyConfig(configdict['widget']) -- except Exception, e: -+ except Exception as e: - self.info( - 'Failed to set the widget for this panel. Reason: %s' % repr(e)) - self.traceback(self.Debug) -@@ -820,7 +820,7 @@ - synoptic = TaurusJDrawSynopticsView() - synoptic.setModel(jdwFileName) - self.__synoptics.append(synoptic) -- except Exception, e: -+ except Exception as e: - # print repr(e) - msg = 'Error loading synoptic file "%s".\nSynoptic won\'t be available' % jdwFileName - self.error(msg) -@@ -880,7 +880,7 @@ - instruments = ms.getElementsOfType('Instrument') - if instruments is None: - raise -- except Exception, e: -+ except Exception as e: - msg = 'Could not fetch Instrument list from "%s"' % macroservername - self.error(msg) - result = Qt.QMessageBox.critical(self, 'Initialization error', '%s\n\n%s' % ( -@@ -984,7 +984,7 @@ - else: # if confname is not a dir name, we assume it is a module name in the python path - conf = self._importConfiguration(confname) - self._confDirectory = os.path.dirname(conf.__file__) -- except Exception, e: -+ except Exception as e: - import traceback - msg = 'Error loading configuration: %s' % traceback.format_exc() # repr(e) - self.error(msg) -@@ -1010,7 +1010,7 @@ - xmlstring = xmlFile.read() - xmlFile.close() - xmlroot = etree.fromstring(xmlstring) -- except Exception, e: -+ except Exception as e: - msg = 'Error reading the XML file: "%s"' % xmlfname - self.error(msg) - self.traceback(level=taurus.Info) -@@ -1185,7 +1185,7 @@ - # create a panel - self.createPanel(w, p.name, floating=p.floating, registerconfig=registerconfig, - instrumentkey=instrumentkey, permanent=True) -- except Exception, e: -+ except Exception as e: - msg = 'Cannot create panel %s' % getattr( - p, 'name', '__Unknown__') - self.error(msg) -@@ -1227,7 +1227,7 @@ - if isinstance(w, BaseConfigurableClass): - self.registerConfigDelegate(w, d.name) - -- except Exception, e: -+ except Exception as e: - msg = 'Cannot add toolbar %s' % getattr( - d, 'name', '__Unknown__') - self.error(msg) -@@ -1273,7 +1273,7 @@ - # register the toolbar as delegate if it supports it - if isinstance(w, BaseConfigurableClass): - self.registerConfigDelegate(w, d.name) -- except Exception, e: -+ except Exception as e: - msg = 'Cannot add applet %s' % getattr( - d, 'name', '__Unknown__') - self.error(msg) -@@ -1509,7 +1509,7 @@ - f = open(self._xmlConfigFileName, 'r') - xmlroot = etree.fromstring(f.read()) - f.close() -- except Exception, e: -+ except Exception as e: - self.error('Cannot parse file "%s": %s', - self._xmlConfigFileName, str(e)) - return -@@ -1564,7 +1564,7 @@ - f.write(xml) - f.close() - break -- except Exception, e: -+ except Exception as e: - msg = 'Cannot write to %s: %s' % (fname, str(e)) - self.error(msg) - Qt.QMessageBox.warning( ---- lib/taurus/qt/qtgui/taurusgui/utils.py (original) -+++ lib/taurus/qt/qtgui/taurusgui/utils.py (refactored) -@@ -387,7 +387,7 @@ - # if model is a sequence, convert to space-separated string - try: - model = " ".join(model) -- except Exception, e: -+ except Exception as e: - msg = ('Cannot convert %s to a space-separated string: %s' % - (model, e)) - Logger().debug(msg) ---- lib/taurus/qt/qtgui/tree/taurusdbtree.py (original) -+++ lib/taurus/qt/qtgui/tree/taurusdbtree.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module provides widgets that display the database in a tree format""" -+from __future__ import absolute_import - - # todo: tango-centric!! - -@@ -37,7 +38,7 @@ - from taurus.qt.qtcore.model import * - from taurus.qt.qtgui.base import TaurusBaseWidget - from taurus.qt.qtgui.icon import getElementTypeIcon, getElementTypeIconName --from taurustree import TaurusBaseTreeWidget -+from .taurustree import TaurusBaseTreeWidget - - - class TaurusDbTreeWidget(TaurusBaseTreeWidget): ---- lib/taurus/qt/qtgui/tree/taurusdevicetree.py (original) -+++ lib/taurus/qt/qtgui/tree/taurusdevicetree.py (refactored) -@@ -26,6 +26,7 @@ - """ - taurusdevicetree.py: - """ -+from __future__ import print_function - - # @todo: This module is not being used anywhere in Taurus and depends on - # non-standard and non-provided modules. It is also quite specific and -@@ -568,7 +569,7 @@ - def trace(self, msg): - if self.TRACE_ALL or self.getLogLevel() in ('DEBUG', 40,): - # @TODO: use the taurus logger instead! ~~cpascual 20121121 -- print 'TaurusDevTree.%s: %s' % (self.getLogLevel(), msg) -+ print('TaurusDevTree.%s: %s' % (self.getLogLevel(), msg)) - - def setTangoHost(self, tango_host=None): - self.db = taurus.Authority(tango_host) -@@ -761,12 +762,12 @@ - label = aname == my_attr.label and aname.lower( - ) or "%s (%s)" % (aname.lower(), my_attr.label) - dct[str(my_device).lower() + '/' + label] = 0 -- except PyTango.DevFailed, e: -+ except PyTango.DevFailed as e: - self.warning('addAttrToDev(%s): %s' % (my_device, str(e))) - qmsg = Qt.QMessageBox(Qt.QMessageBox.Critical, '%s Error' % - my_device, '%s not available' % my_device, Qt.QMessageBox.Ok, self) - qmsg.show() -- except Exception, e: -+ except Exception as e: - self.warning('addAttrToDev(%s): %s' % (my_device, str(e))) - qmsg = Qt.QMessageBox(Qt.QMessageBox.Critical, '%s Error' % - my_device, str(e), Qt.QMessageBox.Ok, self) -@@ -1006,7 +1007,7 @@ - for item in self.item_list if item.isExpanded()] - self.debug('findInTree(%s): Node not found' % (regexp)) - if queue: -- self.Expander.next() -+ next(self.Expander) - except: - self.warning('findInTree(%s): failed' % (regexp)) - self.error(traceback.format_exc()) -@@ -1019,7 +1020,7 @@ - allChildren[str(it.text(0))] = it - - sorter = lambda k, ks=[re.compile(c) for c in order]: str( -- (i for i, r in enumerate(ks) if r.match(k.lower())).next()) + str(k) -+ next((i for i, r in enumerate(ks) if r.match(k.lower())))) + str(k) - for c, it in sorted(allChildren.items(), key=lambda k: sorter(k[0])): - self.debug('tree.sortCustom(%s): %s inserted at %d' % - (order, it.text(0), self.topLevelItemCount())) -@@ -1298,7 +1299,7 @@ - elif not last_was_separator: - menu.addSeparator() - last_was_separator = True -- except Exception, e: -+ except Exception as e: - self.warning('Unable to add Menu Action: %s:%s' % (t, e)) - - if hasattr(node, 'ExpertMenu'): -@@ -1319,7 +1320,7 @@ - elif not last_was_separator: - expert.addSeparator() - last_was_separator = True -- except Exception, e: -+ except Exception as e: - self.warning('Unable to add Expert Action: %s:%s' % (t, e)) - # menu.addSeparator() - menu.exec_(event.globalPos()) -@@ -1666,7 +1667,7 @@ - try: - setattr(self, k, partial( - self.method_forwarder, method=k, object=self.tree)) -- except Exception, e: -+ except Exception as e: - self.warning('Unable to add slot %s: %s' % (k, e)) - # Event forwarding ... - self.tree.refreshTree.connect(self.refreshTree) ---- lib/taurus/qt/qtgui/tree/taurustree.py (original) -+++ lib/taurus/qt/qtgui/tree/taurustree.py (refactored) -@@ -25,13 +25,14 @@ - - """This module provides a base widget that can be used to display a taurus - model in a tree widget""" -+from __future__ import absolute_import - - __all__ = ["TaurusBaseTreeWidget"] - - __docformat__ = 'restructuredtext' - - from taurus.qt.qtgui.model import TaurusBaseModelWidget --from qtree import QBaseTreeWidget -+from .qtree import QBaseTreeWidget - - - class TaurusBaseTreeWidget(QBaseTreeWidget, TaurusBaseModelWidget): ---- lib/taurus/qt/qtgui/util/taurusactionfactory.py (original) -+++ lib/taurus/qt/qtgui/util/taurusactionfactory.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module is designed to provide a factory class for taurus Qt actions """ -+from __future__ import absolute_import - - __all__ = ["ActionFactory"] - -@@ -33,7 +34,7 @@ - from taurus.core.util.singleton import Singleton - from taurus.external.qt import Qt - --import taurusaction -+from . import taurusaction - - - class ActionFactory(Singleton, Logger): ---- lib/taurus/qt/qtgui/util/taurusaction.py (original) -+++ lib/taurus/qt/qtgui/util/taurusaction.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """This module is designed to provide a library of taurus Qt actions""" -+from __future__ import absolute_import - - __all__ = ["ExternalAppAction", - "TaurusMenu", -@@ -171,7 +172,7 @@ - self.buildFromXML(m_node) - - def getActionFactory(self): -- import taurusactionfactory -+ from . import taurusactionfactory - return taurusactionfactory.ActionFactory() - - def buildFromXML(self, m_node): ---- lib/taurus/qt/qtgui/util/tauruscolor.py (original) -+++ lib/taurus/qt/qtgui/util/tauruscolor.py (refactored) -@@ -57,10 +57,10 @@ - - f = self._qbrush_cache_fg - b = self._qbrush_cache_bg -- if not f.has_key(name): -+ if name not in f: - f[name] = Qt.QBrush(self.qcolor(stoq)[1]) - -- if not b.has_key(name): -+ if name not in b: - b[name] = Qt.QBrush(self.qcolor(stoq)[0]) - if name == 'None': - b[name].setStyle(Qt.Qt.BDiagPattern) -@@ -73,10 +73,10 @@ - - f = self._qcolor_cache_fg - b = self._qcolor_cache_bg -- if not f.has_key(name): -+ if name not in f: - f[name] = Qt.QColor(self.number(name, True)) - -- if not b.has_key(name): -+ if name not in b: - b[name] = Qt.QColor(self.number(name)) - - return (b[name], f[name]) -@@ -87,7 +87,7 @@ - - f = self._qvariant_cache_fg - b = self._qvariant_cache_bg -- if not f.has_key(name): -+ if name not in f: - (back, fore) = self.qcolor(name) - f[name] = Qt.QVariant(fore) - b[name] = Qt.QVariant(back) ---- lib/taurus/qt/qtgui/util/taurusropepatch.py (original) -+++ lib/taurus/qt/qtgui/util/taurusropepatch.py (refactored) -@@ -39,7 +39,7 @@ - """Monkey patching rope for better performances""" - import rope - if rope.VERSION not in ('0.9.3', '0.9.2'): -- raise ImportError, "rope %s can't be patched" % rope.VERSION -+ raise ImportError("rope %s can't be patched" % rope.VERSION) - - # Patching pycore.PyCore, so that forced builtin modules (i.e. modules - # that were declared as 'extension_modules' in rope preferences) ---- lib/taurus/qt/qtgui/util/tauruswidgetfactory.py (original) -+++ lib/taurus/qt/qtgui/util/tauruswidgetfactory.py (refactored) -@@ -120,9 +120,9 @@ - qt_ret[dir_name] = package, attr - if issubclass(attr, taurus.qt.qtgui.base.TaurusBaseWidget): - taurus_ret[dir_name] = package, attr -- except Exception, e: -+ except Exception as e: - pass -- except Exception, e: -+ except Exception as e: - return taurus_ret, qt_ret - - if not recursive: -@@ -161,13 +161,13 @@ - try: - self.debug("Trying to find extra module %s", m_name) - f, fname, data = imp.find_module(m_name, [path]) -- except ImportError, ie: -+ except ImportError as ie: - self.debug("Could not find extra module %s:%s", m_name, ie) - continue - try: - self.debug("Trying to load extra module %s", m_name) - mod = imp.load_module(m_name, f, fname, data) -- except ImportError, ie: -+ except ImportError as ie: - self.debug("Could not load extra module %s:%s", m_name, ie) - continue - dir_names = dir(mod) -@@ -184,7 +184,7 @@ - taurus_ret[dir_name] = qt_info['module'], attr - qt_widgets[dir_name] = qt_info['module'], attr - self.debug("registered taurus widget %s", dir_name) -- except Exception, e: -+ except Exception as e: - pass - - def getWidgets(self): ---- lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py (original) -+++ lib/taurus/qt/qtgui/util/test/test_ui/test_ui.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - """Unit tests for UILoadable decorator""" -+from __future__ import absolute_import - - import os.path - -@@ -31,7 +32,7 @@ - from taurus.external.qt import Qt - from taurus.qt.qtgui.util.ui import UILoadable - from taurus.qt.qtgui.test import BaseWidgetTestCase --from mywidget3 import MyWidget3 -+from .mywidget3 import MyWidget3 - - - class UILoadableTestCase(unittest.TestCase): ---- lib/taurus/test/fuzzytest.py (original) -+++ lib/taurus/test/fuzzytest.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - '''Utility functions to deal with non-ideal (fuzzy) tests''' -+from __future__ import print_function - - - def loopTest(testname, maxtries=100, maxfails=10): -@@ -97,8 +98,8 @@ - times that the test should be passed to have a confidence>99%% - that the bug is fixed' - ''' -- print ("Running the test %i times (or until it fails %i times)" + -- "to estimate the failure rate") % (maxtries, maxfails) -+ print(("Running the test %i times (or until it fails %i times)" + -+ "to estimate the failure rate") % (maxtries, maxfails)) - import numpy - - if isinstance(test, str): -@@ -108,11 +109,11 @@ - maxfails=maxfails, **kwargs) - r = float(fails) / tries - dr = numpy.sqrt(fails) / tries -- print 'Failure rate = %g +/- %g (%i/%i)' % (r, dr, fails, tries) -+ print('Failure rate = %g +/- %g (%i/%i)' % (r, dr, fails, tries)) - # calculating n using p-value=1% and failure rate with -1 sigma - n = numpy.ceil(numpy.log(.01) / numpy.log(1 - (r - dr))) -- print ('Number of consecutive times that the test should be passed ' + -- 'to have a confidence>99%% that the bug is fixed: %g') % n -+ print(('Number of consecutive times that the test should be passed ' + -+ 'to have a confidence>99%% that the bug is fixed: %g') % n) - return r, dr, n - - -@@ -127,7 +128,7 @@ - exit(1) - return - -- print calculateTestFuzziness(kk) -+ print(calculateTestFuzziness(kk)) - - # print calculateTestFuzziness('test_pytango_bug659.TestPyTango_Bug659') - # ---- lib/taurus/test/moduleexplorer.py (original) -+++ lib/taurus/test/moduleexplorer.py (refactored) -@@ -25,6 +25,7 @@ - ########################################################################### - - '''Utility code for returning info about a module''' -+from __future__ import print_function - - import sys - import os -@@ -50,7 +51,7 @@ - for p in paterns: - if re.match(p, name) is not None: - if self.verbose: -- print 'excluding "%s" (matches %s)' % (name, p.pattern) -+ print('excluding "%s" (matches %s)' % (name, p.pattern)) - return True - return False - -@@ -90,7 +91,7 @@ - externalmembernames, submodules, warnings - ''' - if self.verbose: -- print "Exploring %s..." % modulename -+ print("Exploring %s..." % modulename) - warnings = [] - try: - module = __import__(modulename, fromlist=['']) -@@ -99,7 +100,7 @@ - modulename, repr(e)) - warnings.append(msg) - if self.verbose: -- print msg -+ print(msg) - return dict(modulename=modulename, - basemodulename=modulename.split('.')[-1], - modulepath=None, -@@ -213,12 +214,12 @@ - ): - moduleinfo, allw = ModuleExplorer.explore( - modulename, exclude_patterns=exclude_patterns, verbose=True) -- print '\n\n' + '*' * 50 -- print "Exploration finished with %i warnings:" % (len(allw)) -+ print('\n\n' + '*' * 50) -+ print("Exploration finished with %i warnings:" % (len(allw))) - for m, w in allw: -- print w -- print '*' * 50 + '\n' -- print -+ print(w) -+ print('*' * 50 + '\n') -+ print() - assert len(allw) == 0 - - # import pprint ---- lib/taurus/test/resource.py (original) -+++ lib/taurus/test/resource.py (refactored) -@@ -24,6 +24,7 @@ - ########################################################################### - - '''Utility code for working with test resources''' -+from __future__ import print_function - - import os - import sys -@@ -62,8 +63,8 @@ - - - if __name__ == "__main__": -- print getResourcePath('taurus.test') -- print getResourcePath('taurus.test', 'resource.py') -+ print(getResourcePath('taurus.test')) -+ print(getResourcePath('taurus.test', 'resource.py')) - # print getResourcePath('taurus.qt.qtgui.plot', 'taurusplot.py') - # print getResourcePath('taurus.test', 'kk.py') - # print getResourcePath('taurus.kk', 'resource.py') ---- lib/taurus/test/test_import.py (original) -+++ lib/taurus/test/test_import.py (refactored) -@@ -24,6 +24,7 @@ - - - """Taurus import tests""" -+from __future__ import absolute_import - - from taurus.external import unittest - -@@ -36,7 +37,7 @@ - - def setUp(self): - """Preconditions: moduleexplorer utility has to be available """ -- from moduleexplorer import ModuleExplorer -+ from .moduleexplorer import ModuleExplorer - self.explore = ModuleExplorer.explore - - def testImportSubmodules(self): ---- lib/taurus/test/testsuite.py (original) -+++ lib/taurus/test/testsuite.py (refactored) -@@ -31,6 +31,7 @@ - testsuite.run() - - """ -+from __future__ import print_function - - __docformat__ = 'restructuredtext' - -@@ -47,7 +48,7 @@ - for e in suite: - if isinstance(e, unittest.TestCase): - if re.match(exclude_pattern, e.id()): -- print "Excluded %s" % e.id() -+ print("Excluded %s" % e.id()) - continue - ret.addTest(e) - else: -@@ -99,7 +100,7 @@ - args = parser.parse_args() - - if args.version: -- print Release.version -+ print(Release.version) - sys.exit(0) - - if args.skip_gui: diff --git a/futurize2.log b/futurize2.log deleted file mode 100644 index 12887a347..000000000 --- a/futurize2.log +++ /dev/null @@ -1,5652 +0,0 @@ ---- ./doc/auto_rst4api.py (original) -+++ ./doc/auto_rst4api.py (refactored) -@@ -28,6 +28,8 @@ - the API of a python module with sphinx''' - from __future__ import print_function - -+from builtins import zip -+from builtins import object - import sys - import os - import imp -@@ -172,7 +174,7 @@ - if self.verbose: - print(' skipping (file already exists)') - # recurse for submodules -- for sminfo in info['submodules'].itervalues(): -+ for sminfo in info['submodules'].values(): - self.createStubs(sminfo, absdocpath) - - def documentModule(self, modulename, docparentpath, exclude_patterns=None): -@@ -204,7 +206,7 @@ - if len(w) == 0: - return [] - else: -- return zip(*w)[1] -+ return list(zip(*w))[1] - - - def main(): ---- ./doc/source/devel/examples/TaurusTest.py (original) -+++ ./doc/source/devel/examples/TaurusTest.py (refactored) -@@ -1,4 +1,7 @@ - from __future__ import print_function -+from __future__ import division -+from builtins import range -+from past.utils import old_div - import PyTango - import sys - import math -@@ -21,7 +24,7 @@ - self._velocity = 20.0 - self._acceleration = 4.0 - self._simulation_mode = False -- self._abscissas = [x / 50.0 for x in xrange(1024)] -+ self._abscissas = [old_div(x, 50.0) for x in range(1024)] - self._curve = [math.sin(x) for x in self._abscissas] - - def always_executed_hook(self): ---- ./doc/source/devel/examples/label06.py (original) -+++ ./doc/source/devel/examples/label06.py (refactored) -@@ -1,3 +1,4 @@ -+from builtins import range - import sys - from taurus.external.qt import Qt - from taurus.qt.qtgui.display import TaurusLabel ---- ./doc/source/sphinxext/taurusextension.py (original) -+++ ./doc/source/sphinxext/taurusextension.py (refactored) -@@ -26,6 +26,8 @@ - """helper methods for taurus sphinx documentation""" - from __future__ import print_function - -+from builtins import str -+from builtins import map - __expr = ('or',) - - ---- ./lib/taurus/__init__.py (original) -+++ ./lib/taurus/__init__.py (refactored) -@@ -26,13 +26,14 @@ - """The main taurus module. It contains a reduced set of wrappers around the - real taurus model classes and information regarding the current release.""" - -+from builtins import object - from .core import release as __R - - --class Release: -+class Release(object): - pass - --for key, value in __R.__dict__.items(): -+for key, value in list(__R.__dict__.items()): - setattr(Release, key, value) - Release.__doc__ = __R.__doc__ - ---- ./lib/taurus/console/list.py (original) -+++ ./lib/taurus/console/list.py (refactored) -@@ -26,6 +26,8 @@ - """ """ - from __future__ import absolute_import - -+from builtins import map -+from builtins import range - __all__ = ["List"] - - __docformat__ = "restructuredtext" -@@ -62,7 +64,7 @@ - self.append(header) - - def setHeaderSeparator(self, header_separator): -- if isinstance(header_separator, (str, unicode)): -+ if isinstance(header_separator, (str, str)): - header_separator = self.col_nb * [header_separator] - self.HeaderSeparator = header_separator - -@@ -72,7 +74,7 @@ - header_separator = property(getHeaderSeparator, setHeaderSeparator) - - def setRowSeparator(self, row_separator): -- if isinstance(row_separator, (str, unicode)): -+ if isinstance(row_separator, (str, str)): - row_separator = self.col_nb * [row_separator] - self.RowSeparator = row_separator - -@@ -104,7 +106,7 @@ - text_alignment = property(getTextAlignment, setTextAlignment) - - def _transform_row(self, row): -- return map(str, row[:self.col_nb]) -+ return list(map(str, row[:self.col_nb])) - - def __setitem__(self, i, row): - return list.__setitem__(self, i, self._transform_row(row)) ---- ./lib/taurus/console/table.py (original) -+++ ./lib/taurus/console/table.py (refactored) -@@ -24,6 +24,11 @@ - ############################################################################# - - """ """ -+from __future__ import division -+from builtins import map -+from builtins import range -+from builtins import object -+from past.utils import old_div - from functools import reduce - - __all__ = ["Table"] -@@ -31,7 +36,7 @@ - __docformat__ = "restructuredtext" - - --class Table: -+class Table(object): - - DefTermWidth = 80 - -@@ -58,7 +63,7 @@ - self.col_head_sep = col_head_sep - self.border = border - -- max_len_fn = lambda x: reduce(max, map(len, x)) -+ max_len_fn = lambda x: reduce(max, list(map(len, x))) - - self.row_head_str = row_head_str - self.row_head_fmt = row_head_fmt -@@ -81,7 +86,7 @@ - raise ValueError(msg) - if col_head_width is None: - if col_head_str is not None: -- col_head_width = reduce(max, map(max_len_fn, col_head_str)) -+ col_head_width = reduce(max, list(map(max_len_fn, col_head_str))) - else: - col_head_width = 10 - self.col_head_width = col_head_width -@@ -107,7 +112,7 @@ - width = term_width - chw # At least one disp column! - if rhw > 0: - width -= rhw + lcs -- disp_cols = width / (chw + lcs) + 1 -+ disp_cols = old_div(width, (chw + lcs)) + 1 - tot_width = chw + (disp_cols - 1) * (chw + lcs) - tot_rows = chl + self.nr_row - if rhw > 0: -@@ -124,36 +129,36 @@ - else: - row_head = [''] * tot_rows - -- for i in xrange(0, self.nr_col, disp_cols): -+ for i in range(0, self.nr_col, disp_cols): - if i > 0: -- nr_sep = tot_width / len(self.row_sep) -+ nr_sep = old_div(tot_width, len(self.row_sep)) - output.append(self.row_sep * nr_sep) - - row_end = min(i + disp_cols, self.nr_col) - line = list(row_head) -- for j in xrange(i, row_end): -+ for j in range(i, row_end): - elem = self.elem_list[j] - if chl: - col_head = self.col_head_str[j] - if j > i: -- for k in xrange(tot_rows): -+ for k in range(tot_rows): - line[k] += self.col_sep - fmt = self.col_head_fmt -- for k in xrange(chl): -+ for k in range(chl): - line[k] += fmt % (chw, col_head[k]) - -- for k in xrange(self.nr_row): -+ for k in range(self.nr_row): - fmt = self.elem_fmt[k] - line[chl + k] += fmt % (chw, elem[k]) - -- max_width = reduce(max, map(len, line)) -+ max_width = reduce(max, list(map(len, line))) - if self.border is not None: -- nr_border = max_width / len(self.border) -+ nr_border = old_div(max_width, len(self.border)) - output.append(self.border * nr_border) - for l in line[:chl]: - output.append(l) - if self.col_head_sep is not None: -- nr_sep = max_width / len(self.col_head_sep) -+ nr_sep = old_div(max_width, len(self.col_head_sep)) - output.append(self.col_head_sep * nr_sep) - for l in line[chl:]: - output.append(l) ---- ./lib/taurus/core/release.py (original) -+++ ./lib/taurus/core/release.py (refactored) -@@ -23,6 +23,7 @@ - ## - ############################################################################# - -+from builtins import str - __docformat__ = "restructuredtext" - - """ ---- ./lib/taurus/core/taurusattribute.py (original) -+++ ./lib/taurus/core/taurusattribute.py (refactored) -@@ -25,6 +25,7 @@ - - """This module contains the base class for a taurus attribute""" - -+from builtins import str - __all__ = ["TaurusAttribute"] - - __docformat__ = "restructuredtext" ---- ./lib/taurus/core/taurusbasetypes.py (original) -+++ ./lib/taurus/core/taurusbasetypes.py (refactored) -@@ -26,6 +26,7 @@ - a misc collection of basic types - ''' - -+from builtins import object - __all__ = ["TaurusSWDevState", "TaurusSWDevHealth", "OperationMode", - "TaurusSerializationMode", "SubscriptionState", "TaurusEventType", - "MatchLevel", "TaurusElementType", "LockStatus", "DataFormat", -@@ -149,7 +150,7 @@ - __PYTHON_TYPE_TO_TAURUS_DATATYPE = { - str: DataType.String, - int: DataType.Integer, -- long: DataType.Integer, -+ int: DataType.Integer, - float: DataType.Float, - bool: DataType.Boolean, - # bytes : DataType.Bytes, # see below... ---- ./lib/taurus/core/taurusconfiguration.py (original) -+++ ./lib/taurus/core/taurusconfiguration.py (refactored) -@@ -27,6 +27,7 @@ - """[DEPRECATED since taurus v4] - This module contains the base class for a taurus attribute configuration""" - -+from builtins import object - __all__ = ["TaurusConfigurationProxy", "TaurusConfiguration"] - - __docformat__ = "restructuredtext" ---- ./lib/taurus/core/taurusdevice.py (original) -+++ ./lib/taurus/core/taurusdevice.py (refactored) -@@ -126,7 +126,7 @@ - # synchronous polling. - if asynch is True: - return 1 -- for attr in attrs.values(): -+ for attr in list(attrs.values()): - attr.poll() - - @property ---- ./lib/taurus/core/taurusexception.py (original) -+++ ./lib/taurus/core/taurusexception.py (refactored) -@@ -25,6 +25,7 @@ - - """This module contains the taurus base exception classes""" - -+from builtins import str - __all__ = ["TaurusException", "DoubleRegistration"] - - __docformat__ = "restructuredtext" ---- ./lib/taurus/core/taurusfactory.py (original) -+++ ./lib/taurus/core/taurusfactory.py (refactored) -@@ -57,6 +57,7 @@ - """ - from __future__ import absolute_import - -+from builtins import object - __all__ = ["TaurusFactory"] - - __docformat__ = "restructuredtext" -@@ -324,14 +325,14 @@ - if not self.isPollingEnabled(): - return - self._polling_enabled = False -- for period, timer in self.polling_timers.iteritems(): -+ for period, timer in self.polling_timers.items(): - timer.stop() - - def enablePolling(self): - """Enable the application tango polling""" - if self.isPollingEnabled(): - return -- for period, timer in self.polling_timers.iteritems(): -+ for period, timer in self.polling_timers.items(): - timer.start() - self._polling_enabled = True - -@@ -354,7 +355,7 @@ - :param attribute: (str) attribute name. - """ - p = None -- for period, timer in self.polling_timers.iteritems(): -+ for period, timer in self.polling_timers.items(): - if timer.containsAttribute(attribute): - timer.removeAttribute(attribute) - if timer.getAttributeCount() == 0: ---- ./lib/taurus/core/taurushelper.py (original) -+++ ./lib/taurus/core/taurushelper.py (refactored) -@@ -26,6 +26,7 @@ - """a list of helper methods""" - from __future__ import print_function - -+from builtins import str - __all__ = ['check_dependencies', 'log_dependencies', 'getSchemeFromName', - 'getValidTypesForName', 'isValidName', 'makeSchemeExplicit', - 'Manager', 'Factory', 'Device', 'Attribute', 'Configuration', ---- ./lib/taurus/core/tauruslistener.py (original) -+++ ./lib/taurus/core/tauruslistener.py (refactored) -@@ -26,6 +26,8 @@ - """This module contains the taurus base listeners classes""" - from __future__ import print_function - -+from builtins import str -+from builtins import object - __all__ = ["TaurusListener", "TaurusExceptionListener"] - - __docformat__ = "restructuredtext" ---- ./lib/taurus/core/taurusmanager.py (original) -+++ ./lib/taurus/core/taurusmanager.py (refactored) -@@ -26,6 +26,7 @@ - """This module contains the taurus base manager class""" - from __future__ import print_function - -+from builtins import range - __all__ = ["TaurusManager"] - - __docformat__ = "restructuredtext" -@@ -346,7 +347,7 @@ - self.debug('Failed to inspect %s' % (full_module_name)) - self.debug('Details:', exc_info=1) - continue -- for s in m.__dict__.values(): -+ for s in list(m.__dict__.values()): - plugin = None - try: - if issubclass(s, TaurusFactory) and \ -@@ -369,7 +370,7 @@ - - def _find_scheme(self, factory_class): - class_name = factory_class.__name__ -- for i in xrange(1, len(class_name)): -+ for i in range(1, len(class_name)): - if class_name[i].isupper(): - return class_name[:i].lower() - ---- ./lib/taurus/core/taurusmodel.py (original) -+++ ./lib/taurus/core/taurusmodel.py (refactored) -@@ -25,6 +25,7 @@ - - """This module contains the base TaurusModel class""" - -+from builtins import object - __all__ = ["TaurusModel"] - - __docformat__ = "restructuredtext" -@@ -219,7 +220,7 @@ - def _getCallableRef(self, listener, cb=None): - # return weakref.ref(listener, self._listenerDied) - meth = getattr(listener, 'eventReceived', None) -- if meth is not None and operator.isCallable(meth): -+ if meth is not None and hasattr(meth, '__call__'): - return weakref.ref(listener, cb) - else: - return CallableRef(listener, cb) -@@ -249,7 +250,7 @@ - return True - - def forceListening(self): -- class __DummyListener: -+ class __DummyListener(object): - - def eventReceived(self, *args): - pass -@@ -292,9 +293,9 @@ - if l is None: - continue - meth = getattr(l, 'eventReceived', None) -- if meth is not None and operator.isCallable(meth): -+ if meth is not None and hasattr(meth, '__call__'): - l.eventReceived(self, event_type, event_value) -- elif operator.isCallable(l): -+ elif hasattr(l, '__call__'): - l(self, event_type, event_value) - - def isWritable(self): ---- ./lib/taurus/core/tauruspollingtimer.py (original) -+++ ./lib/taurus/core/tauruspollingtimer.py (refactored) -@@ -24,7 +24,9 @@ - ############################################################################# - - """This module contains the polling class""" -+from __future__ import division - -+from past.utils import old_div - __all__ = ["TaurusPollingTimer"] - - __docformat__ = "restructuredtext" -@@ -52,7 +54,7 @@ - self.call__init__(Logger, name, parent) - self.dev_dict = {} - self.attr_nb = 0 -- self.timer = Timer(period / 1000.0, self._pollAttributes, self) -+ self.timer = Timer(old_div(period, 1000.0), self._pollAttributes, self) - self.lock = threading.RLock() - - def start(self): -@@ -134,14 +136,14 @@ - when it is time to poll. Do not call this method directly - """ - req_ids = {} -- for dev, attrs in self.dev_dict.items(): -+ for dev, attrs in list(self.dev_dict.items()): - try: - req_id = dev.poll(attrs, asynch=True) - req_ids[dev] = attrs, req_id - except Exception as e: - self.error("poll_asynch error") - self.debug("Details:", exc_info=1) -- for dev, (attrs, req_id) in req_ids.items(): -+ for dev, (attrs, req_id) in list(req_ids.items()): - try: - dev.poll(attrs, req_id=req_id) - except Exception as e: ---- ./lib/taurus/core/epics/test/test_epicsattribute.py (original) -+++ ./lib/taurus/core/epics/test/test_epicsattribute.py (refactored) -@@ -101,7 +101,7 @@ - self.assertTrue(isinstance(read_value, TaurusAttrValue), msg) - - # Test attribute -- for k, exp in expected.iteritems(): -+ for k, exp in expected.items(): - try: - got = getattr(a, k) - except AttributeError: -@@ -113,7 +113,7 @@ - self.__assertValidValue(exp, got, msg) - - # Test attribute value -- for k, exp in expected_attrv.iteritems(): -+ for k, exp in expected_attrv.items(): - try: - got = getattr(read_value, k) - except AttributeError: ---- ./lib/taurus/core/evaluation/evalattribute.py (original) -+++ ./lib/taurus/core/evaluation/evalattribute.py (refactored) -@@ -22,6 +22,7 @@ - ## - ############################################################################# - -+from builtins import str - __all__ = ['EvaluationAttribute'] - - import numpy -@@ -260,7 +261,7 @@ - trstring = v.replaceUnquotedRef(trstring, '{%s}' % r, symbol) - - # validate the expression (look for missing symbols) -- safesymbols = evaluator.getSafe().keys() -+ safesymbols = list(evaluator.getSafe().keys()) - # remove literal text strings from the validation - trimmedstring = re.sub(QUOTED_TEXT_RE, '', trstring) - for s in set(re.findall(PY_VAR_RE, trimmedstring)): ---- ./lib/taurus/core/evaluation/evaldevice.py (original) -+++ ./lib/taurus/core/evaluation/evaldevice.py (refactored) -@@ -22,6 +22,7 @@ - ## - ############################################################################# - -+from builtins import str - __all__ = ['EvaluationDevice'] - - from taurus import Factory ---- ./lib/taurus/core/evaluation/evalvalidator.py (original) -+++ ./lib/taurus/core/evaluation/evalvalidator.py (refactored) -@@ -23,6 +23,7 @@ - ############################################################################# - - from __future__ import absolute_import -+from builtins import zip - __all__ = ['EvaluationDeviceNameValidator', - 'EvaluationAttributeNameValidator'] - -@@ -263,7 +264,7 @@ - - # Substitute each k by its v in the expr (unless they are in - # references) -- for k, v in substmap.iteritems(): -+ for k, v in substmap.items(): - # create a pattern for matching complete word k - # unless it is within between curly brackets - keyPattern = r'(?=1') -- if operator.isMappingType(obj): -+ if isinstance(obj, collections.Mapping): - name = name or 'DICT%02d' % priority - elif type(obj) in (str,) or obj is None: - name, mod = self.__reloadResource(obj) - obj = {} -- for k, v in mod.__dict__.items(): -+ for k, v in list(mod.__dict__.items()): - if not k.startswith('_') and isinstance(v, basestring): - obj[k] = v - else: -@@ -106,7 +108,7 @@ - if pl is None: - self._resource_priority[priority] = pl = [] - pl.append(name) -- self._resource_priority_keys = self._resource_priority.keys() -+ self._resource_priority_keys = list(self._resource_priority.keys()) - self._resource_priority_keys.sort() - return obj - ---- ./lib/taurus/core/resource/resvalidator.py (original) -+++ ./lib/taurus/core/resource/resvalidator.py (refactored) -@@ -22,6 +22,7 @@ - ## - ############################################################################# - -+from builtins import object - __all__ = ['ResDeviceNameValidator', - 'ResAttributeNameValidator'] - ---- ./lib/taurus/core/tango/starter.py (original) -+++ ./lib/taurus/core/tango/starter.py (refactored) -@@ -31,6 +31,8 @@ - """ - from __future__ import print_function - -+from builtins import range -+from builtins import object - __docformat__ = 'restructuredtext' - - ---- ./lib/taurus/core/tango/tangoattribute.py (original) -+++ ./lib/taurus/core/tango/tangoattribute.py (refactored) -@@ -25,6 +25,8 @@ - - """This module contains all taurus tango attribute""" - -+from builtins import str -+from builtins import range - __all__ = ["TangoAttribute", "TangoAttributeEventListener", "TangoAttrValue"] - - __docformat__ = "restructuredtext" -@@ -114,7 +116,7 @@ - if not (numerical or self._attrRef.type == DataType.Boolean): - # generate a nested empty list of given shape - p.value = [] -- for _ in xrange(len(shape) - 1): -+ for _ in range(len(shape) - 1): - p.value = [p.value] - - rvalue = p.value -@@ -378,7 +380,7 @@ - elif PyTango.is_int_type(tgtype): - # changed as a partial workaround to a problem in PyTango - # writing to DevULong64 attributes (see ALBA RT#29793) -- attrvalue = long(magnitude) -+ attrvalue = int(magnitude) - elif tgtype == PyTango.CmdArgType.DevBoolean: - try: - attrvalue = bool(int(magnitude)) ---- ./lib/taurus/core/tango/tangodatabase.py (original) -+++ ./lib/taurus/core/tango/tangodatabase.py (refactored) -@@ -25,7 +25,14 @@ - - """This module contains all taurus tango authority""" - from __future__ import print_function -- -+from __future__ import division -+ -+from builtins import str -+from builtins import map -+from builtins import range -+from past.utils import old_div -+from builtins import object -+import collections - __all__ = ["TangoInfo", "TangoAttrInfo", "TangoDevInfo", "TangoServInfo", - "TangoDevClassInfo", "TangoDatabaseCache", "TangoDatabase", - "TangoAuthority"] -@@ -105,7 +112,7 @@ - def getDeviceNames(self): - if not hasattr(self, "_device_name_list"): - self._device_name_list = sorted(map(TangoDevInfo.name, -- self._devices.values())) -+ list(self._devices.values()))) - return self._device_name_list - - -@@ -122,8 +129,8 @@ - self._alive = None - self._state = None - self._host = host -- self._domain, self._family, self._member = map(str.upper, -- name.split("/", 2)) -+ self._domain, self._family, self._member = list(map(str.upper, -+ name.split("/", 2))) - self._attributes = None - self._alivePending = False - -@@ -245,12 +252,12 @@ - def getDeviceNames(self): - if not hasattr(self, "_device_name_list"): - self._device_name_list = sorted(map(TangoDevInfo.name, -- self._devices.values())) -+ list(self._devices.values()))) - return self._device_name_list - - def getClassNames(self): - if not hasattr(self, "_klass_name_list"): -- klasses = set(map(TangoDevInfo.klass, self._devices.values())) -+ klasses = set(map(TangoDevInfo.klass, list(self._devices.values()))) - self._klass_name_list = sorted(map(TangoDevClassInfo.name, - klasses)) - return self._klass_name_list -@@ -285,7 +292,7 @@ - try: - self._alivePending = True - alive = True -- for d in self.devices().values(): -+ for d in list(self.devices().values()): - alive = d.alive() - if not alive: - break -@@ -327,7 +334,7 @@ - r = db.command_inout("DbMySqlSelect", query) - row_nb, column_nb = r[0][-2:] - data = r[1] -- assert row_nb == len(data) / column_nb -+ assert row_nb == old_div(len(data), column_nb) - else: - # fallback using tango commands (slow but works with sqlite DB) - # see http://sf.net/p/tauruslib/tickets/148/ -@@ -349,7 +356,7 @@ - CD = CaselessDict - dev_dict, serv_dict, klass_dict, alias_dict = CD(), {}, {}, CD() - -- for i in xrange(0, len(data), column_nb): -+ for i in range(0, len(data), column_nb): - name, alias, exported, host, server, klass = data[i:i + column_nb] - if name.count("/") != 2: - continue # invalid/corrupted entry: just ignore it -@@ -423,13 +430,13 @@ - :return: (sequence) a sequence with all registered device names""" - if self._device_name_list is None: - self._device_name_list = sorted( -- map(TangoDevInfo.name, self.devices().values())) -+ map(TangoDevInfo.name, list(self.devices().values()))) - return self._device_name_list - - def getAliasNames(self): - if self._alias_name_list is None: - self._alias_name_list = sorted( -- map(TangoDevInfo.alias, self.aliases().values())) -+ map(TangoDevInfo.alias, list(self.aliases().values()))) - return self._alias_name_list - - def getServerNames(self): -@@ -438,7 +445,7 @@ - :return: (sequence) a sequence with all registered server names""" - if self._server_name_list is None: - self._server_name_list = sorted( -- map(TangoServInfo.name, self.servers().values())) -+ map(TangoServInfo.name, list(self.servers().values()))) - return self._server_name_list - - def getClassNames(self): -@@ -447,7 +454,7 @@ - :return: (sequence) a sequence with all registered device classes""" - if self._klass_name_list is None: - self._klass_name_list = sorted( -- map(TangoDevClassInfo.name, self.klasses().values())) -+ map(TangoDevClassInfo.name, list(self.klasses().values()))) - return self._klass_name_list - - def deviceTree(self): -@@ -474,13 +481,13 @@ - return self._klasses - - def getDeviceDomainNames(self): -- return self._device_tree.keys() -+ return list(self._device_tree.keys()) - - def getDeviceFamilyNames(self, domain): - families = self._device_tree.get(domain) - if families is None: - return [] -- return families.keys() -+ return list(families.keys()) - - def getDeviceMemberNames(self, domain, family): - families = self._device_tree.get(domain) -@@ -489,7 +496,7 @@ - members = families.get(family) - if members is None: - return [] -- return members.keys() -+ return list(members.keys()) - - def getDomainDevices(self, domain): - return self.deviceTree().getDomainDevices(domain) -@@ -511,8 +518,8 @@ - - def _update(self, other): - try: -- if operator.isMappingType(other): -- other = other.values() -+ if isinstance(other, collections.Mapping): -+ other = list(other.values()) - for dev in other: - try: - self.addDevice(dev) -@@ -537,7 +544,7 @@ - def getDomainDevices(self, domain): - """Returns all devices under the given domain. Returns empty list if - the domain doesn't exist or doesn't contain any devices""" -- return self._devices.get(domain, {}).values() -+ return list(self._devices.get(domain, {}).values()) - - def getFamilyDevices(self, domain, family): - """Returns all devices under the given domain/family. Returns empty list if -@@ -545,7 +552,7 @@ - families = self.get(domain) - if families is None: - return -- return families.get(family, {}).values() -+ return list(families.get(family, {}).values()) - - - class TangoServerTree(dict): -@@ -557,8 +564,8 @@ - - def _update(self, other): - try: -- if operator.isMappingType(other): -- other = other.values() -+ if isinstance(other, collections.Mapping): -+ other = list(other.values()) - for serv in other: - try: - self.addServer(serv) -@@ -578,7 +585,7 @@ - def getServerNameInstances(self, serverName): - """Returns all servers under the given serverName. Returns empty list if - the server name doesn't exist or doesn't contain any instances""" -- return self.get(serverName, {}).values() -+ return list(self.get(serverName, {}).values()) - - - def get_home(): -@@ -649,7 +656,7 @@ - # illegal line! - continue - -- key, val = map(str.strip, tup) -+ key, val = list(map(str.strip, tup)) - if key == env_var_name: - return val - -@@ -702,7 +709,7 @@ - serv_name = self.command_inout("DbGetDeviceInfo", dev_name)[1][3] - devs = self.get_device_class_list(serv_name) - dev_name_lower = dev_name.lower() -- for i in xrange(len(devs) / 2): -+ for i in range(old_div(len(devs), 2)): - idx = i * 2 - if devs[idx].lower() == dev_name_lower: - return devs[idx + 1] ---- ./lib/taurus/core/tango/tangodevice.py (original) -+++ ./lib/taurus/core/tango/tangodevice.py (refactored) -@@ -25,6 +25,7 @@ - - """This module defines the TangoDevice object""" - -+from builtins import object - __all__ = ["TangoDevice"] - - __docformat__ = "restructuredtext" -@@ -320,7 +321,7 @@ - - def __pollResult(self, attrs, ts, result, error=False): - if error: -- for attr in attrs.values(): -+ for attr in list(attrs.values()): - attr.poll(single=False, value=None, error=result, time=ts) - return - -@@ -335,7 +336,7 @@ - def __pollAsynch(self, attrs): - ts = time.time() - try: -- req_id = self.read_attributes_asynch(attrs.keys()) -+ req_id = self.read_attributes_asynch(list(attrs.keys())) - except DevFailed as e: - return False, e, ts - return True, req_id, ts -@@ -363,7 +364,7 @@ - error = False - ts = time.time() - try: -- result = self.read_attributes(attrs.keys()) -+ result = self.read_attributes(list(attrs.keys())) - except DevFailed as e: - error = True - result = e ---- ./lib/taurus/core/tango/tangofactory.py (original) -+++ ./lib/taurus/core/tango/tangofactory.py (refactored) -@@ -131,16 +131,16 @@ - def cleanUp(self): - """Cleanup the singleton instance""" - self.trace("[TangoFactory] cleanUp") -- for k, v in self.tango_attrs.items(): -+ for k, v in list(self.tango_attrs.items()): - v.cleanUp() -- for k, v in self.tango_dev_queries.items(): -+ for k, v in list(self.tango_dev_queries.items()): - v.cleanUp() -- for k, v in self.tango_devs.items(): -+ for k, v in list(self.tango_devs.items()): - v.cleanUp() - self.dft_db = None -- for k, v in self.tango_db_queries.items(): -+ for k, v in list(self.tango_db_queries.items()): - v.cleanUp() -- for k, v in self.tango_db.items(): -+ for k, v in list(self.tango_db.items()): - v.cleanUp() - self.reInit() - -@@ -552,14 +552,14 @@ - if not self.isPollingEnabled(): - return - self._polling_enabled = False -- for period, timer in self.polling_timers.iteritems(): -+ for period, timer in self.polling_timers.items(): - timer.stop() - - def enablePolling(self): - """Enable the application tango polling""" - if self.isPollingEnabled(): - return -- for period, timer in self.polling_timers.iteritems(): -+ for period, timer in self.polling_timers.items(): - timer.start() - self._polling_enabled = True - ---- ./lib/taurus/core/tango/img/img.py (original) -+++ ./lib/taurus/core/tango/img/img.py (refactored) -@@ -25,7 +25,9 @@ - - """The img submodule. It contains specific device implementation for CCDs and - 2D detectors""" -+from __future__ import division - -+from past.utils import old_div - __all__ = ['ImageDevice', 'ImageCounterDevice', 'PyImageViewer', 'ImgGrabber', - 'CCDPVCAM', 'ImgBeamAnalyzer', 'Falcon', 'LimaCCDs'] - -@@ -164,9 +166,9 @@ - def getImageData(self, names=None): - data = ImageCounterDevice.getImageData(self, names=names) - if self._color: -- for k, v in data.items(): -+ for k, v in list(data.items()): - s = v[1].value.shape -- v[1].value = v[1].value.reshape((s[0], s[1] / 3, 3)) -+ v[1].value = v[1].value.reshape((s[0], old_div(s[1], 3), 3)) - return data - - ---- ./lib/taurus/core/tango/test/test_tangoattribute.py (original) -+++ ./lib/taurus/core/tango/test/test_tangoattribute.py (refactored) -@@ -27,6 +27,7 @@ - - # __all__ = [] - -+from builtins import map - __docformat__ = 'restructuredtext' - - import numpy -@@ -771,12 +772,12 @@ - got = getattr(attr, cfg) - msg = '%s.%s from Taurus do not mach, expected %s read %s' %\ - (attr_name, cfg, expected, got) -- map(self.__assertValidValue, got, expected, msg) -+ list(map(self.__assertValidValue, got, expected, msg)) - - msg = '%s.%s from Tango do not mach, expected %s read %s' %\ - (attr_name, cfg, expected, got) - tangovalue = self._getDecodePyTangoAttr(attr_name, cfg) -- map(self.__assertValidValue, got, tangovalue, msg) -+ list(map(self.__assertValidValue, got, tangovalue, msg)) - - def write_read_attr(self, attrname=None, setvalue=None, expected=None, - expected_attrv=None, expectedshape=None): -@@ -801,7 +802,7 @@ - self.assertTrue(isinstance(read_value, TangoAttrValue), msg) - - # Test attribute -- for k, exp in expected.iteritems(): -+ for k, exp in expected.items(): - try: - got = getattr(a, k) - except AttributeError: -@@ -813,7 +814,7 @@ - self.__assertValidValue(exp, got, msg) - - # Test attribute value -- for k, exp in expected_attrv.iteritems(): -+ for k, exp in expected_attrv.items(): - try: - got = getattr(read_value, k) - except AttributeError: ---- ./lib/taurus/core/tango/test/tgtestds.py (original) -+++ ./lib/taurus/core/tango/test/tgtestds.py (refactored) -@@ -25,6 +25,7 @@ - - """Module containing base classes for using the TangoSchemeTest DS in tests""" - -+from builtins import object - __all__ = ['TangoSchemeTestLauncher'] - - __docformat__ = 'restructuredtext' ---- ./lib/taurus/core/test/basevalidator.py (original) -+++ ./lib/taurus/core/test/basevalidator.py (refactored) -@@ -27,6 +27,8 @@ - - #__all__ = [] - -+from builtins import str -+from builtins import object - __docformat__ = 'restructuredtext' - - -@@ -49,7 +51,7 @@ - self.assertTrue(self.validator().isValid(name, strict=strict), msg) - if groups is not None: - returned = self.validator().getUriGroups(name, strict=strict) -- for k, v in groups.iteritems(): -+ for k, v in groups.items(): - msg = ('"%s" not in %s.getUriGroups("%s"). Returned %s' % - (k, self.validator.__name__, name, returned)) - self.assertIn(k, returned, msg=msg) ---- ./lib/taurus/core/test/modelequality.py (original) -+++ ./lib/taurus/core/test/modelequality.py (refactored) -@@ -22,6 +22,7 @@ - ## - ############################################################################# - -+from builtins import object - import functools - - from taurus import Device, Attribute # , Authority ---- ./lib/taurus/core/test/test_taurushelper.py (original) -+++ ./lib/taurus/core/test/test_taurushelper.py (refactored) -@@ -212,7 +212,7 @@ - elementType = [elementType] - manager = taurus.Manager() - scheme = manager.getScheme(name) -- supportedSchemes = manager.getPlugins().keys() -+ supportedSchemes = list(manager.getPlugins().keys()) - if scheme not in supportedSchemes: - self.skipTest('"%s" scheme not supported' % scheme) - returned = taurus.isValidName(name, etypes=elementType, strict=strict) -@@ -240,7 +240,7 @@ - klass = TaurusAuthority - manager = taurus.Manager() - scheme = manager.getScheme(name) -- supportedSchemes = manager.getPlugins().keys() -+ supportedSchemes = list(manager.getPlugins().keys()) - if scheme not in supportedSchemes: - self.skipTest('"%s" scheme not supported' % scheme) - a = taurus.Authority(name) -@@ -265,7 +265,7 @@ - klass = TaurusDevice - manager = taurus.Manager() - scheme = manager.getScheme(name) -- supportedSchemes = manager.getPlugins().keys() -+ supportedSchemes = list(manager.getPlugins().keys()) - if scheme not in supportedSchemes: - self.skipTest('"%s" scheme not supported' % scheme) - -@@ -419,7 +419,7 @@ - klass = TaurusAttribute - manager = taurus.Manager() - scheme = manager.getScheme(name) -- supportedSchemes = manager.getPlugins().keys() -+ supportedSchemes = list(manager.getPlugins().keys()) - if scheme not in supportedSchemes: - self.skipTest('"%s" scheme not supported' % scheme) - a = taurus.Attribute(name) -@@ -441,7 +441,7 @@ - msg = ('read() for "%s" did not return a TaurusAttrValue (got a %s)' % - (name, readvalue.__class__.__name__)) - self.assertTrue(isinstance(readvalue, TaurusAttrValue), msg) -- for k, exp in expected.iteritems(): -+ for k, exp in expected.items(): - try: - got = getattr(readvalue, k) - except AttributeError: ---- ./lib/taurus/core/util/codecs.py (original) -+++ ./lib/taurus/core/util/codecs.py (refactored) -@@ -64,6 +64,7 @@ - """ - from __future__ import absolute_import - -+from builtins import str - __all__ = ["Codec", "NullCodec", "ZIPCodec", "BZ2Codec", "JSONCodec", - "FunctionCodec", "PlotCodec", "CodecPipeline", "CodecFactory"] - -@@ -348,7 +349,7 @@ - return format, data - - def _transform_ascii(self, data): -- if isinstance(data, unicode): -+ if isinstance(data, str): - return data.encode('utf-8') - elif isinstance(data, dict): - return self._transform_dict(data) -@@ -364,7 +365,7 @@ - - def _transform_dict(self, dct): - newdict = {} -- for k, v in dct.iteritems(): -+ for k, v in dct.items(): - newdict[self._transform_ascii(k)] = self._transform_ascii(v) - return newdict - -@@ -426,7 +427,7 @@ - return format, data - - def _transform_ascii(self, data): -- if isinstance(data, unicode): -+ if isinstance(data, str): - return data.encode('utf-8') - elif isinstance(data, dict): - return self._transform_dict(data) -@@ -442,7 +443,7 @@ - - def _transform_dict(self, dct): - newdict = {} -- for k, v in dct.iteritems(): -+ for k, v in dct.items(): - newdict[self._transform_ascii(k)] = self._transform_ascii(v) - return newdict - ---- ./lib/taurus/core/util/colors.py (original) -+++ ./lib/taurus/core/util/colors.py (refactored) -@@ -26,6 +26,8 @@ - """This module contains color codes for state and quality""" - from __future__ import print_function - -+from builtins import str -+from builtins import object - __all__ = ["DEVICE_STATE_DATA", "ATTRIBUTE_QUALITY_DATA", "ColorPalette", - "DEVICE_STATE_PALETTE", "ATTRIBUTE_QUALITY_PALETTE"] - -@@ -123,7 +125,7 @@ - return r[0] * 256 * 256 + r[1] * 256 + r[2] - - def __iter__(self): -- return self._rgb_data.keys().__iter__() -+ return list(self._rgb_data.keys()).__iter__() - - def name(self, stoq, fg=False): - """Returns the name of the color.""" ---- ./lib/taurus/core/util/console.py (original) -+++ ./lib/taurus/core/util/console.py (refactored) -@@ -25,6 +25,7 @@ - - """This module contains ANSI color codes""" - -+from builtins import object - __all__ = ["make_color_table", "NoColors", "TermColors", "HTMLColors"] - - __docformat__ = "restructuredtext" -@@ -63,13 +64,13 @@ - setattr(in_class, name, in_class._base % value) - - --class NoColors: -+class NoColors(object): - NoColor = '' # for color schemes in color-less terminals. - Normal = '' # Reset normal coloring - _base = '' # Template for all other colors - - --class TermColors: -+class TermColors(object): - """Color escape sequences. - - This class defines the escape sequences for all the standard (ANSI?) -@@ -86,7 +87,7 @@ - _base = '\033[%sm' # Template for all other colors - - --class HTMLColors: -+class HTMLColors(object): - - NoColor = '' - Normal = '' ---- ./lib/taurus/core/util/constant.py (original) -+++ ./lib/taurus/core/util/constant.py (refactored) -@@ -46,10 +46,11 @@ - consttype.__del__() # Remove all attributes - """ - -+from builtins import object - __docformat__ = "restructuredtext" - - --class _consttype: -+class _consttype(object): - - class _ConstTypeError(TypeError): - pass ---- ./lib/taurus/core/util/containers.py (original) -+++ ./lib/taurus/core/util/containers.py (refactored) -@@ -29,6 +29,11 @@ - """ - from __future__ import print_function - -+from builtins import zip -+from builtins import str -+from builtins import range -+from past.builtins import basestring -+from builtins import object - __all__ = ["CaselessList", "CaselessDict", "CaselessWeakValueDict", "LoopList", - "CircBuf", "LIFO", "TimedQueue", "self_locked", "ThreadDict", - "defaultdict", "defaultdict_fromkey", "CaselessDefaultDict", -@@ -250,7 +255,7 @@ - if other: - # Doesn't do keyword args - if isinstance(other, dict): -- for k, v in other.items(): -+ for k, v in list(other.items()): - dict.__setitem__(self, k.lower(), v) - else: - for k, v in other: -@@ -279,7 +284,7 @@ - - def update(self, other): - """overwritten from :meth:`dict.update`""" -- for k, v in other.items(): -+ for k, v in list(other.items()): - dict.__setitem__(self, k.lower(), v) - - def fromkeys(self, iterable, value=None): -@@ -303,7 +308,7 @@ - if other: - # Doesn't do keyword args - if isinstance(other, dict): -- for k, v in other.items(): -+ for k, v in list(other.items()): - weakref.WeakValueDictionary.__setitem__(self, k.lower(), v) - else: - for k, v in other: -@@ -334,7 +339,7 @@ - - def update(self, other): - """overwritten from :meth:`weakref.WeakValueDictionary.update`""" -- for k, v in other.items(): -+ for k, v in list(other.items()): - weakref.WeakValueDictionary.__setitem__(self, k.lower(), v) - - def fromkeys(self, iterable, value=None): -@@ -413,7 +418,7 @@ - - def dump(self, fileobj): - if self.format == 'csv': -- csv.writer(fileobj).writerows(self.items()) -+ csv.writer(fileobj).writerows(list(self.items())) - elif self.format == 'json': - json.dump(self, fileobj, separators=(',', ':')) - elif self.format == 'pickle': -@@ -487,7 +492,7 @@ - '''returns the current index''' - return self._index - -- def next(self): -+ def __next__(self): - '''advances one item in the list and returns it''' - self._index += 1 - return self.current() -@@ -897,7 +902,7 @@ - or a callable providing a sorting key algorithm. - """ - import operator -- if operator.isCallable(key): -+ if hasattr(key, '__call__'): - self._keys = sorted(self._keys, key=key) - else: - for k in self._keys: -@@ -913,7 +918,7 @@ - - def update(self, other): - if hasattr(other, 'items'): -- other = other.items() -+ other = list(other.items()) - for k, v in other: - self.__setitem__(k, v) - -@@ -989,7 +994,7 @@ - args = tuple() - else: - args = self.default_factory, -- return type(self), args, None, None, self.items() -+ return type(self), args, None, None, list(self.items()) - - def copy(self): - return self.__copy__() -@@ -1000,7 +1005,7 @@ - def __deepcopy__(self, memo): - import copy - return type(self)(self.default_factory, -- copy.deepcopy(self.items())) -+ copy.deepcopy(list(self.items()))) - - def __repr__(self): - return 'defaultdict(%s, %s)' % (self.default_factory, -@@ -1055,7 +1060,7 @@ - def add_to_level(l, d): - lines = [] - if isinstance(d, dict): -- for k, v in d.items(): -+ for k, v in list(d.items()): - print('with key "%s"' % k) - lines.append([''] * l + [str(k)]) - lines += add_to_level(l + 1, v) -@@ -1128,7 +1133,7 @@ - def __str__(self): - return self.__buffer[:self.__end].__str__() - -- def __nonzero__(self): -+ def __bool__(self): - return self.__buffer[:self.__end].__nonzero__() - - def __setitem__(self, i, x): -@@ -1317,5 +1322,5 @@ - - def chunks(l, n): - '''Generator which yields successive n-sized chunks from l''' -- for i in xrange(0, len(l), n): -+ for i in range(0, len(l), n): - yield l[i:i + n] ---- ./lib/taurus/core/util/enumeration.py (original) -+++ ./lib/taurus/core/util/enumeration.py (refactored) -@@ -33,6 +33,8 @@ - values (specified and unspecified) are unique. Enum values then are attributes - of an Enumeration class (Volkswagen.BEETLE, Volkswagen.PASSAT, etc.).""" - -+from builtins import str -+from builtins import object - __all__ = ["EnumException", "Enumeration"] - - __docformat__ = "restructuredtext" -@@ -95,9 +97,9 @@ - raise EnumException( - "flagable enum does not accept tuple items") - x, i = x -- if not isinstance(x, (str, unicode)): -+ if not isinstance(x, (str, str)): - raise EnumException("enum name is not a string: " + str(x)) -- if not isinstance(i, (int, long)): -+ if not isinstance(i, (int, int)): - raise EnumException( - "enum value is not an integer: " + str(i)) - if x in uniqueNames: -@@ -111,7 +113,7 @@ - reverseLookup[i] = x - for x in enumList: - if not isinstance(x, tuple): -- if not isinstance(x, (str, unicode)): -+ if not isinstance(x, (str, str)): - raise EnumException("enum name is not a string: " + str(x)) - if x in uniqueNames: - raise EnumException("enum name is not unique: " + str(x)) -@@ -143,15 +145,15 @@ - return n - - def __contains__(self, i): -- if isinstance(i, (int, long)): -+ if isinstance(i, (int, int)): - return i in self.reverseLookup -- elif isinstance(i, (str, unicode)): -+ elif isinstance(i, (str, str)): - return i in self.lookup - - def __getitem__(self, i): -- if isinstance(i, (int, long)): -+ if isinstance(i, (int, int)): - return self.whatis(i) -- elif isinstance(i, (str, unicode)): -+ elif isinstance(i, (str, str)): - return self.lookup[i] - - def __getattr__(self, attr): -@@ -193,7 +195,7 @@ - """Returns an iterable containning the valid enumeration keys - :return: an interable containning the valid enumeration keys - :rtype: iter""" -- return self.lookup.keys() -+ return list(self.lookup.keys()) - - def whatis(self, value): - """Returns a string representation of the value in the enumeration. ---- ./lib/taurus/core/util/event.py (original) -+++ ./lib/taurus/core/util/event.py (refactored) -@@ -29,6 +29,10 @@ - from __future__ import print_function - from __future__ import absolute_import - -+from past.builtins import cmp -+from builtins import str -+from builtins import range -+from builtins import object - __all__ = ["BoundMethodWeakref", "CallableRef", "EventGenerator", - "ConfigEventGenerator", "ListEventGenerator", "EventListener", - "AttributeEventWait", "AttributeEventIterator"] -@@ -232,7 +236,7 @@ - try: - self.lock() - aux_list = list(self.cb_list) -- for i in xrange(len(aux_list) - 1, -1, -1): -+ for i in range(len(aux_list) - 1, -1, -1): - pair = self.cb_list[i] - if pair[0] is cb_ref: - del self.cb_list[i] -@@ -446,7 +450,7 @@ - if t and t >= after: - return - else: -- for v, t in s.items(): -+ for v, t in list(s.items()): - if v == val: - continue - if t >= after: -@@ -646,7 +650,7 @@ - retries += 1 - while retries != 0: - if any: -- for v, t in s.items(): -+ for v, t in list(s.items()): - if t >= after: - return - if equal: -@@ -654,7 +658,7 @@ - if (t is not None) and (t >= after): - return - else: -- for v, t in s.items(): -+ for v, t in list(s.items()): - if v == val: - continue - if t >= after: ---- ./lib/taurus/core/util/eventfilters.py (original) -+++ ./lib/taurus/core/util/eventfilters.py (refactored) -@@ -27,6 +27,7 @@ - :meth:`taurus.qt.qtgui.base.TaurusBaseComponent.setFilters`""" - - -+from builtins import object - def IGNORE_ALL(s, t, v): - '''Will discard all events''' - return None ---- ./lib/taurus/core/util/excepthook.py (original) -+++ ./lib/taurus/core/util/excepthook.py (refactored) -@@ -25,6 +25,7 @@ - - """This module contains a base class for exception hooks""" - -+from builtins import object - __all__ = ["BaseExceptHook"] - - __docformat__ = "restructuredtext" ---- ./lib/taurus/core/util/fandango_search.py (original) -+++ ./lib/taurus/core/util/fandango_search.py (refactored) -@@ -31,6 +31,7 @@ - """ - # TODO: tango-centric - -+from builtins import str - import re - import taurus - -@@ -116,8 +117,8 @@ - #all_devs.extend('%s/%s'%(host,d) for d in odb.get_device_name('*','*')) - result = [e for e in expressions if e.lower() in all_devs] - expressions = [extend_regexp(e) for e in expressions if e not in result] -- result.extend(filter(lambda d: any(matchCl(extend_regexp(e), d) -- for e in expressions), all_devs)) -+ result.extend([d for d in all_devs if any(matchCl(extend_regexp(e), d) -+ for e in expressions)]) - return result - - ---- ./lib/taurus/core/util/helper.py (original) -+++ ./lib/taurus/core/util/helper.py (refactored) -@@ -1,6 +1,6 @@ - import sys - if sys.version_info < (3,): -- text_type = unicode -+ text_type = str - binary_type = str - else: - text_type = str -@@ -11,4 +11,4 @@ - return isinstance(element, (text_type, binary_type)) - - def isnumber(element): -- return isinstance(element, (int, long)) -+ return isinstance(element, (int, int)) ---- ./lib/taurus/core/util/init_bkcomp.py (original) -+++ ./lib/taurus/core/util/init_bkcomp.py (refactored) -@@ -78,7 +78,7 @@ - :return: (dict) dictionary built from the given sequence""" - def _pairwise(iterable): - """Utility method used by dictFromSequence""" -- itnext = iter(iterable).next -+ itnext = iter(iterable).__next__ - while True: - yield itnext(), itnext() - return dict(_pairwise(seq)) ---- ./lib/taurus/core/util/init_lightweight.py (original) -+++ ./lib/taurus/core/util/init_lightweight.py (refactored) -@@ -77,7 +77,7 @@ - :return: (dict) dictionary built from the given sequence""" - def _pairwise(iterable): - """Utility method used by dictFromSequence""" -- itnext = iter(iterable).next -+ itnext = iter(iterable).__next__ - while True: - yield itnext(), itnext() - return dict(_pairwise(seq)) ---- ./lib/taurus/core/util/lock.py (original) -+++ ./lib/taurus/core/util/lock.py (refactored) -@@ -26,6 +26,7 @@ - """This module defines a *slow* lock class that provides additional debugging - information""" - -+from builtins import object - __all__ = ["TaurusLock"] - - __docformat__ = 'restructuredtext' ---- ./lib/taurus/core/util/log.py (original) -+++ ./lib/taurus/core/util/log.py (refactored) -@@ -28,6 +28,8 @@ - from __future__ import print_function - from __future__ import absolute_import - -+from builtins import str -+from builtins import object - __all__ = ["LogIt", "TraceIt", "DebugIt", "InfoIt", "WarnIt", "ErrorIt", - "CriticalIt", "MemoryLogHandler", "LogExceptHook", "Logger", - "LogFilter", -@@ -63,14 +65,14 @@ - - def getTotal(self): - c = 0 -- for v in self.itervalues(): -+ for v in self.values(): - c += v - return c - - def pretty(self): - from operator import itemgetter - sorted_items = sorted( -- self.iteritems(), key=itemgetter(1), reverse=True) -+ iter(self.items()), key=itemgetter(1), reverse=True) - ret = '\n'.join(['\t%d * "%s"' % (v, k) for k, v in sorted_items]) - return "< Deprecation Counts (%d):\n%s >" % (self.getTotal(), ret) - -@@ -680,7 +682,7 @@ - :return: (sequence) UIDs of currently shared data. - ''' -- return self.__models.keys() -+ return list(self.__models.keys()) - - def debugReader(self, data): - ''' -@@ -338,6 +338,6 @@ - - def info(self): - s = "" -- for uid, m in sorted(self.__models.iteritems()): -+ for uid, m in sorted(self.__models.items()): - s += m.info() + '\n' - return s ---- ./lib/taurus/qt/qtcore/configuration/configuration.py (original) -+++ ./lib/taurus/qt/qtcore/configuration/configuration.py (refactored) -@@ -27,12 +27,17 @@ - configuration features to the classes that inherit from them""" - from __future__ import print_function - -+from future import standard_library -+standard_library.install_aliases() -+from builtins import str -+from past.builtins import basestring -+from builtins import object - __all__ = ["configurableProperty", "BaseConfigurableClass"] - - __docformat__ = 'restructuredtext' - - --class configurableProperty: -+class configurableProperty(object): - '''A dummy class used to handle properties with the configuration API - - .. warning:: this class is intended for internal use by the configuration -@@ -66,7 +71,7 @@ - return self.name - - --class BaseConfigurableClass: -+class BaseConfigurableClass(object): - ''' - A base class defining the API for configurable objects. - -@@ -191,7 +196,7 @@ - # store the configurations for all registered configurable items as - # well - itemcfgs = {} -- for k, v in self.__configurableItems.iteritems(): -+ for k, v in self.__configurableItems.items(): - itemcfgs[k] = v.createConfig(allowUnpickable=allowUnpickable) - configdict["__itemConfigurations__"] = itemcfgs - configdict["__orderedConfigNames__"] = self.__configurableItemNames -@@ -403,7 +408,7 @@ - .. seealso:: :meth:`restoreQConfig` - ''' - from taurus.external.qt import Qt -- import cPickle as pickle -+ import pickle as pickle - configdict = self.createConfig(allowUnpickable=False) - return Qt.QByteArray(pickle.dumps(configdict)) - -@@ -417,7 +422,7 @@ - ''' - if qstate.isNull(): - return -- import cPickle as pickle -+ import pickle as pickle - configdict = pickle.loads(qstate.data()) - self.applyConfig(configdict) - -@@ -428,10 +433,10 @@ - - :return: (str) file name used - """ -- import cPickle as pickle -+ import pickle as pickle - if ofile is None: - from taurus.external.qt import Qt -- ofile = unicode(Qt.QFileDialog.getSaveFileName( -+ ofile = str(Qt.QFileDialog.getSaveFileName( - self, 'Save Configuration', '%s.pck' % self.__class__.__name__, 'Configuration File (*.pck)')) - if not ofile: - return -@@ -449,10 +454,10 @@ - - :return: (str) file name used - """ -- import cPickle as pickle -+ import pickle as pickle - if ifile is None: - from taurus.external.qt import Qt -- ifile = unicode(Qt.QFileDialog.getOpenFileName( -+ ifile = str(Qt.QFileDialog.getOpenFileName( - self, 'Load Configuration', '', 'Configuration File (*.pck)')) - if not ifile: - return ---- ./lib/taurus/qt/qtcore/model/taurusdatabasemodel.py (original) -+++ ./lib/taurus/qt/qtcore/model/taurusdatabasemodel.py (refactored) -@@ -26,6 +26,7 @@ - """This module provides widgets that display the database in a tree format""" - # TODO: tango-centric - -+from builtins import str - __all__ = ["TaurusTreeDevicePartItem", "TaurusTreeDeviceDomainItem", - "TaurusTreeDeviceFamilyItem", "TaurusTreeDeviceMemberItem", "TaurusTreeSimpleDeviceItem", - "TaurusTreeDeviceItem", "TaurusTreeAttributeItem", "TaurusTreeServerNameItem", -@@ -266,7 +267,7 @@ - alarms="[%s, %s]" % (di.alarms.min_alarm, di.alarms.max_alarm), - warnings="[%s, %s]" % (di.alarms.min_warning, di.alarms.max_warning),) - -- for id, value in items.items(): -+ for id, value in list(items.items()): - ret += '%s:%s' % ( - id.capitalize(), value) - ret += '' -@@ -553,15 +554,15 @@ - data = data.deviceTree() - - rootItem = self._rootItem -- for domain in data.keys(): -+ for domain in list(data.keys()): - families = data[domain] - domainItem = TaurusTreeDeviceDomainItem( - self, domain.upper(), rootItem) -- for family in families.keys(): -+ for family in list(families.keys()): - members = families[family] - familyItem = TaurusTreeDeviceFamilyItem( - self, family.upper(), domainItem) -- for member in members.keys(): -+ for member in list(members.keys()): - dev = members[member] - memberItem = TaurusTreeDeviceItem( - self, dev, parent=familyItem) -@@ -586,7 +587,7 @@ - servers = data.servers() - rootItem = self._rootItem - -- for server_name, server in servers.items(): -+ for server_name, server in list(servers.items()): - serverInstanceItem = TaurusTreeFullServerItem( - self, server, rootItem) - rootItem.appendChild(serverInstanceItem) ---- ./lib/taurus/qt/qtcore/model/taurusmodel.py (original) -+++ ./lib/taurus/qt/qtcore/model/taurusmodel.py (refactored) -@@ -25,6 +25,7 @@ - - """This module provides base taurus tree item and a base tree model""" - -+from builtins import object - __all__ = ["TaurusBaseTreeItem", "TaurusBaseModel", "TaurusBaseProxyModel"] - - __docformat__ = 'restructuredtext' ---- ./lib/taurus/qt/qtcore/util/emitter.py (original) -+++ ./lib/taurus/qt/qtcore/util/emitter.py (refactored) -@@ -27,8 +27,17 @@ - emitter.py: This module provides a task scheduler used by TaurusGrid and - TaurusDevTree widgets - """ -- --from Queue import Queue, Empty -+from __future__ import division -+ -+from future import standard_library -+standard_library.install_aliases() -+from builtins import next -+from builtins import str -+from builtins import map -+from past.builtins import basestring -+from past.utils import old_div -+from builtins import object -+from queue import Queue, Empty - import traceback - from functools import partial - from collections import Iterable -@@ -218,7 +227,7 @@ - self.emitter.doSomething.connect(self._doSomething) - - if not self.refreshTimer: -- self.emitter.somethingDone.connect(self.next) -+ self.emitter.somethingDone.connect(self.__next__) - - def onRefresh(self): - try: -@@ -242,7 +251,7 @@ - def getDone(self): - """ Returns % of done tasks in 0-1 range """ - pending = self.getQueue().qsize() -- return float(self._done) / (self._done + pending) -+ return old_div(float(self._done), (self._done + pending)) - - def clear(self): - while not self.todo.empty(): -@@ -279,12 +288,12 @@ - method(*args) - except: - self.log.error('At TaurusEmitterThread._doSomething(%s): \n%s' -- % (map(str, args), traceback.format_exc())) -+ % (list(map(str, args)), traceback.format_exc())) - self.emitter.somethingDone.emit() - self._done += 1 - return - -- def next(self): -+ def __next__(self): - queue = self.getQueue() - msg = ('At TaurusEmitterThread.next(), %d items remaining.' - % queue.qsize()) -@@ -376,7 +385,7 @@ - """Check all pending subscriptions in the current factory - """ - attrs = [] -- items = self._factory.getExistingAttributes().items() -+ items = list(self._factory.getExistingAttributes().items()) - for name, attr in items: - if attr is None: - continue -@@ -416,7 +425,7 @@ - Logger.cleanUp(self) - - --class SingletonWorker(): -+class SingletonWorker(object): - """ - SingletonWorker is used to manage TaurusEmitterThread as Singleton objects - -@@ -498,8 +507,8 @@ - return self.thread.getDone() - - def start(self): -- self.thread.emitter.somethingDone.connect(self.next) -- self.thread.emitter.newQueue.connect(self.thread.next) -+ self.thread.emitter.somethingDone.connect(self.__next__) -+ self.thread.emitter.newQueue.connect(self.thread.__next__) - try: - self.thread.start() - except: -@@ -509,8 +518,8 @@ - return - - def stop(self): -- self.thread.emitter.somethingDone.disconnect(self.next) -- self.thread.emitter.newQueue.disconnect(self.thread.next) -+ self.thread.emitter.somethingDone.disconnect(self.__next__) -+ self.thread.emitter.newQueue.disconnect(self.thread.__next__) - self._running = False - return - ---- ./lib/taurus/qt/qtcore/util/properties.py (original) -+++ ./lib/taurus/qt/qtcore/util/properties.py (refactored) -@@ -55,6 +55,8 @@ - - """ - -+from builtins import str -+from builtins import map - from functools import partial - from taurus.external.qt import Qt - from taurus.core.util.fandango_search import isSequence, isDictionary -@@ -81,7 +83,7 @@ - other, dct = sorted((a, b), key=isDictionary) - if not isDictionary(other): - other = dict.fromkeys(other if isSequence(other) else [other, ]) -- for k, v in other.items(): -+ for k, v in list(other.items()): - dct[k] = v if not k in dct else djoin(dct[k], v) - return dct - ---- ./lib/taurus/qt/qtcore/util/signal.py (original) -+++ ./lib/taurus/qt/qtcore/util/signal.py (refactored) -@@ -1,6 +1,7 @@ - """Provide a Signal class for non-QObject objects""" - from __future__ import print_function - -+from builtins import object - __all__ = ['baseSignal'] - - from PyQt4 import Qt ---- ./lib/taurus/qt/qtdesigner/taurusdesigner.py (original) -+++ ./lib/taurus/qt/qtdesigner/taurusdesigner.py (refactored) -@@ -23,6 +23,7 @@ - ## - ############################################################################# - -+from builtins import str - import sys - import os.path - import optparse ---- ./lib/taurus/qt/qtdesigner/tauruspluginplugin.py (original) -+++ ./lib/taurus/qt/qtdesigner/tauruspluginplugin.py (refactored) -@@ -119,7 +119,7 @@ - - def customWidgets(self): - if self._widgets is None: -- self._widgets = [w(self) for w in _plugins.values()] -+ self._widgets = [w(self) for w in list(_plugins.values())] - return self._widgets - - if __name__ != "__main__": ---- ./lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py (original) -+++ ./lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py (refactored) -@@ -38,6 +38,8 @@ - """ - from __future__ import print_function - -+from builtins import str -+from builtins import zip - import inspect - - from taurus.external.qt import Qt -@@ -86,8 +88,8 @@ - if aspec.defaults is None: - kwspec = {} - else: -- kwspec = dict(zip(aspec.args[-len(aspec.defaults):], -- aspec.defaults)) -+ kwspec = dict(list(zip(aspec.args[-len(aspec.defaults):], -+ aspec.defaults))) - args, kwargs = [], {} - if 'designMode' in kwspec: - kwargs['designMode'] = designMode ---- ./lib/taurus/qt/qtgui/application/taurusapplication.py (original) -+++ ./lib/taurus/qt/qtgui/application/taurusapplication.py (refactored) -@@ -26,6 +26,7 @@ - """This module provides the base - :class:`taurus.qt.qtgui.application.TaurusApplication` class.""" - -+from builtins import str - from __future__ import with_statement - - __all__ = ["TaurusApplication"] ---- ./lib/taurus/qt/qtgui/base/taurusbase.py (original) -+++ ./lib/taurus/qt/qtgui/base/taurusbase.py (refactored) -@@ -27,6 +27,8 @@ - """This module provides the set of base classes from which the Qt taurus widgets - should inherit to be considered valid taurus widgets.""" - -+from builtins import str -+from past.builtins import basestring - __all__ = ["TaurusBaseComponent", "TaurusBaseWidget", - "TaurusBaseWritableWidget", "defaultFormatter"] - -@@ -330,7 +332,7 @@ - but it can also be called any time the buffer needs to be flushed - ''' - with self._eventsBufferLock: -- for evt in self._bufferedEvents.values(): -+ for evt in list(self._bufferedEvents.values()): - self.taurusEvent.emit(*evt) - self._bufferedEvents = {} - ---- ./lib/taurus/qt/qtgui/base/tauruscontroller.py (original) -+++ ./lib/taurus/qt/qtgui/base/tauruscontroller.py (refactored) -@@ -26,6 +26,8 @@ - - """This module provides the set of base class taurus controllers.""" - -+from builtins import str -+from builtins import object - __all__ = ["TaurusBaseController", "TaurusAttributeControllerHelper", - "TaurusScalarAttributeControllerHelper", - "TaurusConfigurationControllerHelper", ---- ./lib/taurus/qt/qtgui/button/taurusbutton.py (original) -+++ ./lib/taurus/qt/qtgui/button/taurusbutton.py (refactored) -@@ -27,6 +27,9 @@ - """This module provides a taurus QPushButton based widgets""" - from __future__ import print_function - -+from builtins import map -+from builtins import str -+from past.builtins import basestring - __all__ = ["TaurusLauncherButton", "TaurusCommandButton", "TaurusLockButton"] - - __docformat__ = 'restructuredtext' -@@ -406,7 +409,7 @@ - else: - return parameters - else: -- return map(cast_type, parameters) -+ return list(map(cast_type, parameters)) - - def setCommand(self, commandName): - '''sets the command to be executed when the button is clicked -@@ -638,7 +641,7 @@ - if len(args) == 0: - w = demo() - else: -- models = map(str.lower, args) -+ models = list(map(str.lower, args)) - - w = Qt.QWidget() - layout = Qt.QGridLayout() ---- ./lib/taurus/qt/qtgui/compact/abstractswitcher.py (original) -+++ ./lib/taurus/qt/qtgui/compact/abstractswitcher.py (refactored) -@@ -26,6 +26,7 @@ - """This module provides base classes from which the compact widgets should inherit - """ - -+from past.builtins import basestring - __all__ = ["TaurusReadWriteSwitcher"] - - __docformat__ = 'restructuredtext' ---- ./lib/taurus/qt/qtgui/container/qcontainer.py (original) -+++ ./lib/taurus/qt/qtgui/container/qcontainer.py (refactored) -@@ -25,6 +25,7 @@ - - """This module provides basic pure Qt container widgets""" - -+from builtins import str - __all__ = ["QGroupWidget"] - - __docformat__ = 'restructuredtext' ---- ./lib/taurus/qt/qtgui/container/taurusframe.py (original) -+++ ./lib/taurus/qt/qtgui/container/taurusframe.py (refactored) -@@ -26,6 +26,7 @@ - """This module provides basic taurus container widgets""" - from __future__ import absolute_import - -+from builtins import map - __all__ = ["TaurusFrame"] - - __docformat__ = 'restructuredtext' -@@ -150,7 +151,7 @@ - if len(args) == 0: - w = demo() - else: -- models = map(str.lower, args) -+ models = list(map(str.lower, args)) - - w = Qt.QWidget() - w.setWindowTitle(app.applicationName()) ---- ./lib/taurus/qt/qtgui/container/taurusgroupbox.py (original) -+++ ./lib/taurus/qt/qtgui/container/taurusgroupbox.py (refactored) -@@ -26,6 +26,8 @@ - """This module provides basic taurus group box widget""" - from __future__ import absolute_import - -+from builtins import map -+from builtins import str - __all__ = ["TaurusGroupBox"] - - __docformat__ = 'restructuredtext' -@@ -195,7 +197,7 @@ - if len(args) == 0: - w = demo() - else: -- models = map(str.lower, args) -+ models = list(map(str.lower, args)) - - w = Qt.QWidget() - w.setWindowTitle(app.applicationName()) ---- ./lib/taurus/qt/qtgui/container/taurusgroupwidget.py (original) -+++ ./lib/taurus/qt/qtgui/container/taurusgroupwidget.py (refactored) -@@ -26,6 +26,7 @@ - """This module provides a taurus group widget""" - from __future__ import absolute_import - -+from builtins import map - __all__ = ["TaurusGroupWidget"] - - __docformat__ = 'restructuredtext' -@@ -195,7 +196,7 @@ - if len(args) == 0: - w = demo() - else: -- models = map(str.lower, args) -+ models = list(map(str.lower, args)) - - w = Qt.QWidget() - w.setWindowTitle(app.applicationName()) ---- ./lib/taurus/qt/qtgui/container/taurusmainwindow.py (original) -+++ ./lib/taurus/qt/qtgui/container/taurusmainwindow.py (refactored) -@@ -28,6 +28,9 @@ - """ - from __future__ import absolute_import - -+from builtins import str -+from builtins import range -+from past.builtins import basestring - __all__ = ["TaurusMainWindow"] - - __docformat__ = 'restructuredtext' -@@ -91,7 +94,7 @@ - self.externalAppsPage.setWidgetResizable(True) - self._tabwidget.addTab(self.externalAppsPage, - "External Application Paths") -- label = "Command line for %s" % unicode(extapp.text()) -+ label = "Command line for %s" % str(extapp.text()) - editWidget = CommandArgsLineEdit(extapp, " ".join(extapp.cmdArgs())) - #editWidget = Qt.QLineEdit(" ".join(extapp.cmdArgs())) - self.externalAppsPage.widget().layout().addRow(label, editWidget) -@@ -106,12 +109,12 @@ - ''' - from taurus.external.qt import Qt - layout = self.externalAppsPage.widget().layout() -- for cnt in reversed(range(layout.count())): -+ for cnt in reversed(list(range(layout.count()))): - widget = layout.itemAt(cnt).widget() - if widget is not None: - text = str(widget.text()) # command1 - if isinstance(widget, Qt.QLabel): -- dialog_text = "Command line for %s" % unicode( -+ dialog_text = "Command line for %s" % str( - extapp.text()) - if text == dialog_text: - layout.removeWidget(widget) -@@ -623,7 +626,7 @@ - self.applyQConfig(ba) - except Exception as e: - msg = 'Problem loading configuration from "%s". Some settings may not be restored.\n Details: %s' % ( -- unicode(settings.fileName()), repr(e)) -+ str(settings.fileName()), repr(e)) - self.error(msg) - Qt.QMessageBox.warning( - self, 'Error Loading settings', msg, Qt.QMessageBox.Ok) -@@ -681,7 +684,7 @@ - if not ok: - return - if name in perspectives: -- ans = Qt.QMessageBox.question(self, "Overwrite perspective?", "overwrite existing perspective %s?" % unicode(name), -+ ans = Qt.QMessageBox.question(self, "Overwrite perspective?", "overwrite existing perspective %s?" % str(name), - Qt.QMessageBox.Yes, Qt.QMessageBox.No) - if ans != Qt.QMessageBox.Yes: - return -@@ -759,16 +762,16 @@ - :param fname: (str) name of output file. If None given, a file dialog will be shown. - ''' - if fname is None: -- fname = unicode(Qt.QFileDialog.getSaveFileName(self, 'Choose file where the current settings should be saved', -+ fname = str(Qt.QFileDialog.getSaveFileName(self, 'Choose file where the current settings should be saved', - '', "Ini files (*.ini);;All files (*)")) - if not fname: - return - self.saveSettings() - ok = Qt.QFile.copy(self.getQSettings().fileName(), fname) - if ok: -- self.info('MainWindow settings saved in "%s"' % unicode(fname)) -+ self.info('MainWindow settings saved in "%s"' % str(fname)) - else: -- msg = 'Settings could not be exported to %s' % unicode(fname) -+ msg = 'Settings could not be exported to %s' % str(fname) - Qt.QMessageBox.warning(self, 'Export error', msg) - - def importSettingsFile(self, fname=None): -@@ -779,7 +782,7 @@ - :param fname: (str) name of ini file. If None given, a file dialog will be shown. - ''' - if fname is None: -- fname = unicode(Qt.QFileDialog.getOpenFileName(self, 'Select a ini-format settings file', -+ fname = str(Qt.QFileDialog.getOpenFileName(self, 'Select a ini-format settings file', - '', "Ini files (*.ini);;All files (*)")) - if not fname: - return -@@ -935,8 +938,8 @@ - self.setHelpManualURI(uri) - - def showHelpAbout(self): -- appname = unicode(Qt.qApp.applicationName()) -- appversion = unicode(Qt.qApp.applicationVersion()) -+ appname = str(Qt.qApp.applicationName()) -+ appversion = str(Qt.qApp.applicationVersion()) - from taurus.core import release - abouttext = "%s %s\n\nUsing %s %s" % ( - appname, appversion, release.name, release.version) -@@ -961,7 +964,7 @@ - if key is None: - from taurus.core.util.user import getSystemUserName - username = getSystemUserName() -- appname = unicode(Qt.QApplication.applicationName()) -+ appname = str(Qt.QApplication.applicationName()) - key = "__socket_%s-%s__" % (username, appname) - from taurus.external.qt import QtNetwork - socket = QtNetwork.QLocalSocket(self) ---- ./lib/taurus/qt/qtgui/container/taurusscrollarea.py (original) -+++ ./lib/taurus/qt/qtgui/container/taurusscrollarea.py (refactored) -@@ -26,6 +26,7 @@ - """This module provides basic taurus scroll area widget""" - from __future__ import absolute_import - -+from builtins import map - __all__ = ["TaurusScrollArea"] - - __docformat__ = 'restructuredtext' -@@ -173,7 +174,7 @@ - if len(args) == 0: - w = demo() - else: -- models = map(str.lower, args) -+ models = list(map(str.lower, args)) - - w = Qt.QWidget() - w.setWindowTitle(app.applicationName()) ---- ./lib/taurus/qt/qtgui/dialog/taurusmessagebox.py (original) -+++ ./lib/taurus/qt/qtgui/dialog/taurusmessagebox.py (refactored) -@@ -25,6 +25,9 @@ - - """This module provides a set of dialog based widgets""" - -+from future import standard_library -+standard_library.install_aliases() -+from builtins import object - __all__ = ["TaurusMessageBox", "protectTaurusMessageBox", - "ProtectTaurusMessageBox", "TaurusExceptHookMessageBox"] - -@@ -337,8 +340,8 @@ - except PyTango.DevFailed as df1: - try: - import traceback -- import StringIO -- origin = StringIO.StringIO() -+ import io -+ origin = io.StringIO() - traceback.print_stack(file=origin) - origin.seek(0) - origin = origin.read() ---- ./lib/taurus/qt/qtgui/display/qled.py (original) -+++ ./lib/taurus/qt/qtgui/display/qled.py (refactored) -@@ -25,6 +25,7 @@ - - """A pure Qt led widget""" - -+from builtins import str - __all__ = ["LedColor", "LedStatus", "LedSize", "QLed", "QLedOld"] - - __docformat__ = 'restructuredtext' ---- ./lib/taurus/qt/qtgui/display/qpixmapwidget.py (original) -+++ ./lib/taurus/qt/qtgui/display/qpixmapwidget.py (refactored) -@@ -25,7 +25,9 @@ - - """This module contains a pure Qt widget that displays an image""" - from __future__ import absolute_import -- -+from __future__ import division -+ -+from past.utils import old_div - __all__ = ["QPixmapWidget"] - - __docformat__ = 'restructuredtext' -@@ -80,11 +82,11 @@ - vAlign = align & Qt.Qt.AlignVertical_Mask - x, y = 0, 0 - if hAlign & Qt.Qt.AlignHCenter: -- x = (w - pw) / 2 -+ x = old_div((w - pw), 2) - elif hAlign & Qt.Qt.AlignRight: - x = w - pw - if vAlign & Qt.Qt.AlignVCenter: -- y = (h - ph) / 2 -+ y = old_div((h - ph), 2) - elif vAlign & Qt.Qt.AlignBottom: - y = h - ph - x, y = max(0, x), max(0, y) ---- ./lib/taurus/qt/qtgui/display/qsevensegment.py (original) -+++ ./lib/taurus/qt/qtgui/display/qsevensegment.py (refactored) -@@ -27,7 +27,11 @@ - qsevensegmentdisplay.py - """ - from __future__ import print_function -- -+from __future__ import division -+ -+from builtins import str -+from builtins import range -+from past.utils import old_div - __all__ = ['Q7SegDigit'] - - __docformat__ = 'restructuredtext' -@@ -134,7 +138,7 @@ - - DftWidth = 300 - DftHeight = 300 -- DftAspectRatio = DftWidth / DftHeight -+ DftAspectRatio = old_div(DftWidth, DftHeight) - DftUseFrame = True - - def __init__(self, parent=None, **kwargs): -@@ -202,11 +206,11 @@ - painter.setRenderHint(Qt.QPainter.Antialiasing) - painter.setWindow(0, 0, self.DftWidth, self.DftHeight) - w, h = float(self.width()), float(self.height()) -- aspect = w / h -+ aspect = old_div(w, h) - if aspect > 0.75: - w = h * aspect - else: -- h = w / aspect -+ h = old_div(w, aspect) - painter.setViewport(0, 0, w, h) - self._paintBorder(painter) - self._paintSegment(painter) -@@ -248,7 +252,7 @@ - - pens, brushes = self._pens[idx], self._brushes[idx] - -- for i in xrange(7): -+ for i in range(7): - seg = Qt.QPainterPath() - seg.addPolygon(geom[i]) - painter.setPen(pens[i]) -@@ -506,7 +510,7 @@ - self.setLayout(l) - - self._digits = [] -- for i in xrange(5): -+ for i in range(5): - d = Q7SegDigit() - d.setUseFrame(False) - d.setValue(i) ---- ./lib/taurus/qt/qtgui/display/tauruslabel.py (original) -+++ ./lib/taurus/qt/qtgui/display/tauruslabel.py (refactored) -@@ -26,6 +26,8 @@ - """This module provides a set of basic Taurus widgets based on QLabel""" - from __future__ import absolute_import - -+from builtins import str -+from builtins import object - __all__ = ["TaurusLabel"] - - __docformat__ = 'restructuredtext' -@@ -116,8 +118,8 @@ - toolTip = label.getFormatedToolTip() - if self._trimmedText: - toolTip = u"

Value: %s


%s" %\ -- (unicode(self._text, errors='replace'), -- unicode(str(toolTip), errors='replace')) -+ (str(self._text, errors='replace'), -+ str(str(toolTip), errors='replace')) - label.setToolTip(toolTip) - - _updateBackground = updateLabelBackground ---- ./lib/taurus/qt/qtgui/display/tauruslcd.py (original) -+++ ./lib/taurus/qt/qtgui/display/tauruslcd.py (refactored) -@@ -26,6 +26,9 @@ - """This module provides a Taurus widget based on QLCDNumber""" - from __future__ import absolute_import - -+from builtins import map -+from builtins import str -+from builtins import object - __all__ = ["TaurusLCD"] - - __docformat__ = 'restructuredtext' -@@ -413,7 +416,7 @@ - if len(args) == 0: - w = demo() - else: -- models = map(str.lower, args) -+ models = list(map(str.lower, args)) - - w = Qt.QWidget() - layout = Qt.QGridLayout() ---- ./lib/taurus/qt/qtgui/display/taurusled.py (original) -+++ ./lib/taurus/qt/qtgui/display/taurusled.py (refactored) -@@ -27,6 +27,9 @@ - """This module provides a set of basic Taurus widgets based on QLed""" - from __future__ import absolute_import - -+from builtins import map -+from builtins import str -+from builtins import object - __all__ = ["TaurusLed"] - - __docformat__ = 'restructuredtext' -@@ -478,7 +481,7 @@ - if len(args) == 0: - w = demo() - else: -- models = map(str.lower, args) -+ models = list(map(str.lower, args)) - - w = Qt.QWidget() - layout = Qt.QGridLayout() ---- ./lib/taurus/qt/qtgui/display/test/test_tauruslabel.py (original) -+++ ./lib/taurus/qt/qtgui/display/test/test_tauruslabel.py (refactored) -@@ -25,6 +25,7 @@ - - """Unit tests for Taurus Label""" - -+from builtins import str - import unittest - from taurus.external.qt import Qt - from taurus.test import insertTest ---- ./lib/taurus/qt/qtgui/editor/tauruseditor.py (original) -+++ ./lib/taurus/qt/qtgui/editor/tauruseditor.py (refactored) -@@ -25,6 +25,7 @@ - - """This module contains a taurus text editor widget.""" - -+from builtins import str - __all__ = ["TaurusBaseEditor"] - - __docformat__ = 'restructuredtext' ---- ./lib/taurus/qt/qtgui/extra_guiqwt/curve.py (original) -+++ ./lib/taurus/qt/qtgui/extra_guiqwt/curve.py (refactored) -@@ -26,6 +26,7 @@ - """Extension of :mod:`guiqwt.curve`""" - from __future__ import print_function - -+from builtins import next - __all__ = ["TaurusCurveItem"] - - from taurus.external.qt import Qt ---- ./lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py (original) -+++ ./lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py (refactored) -@@ -27,6 +27,11 @@ - curvesmodel Model and view for new CurveItem configuration - """ - from __future__ import print_function -+from builtins import map -+from builtins import next -+from builtins import str -+from builtins import range -+from builtins import object - __all__ = ['TaurusCurveItemTableModel', 'CurveItemConf', 'CurveItemConfDlg'] - #raise UnimplementedError('Under Construction!') - -@@ -43,7 +48,7 @@ - from taurus.qt.qtgui.extra_guiqwt.styles import TaurusCurveParam - - import guiqwt --__guiqwt_version = map(int, guiqwt.__version__.split('.')[:3]) -+__guiqwt_version = list(map(int, guiqwt.__version__.split('.')[:3])) - if __guiqwt_version <= [2, 3, 1]: - import taurus.external.qt.Qwt5 as qwt - else: -@@ -55,7 +60,7 @@ - # set some named constants - # columns: - NUMCOLS = 3 --X, Y, TITLE = range(NUMCOLS) -+X, Y, TITLE = list(range(NUMCOLS)) - SRC_ROLE = Qt.Qt.UserRole + 1 - - ---- ./lib/taurus/qt/qtgui/extra_guiqwt/plot.py (original) -+++ ./lib/taurus/qt/qtgui/extra_guiqwt/plot.py (refactored) -@@ -26,6 +26,9 @@ - """ - Extension of :mod:`guiqwt.plot` - """ -+from builtins import next -+from builtins import str -+from past.builtins import basestring - __all__ = ["TaurusCurveDialog", "TaurusTrendDialog", "TaurusImageDialog"] - - import copy ---- ./lib/taurus/qt/qtgui/extra_guiqwt/scales.py (original) -+++ ./lib/taurus/qt/qtgui/extra_guiqwt/scales.py (refactored) -@@ -27,6 +27,11 @@ - scales.py: Custom scales used by taurus.qt.qtgui.plot module - """ - from __future__ import print_function -+from __future__ import division -+from builtins import map -+from builtins import str -+from builtins import range -+from past.utils import old_div - __all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", - "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", - "FixedLabelsScaleDraw"] -@@ -37,7 +42,7 @@ - from taurus.external.qt import Qt - - import guiqwt --__guiqwt_version = map(int, guiqwt.__version__.split('.')[:3]) -+__guiqwt_version = list(map(int, guiqwt.__version__.split('.')[:3])) - - if __guiqwt_version <= [2, 3, 1]: - import taurus.external.qt.Qwt5 as qwt -@@ -226,7 +231,7 @@ - - elif dx > 2: # 2s - format = "%H:%M:%S" -- majticks = range(int(x1) + 1, int(x2)) -+ majticks = list(range(int(x1) + 1, int(x2))) - - else: # less than 2s (show microseconds) - scaleDiv = qwt.QwtLinearScaleEngine.divideScale( -@@ -237,7 +242,7 @@ - # make sure to comply with maxMajTicks - L = len(majticks) - if L > maxMajSteps: -- majticks = majticks[::int(numpy.ceil(float(L) / maxMajSteps))] -+ majticks = majticks[::int(numpy.ceil(old_div(float(L), maxMajSteps)))] - - scaleDiv = qwt.QwtScaleDiv(interval, minticks, medticks, majticks) - self.scaleDraw().setDatetimeLabelFormat(format) -@@ -370,7 +375,7 @@ - s = 86400 # 1 day - # calculate a step size that respects the base step (s) and also - # enforces the maxMajSteps -- stepSize = s * int(numpy.ceil(float(d_range // s) / maxMajSteps)) -+ stepSize = s * int(numpy.ceil(old_div(float(d_range // s), maxMajSteps))) - return qwt.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize) - - @staticmethod ---- ./lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py (original) -+++ ./lib/taurus/qt/qtgui/extra_guiqwt/taurustrend2d.py (refactored) -@@ -26,6 +26,7 @@ - """ - taurustrend.py: Generic trend widget for Taurus - """ -+from builtins import str - __all__ = ["TaurusTrend2DDialog"] - - from guiqwt.plot import ImageDialog ---- ./lib/taurus/qt/qtgui/extra_guiqwt/tools.py (original) -+++ ./lib/taurus/qt/qtgui/extra_guiqwt/tools.py (refactored) -@@ -26,6 +26,7 @@ - """Extension of :mod:`guiqwt.tools`""" - - -+from builtins import zip - __docformat__ = 'restructuredtext' - - import weakref -@@ -173,7 +174,7 @@ - - def update_status(self, plot): - active_scale = self._getAxesUseTime(plot) -- for scale_type, scale_action in self.scale_menu.items(): -+ for scale_type, scale_action in list(self.scale_menu.items()): - scale_action.setEnabled(True) - if active_scale == scale_type: - scale_action.setChecked(True) ---- ./lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py (original) -+++ ./lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py (refactored) -@@ -27,6 +27,7 @@ - nexusWidget.py: - """ - -+from builtins import str - __all__ = ["TaurusNexusBrowser"] - - import numpy -@@ -111,7 +112,7 @@ - - def openFile(self, fname=None): - if fname is None: -- fname = unicode(Qt.QFileDialog.getOpenFileName( -+ fname = str(Qt.QFileDialog.getOpenFileName( - self, "Choose NeXus File", "/home/cpascual/local/tmp/scantest.h5")) # @TODO!! - if fname: - self.__nexusFile = self.__fileModel.openFile(fname) ---- ./lib/taurus/qt/qtgui/graphic/taurusgraphic.py (original) -+++ ./lib/taurus/qt/qtgui/graphic/taurusgraphic.py (refactored) -@@ -26,9 +26,17 @@ - taurusgraphic.py: - """ - from __future__ import print_function -+from __future__ import division - - # TODO: Tango-centric - -+from future import standard_library -+standard_library.install_aliases() -+from builtins import str -+from builtins import range -+from past.builtins import basestring -+from builtins import object -+from past.utils import old_div - __all__ = ['SynopticSelectionStyle', - 'parseTangoUri', - 'QEmitter', # TODO: QEmitter should probably be removed (kept priv) -@@ -64,7 +72,7 @@ - import operator - import types - --import Queue -+import queue - - from taurus import Manager - from taurus.core import AttrQuality, DataType -@@ -373,7 +381,7 @@ - if not target.endswith('$'): - target += '$' - result = [] -- for k in self._itemnames.keys(): -+ for k in list(self._itemnames.keys()): - if re.match(target.lower(), k.lower()): - #self.debug('getItemByName(%s): _itemnames[%s]: %s'%(target,k,self._itemnames[k])) - result.extend(self._itemnames[k]) -@@ -383,7 +391,7 @@ - """ This method will try first with named objects; if failed then with itemAt """ - pos = Qt.QPointF(x, y) - itemsAtPos = [] -- for z, o in sorted((i.zValue(), i) for v in self._itemnames.values() for i in v if i.contains(pos) or i.isUnderMouse()): -+ for z, o in sorted((i.zValue(), i) for v in list(self._itemnames.values()) for i in v if i.contains(pos) or i.isUnderMouse()): - if not hasattr(o, 'getExtensions'): - self.debug( - 'getItemByPosition(%d,%d): adding Qt primitive %s' % (x, y, o)) -@@ -685,7 +693,7 @@ - SelectionMark = picture - SelectionMark.setRect(0, 0, w, h) - SelectionMark.hide() -- elif operator.isCallable(picture): -+ elif hasattr(picture, '__call__'): - SelectionMark = picture() - else: - if isinstance(picture, Qt.QPixmap): -@@ -734,8 +742,8 @@ - if w > MAX_CIRCLE_SIZE[0] or h > MAX_CIRCLE_SIZE[1]: - # Applying correction if the file is too big, half max - # circle size around the center -- x, y = (x + w / 2.) - .5 * \ -- MAX_CIRCLE_SIZE[0], (y + h / 2.) - .5 * \ -+ x, y = (x + old_div(w, 2.)) - .5 * \ -+ MAX_CIRCLE_SIZE[0], (y + old_div(h, 2.)) - .5 * \ - MAX_CIRCLE_SIZE[1], - w, h = [.5 * t for t in MAX_CIRCLE_SIZE] - else: -@@ -831,7 +839,7 @@ - def start(self): - if self.updateThread: - return -- self.updateQueue = Queue.Queue() -+ self.updateQueue = queue.Queue() - self.updateThread = TaurusGraphicsUpdateThread(self) - self.updateThread.start() # Qt.QThread.HighPriority) - -@@ -985,7 +993,7 @@ - path.lineTo(cp[1]) - else: - path.moveTo(cp[0]) -- for i in xrange(1, nb_points - 1, 3): -+ for i in range(1, nb_points - 1, 3): - p1 = cp[i + 0] - p2 = cp[i + 1] - end = cp[i + 2] -@@ -1438,7 +1446,7 @@ - } - - --class TaurusBaseGraphicsFactory: -+class TaurusBaseGraphicsFactory(object): - - def __init__(self): - pass -@@ -1506,7 +1514,7 @@ - def getGraphicsItem(self, type_, params): - name = params.get(self.getNameParam()) - # applying alias -- for k, v in getattr(self, 'alias', {}).items(): -+ for k, v in list(getattr(self, 'alias', {}).items()): - if k in name: - name = str(name).replace(k, v) - params[self.getNameParam()] = name ---- ./lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py (original) -+++ ./lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py (refactored) -@@ -26,6 +26,8 @@ - """This module contains the graphics factory for the jdraw file format""" - from __future__ import absolute_import - -+from builtins import str -+from builtins import range - __all__ = ["TaurusJDrawGraphicsFactory"] - - __docformat__ = 'restructuredtext' -@@ -181,7 +183,7 @@ - - polygon = Qt.QPolygonF() - p = params.get('summit') -- for i in xrange(0, len(p), 2): -+ for i in range(0, len(p), 2): - polygon.append(Qt.QPointF(p[i], p[i + 1])) - item.setPolygon(polygon) - -@@ -190,7 +192,7 @@ - def getSplineObj(self, params): - item = self.getGraphicsItem('Spline', params) - p = params.get('summit') -- p = [Qt.QPointF(p[i], p[i + 1]) for i in xrange(0, len(p), 2)] -+ p = [Qt.QPointF(p[i], p[i + 1]) for i in range(0, len(p), 2)] - item.setControlPoints(p) - isClosed = params.get('isClosed', True) - item.setClose(isClosed) -@@ -213,8 +215,8 @@ - # it is parsed as a float - vAlignment = int(params.get('vAlignment', 0)) - hAlignment = int(params.get('hAlignment', 0)) -- assert(vAlignment in VALIGNMENT.keys()) -- assert(hAlignment in ALIGNMENT.keys()) -+ assert(vAlignment in list(VALIGNMENT.keys())) -+ assert(hAlignment in list(ALIGNMENT.keys())) - vAlignment = VALIGNMENT[vAlignment] - hAlignment = ALIGNMENT[hAlignment] - item.setAlignment(hAlignment | vAlignment) -@@ -332,7 +334,7 @@ - params.get('extensions')["ignoreRepaint"] = "true" - - if self.alias: -- for k, v in self.alias.items(): -+ for k, v in list(self.alias.items()): - name = str(name).replace(k, v) - - # Forcing not-Taurus items to have a name and be able to trigger events ---- ./lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py (original) -+++ ./lib/taurus/qt/qtgui/graphic/jdraw/jdraw_parser.py (refactored) -@@ -27,6 +27,7 @@ - - from __future__ import absolute_import - -+from builtins import str - __all__ = ["new_parser", "parse"] - - import os ---- ./lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py (original) -+++ ./lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py (refactored) -@@ -26,6 +26,8 @@ - """This module contains the graphics view widget for jdraw files""" - from __future__ import absolute_import - -+from builtins import str -+from past.builtins import basestring - __all__ = ["TaurusJDrawSynopticsView"] - - __docformat__ = 'restructuredtext' -@@ -121,7 +123,7 @@ - self.emitColors() - - def openJDraw(self): -- ifile = unicode(Qt.QFileDialog.getOpenFileName( -+ ifile = str(Qt.QFileDialog.getOpenFileName( - self, 'Load JDraw File', '', 'JDraw File (*.jdw)')) - if not ifile: - return -@@ -139,7 +141,7 @@ - return - - def get_item_list(self): -- return [item._name for item in self.scene().items() if hasattr(item, '_name') and item._name] -+ return [item._name for item in list(self.scene().items()) if hasattr(item, '_name') and item._name] - - def get_device_list(self): - items = [(item, parseTangoUri(item)) for item in self.get_item_list()] -@@ -148,7 +150,7 @@ - def get_item_colors(self, emit=False): - item_colors = {} - try: -- for item in self.scene().items(): -+ for item in list(self.scene().items()): - if not getattr(item, '_name', '') or not getattr(item, '_currBgBrush', None): - continue - item_colors[item._name] = item._currBgBrush.color().name() -@@ -421,7 +423,7 @@ - - def setModels(self): - """ This method triggers item.setModel(item._name) in all internal items. """ -- for item in self.scene().items(): -+ for item in list(self.scene().items()): - if item._name and isinstance(item, TaurusGraphicsItem): - self.debug( - 'TaurusJDrawGraphicsFactory.setModels(): calling item.setModel(%s)' % (item._name)) ---- ./lib/taurus/qt/qtgui/help/assistant.py (original) -+++ ./lib/taurus/qt/qtgui/help/assistant.py (refactored) -@@ -39,13 +39,15 @@ - app.exec_() - """ - -+from builtins import str -+from builtins import object - __all__ = ["Assistant", "Widgets"] - - - from taurus.external.qt import Qt - - --class Widgets: -+class Widgets(object): - contents = "contents" - index = "index" - bookmarks = "bookmarks" ---- ./lib/taurus/qt/qtgui/icon/catalog.py (original) -+++ ./lib/taurus/qt/qtgui/icon/catalog.py (refactored) -@@ -78,7 +78,7 @@ - pixmaps = {} - choices = [] - row = [] -- for md5, choice in hashes.items(): -+ for md5, choice in list(hashes.items()): - try: - pixmaps[choice] = pixmaps_hashed[md5] - except KeyError: ---- ./lib/taurus/qt/qtgui/icon/icon.py (original) -+++ ./lib/taurus/qt/qtgui/icon/icon.py (refactored) -@@ -25,6 +25,7 @@ - - """This module provides taurus-specific functions related to icons""" - -+from builtins import range - __all__ = [ - 'sanitizePrefix', - 'registerPathFiles', -@@ -68,7 +69,7 @@ - __3DQS = Qt.QSize(3 * __DW, __DH) - - # Indexes for the map below --__IDX_ELEM_TYPE_ICON, __IDX_ELEM_TYPE_SIZE, __IDX_ELEM_TYPE_TOOLTIP = range(3) -+__IDX_ELEM_TYPE_ICON, __IDX_ELEM_TYPE_SIZE, __IDX_ELEM_TYPE_TOOLTIP = list(range(3)) - - # New default role map - # Elements are: icon theme, preferred size, description/tooltip -@@ -102,7 +103,7 @@ - } - - # Indexes for the map below --__IDX_STATE_ICON, __IDX_STATE_TOOLTIP = range(2) -+__IDX_STATE_ICON, __IDX_STATE_TOOLTIP = list(range(2)) - - _STATE_MAP = { - TaurusDevState.Ready: ("status:available.svg", "Element ready"), ---- ./lib/taurus/qt/qtgui/input/choicedlg.py (original) -+++ ./lib/taurus/qt/qtgui/input/choicedlg.py (refactored) -@@ -26,6 +26,7 @@ - """This package provides a dialog for graphically choosing a Taurus class""" - from __future__ import print_function - -+from builtins import str - __all__ = ["GraphicalChoiceDlg", "GraphicalChoiceWidget"] - - __docformat__ = 'restructuredtext' -@@ -196,7 +197,7 @@ - - def onClick(self): - '''slot called when a button is clicked''' -- self._chosen = unicode(self.sender().text()) -+ self._chosen = str(self.sender().text()) - self.choiceMade.emit(self._chosen) - - def getChosen(self): ---- ./lib/taurus/qt/qtgui/input/qwheel.py (original) -+++ ./lib/taurus/qt/qtgui/input/qwheel.py (refactored) -@@ -24,7 +24,11 @@ - ############################################################################# - - """This module provides an arrow based widget.""" -- -+from __future__ import division -+ -+from builtins import map -+from builtins import range -+from past.utils import old_div - __all__ = ["QWheelEdit"] - - __docformat__ = 'restructuredtext' -@@ -96,7 +100,7 @@ - class _DigitLabel(Qt.QLabel): - """A private single digit label to be used by QWheelEdit widget""" - -- PixmapKeys = map(str, xrange(10)) + ['blank', 'minus', 'point'] -+ PixmapKeys = list(map(str, range(10))) + ['blank', 'minus', 'point'] - - def __init__(self, lbl, parent=None): - Qt.QLabel.__init__(self, parent) -@@ -223,7 +227,7 @@ - @return (float) the minimum possible value - """ - decmax = 0 -- for i in xrange(self.getDecDigitCount()): -+ for i in range(self.getDecDigitCount()): - decmax += 9 * math.pow(10, -(i + 1)) - return -math.pow(10.0, self.getIntDigitCount()) + 1 - decmax - -@@ -236,7 +240,7 @@ - @return (float) the maximum possible value - """ - decmax = 0 -- for i in xrange(self.getDecDigitCount()): -+ for i in range(self.getDecDigitCount()): - decmax += 9 * math.pow(10, -(i + 1)) - return math.pow(10.0, self.getIntDigitCount()) - 1 + decmax - -@@ -270,7 +274,7 @@ - l.setColumnMinimumWidth(0, _ArrowButton.ButtonSize) - l.setColumnStretch(0, 1) - -- for i in xrange(id): -+ for i in range(id): - col = i + 1 - d = _DigitLabel('0') - up = _UpArrowButton(id - i - 1) -@@ -293,7 +297,7 @@ - self._digitLabels.append(dotLabel) - l.addWidget(dotLabel, 1, id + 1) - -- for i in xrange(id, digits): -+ for i in range(id, digits): - col = i + 1 - if showDot: - col += 1 -@@ -442,7 +446,7 @@ - if len(v_str) > len(self._digitLabels): - # do auto adjust - if '.' in v_str: -- dc = map(len, v_str.split('.')) -+ dc = list(map(len, v_str.split('.'))) - else: - dc = len(v_str), 0 - self._setDigits(*dc) -@@ -767,8 +771,8 @@ - self.setFocus() - - def wheelEvent(self, evt): -- numDegrees = evt.delta() / 8 -- numSteps = numDegrees / 15 -+ numDegrees = old_div(evt.delta(), 8) -+ numSteps = old_div(numDegrees, 15) - #w = Qt.QApplication.focusWidget() - w = self.focusWidget() - if not isinstance(w, _DigitLabel): ---- ./lib/taurus/qt/qtgui/input/tauruscheckbox.py (original) -+++ ./lib/taurus/qt/qtgui/input/tauruscheckbox.py (refactored) -@@ -25,6 +25,7 @@ - - """This module provides a set of basic taurus widgets based on QCheckBox""" - -+from builtins import str - __all__ = ["TaurusValueCheckBox"] - - __docformat__ = 'restructuredtext' ---- ./lib/taurus/qt/qtgui/input/tauruscombobox.py (original) -+++ ./lib/taurus/qt/qtgui/input/tauruscombobox.py (refactored) -@@ -26,6 +26,7 @@ - - """This module provides a set of basic taurus widgets based on QCheckBox""" - -+from builtins import str - __all__ = ["TaurusAttrListComboBox", "TaurusValueComboBox"] - - __docformat__ = 'restructuredtext' ---- ./lib/taurus/qt/qtgui/input/tauruslineedit.py (original) -+++ ./lib/taurus/qt/qtgui/input/tauruslineedit.py (refactored) -@@ -26,7 +26,11 @@ - """ - This module provides a set of basic taurus widgets based on QLineEdit - """ -- -+from __future__ import division -+ -+from builtins import bytes -+from builtins import str -+from past.utils import old_div - import sys - import numpy - from taurus.external.qt import Qt -@@ -176,8 +180,8 @@ - return Qt.QLineEdit.wheelEvent(self, evt) - - evt.accept() -- numDegrees = evt.delta() / 8 -- numSteps = numDegrees / 15 -+ numDegrees = old_div(evt.delta(), 8) -+ numSteps = old_div(numDegrees, 15) - self._stepBy(numSteps) - - def keyPressEvent(self, evt): ---- ./lib/taurus/qt/qtgui/input/taurusspinbox.py (original) -+++ ./lib/taurus/qt/qtgui/input/taurusspinbox.py (refactored) -@@ -28,6 +28,7 @@ - """ - from __future__ import absolute_import - -+from builtins import str - from taurus.external.qt import Qt - - from .tauruslineedit import TaurusValueLineEdit ---- ./lib/taurus/qt/qtgui/model/qbasemodel.py (original) -+++ ./lib/taurus/qt/qtgui/model/qbasemodel.py (refactored) -@@ -236,7 +236,7 @@ - menu = Qt.QMenu("Perspective", b) - b.setMenu(menu) - af = ActionFactory() -- for persp, persp_data in view.KnownPerspectives.items(): -+ for persp, persp_data in list(view.KnownPerspectives.items()): - label = persp_data["label"] - icon = Qt.QIcon.fromTheme(persp_data["icon"]) - tip = persp_data["tooltip"] ---- ./lib/taurus/qt/qtgui/panel/qdataexportdialog.py (original) -+++ ./lib/taurus/qt/qtgui/panel/qdataexportdialog.py (refactored) -@@ -27,6 +27,9 @@ - one or more curves""" - from __future__ import print_function - -+from builtins import zip -+from builtins import str -+from builtins import range - __all__ = ["QDataExportDialog"] - - import os.path -@@ -76,7 +79,7 @@ - self.datadict = datadict - self.dataSetCB.clear() - self.dataSetCB.insertItems(0, sortedNames) -- if len(self.datadict.keys()) > 1: -+ if len(list(self.datadict.keys())) > 1: - self.dataSetCB.insertItems( - 0, [self.allInSingleFile, self.allInMultipleFiles]) - -@@ -152,7 +155,7 @@ - if not outputdir: - return False - preffix = os.path.join(str(outputdir), "set") -- for i, k in zip(range(len(self.datadict)), self.sortedNames): -+ for i, k in zip(list(range(len(self.datadict))), self.sortedNames): - ofile = "%s%03i.dat" % (preffix, i + 1) - try: - self.exportCurrentData( ---- ./lib/taurus/qt/qtgui/panel/qdoublelist.py (original) -+++ ./lib/taurus/qt/qtgui/panel/qdoublelist.py (refactored) -@@ -30,6 +30,8 @@ - """ - from __future__ import print_function - -+from builtins import str -+from builtins import range - __all__ = ["QDoubleListDlg"] - - __docformat__ = 'restructuredtext' -@@ -102,14 +104,14 @@ - - :return: (list) - ''' -- return [unicode(self.ui.list1.item(row).text()) for row in xrange(self.ui.list1.count())] -+ return [str(self.ui.list1.item(row).text()) for row in range(self.ui.list1.count())] - - def getAll2(self): - '''returns a copy the items in the second list - - :return: (list) - ''' -- return [unicode(self.ui.list2.item(row).text()) for row in xrange(self.ui.list2.count())] -+ return [str(self.ui.list2.item(row).text()) for row in range(self.ui.list2.count())] - - # note, for the moment we do not make it available in designer because it does not - # behave well as a widget (only as a dialog) (e.g., it closes if ESC is pressed ---- ./lib/taurus/qt/qtgui/panel/qrawdatachooser.py (original) -+++ ./lib/taurus/qt/qtgui/panel/qrawdatachooser.py (refactored) -@@ -27,6 +27,7 @@ - RawDataChooser.py: widget for importing RawData (from file or from a function) - """ - -+from builtins import str - __all__ = ["QRawDataWidget"] - - import numpy ---- ./lib/taurus/qt/qtgui/panel/taurusconfigeditor.py (original) -+++ ./lib/taurus/qt/qtgui/panel/taurusconfigeditor.py (refactored) -@@ -27,12 +27,15 @@ - taurusconfigeditor.py: - """ - -+from future import standard_library -+standard_library.install_aliases() -+from builtins import str - __all__ = ["QConfigEditor"] - - __docformat__ = 'restructuredtext' - - from taurus.external.qt import Qt --import cPickle as pickle -+import pickle as pickle - import os - import tempfile - from taurus.qt.qtcore.configuration import BaseConfigurableClass -@@ -77,9 +80,9 @@ - - :param iniFileName: (str) - ''' -- self.originalFile = unicode(iniFileName) -+ self.originalFile = str(iniFileName) - self._file = tempfile.NamedTemporaryFile() -- self._temporaryFile = unicode(self._file.name) -+ self._temporaryFile = str(self._file.name) - - shutil.copyfile(self.originalFile, self._temporaryFile) - ---- ./lib/taurus/qt/qtgui/panel/taurusconfigurationpanel.py (original) -+++ ./lib/taurus/qt/qtgui/panel/taurusconfigurationpanel.py (refactored) -@@ -25,6 +25,7 @@ - - """This module provides a set of basic taurus widgets based on QLineEdit""" - -+from builtins import str - __all__ = ["TaurusConfigurationPanel", "TangoConfigLineEdit", - "TaurusConfigLineEdit"] - ---- ./lib/taurus/qt/qtgui/panel/taurusdemo.py (original) -+++ ./lib/taurus/qt/qtgui/panel/taurusdemo.py (refactored) -@@ -24,6 +24,7 @@ - ############################################################################# - - from __future__ import print_function -+from builtins import str - import sys - import operator - -@@ -55,12 +56,12 @@ - continue - internal_widget_module = sys.modules[internal_widget_module_name] - if hasattr(internal_widget_module, "demo"): -- if operator.isCallable(internal_widget_module.demo): -+ if hasattr(internal_widget_module.demo, '__call__'): - demos[internal_widget_module_name] = internal_widget_module.demo - - groups = set() - -- for demo_name in demos.keys(): -+ for demo_name in list(demos.keys()): - parts = demo_name.split(".") - group = parts[-2] - groups.add(group) ---- ./lib/taurus/qt/qtgui/panel/taurusdevicepanel.py (original) -+++ ./lib/taurus/qt/qtgui/panel/taurusdevicepanel.py (refactored) -@@ -27,6 +27,8 @@ - TaurusDevicePanel.py: - """ - -+from builtins import str -+from past.builtins import basestring - __all__ = ["TaurusDevicePanel", "TaurusDevPanel"] - - __docformat__ = 'restructuredtext' -@@ -72,10 +74,10 @@ - - - def get_regexp_dict(dct, key, default=None): # TODO: Tango-centric -- for k, v in dct.items(): # Trying regular expression match -+ for k, v in list(dct.items()): # Trying regular expression match - if matchCl(k, key): - return v -- for k, v in dct.items(): # If failed, trying if key is contained -+ for k, v in list(dct.items()): # If failed, trying if key is contained - if k.lower() in key.lower(): - return v - if default is not None: -@@ -323,7 +325,7 @@ - font.setPointSize(15) - self._label.setFont(font) - if pixmap is None and self.getIconMap(): -- for k, v in self.getIconMap().items(): -+ for k, v in list(self.getIconMap().items()): - if searchCl(k, model): - pixmap = v - if pixmap is not None: -@@ -348,7 +350,7 @@ - filters = get_regexp_dict( - TaurusDevicePanel._attribute_filter, model, ['.*']) - if hasattr(filters, 'keys'): -- filters = filters.items() # Dictionary! -+ filters = list(filters.items()) # Dictionary! - if filters and isinstance(filters[0], (list, tuple)): # Mapping - self._attrs = [] - for tab, attrs in filters: -@@ -466,7 +468,7 @@ - form.setViewFilters([lambda c: str(c.cmd_name).lower() not in ( - 'state', 'status') and any(searchCl(s[0], str(c.cmd_name)) for s in params)]) - form.setDefaultParameters(dict((k, v) for k, v in ( -- params if not hasattr(params, 'items') else params.items()) if v)) -+ params if not hasattr(params, 'items') else list(params.items())) if v)) - for wid in form._cmdWidgets: - if not hasattr(wid, 'getCommand') or not hasattr(wid, 'setDangerMessage'): - continue ---- ./lib/taurus/qt/qtgui/panel/taurusform.py (original) -+++ ./lib/taurus/qt/qtgui/panel/taurusform.py (refactored) -@@ -27,6 +27,10 @@ - from __future__ import print_function - from __future__ import absolute_import - -+from builtins import zip -+from builtins import filter -+from builtins import str -+from past.builtins import basestring - __all__ = ["TaurusAttrForm", "TaurusCommandsForm", "TaurusForm"] - - __docformat__ = 'restructuredtext' -@@ -207,7 +211,7 @@ - if self.__modelChooserDlg is None: - self.__modelChooserDlg = Qt.QDialog(self) - self.__modelChooserDlg.setWindowTitle( -- "%s - Model Chooser" % unicode(self.windowTitle())) -+ "%s - Model Chooser" % str(self.windowTitle())) - self.__modelChooserDlg.modelChooser = TaurusModelChooser() - layout = Qt.QVBoxLayout() - layout.addWidget(self.__modelChooserDlg.modelChooser) -@@ -653,7 +657,7 @@ - return - - for f in self.getViewFilters(): -- commands = filter(f, commands) -+ commands = list(filter(f, commands)) - - self._clearFrame() - -@@ -739,7 +743,7 @@ - - ''' - self._defaultParameters = dict((k.lower(), v) -- for k, v in params.items()) -+ for k, v in list(params.items())) - self._updateCommandWidgets() - - def setViewFilters(self, filterlist): -@@ -838,7 +842,7 @@ - return - attrlist = sorted(dev.attribute_list_query(), key=self._sortKey) - for f in self.getViewFilters(): -- attrlist = filter(f, attrlist) -+ attrlist = list(filter(f, attrlist)) - attrnames = [] - devname = self.getModelName() - for a in attrlist: ---- ./lib/taurus/qt/qtgui/panel/taurusinputpanel.py (original) -+++ ./lib/taurus/qt/qtgui/panel/taurusinputpanel.py (refactored) -@@ -26,6 +26,9 @@ - """This module provides an Input panel (usually used inside a TaurusDialog)""" - from __future__ import print_function - -+from builtins import map -+from builtins import str -+from builtins import object - __all__ = ["TaurusInputPanel"] - - __docformat__ = 'restructuredtext' -@@ -121,7 +124,7 @@ - self.setText(input_data['prompt']) - - data_type = input_data.get('data_type', 'String') -- is_seq = not isinstance(data_type, (str, unicode)) and \ -+ is_seq = not isinstance(data_type, (str, str)) and \ - isinstance(data_type, collections.Sequence) - if is_seq: - panel, getter = self.create_selection_panel(input_data) -@@ -161,7 +164,7 @@ - self._ui.inputWidget = combobox = Qt.QComboBox() - items = input_data['data_type'] - for item in items: -- is_seq = not isinstance(item, (str, unicode)) and \ -+ is_seq = not isinstance(item, (str, str)) and \ - isinstance(item, collections.Sequence) - if is_seq: - text, userData = item -@@ -183,7 +186,7 @@ - self._ui.inputWidget = buttongroup = Qt.QButtonGroup() - buttongroup.setExclusive(True) - for item in items: -- is_seq = not isinstance(item, (str, unicode)) and \ -+ is_seq = not isinstance(item, (str, str)) and \ - isinstance(item, collections.Sequence) - if is_seq: - text, userData = item -@@ -210,7 +213,7 @@ - default_value = input_data.get('default_value') - if default_value is None: - default_value = () -- dft_is_seq = not isinstance(default_value, (str, unicode)) and \ -+ dft_is_seq = not isinstance(default_value, (str, str)) and \ - isinstance(default_value, collections.Sequence) - if not dft_is_seq: - default_value = default_value, -@@ -219,7 +222,7 @@ - listwidget.setSelectionMode(Qt.QAbstractItemView.MultiSelection) - - for item in items: -- is_seq = not isinstance(item, (str, unicode)) and \ -+ is_seq = not isinstance(item, (str, str)) and \ - isinstance(item, collections.Sequence) - if is_seq: - text, userData = item ---- ./lib/taurus/qt/qtgui/panel/taurusmessagepanel.py (original) -+++ ./lib/taurus/qt/qtgui/panel/taurusmessagepanel.py (refactored) -@@ -25,6 +25,10 @@ - - """This module provides a panel to display taurus messages""" - -+from future import standard_library -+standard_library.install_aliases() -+from builtins import str -+from builtins import object - __all__ = ["TaurusMessagePanel", "TaurusMessageErrorHandler", - "TangoMessageErrorHandler", "MacroServerMessageErrorHandler"] - -@@ -278,7 +282,7 @@ - def _initReportCombo(self): - report_handlers = get_report_handlers() - combo = self.reportComboBox() -- for name, report_handler in report_handlers.items(): -+ for name, report_handler in list(report_handlers.items()): - name = Qt.QVariant(name) - combo.addItem(report_handler.Label, name) - -@@ -504,7 +508,7 @@ - :return: a message box error handler - :rtype: TaurusMessageBoxErrorHandler class object""" - -- for exc, h_klass in klass.ErrorHandlers.items(): -+ for exc, h_klass in list(klass.ErrorHandlers.items()): - if issubclass(err_type, exc): - return h_klass - return TaurusMessageErrorHandler -@@ -589,8 +593,8 @@ - except PyTango.DevFailed as df1: - try: - import traceback -- import StringIO -- origin = StringIO.StringIO() -+ import io -+ origin = io.StringIO() - traceback.print_stack(file=origin) - origin.seek(0) - origin = origin.read() ---- ./lib/taurus/qt/qtgui/panel/taurusmodelchooser.py (original) -+++ ./lib/taurus/qt/qtgui/panel/taurusmodelchooser.py (refactored) -@@ -29,6 +29,7 @@ - from __future__ import print_function - from __future__ import absolute_import - -+from builtins import str - __all__ = ["TaurusModelSelectorTree", "TaurusModelChooser"] - - import sys ---- ./lib/taurus/qt/qtgui/panel/taurusmodellist.py (original) -+++ ./lib/taurus/qt/qtgui/panel/taurusmodellist.py (refactored) -@@ -26,6 +26,10 @@ - """ - itemsmodel Model and view for new CurveItem configuration - """ -+from builtins import str -+from builtins import range -+from past.builtins import basestring -+from builtins import object - __all__ = ['TaurusModelModel', 'TaurusModelItem', 'TaurusModelList'] - #raise UnimplementedError('Under Construction!') - -@@ -172,7 +176,7 @@ - if index.isValid() and (0 <= index.row() < self.rowCount()): - row = index.row() - item = self.items[row] -- value = Qt.from_qvariant(value, unicode) -+ value = Qt.from_qvariant(value, str) - if role == Qt.Qt.EditRole: - item.src = value - elif role == Qt.Qt.DisplayRole: -@@ -188,7 +192,7 @@ - if parentindex is None: - parentindex = Qt.QModelIndex() - if items is None: -- slice = [TaurusModelItem() for i in xrange(rows)] -+ slice = [TaurusModelItem() for i in range(rows)] - else: - slice = list(items) - # note that the rows parameter is ignored if items is passed -@@ -424,7 +428,7 @@ - - .. seealso:: :meth:`getModelItems` - ''' -- return [unicode(s.src) for s in self.getModelItems()] -+ return [str(s.src) for s in self.getModelItems()] - - @classmethod - def getQtDesignerPluginInfo(cls): ---- ./lib/taurus/qt/qtgui/panel/taurusvalue.py (original) -+++ ./lib/taurus/qt/qtgui/panel/taurusvalue.py (refactored) -@@ -27,6 +27,7 @@ - taurusvalue.py: - """ - -+from builtins import str - __all__ = ["TaurusValue", "TaurusValuesFrame", "DefaultTaurusValueCheckBox", - "DefaultUnitsWidget", "TaurusPlotButton", "TaurusArrayEditorButton", - "TaurusValuesTableButton", "TaurusValuesTableButton_W", ---- ./lib/taurus/qt/qtgui/panel/report/albareport.py (original) -+++ ./lib/taurus/qt/qtgui/panel/report/albareport.py (refactored) -@@ -26,6 +26,7 @@ - """This module provides a panel to display taurus messages""" - from __future__ import absolute_import - -+from builtins import str - __all__ = ["TicketReportHandler"] - - __docformat__ = 'restructuredtext' ---- ./lib/taurus/qt/qtgui/panel/report/basicreport.py (original) -+++ ./lib/taurus/qt/qtgui/panel/report/basicreport.py (refactored) -@@ -25,6 +25,7 @@ - - """This module provides a panel to display taurus messages""" - -+from builtins import str - __all__ = ["ClipboardReportHandler", "SMTPReportHandler"] - - __docformat__ = 'restructuredtext' ---- ./lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py (original) -+++ ./lib/taurus/qt/qtgui/panel/test/test_taurusvalue.py (refactored) -@@ -25,6 +25,7 @@ - - """Test for taurus.qt.qtgui.panel.taurusvalue""" - -+from builtins import str - import unittest - from taurus.test import insertTest - from taurus.qt.qtgui.test import BaseWidgetTestCase ---- ./lib/taurus/qt/qtgui/plot/arrayedit.py (original) -+++ ./lib/taurus/qt/qtgui/plot/arrayedit.py (refactored) -@@ -27,8 +27,13 @@ - arrayedit.py: Widget for editing a spectrum/array via control points - """ - from __future__ import absolute_import -- -- -+from __future__ import division -+ -+ -+from builtins import zip -+from builtins import str -+from builtins import range -+from past.utils import old_div - import numpy - from taurus.external.qt import Qt, Qwt5 - from taurus.qt.qtgui.util.ui import UILoadable -@@ -266,7 +271,7 @@ - new_xp = numpy.zeros(table.rowCount()) - new_corrp = numpy.zeros(table.rowCount()) - try: -- for i in xrange(table.rowCount()): -+ for i in range(table.rowCount()): - new_xp[i] = float(table.item(i, 0).text()) - new_corrp[i] = float(table.item(i, 1).text()) - self.setCorrection(new_xp, new_corrp) -@@ -407,7 +412,7 @@ - Qt.QMessageBox.warning( - self, 'Scaling Error', 'The master at this control point is zero-valued. This point cannot be used as reference for scaling') - return -- v = sender.corrSB.value() / (self.yp[index]) -+ v = old_div(sender.corrSB.value(), (self.yp[index])) - for i in range(0, index): - self._controllers[i].corrSB.setValue(v * self.yp[i]) - -@@ -420,7 +425,7 @@ - Qt.QMessageBox.warning( - self, 'Scaling Error', 'The master at this control point is zero-valued. This point cannot be used as reference for scaling') - return -- v = sender.corrSB.value() / (self.yp[index]) -+ v = old_div(sender.corrSB.value(), (self.yp[index])) - for i in range(index + 1, self.xp.size): - self._controllers[i].corrSB.setValue(v * self.yp[i]) - ---- ./lib/taurus/qt/qtgui/plot/curveStatsDlg.py (original) -+++ ./lib/taurus/qt/qtgui/plot/curveStatsDlg.py (refactored) -@@ -28,7 +28,11 @@ - A Qt dialog for choosing plot appearance (symbols and lines) - for a QwtPlot-derived widget (like Taurusplot) - """ -- -+from __future__ import division -+ -+from builtins import zip -+from builtins import range -+from past.utils import old_div - from taurus.external.qt import Qt, Qwt5 - from datetime import datetime - from taurus.qt.qtgui.util.ui import UILoadable -@@ -68,7 +72,7 @@ - - cbs = (self.ui.npointsStatCB, self.ui.minStatCB, self.ui.maxStatCB, - self.ui.meanStatCB, self.ui.stdStatCB, self.ui.rmsStatCB) -- self._checkboxToColMap = dict(zip(cbs, xrange(len(self.statColumns)))) -+ self._checkboxToColMap = dict(list(zip(cbs, range(len(self.statColumns))))) - - self.minPicker = Qwt5.QwtPlotPicker(Qwt5.QwtPlot.xBottom, - Qwt5.QwtPlot.yLeft, -@@ -133,10 +137,10 @@ - - def _timestamptToQDateTime(self, ts): - dt = datetime.fromtimestamp(ts) -- return Qt.QDateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond / 1000) -+ return Qt.QDateTime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, old_div(dt.microsecond, 1000)) - - def _QDateTimeToTimestamp(self, qdt): -- return qdt.toTime_t() + qdt.time().msec() / 1000. -+ return qdt.toTime_t() + old_div(qdt.time().msec(), 1000.) - - def onSelectMin(self): - '''slot called when the user clicks on the selectMin button''' -@@ -233,7 +237,7 @@ - '''returns a list of row numbers corresponding to the selected rows of the table''' - selected = [] - for rg in self.ui.statsTW.selectedRanges(): -- for row in xrange(rg.topRow(), rg.topRow() + rg.rowCount()): -+ for row in range(rg.topRow(), rg.topRow() + rg.rowCount()): - selected.append(row) - return selected - -@@ -249,21 +253,21 @@ - xmin, xmax = None, None - if self.ui.minCB.isChecked(): - if plot.getXIsTime(): -- xmin = self.ui.minDTE.dateTime().toTime_t() + self.ui.minDTE.time().msec() / \ -- 1000. -+ xmin = self.ui.minDTE.dateTime().toTime_t() + old_div(self.ui.minDTE.time().msec(), \ -+ 1000.) - else: - xmin = self.ui.minSB.value() - if self.ui.maxCB.isChecked(): - if plot.getXIsTime(): -- xmax = self.ui.maxDTE.dateTime().toTime_t() + self.ui.maxDTE.time().msec() / \ -- 1000. -+ xmax = self.ui.maxDTE.dateTime().toTime_t() + old_div(self.ui.maxDTE.time().msec(), \ -+ 1000.) - else: - xmax = self.ui.maxSB.value() - limits = xmin, xmax - - selectedRows = self.getSelectedRows() - if len(selectedRows) == 0: -- selectedRows = range(len(self.curveNames)) -+ selectedRows = list(range(len(self.curveNames))) - selectedCurves = [self.curveNames[i] for i in selectedRows] - statsdict = plot.getCurveStats( - limits=limits, curveNames=selectedCurves) ---- ./lib/taurus/qt/qtgui/plot/curveprops.py (original) -+++ ./lib/taurus/qt/qtgui/plot/curveprops.py (refactored) -@@ -27,6 +27,9 @@ - curveprops: Model and view for curve properties - """ - from __future__ import absolute_import -+from builtins import str -+from builtins import range -+from builtins import object - __all__ = ['CurveConf', 'CurvesTableModel', - 'ExtendedSelectionModel', 'CurvePropertiesView'] - #raise NotImplementedError('Under Construction!') -@@ -50,7 +53,7 @@ - # set some named constants - # columns: - NUMCOLS = 4 --X, Y, TITLE, VIS = range(NUMCOLS) -+X, Y, TITLE, VIS = list(range(NUMCOLS)) - SRC_ROLE = Qt.Qt.UserRole + 1 - PROPS_ROLE = Qt.Qt.UserRole + 2 - -@@ -74,7 +77,7 @@ - - def processSrc(self, src): - '''returns src,display,icon,ok''' -- src = unicode(src) -+ src = str(src) - # empty - if src == '': - return '', '', Qt.QIcon(), True -@@ -243,7 +246,7 @@ - row, 0), self.index(row, self.ncolumns - 1)) - else: - column = index.column() -- value = Qt.from_qvariant(value, unicode) -+ value = Qt.from_qvariant(value, str) - if column == X: - curve.x.setSrc(value) - elif column == Y: -@@ -357,8 +360,8 @@ - self.loadUi() - - self.ui.sStyleCB.insertItems(0, sorted(NamedSymbolStyles.values())) -- self.ui.lStyleCB.insertItems(0, NamedLineStyles.values()) -- self.ui.cStyleCB.insertItems(0, NamedCurveStyles.values()) -+ self.ui.lStyleCB.insertItems(0, list(NamedLineStyles.values())) -+ self.ui.cStyleCB.insertItems(0, list(NamedCurveStyles.values())) - self.ui.sColorCB.addItem("") - self.ui.lColorCB.addItem("") - for color in NamedColors: ---- ./lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py (original) -+++ ./lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py (refactored) -@@ -30,6 +30,8 @@ - """ - from __future__ import print_function - -+from builtins import str -+from builtins import object - import copy - - from taurus.external.qt import Qt, Qwt5 -@@ -46,7 +48,7 @@ - Qt.Qt.DashDotDotLine: ".._..", - } - ReverseNamedLineStyles = {} --for k, v in NamedLineStyles.iteritems(): -+for k, v in NamedLineStyles.items(): - ReverseNamedLineStyles[v] = k - - NamedCurveStyles = {None: "", -@@ -57,7 +59,7 @@ - Qwt5.QwtPlotCurve.Dots: "Dots" - } - ReverseNamedCurveStyles = {} --for k, v in NamedCurveStyles.iteritems(): -+for k, v in NamedCurveStyles.items(): - ReverseNamedCurveStyles[v] = k - - NamedSymbolStyles = { -@@ -81,7 +83,7 @@ - } - - ReverseNamedSymbolStyles = {} --for k, v in NamedSymbolStyles.iteritems(): -+for k, v in NamedSymbolStyles.items(): - ReverseNamedSymbolStyles[v] = k - - NamedColors = ["Black", "Red", "Blue", "Magenta", -@@ -113,8 +115,8 @@ - self.loadUi() - self.autoApply = autoApply - self.sStyleCB.insertItems(0, sorted(NamedSymbolStyles.values())) -- self.lStyleCB.insertItems(0, NamedLineStyles.values()) -- self.cStyleCB.insertItems(0, NamedCurveStyles.values()) -+ self.lStyleCB.insertItems(0, list(NamedLineStyles.values())) -+ self.cStyleCB.insertItems(0, list(NamedCurveStyles.values())) - self.sColorCB.addItem("") - self.lColorCB.addItem("") - if not showButtons: -@@ -164,7 +166,7 @@ - self._curvePropDictOrig = copy.deepcopy(curvePropDict) - self.curvesLW.clear() - self.__itemsDict = CaselessDict() -- for name, prop in self.curvePropDict.iteritems(): -+ for name, prop in self.curvePropDict.items(): - # create and insert the item - item = Qt.QListWidgetItem(Qt.QString(prop.title), self.curvesLW) - self.__itemsDict[name] = item -@@ -192,7 +194,7 @@ - ''' - if newTitlesDict is None: - return -- for name, title in newTitlesDict.iteritems(): -+ for name, title in newTitlesDict.items(): - self.curvePropDict[name].title = title - self.__itemsDict[name].setText(title) - ---- ./lib/taurus/qt/qtgui/plot/qwtdialog.py (original) -+++ ./lib/taurus/qt/qtgui/plot/qwtdialog.py (refactored) -@@ -28,7 +28,11 @@ - """ - from __future__ import print_function - from __future__ import absolute_import -- -+from __future__ import division -+ -+from builtins import str -+from builtins import range -+from past.utils import old_div - __all__ = ["TaurusPlotConfigDialog"] - - import time -@@ -251,11 +255,11 @@ - elif dt < 120: - return "%g s" % round(dt, 0) - elif dt < 7200: -- return "%g m" % round(dt / 60, 0) -+ return "%g m" % round(old_div(dt, 60), 0) - elif dt < 172800: -- return "%g h" % round(dt / 3600, 0) -- else: -- return "%g d" % round(dt / 86400, 0) -+ return "%g h" % round(old_div(dt, 3600), 0) -+ else: -+ return "%g d" % round(old_div(dt, 86400), 0) - - def str2deltatime(self, strtime): - '''Translates a time string to seconds -@@ -267,7 +271,7 @@ - 24, 'w': 3600 * 24 * 7, 'y': 3600 * 24 * 365} - if strtime.lower() == "now": - return time.time() -- if strtime[-1] in timeunits.keys(): -+ if strtime[-1] in list(timeunits.keys()): - try: - return float(strtime[:-1]) * timeunits[strtime[-1]] - except Exception as e: ---- ./lib/taurus/qt/qtgui/plot/scales.py (original) -+++ ./lib/taurus/qt/qtgui/plot/scales.py (refactored) -@@ -27,6 +27,10 @@ - scales.py: Custom scales used by taurus.qt.qtgui.plot module - """ - from __future__ import print_function -+from __future__ import division -+from builtins import str -+from builtins import range -+from past.utils import old_div - __all__ = ["DateTimeScaleEngine", "DeltaTimeScaleEngine", "FixedLabelsScaleEngine", - "FancyScaleDraw", "TaurusTimeScaleDraw", "DeltaTimeScaleDraw", - "FixedLabelsScaleDraw"] -@@ -218,7 +222,7 @@ - - elif dx > 2: # 2s - format = "%H:%M:%S" -- majticks = range(int(x1) + 1, int(x2)) -+ majticks = list(range(int(x1) + 1, int(x2))) - - else: # less than 2s (show microseconds) - scaleDiv = Qwt5.QwtLinearScaleEngine.divideScale( -@@ -229,7 +233,7 @@ - # make sure to comply with maxMajTicks - L = len(majticks) - if L > maxMajSteps: -- majticks = majticks[::int(numpy.ceil(float(L) / maxMajSteps))] -+ majticks = majticks[::int(numpy.ceil(old_div(float(L), maxMajSteps)))] - - scaleDiv = Qwt5.QwtScaleDiv(interval, minticks, medticks, majticks) - self.scaleDraw().setDatetimeLabelFormat(format) -@@ -362,7 +366,7 @@ - s = 86400 # 1 day - # calculate a step size that respects the base step (s) and also - # enforces the maxMajSteps -- stepSize = s * int(numpy.ceil(float(d_range // s) / maxMajSteps)) -+ stepSize = s * int(numpy.ceil(old_div(float(d_range // s), maxMajSteps))) - return Qwt5.QwtLinearScaleEngine.divideScale(self, x1, x2, maxMajSteps, maxMinSteps, stepSize) - - @staticmethod ---- ./lib/taurus/qt/qtgui/plot/taurusarrayedit.py (original) -+++ ./lib/taurus/qt/qtgui/plot/taurusarrayedit.py (refactored) -@@ -25,6 +25,7 @@ - - - from __future__ import absolute_import -+from builtins import str - from taurus.external.qt import Qt - import taurus - import numpy ---- ./lib/taurus/qt/qtgui/plot/taurusplot.py (original) -+++ ./lib/taurus/qt/qtgui/plot/taurusplot.py (refactored) -@@ -28,6 +28,16 @@ - """ - from __future__ import print_function - from __future__ import absolute_import -+from __future__ import division -+from future import standard_library -+standard_library.install_aliases() -+from builtins import zip -+from builtins import next -+from builtins import str -+from builtins import range -+from past.builtins import basestring -+from past.utils import old_div -+from builtins import object - __all__ = ["TaurusCurve", "TaurusCurveMarker", - "TaurusXValues", "TaurusPlot", "isodatestr2float"] - -@@ -144,9 +154,9 @@ - ''' - xmap = self.plot().canvasMap(self.xAxis()) - ymap = self.plot().canvasMap(self.yAxis()) -- xmiddlepoint = xmap.p1() + xmap.pDist() / 2 # p1,p2 are left,right here -+ xmiddlepoint = xmap.p1() + old_div(xmap.pDist(), 2) # p1,p2 are left,right here - # p1,p2 are bottom,top here (and pixel coords start from top!) -- ymiddlepoint = ymap.p2() + ymap.pDist() / 2 -+ ymiddlepoint = ymap.p2() + old_div(ymap.pDist(), 2) - xPaintPos = xmap.transform(self.xValue()) - yPaintPos = ymap.transform(self.yValue()) - -@@ -912,8 +922,8 @@ - if imax is None: - imax = data.size() - -- x = numpy.array([data.x(i) for i in xrange(imin, imax)]) -- y = numpy.array([data.y(i) for i in xrange(imin, imax)]) -+ x = numpy.array([data.x(i) for i in range(imin, imax)]) -+ y = numpy.array([data.y(i) for i in range(imin, imax)]) - - if limits is not None: - xmin, xmax = limits -@@ -1278,7 +1288,7 @@ - - def setFormat(self, format): - """Reimplemented from TaurusBaseComponent""" -- targetCurveNames = self.curves.iterkeys() -+ targetCurveNames = iter(self.curves.keys()) - for name in targetCurveNames: - curve = self.curves.get(name, None) - w = getattr(curve, 'owner', curve) -@@ -1345,7 +1355,7 @@ - if curve is None: - title = None - else: -- title = unicode(curve.title().text()) -+ title = str(curve.title().text()) - finally: - self.curves_lock.release() - return title -@@ -1360,7 +1370,7 @@ - ''' - self.curves_lock.acquire() - try: -- ret = copy.deepcopy(self.curves.keys()) -+ ret = copy.deepcopy(list(self.curves.keys())) - finally: - self.curves_lock.release() - return ret -@@ -1395,7 +1405,7 @@ - try: - if ordered is None: - orderedObjs = sorted( -- self.curves.values(), key=lambda curve: curve.titleText(compiled=True)) -+ list(self.curves.values()), key=lambda curve: curve.titleText(compiled=True)) - else: - #current = self.curves.keys() - # if len(ordered) != len(current) or set(map(str.lower,current)) - set(map(str.lower, ordered)): -@@ -1430,7 +1440,7 @@ - for z in (self._zoomer1, self._zoomer2): - z.setEnabled(z.yAxis() == axis) - self._zoomer = self.getZoomers(axis)[0] -- self.debug('Now Zooming on %s' % unicode(self.getAxisName(axis))) -+ self.debug('Now Zooming on %s' % str(self.getAxisName(axis))) - return self._zoomer.yAxis() - - def getAxisName(self, axis): -@@ -1441,7 +1451,7 @@ - - :return: (unicode) - ''' -- name = unicode(self.axisTitle(axis).text()) -+ name = str(self.axisTitle(axis).text()) - if name == '': - name = self._axesnames[axis] - return name -@@ -1451,7 +1461,7 @@ - - :param paused: (bool) if True, the plot will be paused - ''' -- for c in self.curves.itervalues(): -+ for c in self.curves.values(): - c.setPaused(paused) - self._isPaused = paused - -@@ -1524,7 +1534,7 @@ - If None given, it will be autocalculated - - ''' -- positions, labels = zip(*pos_and_labels) # "unzipping" -+ positions, labels = list(zip(*pos_and_labels)) # "unzipping" - positions = list(positions) - - self.setAxisScaleEngine(axis, FixedLabelsScaleEngine(positions)) -@@ -1662,7 +1672,7 @@ - self.curves_lock.acquire() - try: - self._showMaxPeaks = show -- for curveName in self.curves.iterkeys(): -+ for curveName in self.curves.keys(): - curve = self.curves.get(str(curveName)) - if show: - curve.showMaxPeak(True) -@@ -1683,7 +1693,7 @@ - self.curves_lock.acquire() - try: - self._showMinPeaks = show -- for curveName in self.curves.iterkeys(): -+ for curveName in self.curves.keys(): - curve = self.curves.get(str(curveName)) - if show: - curve.showMinPeak(True) -@@ -1749,7 +1759,7 @@ - try: - # get the key in the self.curves directory - curveName = None -- for curveName, c in self.curves.iteritems(): -+ for curveName, c in self.curves.items(): - if c is curve: - break - axis = curve.yAxis() -@@ -1930,7 +1940,7 @@ - """ - self.curves_lock.acquire() - try: -- names = [name for name in self.curves.keys() if self.curves[ -+ names = [name for name in list(self.curves.keys()) if self.curves[ - name].isRawData] - finally: - self.curves_lock.release() -@@ -1951,8 +1961,8 @@ - try: - if curvename in self.curves: - data = self.curves[curvename].data() -- x = [data.x(i) for i in xrange(data.size())] -- y = [data.y(i) for i in xrange(data.size())] -+ x = [data.x(i) for i in range(data.size())] -+ y = [data.y(i) for i in range(data.size())] - else: - self.error("Curve '%s' not found" % curvename) - raise KeyError() -@@ -1988,7 +1998,7 @@ - xnames.append(xname) - ynames.append(yname) - -- del_curves = [name for name in self.curves.keys() -+ del_curves = [name for name in list(self.curves.keys()) - if name not in ynames] - - # if all curves were removed, reset the color palette -@@ -2101,7 +2111,7 @@ - '''See :meth:`TaurusBaseComponent.parentModelChanged`''' - self.curves_lock.acquire() - try: -- for curve in self.curves.values(): -+ for curve in list(self.curves.values()): - curve.setModelCheck(curve.getModel(), False) - finally: - self.curves_lock.release() -@@ -2260,7 +2270,7 @@ - self.curves_lock.acquire() - try: - propdict = {} -- for name, curve in self.curves.iteritems(): -+ for name, curve in self.curves.items(): - propdict[name] = copy.deepcopy(curve.getAppearanceProperties()) - finally: - self.curves_lock.release() -@@ -2278,7 +2288,7 @@ - """ - self.curves_lock.acquire() - try: -- for name, prop in propDict.iteritems(): -+ for name, prop in propDict.items(): - c = self.curves[name] - c.setAppearanceProperties(copy.deepcopy(prop)) - visible = getattr(prop, 'visible', True) -@@ -2327,7 +2337,7 @@ - miscdict = {'defaultCurvesTitle': self.getDefaultCurvesTitle(), - 'canvasBackground': self.canvasBackground(), - 'orderedCurveNames': self.getCurveNamesSorted(), -- 'plotTitle': unicode(self.title().text()), -+ 'plotTitle': str(self.title().text()), - 'formatter': self.getFormat()} - if self.isWindow(): - miscdict["Geometry"] = self.saveGeometry() -@@ -2397,7 +2407,7 @@ - self.curves_lock.acquire() - try: - if curvenames is None: -- curvenames = self.curves.keys() -+ curvenames = list(self.curves.keys()) - curvenames = self._lowerIfInsensitive(curvenames) - for name in curvenames: - curve = self.curves.get(name) -@@ -2429,11 +2439,11 @@ - if not self.checkConfigVersion(configdict): - return - # attach the curves -- for rd in configdict["RawData"].values(): -+ for rd in list(configdict["RawData"].values()): - self.attachRawData(rd) - # for backwards compatibility, if the ordered list of models is not - # stored, it uses the unsorted dict values -- models = configdict.get("model", configdict["TangoCurves"].values()) -+ models = configdict.get("model", list(configdict["TangoCurves"].values())) - self.addModels(models) - # set curve properties - self.setCurveAppearanceProperties(configdict["CurveProp"]) -@@ -2486,7 +2496,7 @@ - - :return: (str) file name used - """ -- import cPickle as pickle -+ import pickle as pickle - if ofile is None: - ofile = str(Qt.QFileDialog.getSaveFileName(self, 'Save Taurusplot Configuration', - 'TaurusplotConfig.pck', 'TaurusPlot Curve Properties File (*.pck)')) -@@ -2506,7 +2516,7 @@ - - :return: (str) file name used - """ -- import cPickle as pickle -+ import pickle as pickle - if ifile is None: - ifile = str(Qt.QFileDialog.getOpenFileName( - self, 'Load Taurusplot Configuration', '', 'TaurusPlot Curve Properties File (*.pck)')) -@@ -2523,7 +2533,7 @@ - See :meth:`TaurusBaseComponent.setEventFilters` - ''' - if curvenames is None: -- curvenames = self.curves.keys() -+ curvenames = list(self.curves.keys()) - self.curves_lock.acquire() - try: - for name in curvenames: -@@ -2551,7 +2561,7 @@ - originalXRange = self.getXAxisRange() - self.curves_lock.acquire() - try: -- for c in self.curves.values(): -+ for c in list(self.curves.values()): - if c.minXValue() < minX: - minX = c.minXValue() - if c.maxXValue() > maxX: -@@ -2670,7 +2680,7 @@ - '''call safeSetData again on all curves to force a refiltering in case the scale changed its type''' - self.curves_lock.acquire() - try: -- for c in self.curves.itervalues(): -+ for c in self.curves.values(): - c.safeSetData() - finally: - self.curves_lock.release() -@@ -2801,7 +2811,7 @@ - else: - rawdata["x"] = M[:, xcol] - -- for col in xrange(M.shape[1]): -+ for col in range(M.shape[1]): - if col == xcol: - continue # ignore the xcol (it has already been set) - rawdata["y"] = M[:, col] -@@ -2926,7 +2936,7 @@ - try: - # get a list of *unique* axes with visible curves attached - axes = list( -- set([curve.yAxis() for curve in self.curves.itervalues() if curve.isVisible()])) -+ set([curve.yAxis() for curve in self.curves.values() if curve.isVisible()])) - - n = len(axes) - if n == 0: -@@ -2985,7 +2995,7 @@ - self.curves_lock.acquire() - try: - if targetCurveNames is None: -- targetCurveNames = self.curves.iterkeys() -+ targetCurveNames = iter(self.curves.keys()) - for name in targetCurveNames: - curve = self.curves.get(name, None) - if curve is None: -@@ -2993,7 +3003,7 @@ - if not curve.isVisible(): - continue - data = curve.data() -- for i in xrange(data.size()): -+ for i in range(data.size()): - point = Qt.QPoint(self.transform(curve.xAxis(), data.x( - i)), self.transform(curve.yAxis(), data.y(i))) - if scopeRect.contains(point): -@@ -3186,7 +3196,7 @@ - for name in curveNames: - curve = self.curves.get(name, None) - stats[name] = curve.getStats(limits=limits) -- stats[name]['title'] = unicode(curve.title().text()) -+ stats[name]['title'] = str(curve.title().text()) - finally: - self.curves_lock.release() - return stats -@@ -3359,7 +3369,7 @@ - - self.curves_lock.acquire() - try: -- for curve in self.curves.values(): -+ for curve in list(self.curves.values()): - curve.setUseParentModel(yesno) - finally: - self.curves_lock.release() -@@ -3459,7 +3469,7 @@ - try: - if curveNamesList is None: - curveNamesList = [ -- n for n, c in self.curves.iteritems() if not c.isRawData] -+ n for n, c in self.curves.items() if not c.isRawData] - newTitlesDict = CaselessDict() - for curveName in curveNamesList: - curve = self.curves.get(curveName) -@@ -3626,7 +3636,7 @@ - self._optimizationEnabled = enable - # make sure that already-created curves are also optimized - try: -- for curveName in self.curves.iterkeys(): -+ for curveName in self.curves.keys(): - curve = self.curves.get(str(curveName)) - curve.setPaintAttribute(curve.PaintFiltered, enable) - curve.setPaintAttribute(curve.ClipPolygons, enable) -@@ -3728,7 +3738,7 @@ - w.setModel(models) - - if options.export_file is not None: -- curves = dict.fromkeys(w.trendSets.keys(), 0) -+ curves = dict.fromkeys(list(w.trendSets.keys()), 0) - - def exportIfAllCurves(curve, trend=w, counters=curves): - curve = str(curve) -@@ -3743,7 +3753,7 @@ - if not curves: - w.close() - else: -- for ts in w.trendSets.values(): -+ for ts in list(w.trendSets.values()): - ts.dataChanged.connect(exportIfAllCurves) - sys.exit(app.exec_()) # exit without showing the widget - ---- ./lib/taurus/qt/qtgui/plot/taurustrend.py (original) -+++ ./lib/taurus/qt/qtgui/plot/taurustrend.py (refactored) -@@ -27,6 +27,11 @@ - taurustrend.py: Generic trend widget for Taurus - """ - from __future__ import print_function -+from __future__ import division -+from builtins import zip -+from builtins import str -+from builtins import range -+from past.utils import old_div - __all__ = ["ScanTrendsSet", "TaurusTrend", "TaurusTrendsSet"] - - from datetime import datetime -@@ -113,7 +118,7 @@ - self._orderedCurveNames = [] - else: - self._curves = curves -- self._orderedCurveNames = curves.keys() -+ self._orderedCurveNames = list(curves.keys()) - self._titleText = None - self.setModel(name) - -@@ -184,7 +189,7 @@ - ntrends = len(self._curves) - if '' in basetitle: - ret = [basetitle.replace('', "%i" % i) -- for i in xrange(ntrends)] -+ for i in range(ntrends)] - else: - ret = [basetitle] * ntrends - return ret -@@ -472,7 +477,7 @@ - # them to the TrendSet - name = self.getModelName() - rawdata = {'x': numpy.zeros(0), 'y': numpy.zeros(0)} -- for i in xrange(ntrends): -+ for i in range(ntrends): - subname = "%s[%i]" % (name, i) - self.parent().attachRawData(rawdata, id=subname) - self.addCurve(subname, self.parent().curves[subname]) -@@ -830,7 +835,7 @@ - # if autoclear is False we have to work directly with each curve (and - # cannot buffer) - else: -- for n, v in recordData.items(): -+ for n, v in list(recordData.items()): - c = self._curves.get(n, None) - if c is None: - continue -@@ -1124,7 +1129,7 @@ - not remove the models, it simply removes all stored data)''' - self.curves_lock.acquire() - try: -- for ts in self.trendSets.itervalues(): -+ for ts in self.trendSets.values(): - ts.clearTrends(replot=False) - finally: - self.curves_lock.release() -@@ -1158,7 +1163,7 @@ - try: - # For it to work properly, 'names' must be a CaselessList, just as - # self.trendSets is a CaselessDict -- del_sets = [name for name in self.trendSets.keys() -+ del_sets = [name for name in list(self.trendSets.keys()) - if name not in names] - - # if all trends were removed, reset the color palette -@@ -1276,7 +1281,7 @@ - index = 0 - else: - return tset.compiledTitle -- title = unicode(tset[index].title().text()) -+ title = str(tset[index].title().text()) - finally: - self.curves_lock.release() - return title -@@ -1325,7 +1330,7 @@ - newTitlesDict = CaselessDict() - for curveName in curveNamesList: - curvetitle = titletext -- for ts in self.trendSets.itervalues(): -+ for ts in self.trendSets.values(): - if curveName in ts: - curvetitle = ts.compileBaseTitle(curvetitle) - curvetitle = curvetitle.replace( -@@ -1426,7 +1431,7 @@ - # calling setInterval only when really needed. - self._replotTimer.setInterval(plot_refresh) - self.debug('New replot period is %1.2f seconds', -- (plot_refresh / 1000.)) -+ (old_div(plot_refresh, 1000.))) - - else: - self.warning( -@@ -1437,7 +1442,7 @@ - - .. seealso:: :meth:`TaurusBaseComponent.setPaused` - ''' -- for ts in self.trendSets.itervalues(): -+ for ts in self.trendSets.values(): - ts.setPaused(paused) - self._isPaused = paused - -@@ -1475,7 +1480,7 @@ - miscdict["MaxBufferSize"] = self.getMaxDataBufferSize() - self.curves_lock.acquire() - try: -- for tsname, ts in self.trendSets.iteritems(): -+ for tsname, ts in self.trendSets.items(): - if tsname in tsnames: - # store a dict containing just model names (key and value - # are the same) -@@ -1506,11 +1511,11 @@ - if maxBufferSize is not None: - self.setMaxDataBufferSize(maxBufferSize) - # attach the curves -- for rd in configdict["RawData"].values(): -+ for rd in list(configdict["RawData"].values()): - self.attachRawData(rd) - # for backwards compatibility, if the ordered list of models is not - # stored, it uses the unsorted dict values -- models = configdict.get("model", configdict["TrendSets"].values()) -+ models = configdict.get("model", list(configdict["TrendSets"].values())) - self.addModels(models) - for m in models: - tset = self.trendSets[m] -@@ -1686,7 +1691,7 @@ - - self.curves_lock.acquire() - try: -- for n, ts in self.trendSets.iteritems(): -+ for n, ts in self.trendSets.items(): - try: - ts.setMaxDataBufferSize(maxSize) - except ValueError: -@@ -1923,7 +1928,7 @@ - w.setModel(models) - # export option - if options.export_file is not None: -- curves = dict.fromkeys(w.trendSets.keys(), 0) -+ curves = dict.fromkeys(list(w.trendSets.keys()), 0) - - def exportIfAllCurves(curve, trend=w, counters=curves): - curve = str(curve) -@@ -1938,7 +1943,7 @@ - if not curves: - w.close() - else: -- for ts in w.trendSets.values(): -+ for ts in list(w.trendSets.values()): - ts.dataChanged.connect(exportIfAllCurves) - sys.exit(app.exec_()) # exit without showing the widget - ---- ./lib/taurus/qt/qtgui/table/qdictionary.py (original) -+++ ./lib/taurus/qt/qtgui/table/qdictionary.py (refactored) -@@ -26,6 +26,9 @@ - """This module provides basic python dictionary/list editor widgets""" - from __future__ import print_function - -+from builtins import str -+from builtins import range -+from past.builtins import basestring - __all__ = ["QDictionaryEditor", "QListEditor"] - - __docformat__ = 'restructuredtext' -@@ -87,8 +90,8 @@ - - def expand(d, level): # ,nrows=nrows,ncols=ncols): - # self.debug('\texpand(%s(%s),%s)'%(type(d),d,level)) -- items = d.items() if isinstance(d, SortedDict) else sorted( -- d.items() if hasattr(d, 'items') else d) -+ items = list(d.items()) if isinstance(d, SortedDict) else sorted( -+ list(d.items()) if hasattr(d, 'items') else d) - for k, v in items: - zero = data['nrows'] - data[(data['nrows'], level)] = k -@@ -106,7 +109,7 @@ - [table.append([]) for r in range(data.pop('nrows'))] - [table[r].append(None) for c in range(data.pop('ncols')) - for r in range(len(table))] -- for coord, value in data.items(): -+ for coord, value in list(data.items()): - table[coord[0]][coord[1]] = value - return table - ---- ./lib/taurus/qt/qtgui/table/qlogtable.py (original) -+++ ./lib/taurus/qt/qtgui/table/qlogtable.py (refactored) -@@ -27,6 +27,10 @@ - python :mod:`logging` module""" - from __future__ import absolute_import - -+from past.builtins import cmp -+from builtins import map -+from builtins import str -+from builtins import range - __all__ = ["QLoggingTableModel", "QLoggingTable", "QLoggingWidget", - "QRemoteLoggingTableModel"] - -@@ -50,7 +54,7 @@ - - from .qtable import QBaseTableWidget - --LEVEL, TIME, MSG, NAME, ORIGIN = range(5) -+LEVEL, TIME, MSG, NAME, ORIGIN = list(range(5)) - HORIZ_HEADER = 'Level', 'Time', 'Message', 'By', 'Origin' - - __LEVEL_BRUSH = { -@@ -77,7 +81,7 @@ - elevel = taurus.Error - elif level <= taurus.Critical: - elevel = taurus.Critical -- f, g = map(Qt.QBrush, __LEVEL_BRUSH[elevel]) -+ f, g = list(map(Qt.QBrush, __LEVEL_BRUSH[elevel])) - return f, g - - -@@ -120,7 +124,7 @@ - host, procName, procID, threadName, threadID = _get_record_origin(rec) - pathname, filename, modulename, funcname, lineno = _get_record_trace(rec) - timestamp = str(datetime.datetime.fromtimestamp(rec.created)) -- bgcolor, fgcolor = map(Qt.QBrush.color, getBrushForLevel(rec.levelno)) -+ bgcolor, fgcolor = list(map(Qt.QBrush.color, getBrushForLevel(rec.levelno))) - bgcolor = "#%02x%02x%02x" % ( - bgcolor.red(), bgcolor.green(), bgcolor.blue()) - fgcolor = "#%02x%02x%02x" % ( -@@ -346,7 +350,7 @@ - """Overwrite of slot rows inserted to do proper resize and scroll to - bottom if desired""" - Qt.QTableView.rowsInserted(self, index, start, end) -- for i in xrange(start, end + 1): -+ for i in range(start, end + 1): - self.resizeRowToContents(i) - if start == 0: - self.resizeColumnsToContents() -@@ -563,7 +567,7 @@ - import time - import random - -- for i in xrange(10): -+ for i in range(10): - taurus.info("Hello world %04d" % i) - - loggers = ["Object%02d" % (i + 1) for i in range(10)] ---- ./lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py (original) -+++ ./lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py (refactored) -@@ -30,6 +30,8 @@ - - # todo: tango-centric - -+from builtins import str -+from builtins import range - __all__ = ["TaurusPropTable"] - - from taurus.external.qt import Qt, QtCore, QtGui -@@ -230,7 +232,7 @@ - text, ok = QtGui.QInputDialog.getText( - self, 'New Property', 'Property name:') - if ok: -- text1 = unicode(text) -+ text1 = str(text) - new_prop_name = str(text1) - new_prop_value = '0' - dict1 = {new_prop_name: [new_prop_value]} -@@ -269,7 +271,7 @@ - new_text, ok = QtGui.QInputDialog.getText( - self, 'Rename', 'Write new name of property:') - if ok: -- new_text = unicode(new_text) -+ new_text = str(new_text) - new_text = str(new_text) - list = [prop_name] - dict = {new_text: [prop_value]} -@@ -289,7 +291,7 @@ - self.setNewPropertyValue(new_text) - - def setNewPropertyValue(self, new_text): -- new_text = unicode(new_text) -+ new_text = str(new_text) - new_text = str(new_text) - values = {self.prop_name2: new_text.replace('\r', '').split('\n')} - self.db.put_device_property(self.dev_name, values) ---- ./lib/taurus/qt/qtgui/table/taurusgrid.py (original) -+++ ./lib/taurus/qt/qtgui/table/taurusgrid.py (refactored) -@@ -34,6 +34,12 @@ - # This module needs a total cleanup. Both re. code conventions and algorithms. - # --cpascual 20140827 - -+from future import standard_library -+standard_library.install_aliases() -+from builtins import zip -+from builtins import next -+from builtins import str -+from builtins import range - __all__ = ["TaurusGrid"] - - __docformat__ = 'restructuredtext' -@@ -41,7 +47,7 @@ - import re - import operator - import traceback --import Queue -+import queue - from functools import partial - - from taurus.external.qt import Qt, QtGui, QtCore -@@ -275,7 +281,7 @@ - self.hideLabels = False - - self.defineStyle() -- self.modelsQueue = Queue.Queue() -+ self.modelsQueue = queue.Queue() - self.__modelsThread = None - if not designMode: - self.modelsThread -@@ -660,12 +666,12 @@ - self.row_labels = sorted( - list(set(m.split('/')[0].upper() for m in models if - m.count('/') >= 2))) -- self.row_labels = zip(self.row_labels, self.row_labels) -+ self.row_labels = list(zip(self.row_labels, self.row_labels)) - if not self.column_labels: # Families used by default - self.column_labels = sorted( - list(set(m.split('/')[1].upper() for m in models if - m.count('/') >= 2))) -- self.column_labels = zip(self.column_labels, self.column_labels) -+ self.column_labels = list(zip(self.column_labels, self.column_labels)) - - # for m in models: - # if m.count('/')<2: ---- ./lib/taurus/qt/qtgui/table/taurusvaluestable.py (original) -+++ ./lib/taurus/qt/qtgui/table/taurusvaluestable.py (refactored) -@@ -23,6 +23,7 @@ - ## - ############################################################################# - -+from builtins import str - __all__ = ["TaurusValuesTable"] - - __docformat__ = 'restructuredtext' -@@ -58,7 +59,7 @@ - - class TaurusValuesIOTableModel(Qt.QAbstractTableModel): - typeCastingMap = {'f': float, 'b': bool, -- 'u': int, 'i': int, 'S': str, 'U': unicode} -+ 'u': int, 'i': int, 'S': str, 'U': str} - # Need to have an array - - dataChanged = Qt.pyqtSignal('QModelIndex', 'QModelIndex') -@@ -265,11 +266,11 @@ - kind = table.dtype.kind - if kind in 'SU': - table = table.tolist() # we want to allow the strings to be larger than the original ones -- for (r, c), v in self._modifiedDict.items(): -+ for (r, c), v in list(self._modifiedDict.items()): - table[r][c] = Qt.from_qvariant(v, str) - table = numpy.array(table, dtype=str) - else: -- for k, v in self._modifiedDict.items(): -+ for k, v in list(self._modifiedDict.items()): - if kind in ['f', 'i', 'u']: - units = self._parent.getCurrentUnits() - q = _value2Quantity(v, units) ---- ./lib/taurus/qt/qtgui/taurusgui/PermanentCustomPanelsDlg.py (original) -+++ ./lib/taurus/qt/qtgui/taurusgui/PermanentCustomPanelsDlg.py (refactored) -@@ -28,6 +28,7 @@ - PermanentCustomPanelDlg.py: - """ - -+from builtins import object - from taurus.external.qt import Qt - - ---- ./lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py (original) -+++ ./lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py (refactored) -@@ -34,6 +34,8 @@ - """ - from __future__ import print_function - -+from builtins import str -+from builtins import range - __all__ = ["AppSettingsWizard", "ExternalAppEditor"] - - import os -@@ -230,14 +232,14 @@ - self._projectDirBT.clicked.connect(self.onSelectDir) - - def onSelectDir(self): -- dirname = unicode(Qt.QFileDialog.getExistingDirectory( -+ dirname = str(Qt.QFileDialog.getExistingDirectory( - self, 'Choose the project directory', self._projectDirLE.text())) - if not dirname: - return - self._projectDirLE.setText(dirname) - - def validatePage(self): -- dirname = unicode(self._projectDirLE.text()) -+ dirname = str(self._projectDirLE.text()) - - if not os.path.exists(dirname): - try: -@@ -280,7 +282,7 @@ - return True - - def _getProjectDir(self): -- return unicode(self._projectDirLE.text()) -+ return str(self._projectDirLE.text()) - - - class GeneralSettings(BasePage): -@@ -579,7 +581,7 @@ - fileNames = Qt.QFileDialog.getOpenFileNames(self, self.tr( - "Open File"), pdir, self.tr("JDW (*.jdw );; All files (*)")) - for fileName in fileNames: -- fileName = unicode(fileName) -+ fileName = str(fileName) - if fileName not in self._synoptics: - self._synoptics.append(fileName) - self._refreshSynopticList() -@@ -1328,8 +1330,8 @@ - datetime.datetime.now().isoformat()) - # copy files - for i in range(self._substTable.rowCount()): -- src = unicode(self._substTable.item(i, 0).text()) -- dst = os.path.join(install_dir, unicode( -+ src = str(self._substTable.item(i, 0).text()) -+ dst = os.path.join(install_dir, str( - self._substTable.item(i, 1).text())) - if os.path.normpath(src) != os.path.normpath(dst): - shutil.copy(src, dst) -@@ -1338,7 +1340,7 @@ - xmlcfgfilename = os.path.join(install_dir, - self.wizard().getXmlConfigFileName()) - f = open(xmlcfgfilename, 'w') -- f.write(unicode(self._xml.toPlainText())) -+ f.write(str(self._xml.toPlainText())) - f.close() - logfile.write('XML Config file created: "%s"\n' % xmlcfgfilename) - # write python config file -@@ -1391,8 +1393,8 @@ - warnings = self.wizard().getProjectWarnings() - if warnings: - msg += '\n\nHowever, some fine-tuning may be needed. Please check the details:\n' -- for short, long in warnings: -- details += '- %s: %s\n\n' % (short, long) -+ for short, int in warnings: -+ details += '- %s: %s\n\n' % (short, int) - logfile.write(msg + details) - logfile.close() - dlg = Qt.QMessageBox(Qt.QMessageBox.Information, -@@ -1482,7 +1484,7 @@ - root = etree.fromstring(xml) - - # print self.Pages -- for pageNumber in range(len(self.Pages.keys())): -+ for pageNumber in range(len(list(self.Pages.keys()))): - self.page(pageNumber).fromXml(root) - - def getXml(self): -@@ -1625,7 +1627,7 @@ - long = ('The synoptic file "%s" references a file that ' - 'has been copied to the project dir in order to make the project portable. ' - 'Please edit "%s" and replace "%s" by "%s"') % (dst, dst, ref, refdst) -- self._projectWarnings.append((short, long)) -+ self._projectWarnings.append((short, int)) - - # macroserver page - if self.SARDANA_INSTALLED and self.__getitem__("macroServerName"): ---- ./lib/taurus/qt/qtgui/taurusgui/macrolistener.py (original) -+++ ./lib/taurus/qt/qtgui/taurusgui/macrolistener.py (refactored) -@@ -37,6 +37,7 @@ - - # TODO: move to sardana.taurus - -+from builtins import object - __all__ = ['MacroBroker', 'DynamicPlotManager'] - __docformat__ = 'restructuredtext' - -@@ -145,7 +146,7 @@ - plots1d = {} - images = {} - -- for chname, chdata in channels.items(): -+ for chname, chdata in list(channels.items()): - ptype = chdata['plot_type'] - if ptype == PlotType.No: - continue -@@ -195,7 +196,7 @@ - ''' - from taurus.qt.qtgui.plot import TaurusTrend - newpanels = [] -- for axes, plotables in trends1d.items(): -+ for axes, plotables in list(trends1d.items()): - if not axes: - continue - if axes not in self._trends1d: -@@ -250,7 +251,7 @@ - raise - return - -- for axes, plotables in trends2d.items(): -+ for axes, plotables in list(trends2d.items()): - for chname in plotables: - pname = u'Trend2D - %s' % chname - if pname in self._trends2d: -@@ -306,7 +307,7 @@ - given (default), all the panels are removed. - ''' - if names is None: -- names = self._trends1d.values() + self._trends2d.values() -+ names = list(self._trends1d.values()) + list(self._trends2d.values()) - # TODO: do the same for other temporary panels - for pname in names: - self.removePanel(pname) -@@ -552,7 +553,7 @@ - door.command_inout('abort') - # send stop/abort to all pools - pools = door.macro_server.getElementsOfType('Pool') -- for pool in pools.values(): -+ for pool in list(pools.values()): - self.info('Sending %s command to %s' % (cmd, pool.getFullName())) - try: - pool.getObj().command_inout(cmd) ---- ./lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py (original) -+++ ./lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py (refactored) -@@ -24,6 +24,9 @@ - ########################################################################### - - from __future__ import print_function -+from builtins import str -+from builtins import zip -+from builtins import range - __all__ = ["PanelDescriptionWizard"] - """ - paneldescriptionwizard.py: -@@ -222,7 +225,7 @@ - Qt.QWizardPage.__init__(self, parent) - TaurusBaseWidget.__init__(self, 'WidgetPage') - if extraWidgets: -- customWidgets, customWidgetScreenshots = zip(*extraWidgets) -+ customWidgets, customWidgetScreenshots = list(zip(*extraWidgets)) - pixmaps = {} - for k, s in extraWidgets: - if s is None: -@@ -462,7 +465,7 @@ - - class CommTableModel(Qt.QAbstractTableModel): - NUMCOLS = 3 -- UID, R, W = range(NUMCOLS) -+ UID, R, W = list(range(NUMCOLS)) - - dataChanged = Qt.pyqtSignal(int, int) - -@@ -555,7 +558,7 @@ - - class CommItemDelegate(Qt.QStyledItemDelegate): - NUMCOLS = 3 -- UID, R, W = range(NUMCOLS) -+ UID, R, W = list(range(NUMCOLS)) - - def __init__(self, parent=None, widget=None, sdm=None): - super(CommItemDelegate, self).__init__(parent) ---- ./lib/taurus/qt/qtgui/taurusgui/taurusgui.py (original) -+++ ./lib/taurus/qt/qtgui/taurusgui/taurusgui.py (refactored) -@@ -25,6 +25,8 @@ - - """This package provides the TaurusGui class""" - -+from builtins import str -+from past.builtins import basestring - __all__ = ["DockWidgetPanel", "TaurusGui"] - - __docformat__ = 'restructuredtext' -@@ -91,7 +93,7 @@ - self.onInstrumentChanged(self.ui.instrumentCB.currentText()) - - def onInstrumentChanged(self, instrumentname): -- instrumentname = unicode(instrumentname) -+ instrumentname = str(instrumentname) - panelname = self.associations.get(instrumentname) - if panelname is None: - self.ui.panelCB.setCurrentIndex(0) -@@ -104,10 +106,10 @@ - role = self.ui.buttonBox.buttonRole(button) - if role in (Qt.QDialogButtonBox.AcceptRole, Qt.QDialogButtonBox.ApplyRole): - if self.ui.panelCB.currentIndex() > 0: -- panelname = unicode(self.ui.panelCB.currentText()) -+ panelname = str(self.ui.panelCB.currentText()) - else: - panelname = None -- instrumentname = unicode(self.ui.instrumentCB.currentText()) -+ instrumentname = str(self.ui.instrumentCB.currentText()) - self.associations[instrumentname] = panelname - self.parent().setInstrumentAssociation(instrumentname, panelname) - -@@ -128,7 +130,7 @@ - self.setWidget(widget) - # self._widget = self.widget() #keep a pointer that may change if the - # widget changes -- name = unicode(name) -+ name = str(name) - self.setWindowTitle(name) - self.setObjectName(name) - self._custom = False -@@ -342,7 +344,7 @@ - except: - pass - TaurusMainWindow.closeEvent(self, event) -- for n, panel in self.__panels.items(): -+ for n, panel in list(self.__panels.items()): - panel.closeEvent(event) - panel.widget().closeEvent(event) - if not event.isAccepted(): -@@ -361,7 +363,7 @@ - permanent = (panelsmenu == self.__permPanelsMenu) - panelsmenu.clear() - panelnames = sorted( -- [n for n, p in self.__panels.items() if (p.isPermanent() == permanent)]) -+ [n for n, p in list(self.__panels.items()) if (p.isPermanent() == permanent)]) - for name in panelnames: - panelsmenu.addAction(self.__panels[name].toggleViewAction()) - -@@ -500,7 +502,7 @@ - removed - If None given, the user will be prompted - ''' -- apps = self.__external_app.keys() + self.__permanent_ext_apps -+ apps = list(self.__external_app.keys()) + self.__permanent_ext_apps - if name is None: - items = sorted(apps) - msg1 = "Remove External application" -@@ -510,13 +512,13 @@ - False) - if not ok: - return -- name = unicode(name) -+ name = str(name) - if name not in apps: - msg = ('Cannot remove the external application "%s"' - ' (not found)' % name) - self.debug(msg) - return -- if name in self.__external_app.keys(): -+ if name in list(self.__external_app.keys()): - self.__external_app.pop(name) - else: - self.__permanent_ext_apps.remove(name) -@@ -570,12 +572,12 @@ - ''' - if name is None: - items = sorted( -- [n for n, p in self.__panels.iteritems() if p.isCustom()]) -+ [n for n, p in self.__panels.items() if p.isCustom()]) - name, ok = Qt.QInputDialog.getItem(self, "Remove Panel", - "Panel to be removed (only custom panels can be removed).\n Important: you may want to save the perspective afterwards,\n and maybe remove the panel from other perspectives as well", items, 0, False) - if not ok: - return -- name = unicode(name) -+ name = str(name) - if name not in self.__panels: - self.debug('Cannot remove panel "%s" (not found)' % name) - return -@@ -626,7 +628,7 @@ - 'Deprecation warning: please note that the "area" argument is deprecated. See TaurusGui.createPanel doc') - floating = not(floating) - -- name = unicode(name) -+ name = str(name) - if name in self.__panels: - self.info('Panel with name "%s" already exists. Reusing.' % name) - return self.__panels[name] -@@ -636,7 +638,7 @@ - # we will only place panels in this area - self.addDockWidget(Qt.Qt.TopDockWidgetArea, panel) - if len(self.__panels) != 0: -- self.tabifyDockWidget(self.__panels.values()[-1], panel) -+ self.tabifyDockWidget(list(self.__panels.values())[-1], panel) - - panel.setFloating(floating) - -@@ -674,14 +676,14 @@ - - :return: (DockWidgetPanel) - ''' -- return self.__panels[unicode(name)] -+ return self.__panels[str(name)] - - def getPanelNames(self): - '''returns the names of existing panels - - :return: (list) - ''' -- return copy.deepcopy(self.__panels.keys()) -+ return copy.deepcopy(list(self.__panels.keys())) - - def _setPermanentExternalApps(self, permExternalApps): - '''creates empty panels for restoring custom panels. -@@ -717,7 +719,7 @@ - - :return: (list) - ''' -- return [n for n, p in self.__panels.iteritems() if (p.isCustom() and p.isPermanent())] -+ return [n for n, p in self.__panels.items() if (p.isCustom() and p.isPermanent())] - - def updatePermanentCustomPanels(self, showAlways=True): - ''' -@@ -729,7 +731,7 @@ - # check if there are some newly created panels that may be made - # permanent - perm = self._getPermanentCustomPanels() -- temp = [n for n, p in self.__panels.iteritems() if ( -+ temp = [n for n, p in self.__panels.items() if ( - p.isCustom() and not p.isPermanent())] - if len(temp) > 0 or showAlways: - dlg = QDoubleListDlg(winTitle='Stored panels', -@@ -765,7 +767,7 @@ - mainLabel=msg, - label1='Temporary (to be discarded)', - label2='Permanent (to be stored)', -- list1=self.__external_app.keys(), -+ list1=list(self.__external_app.keys()), - list2=self.__permanent_ext_apps) - result = dlg.exec_() - if result == Qt.QDialog.Accepted: -@@ -888,7 +890,7 @@ - if result == Qt.QMessageBox.Abort: - sys.exit() - return [] -- for i in instruments.values(): -+ for i in list(instruments.values()): - i_name = i.full_name - #i_name, i_unknown, i_type, i_pools = i.split() - i_view = PanelDescription( -@@ -896,12 +898,12 @@ - instrument_dict[i_name] = i_view - - from operator import attrgetter -- pool_elements = sorted(ms.getElementsWithInterface( -- 'Moveable').values(), key=attrgetter('name')) -- pool_elements += sorted(ms.getElementsWithInterface( -- 'ExpChannel').values(), key=attrgetter('name')) -- pool_elements += sorted(ms.getElementsWithInterface( -- 'IORegister').values(), key=attrgetter('name')) -+ pool_elements = sorted(list(ms.getElementsWithInterface( -+ 'Moveable').values()), key=attrgetter('name')) -+ pool_elements += sorted(list(ms.getElementsWithInterface( -+ 'ExpChannel').values()), key=attrgetter('name')) -+ pool_elements += sorted(list(ms.getElementsWithInterface( -+ 'IORegister').values()), key=attrgetter('name')) - for elem in pool_elements: - instrument = elem.instrument - if instrument: -@@ -915,7 +917,7 @@ - # ----------------------------------------------------------- - instrument_dict[i_name].model.append(e_name) - # filter out empty panels -- ret = [instrument for instrument in instrument_dict.values() -+ ret = [instrument for instrument in list(instrument_dict.values()) - if len(instrument.model) > 0] - return ret - -@@ -1332,7 +1334,7 @@ - dwfeat = Qt.QDockWidget.AllDockWidgetFeatures - else: - dwfeat = Qt.QDockWidget.NoDockWidgetFeatures -- for panel in self.__panels.values(): -+ for panel in list(self.__panels.values()): - panel.toggleViewAction().setEnabled(modifiable) - panel.setFeatures(dwfeat) - for action in (self.newPanelAction, self.showAllPanelsAction, -@@ -1355,12 +1357,12 @@ - - def hideAllPanels(self): - '''hides all current panels''' -- for panel in self.__panels.itervalues(): -+ for panel in self.__panels.values(): - panel.hide() - - def showAllPanels(self): - '''shows all current panels''' -- for panel in self.__panels.itervalues(): -+ for panel in self.__panels.values(): - panel.show() - - def onShowAssociationDialog(self): -@@ -1391,7 +1393,7 @@ - panel or None to remove the association - for this instrument. - ''' -- instrumentname = unicode(instrumentname) -+ instrumentname = str(instrumentname) - # remove a previous association if it exists - oldpanelname = self.__instrumentToPanelMap.get(instrumentname, None) - self.__panelToInstrumentMap.pop(oldpanelname, None) -@@ -1426,12 +1428,12 @@ - else: - self.__instrumentToPanelMap.update(copy.deepcopy(associationsdict)) - self.__panelToInstrumentMap = {} -- for k, v in self.__instrumentToPanelMap.iteritems(): -+ for k, v in self.__instrumentToPanelMap.items(): - self.__panelToInstrumentMap[v] = k - - def _onPanelVisibilityChanged(self, visible): - if visible: -- panelname = unicode(self.sender().objectName()) -+ panelname = str(self.sender().objectName()) - instrumentname = self.__panelToInstrumentMap.get(panelname) - if instrumentname is not None: - self.SelectedInstrument.emit(instrumentname) -@@ -1442,7 +1444,7 @@ - - :param instrumentname: (str) The name that identifies the instrument. - ''' -- instrumentname = unicode(instrumentname) -+ instrumentname = str(instrumentname) - panelname = self.getInstrumentAssociation(instrumentname) - self.setFocusToPanel(panelname) - -@@ -1452,7 +1454,7 @@ - :param panelname: (str) The name that identifies the panel. - This name must be unique within the panels in the GUI. - ''' -- panelname = unicode(panelname) -+ panelname = str(panelname) - try: - panel = self.__panels[panelname] - panel.show() -@@ -1490,9 +1492,9 @@ - raise DeprecationWarning( - 'findPanelsInArea is no longer supported (now all panels reside in the same DockWidget Area)') - if area == 'FLOATING': -- return [p for p in self.__panels.values() if p.isFloating()] -+ return [p for p in list(self.__panels.values()) if p.isFloating()] - else: -- return [p for p in self.__panels.values() if self.dockWidgetArea(p) == area] -+ return [p for p in list(self.__panels.values()) if self.dockWidgetArea(p) == area] - - @classmethod - def getQtDesignerPluginInfo(cls): -@@ -1530,7 +1532,7 @@ - dlg = QDoubleListDlg(winTitle='Export Panels to XML', - mainLabel='Select which of the custom panels you want to export as xml configuration', - label1='Not Exported', label2='Exported', -- list1=[n for n, p in self.__panels.iteritems() if p.isCustom()], list2=[]) -+ list1=[n for n, p in self.__panels.items() if p.isCustom()], list2=[]) - result = dlg.exec_() - if result != Qt.QDialog.Accepted: - return ---- ./lib/taurus/qt/qtgui/taurusgui/utils.py (original) -+++ ./lib/taurus/qt/qtgui/taurusgui/utils.py (refactored) -@@ -26,6 +26,9 @@ - """This configuration contains base modules and classes that may be used - by specific TaurusGui-based GUIs""" - -+from builtins import str -+from past.builtins import basestring -+from builtins import object - __docformat__ = 'restructuredtext' - - import os -@@ -38,7 +41,7 @@ - # this is here only for backwards compatibility. It should not be used at all - - --class Qt_Qt: -+class Qt_Qt(object): - LeftDockWidgetArea = 1 - RightDockWidgetArea = 2 - BottomDockWidgetArea = 3 -@@ -223,9 +226,9 @@ - w.setModel(self.model) - # connect (if an sdm is given) - if sdm is not None: -- for dataUID, signalname in self.sharedDataWrite.iteritems(): -+ for dataUID, signalname in self.sharedDataWrite.items(): - sdm.connectWriter(dataUID, w, signalname) -- for dataUID, slotname in self.sharedDataRead.iteritems(): -+ for dataUID, slotname in self.sharedDataRead.items(): - sdm.connectReader(dataUID, getattr(w, slotname)) - # set the name - w.name = self.name -@@ -250,12 +253,12 @@ - floating.text = str(self._floating) - - sharedDataWrite = etree.SubElement(root, "sharedDataWrite") -- for k, v in self._sharedDataWrite.iteritems(): -+ for k, v in self._sharedDataWrite.items(): - item = etree.SubElement( - sharedDataWrite, "item", datauid=k, signalName=v) - - sharedDataRead = etree.SubElement(root, "sharedDataRead") -- for k, v in self._sharedDataRead.iteritems(): -+ for k, v in self._sharedDataRead.items(): - item = etree.SubElement( - sharedDataRead, "item", datauid=k, slotName=v) - ---- ./lib/taurus/qt/qtgui/test/base.py (original) -+++ ./lib/taurus/qt/qtgui/test/base.py (refactored) -@@ -25,6 +25,9 @@ - - """Utilities for creating generic tests for Taurus widgets""" - -+from builtins import zip -+from builtins import range -+from builtins import object - import time - import taurus.core - import unittest -@@ -84,7 +87,7 @@ - self.assertTrue(deps <= maximum, msg) - - def processEvents(self, repetitions=1, sleep=0): -- for i in xrange(repetitions): -+ for i in range(repetitions): - time.sleep(sleep) - self._app.processEvents() - ---- ./lib/taurus/qt/qtgui/tree/qtree.py (original) -+++ ./lib/taurus/qt/qtgui/tree/qtree.py (refactored) -@@ -25,6 +25,7 @@ - - """This module provides base tree widget""" - -+from builtins import range - __all__ = ["QBaseTreeWidget"] - - __docformat__ = 'restructuredtext' ---- ./lib/taurus/qt/qtgui/tree/taurusdevicetree.py (original) -+++ ./lib/taurus/qt/qtgui/tree/taurusdevicetree.py (refactored) -@@ -34,6 +34,11 @@ - # Taurusdbtree - - # ,"SearchEdit"] #"TaurusTreeNode"] -+from builtins import next -+from builtins import str -+from builtins import range -+from past.builtins import basestring -+from builtins import object - __all__ = ["TaurusDevTree", "TaurusSearchTree", "TaurusDevTreeOptions"] - - import time -@@ -194,11 +199,11 @@ - node = self.getNode() - try: - name, url = self.getNodeText(node), '' -- for k, v in self.getIconMap().items(): -+ for k, v in list(self.getIconMap().items()): - if re.match(k.lower(), name.lower()): - url = v - if not url: -- for k, v in self.getIconMap().items(): -+ for k, v in list(self.getIconMap().items()): - if k.lower() in name.lower(): - url = v - # if name.count('/')==2: -@@ -640,10 +645,10 @@ - dct = self.getTangoDict(filters) - else: # if isMap(filters): - self.setWindowTitle('TaurusDevTree:%s' % -- ','.join(filters.keys())) -+ ','.join(list(filters.keys()))) - - def expand_dict(d): -- return [x for v in d.values() for x in (expand_dict(v) if hasattr(v, 'values') else (v,))] -+ return [x for v in list(d.values()) for x in (expand_dict(v) if hasattr(v, 'values') else (v,))] - targets = [t.upper() for t in get_matching_devices( - ['*%s*' % f if '*' not in f else f for f in expand_dict(filters)])] - -@@ -651,7 +656,7 @@ - return dict.fromkeys(t for t in targets if matchCl(f, t)) - - def expand_filter(f): -- return dict((k, expand_filter(v) if hasattr(v, 'values') else get_devs(v)) for k, v in f.items() if v) -+ return dict((k, expand_filter(v) if hasattr(v, 'values') else get_devs(v)) for k, v in list(f.items()) if v) - dct = expand_filter(filters) - # self.Loader.next([self.setTree,dct,True]) - self.setTree(dct, clear=True) -@@ -800,7 +805,7 @@ - if alias: - self.trace('Got aliases for %s: %s' % (aname, alias)) - [setattr(natt, 'AttributeAlias', v) -- for k, v in alias.items() if k in aname.lower()] -+ for k, v in list(alias.items()) if k in aname.lower()] - else: - natt.AttributeAlias = aname.split()[0].strip() - node.setExpanded(True) -@@ -825,7 +830,7 @@ - return self.item_index[key] - - def getNodeList(self): -- return self.item_index.keys() -+ return list(self.item_index.keys()) - - def getMatchingNodes(self, regexp, limit=0, all=False, exclude=None): - """ It returns all nodes matching the given expression. """ -@@ -838,7 +843,7 @@ - if node is not None: - return [node] - regexp = re.compile(extend_regexp(regexp)) -- for k, node in self.item_index.iteritems(): -+ for k, node in self.item_index.items(): - nname = self.getNodeText(node, full=True).lower() - if (regexp.match(k) or regexp.match(nname)) and \ - (not exclude or not any(re.match(x.lower(), y) for x in exclude for y in (k.lower(), nname))): -@@ -869,7 +874,7 @@ - def unpackChildren(self): - """ removes all nodes from the tree and returns them in a list, used for resorting """ - allChildren = [] -- nodes = self.getAllNodes().values() -+ nodes = list(self.getAllNodes().values()) - - for node in nodes: - allChildren.extend(node.takeChildren()) -@@ -1021,7 +1026,7 @@ - - sorter = lambda k, ks=[re.compile(c) for c in order]: str( - next((i for i, r in enumerate(ks) if r.match(k.lower())))) + str(k) -- for c, it in sorted(allChildren.items(), key=lambda k: sorter(k[0])): -+ for c, it in sorted(list(allChildren.items()), key=lambda k: sorter(k[0])): - self.debug('tree.sortCustom(%s): %s inserted at %d' % - (order, it.text(0), self.topLevelItemCount())) - self.insertTopLevelItem(self.topLevelItemCount(), it) -@@ -1062,12 +1067,12 @@ - if not isinstance(dct, dict): - dct = dict.fromkeys(dct, '') - nodes = self.getAllNodes() -- for name, node in nodes.iteritems(): -+ for name, node in nodes.items(): - name = str(name).split()[0] - if node.isHidden(): - continue - if regexps: -- matches = [v for k, v in dct.items() if re.match( -+ matches = [v for k, v in list(dct.items()) if re.match( - k.lower(), name.lower())] - if matches: - update_node(node, name, {name: matches[0]}) -@@ -1286,7 +1291,7 @@ - - if hasattr(node, 'ContextMenu'): - last_was_separator = True -- for t in (type(node.ContextMenu) is dict and node.ContextMenu.items() or node.ContextMenu): -+ for t in (type(node.ContextMenu) is dict and list(node.ContextMenu.items()) or node.ContextMenu): - try: - k, action = t - if k: -@@ -1307,7 +1312,7 @@ - expert = menu.addMenu('Expert') - # expert.addSeparator() - last_was_separator = True -- for t in (type(node.ContextMenu) is dict and node.ExpertMenu.items() or node.ExpertMenu): -+ for t in (type(node.ContextMenu) is dict and list(node.ExpertMenu.items()) or node.ExpertMenu): - try: - k, action = t - if k: -@@ -1660,7 +1665,7 @@ - self.layout().addWidget(self.tree) - self.registerConfigDelegate(self.tree) - # Slot forwarding ... -- for k in TaurusDevTree.__dict__.keys(): -+ for k in list(TaurusDevTree.__dict__.keys()): - # if k in ['__init__','defineStyle']: continue - if k not in self.__slots__: - continue ---- ./lib/taurus/qt/qtgui/util/taurusaction.py (original) -+++ ./lib/taurus/qt/qtgui/util/taurusaction.py (refactored) -@@ -26,6 +26,8 @@ - """This module is designed to provide a library of taurus Qt actions""" - from __future__ import absolute_import - -+from builtins import str -+from past.builtins import basestring - __all__ = ["ExternalAppAction", - "TaurusMenu", - "TaurusAction", -@@ -131,10 +133,10 @@ - else: - return False - except OSError: -- err = "Error launching %s" % unicode(self.text()) -+ err = "Error launching %s" % str(self.text()) - msg = "Cannot launch application:\n" + \ - " ".join(self.__cmdargs) + \ -- "\nHint: Check that %s is installed and in the path" % unicode( -+ "\nHint: Check that %s is installed and in the path" % str( - self.text()) - if self.interactive: - Qt.QMessageBox.warning(self.parentWidget(), err, msg) ---- ./lib/taurus/qt/qtgui/util/taurusactionfactory.py (original) -+++ ./lib/taurus/qt/qtgui/util/taurusactionfactory.py (refactored) -@@ -130,7 +130,7 @@ - action.toggled.connect(toggled) - action.setCheckable(True) - if icon is not None: -- if isinstance(icon, (str, unicode)): -+ if isinstance(icon, (str, str)): - icon = Qt.QIcon.fromTheme(icon) - action.setIcon(icon) - if shortcut is not None: ---- ./lib/taurus/qt/qtgui/util/tauruswidgetfactory.py (original) -+++ ./lib/taurus/qt/qtgui/util/tauruswidgetfactory.py (refactored) -@@ -194,19 +194,19 @@ - return self._taurus_widgets - - def getWidgetClassNames(self): -- return self._qt_widgets.keys() -+ return list(self._qt_widgets.keys()) - - def getWidgetClasses(self): -- return [klass for mod_name, klass in self._qt_widgets.values()] -+ return [klass for mod_name, klass in list(self._qt_widgets.values())] - - def getWidgetClass(self, name): - return self._qt_widgets[name][1] - - def getTaurusWidgetClassNames(self): -- return self._taurus_widgets.keys() -+ return list(self._taurus_widgets.keys()) - - def getTaurusWidgetClasses(self): -- return [klass for mod_name, klass in self._taurus_widgets.values()] -+ return [klass for mod_name, klass in list(self._taurus_widgets.values())] - - def getTaurusWidgetClass(self, name): - return self._taurus_widgets.get(name)[1] ---- ./lib/taurus/qt/qtgui/util/tauruswidgettree.py (original) -+++ ./lib/taurus/qt/qtgui/util/tauruswidgettree.py (refactored) -@@ -26,6 +26,7 @@ - """ - """ - -+from builtins import str - __all__ = ["QObjectRepresentation", "get_qobject_tree", "get_qobject_tree_str", - "TreeQObjectModel", "TreeQObjectWidget"] - ---- ./lib/taurus/qt/qtgui/util/ui.py (original) -+++ ./lib/taurus/qt/qtgui/util/ui.py (refactored) -@@ -25,6 +25,7 @@ - - """utilities to load ui files for widgets""" - -+from builtins import object - __all__ = ["loadUi", - "UILoadable", - ] ---- ./lib/taurus/test/base.py (original) -+++ ./lib/taurus/test/base.py (refactored) -@@ -100,7 +100,7 @@ - - if test_method_doc is None: - argsrep = ', '.join(['%s=%s' % (k, repr(v)) -- for k, v in helper_kwargs.items()]) -+ for k, v in list(helper_kwargs.items())]) - if tested_name: - test_method_doc = 'Testing %s with %s(%s)' % (tested_name, - helper_name, argsrep) ---- ./lib/taurus/test/fuzzytest.py (original) -+++ ./lib/taurus/test/fuzzytest.py (refactored) -@@ -25,8 +25,10 @@ - - '''Utility functions to deal with non-ideal (fuzzy) tests''' - from __future__ import print_function -+from __future__ import division - - -+from past.utils import old_div - def loopTest(testname, maxtries=100, maxfails=10): - '''Run a test `maxtries` times or until it fails `maxfails` times and - report the number of tries and failures. -@@ -107,11 +109,11 @@ - else: - tries, fails = loopSubprocess(test, maxtries=maxtries, - maxfails=maxfails, **kwargs) -- r = float(fails) / tries -- dr = numpy.sqrt(fails) / tries -+ r = old_div(float(fails), tries) -+ dr = old_div(numpy.sqrt(fails), tries) - print('Failure rate = %g +/- %g (%i/%i)' % (r, dr, fails, tries)) - # calculating n using p-value=1% and failure rate with -1 sigma -- n = numpy.ceil(numpy.log(.01) / numpy.log(1 - (r - dr))) -+ n = numpy.ceil(old_div(numpy.log(.01), numpy.log(1 - (r - dr)))) - print(('Number of consecutive times that the test should be passed ' + - 'to have a confidence>99%% that the bug is fixed: %g') % n) - return r, dr, n ---- ./lib/taurus/test/moduleexplorer.py (original) -+++ ./lib/taurus/test/moduleexplorer.py (refactored) -@@ -27,6 +27,7 @@ - '''Utility code for returning info about a module''' - from __future__ import print_function - -+from builtins import object - import sys - import os - import inspect -@@ -175,7 +176,7 @@ - ret = [(mname, el) for el in info[key]] - except KeyError: - return [] -- for sminfo in info['submodules'].itervalues(): -+ for sminfo in info['submodules'].values(): - ret += ModuleExplorer.getAll(sminfo, key) - return ret - ---- ./lib/taurus/test/test_import.py (original) -+++ ./lib/taurus/test/test_import.py (refactored) -@@ -26,6 +26,7 @@ - """Taurus import tests""" - from __future__ import absolute_import - -+from builtins import zip - import unittest - - From 1ecc507d3bfd13176586d8c29df4baf64590e972 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 19 Oct 2018 13:28:16 +0200 Subject: [PATCH 138/252] Update changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 282438404..dce6407ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,13 @@ Note: changes in the [support-3.x] branch (which was split from the master branch after [3.7.1] and maintained in parallel to the develop branch) won't be reflected in this file. +## Unreleased + +### Added +- Support of Python3 (beta stage, not yet production ready) (#703) + + + ## [4.4.0] - 2018-07-26 ### Deprecated From a1e1aaa955f75c8a51f733c8869cc8284322f6de Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 19 Oct 2018 13:28:33 +0200 Subject: [PATCH 139/252] Bump version 4.4.1-alpha to 4.5.0-alpha --- .bumpversion.cfg | 2 +- lib/taurus/core/release.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 38e2cba1e..b1dc34355 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -3,7 +3,7 @@ commit = True message = Bump version {current_version} to {new_version} tag = False tag_name = {new_version} -current_version = 4.4.1-alpha +current_version = 4.5.0-alpha parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\-(?P[a-z]+))? serialize = {major}.{minor}.{patch}-{release} diff --git a/lib/taurus/core/release.py b/lib/taurus/core/release.py index 726c15fae..3ede55c9d 100644 --- a/lib/taurus/core/release.py +++ b/lib/taurus/core/release.py @@ -47,7 +47,7 @@ # we use semantic versioning (http://semver.org/) and we update it using the # bumpversion script (https://github.com/peritus/bumpversion) -version = '4.4.1-alpha' +version = '4.5.0-alpha' # generate version_info and revision (**deprecated** since version 4.0.2-dev). if '-' in version: From 402588e7a4c2a1bd5770ac796e6db5bb3922498b Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 3 Oct 2018 09:50:17 +0200 Subject: [PATCH 140/252] Remove Qt API1 related code --- lib/taurus/qt/qtgui/util/validator.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/lib/taurus/qt/qtgui/util/validator.py b/lib/taurus/qt/qtgui/util/validator.py index c5d80fe3c..92f875ebb 100755 --- a/lib/taurus/qt/qtgui/util/validator.py +++ b/lib/taurus/qt/qtgui/util/validator.py @@ -88,7 +88,7 @@ def setBottom(self, bottom): """ self._bottom = Quantity(bottom) - def _validate(self, input, pos): + def validate(self, input, pos): """Reimplemented from :class:`QValidator` to validate if the input string is a representation of a quantity within the set bottom and top limits @@ -112,12 +112,3 @@ def _validate(self, input, pos): except DimensionalityError: return Qt.QValidator.Intermediate, input, pos return Qt.QValidator.Acceptable, input, pos - - def _validate_oldQt(self, input, pos): - """Old Qt (v4.4.) -compatible implementation of validate""" - state, _, pos = self._validate(input, pos) - return state, pos - - # select the appropriate implementation of validate. See: - # https://www.mail-archive.com/pyqt@riverbankcomputing.com/msg26344.html - validate = Qt.PYQT_QSTRING_API_1 and _validate_oldQt or _validate From adffd7b06b613ed6b172fffc1d4e3fe098e52cef Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 19 Oct 2018 15:09:30 +0200 Subject: [PATCH 141/252] Avoid using qvariant --- lib/taurus/qt/qtgui/panel/taurusinputpanel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/panel/taurusinputpanel.py b/lib/taurus/qt/qtgui/panel/taurusinputpanel.py index e1fbedb12..27ecaa381 100644 --- a/lib/taurus/qt/qtgui/panel/taurusinputpanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusinputpanel.py @@ -231,7 +231,7 @@ def _create_multi_selection_panel(self, input_data): else: text, userData = str(item), item item_widget = Qt.QListWidgetItem(text, listwidget) - item_widget.setData(Qt.Qt.UserRole, Qt.to_qvariant(userData)) + item_widget.setData(Qt.Qt.UserRole, userData) if userData in default_value: item_widget.setSelected(True) layout.addWidget(listwidget) From f51780dc835b6b390d70225466a2cbeffbb800bc Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 26 Oct 2018 06:10:36 +0200 Subject: [PATCH 142/252] Remove qtpy references --- lib/taurus/external/qt/QtGui.py | 4 ---- setup.py | 3 +-- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/taurus/external/qt/QtGui.py b/lib/taurus/external/qt/QtGui.py index ddb7e3a18..110038b62 100644 --- a/lib/taurus/external/qt/QtGui.py +++ b/lib/taurus/external/qt/QtGui.py @@ -33,9 +33,5 @@ if __backend == 'PyQt5': _updateQtSubModule(globals(), "QtWidgets") -else: - # early import of qtpy.QtWidgets as a workaround for - # https://github.com/taurus-org/taurus/issues/401 - import qtpy.QtWidgets as __qtpy_QtWidgets del _updateQtSubModule, API_NAME diff --git a/setup.py b/setup.py index 1bd112af9..4a9935a22 100644 --- a/setup.py +++ b/setup.py @@ -73,8 +73,7 @@ def get_release_info(): extras_require = { - 'taurus-qt': ['qtpy >=1.2.1', - # 'PyQt4 >=4.8', + 'taurus-qt': [# 'PyQt4 >=4.8', # 'PyQt4.Qwt5 >=5.2.0', # [Taurus-Qt-Plot] 'ply >=2.3', # [Taurus-Qt-Synoptic] 'lxml >=2.1', # [Taurus-Qt-TaurusGUI] From c23a1674129c5429f5e01e44ea47b4d338b2277b Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 26 Oct 2018 23:25:36 +0200 Subject: [PATCH 143/252] Refactor taurus.external.qt to also support PyQt5 and PySide(2) Refactor the taurus.external.qt mixin to proper support all Qt bindings (PyQt4, PyQt5, PySide, PySide2). The refactoring is based largely on the current qtpy code, but adapted to: a) avoid disruptive patching of loaded modules b) provide compatibility to applications that use taurus.external.qt and still use PyQt4 coding style --- lib/taurus/external/qt/QtCore.py | 292 ++++++++---------------- lib/taurus/external/qt/QtDesigner.py | 42 ++-- lib/taurus/external/qt/QtGui.py | 62 ++--- lib/taurus/external/qt/QtHelp.py | 46 ++-- lib/taurus/external/qt/QtNetwork.py | 47 ++-- lib/taurus/external/qt/QtSvg.py | 48 ++-- lib/taurus/external/qt/QtUiTools.py | 44 +++- lib/taurus/external/qt/QtWebKit.py | 18 +- lib/taurus/external/qt/Qwt5.py | 11 +- lib/taurus/external/qt/__init__.py | 228 +++++++++++-------- lib/taurus/external/qt/uic.py | 323 +++++++++++++++++---------- 11 files changed, 608 insertions(+), 553 deletions(-) diff --git a/lib/taurus/external/qt/QtCore.py b/lib/taurus/external/qt/QtCore.py index 602655b6e..a91c3fee6 100644 --- a/lib/taurus/external/qt/QtCore.py +++ b/lib/taurus/external/qt/QtCore.py @@ -1,204 +1,106 @@ # -*- coding: utf-8 -*- +# +# Copyright © 2018- CELLS / ALBA Synchrotron, Bellaterra, Spain +# Copyright © 2014-2015 Colin Duquesnoy +# Copyright © 2009-2018 The Spyder Development Team +# +# Licensed under the terms of the MIT License +# (see LICENSE.txt for details) -############################################################################## -## -## This file is part of Taurus -## -## http://taurus-scada.org -## -## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain -## -## Taurus is free software: you can redistribute it and/or modify -## it under the terms of the GNU Lesser General Public License as published by -## the Free Software Foundation, either version 3 of the License, or -## (at your option) any later version. -## -## Taurus is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU Lesser General Public License for more details. -## -## You should have received a copy of the GNU Lesser General Public License -## along with Taurus. If not, see . -## -############################################################################## +""" +Provides QtCore classes and functions. +""" -"""This module exposes QtCore module""" +from . import PYQT5, PYSIDE2, PYQT4, PYSIDE, PythonQtError -from builtins import object -from future.utils import string_types -from future.utils import PY2 -from taurus.external.qt import API_NAME -__backend = API_NAME - - -def __to_qvariant_1(pyobj=None): - """Properly converts a python object into a proper QVariant according to - the PySide or PyQt API version in use - - :param pyobj: object to be converted - :return: A proper QVariant""" - from PyQt4.QtCore import QVariant - if pyobj is None: - return QVariant() # PyQt 4.4 doesn't accept QVariant(None) - return QVariant(pyobj) - - -def __from_qvariant_1(qobj=None, convfunc=None): - """Properly converts a QVariant/QVariant equivalent to a python object - according to the PySide or PyQt API version in use - - :param qobj: object to be converted - :param convfunc: - conversion function. Not used if QVariant is not available. - If QVariant is available: [default: None, meaning use - qobj.toPyObject()]. Can be a function like str, int, bool, float or - a string containing the conversion method (ex.: 'toByteArray') will - call qobj.toByteArray() - :return: A proper python object""" - if convfunc is None: - return qobj.toPyObject() - elif callable(convfunc): - if convfunc is str: - return convfunc(qobj.toString()) - elif convfunc is bool: - return qobj.toBool() - elif convfunc is int: - return qobj.toInt()[0] - elif convfunc is float: - return qobj.toDouble()[0] - elif PY2 and confunc is unicode: # py2 compatibility - return convfunc(qobj.toString()) - elif isinstance(convfunc, string_types): - return getattr(qobj, convfunc)() - - -def __QVariant_2(pyobj=None): - return pyobj - - -def __to_qvariant_2(pyobj=None): - """Properly converts a python object into a proper QVariant according to - the PySide or PyQt4 API version in use - - :param pyobj: object to be converted - :return: A proper QVariant""" - return pyobj - - -def __from_qvariant_2(qobj=None, convfunc=None): - """Properly converts a QVariant/QVariant equivalent to a python object - according to the PySide or PyQt4 API version in use - - :param qobj: object to be converted - :param convfunc: - conversion function. Not used if QVariant is not available. - If QVariant is available: [default: None, meaning use - qobj.toPyObject()]. Can be a function like str, int, bool, float or - a string containing the conversion method (ex.: 'toByteArray') will - call qobj.toByteArray() - :return: A proper python object""" - return qobj - - -__QString_2 = str - -__QStringList_2 = list - - -if __backend == 'PyQt4': - from PyQt4 import QtCore as __QtCore - - # Alias PyQt-specific functions for PySide compatibility. - if hasattr(__QtCore, "pyqtSignal"): - Signal = __QtCore.pyqtSignal - if hasattr(__QtCore, "pyqtSlot"): - Slot = __QtCore.pyqtSlot - else: #implement dummy pyqtSlot decorator for PyQt<4.6 - class DummyPyqtSlot(object): - def __init__(self, *a, **kw): - pass - def __call__(self, f): - return f - Slot = pyqtSlot = DummyPyqtSlot - if hasattr(__QtCore, "pyqtProperty"): - Property = __QtCore.pyqtProperty - - try: - __api_version__ = __QtCore.QT_VERSION_STR - except AttributeError: +if PYQT5: + from PyQt5.QtCore import * + from PyQt5.QtCore import pyqtSignal as Signal + from PyQt5.QtCore import pyqtSlot as Slot + from PyQt5.QtCore import pyqtProperty as Property + from PyQt5.QtCore import QT_VERSION_STR as __version__ + + # For issue #153 of qtpy + from PyQt5.QtCore import QDateTime + QDateTime.toPython = QDateTime.toPyDateTime + +elif PYSIDE2: + from PySide2.QtCore import * + from PySide2.QtCore import Signal as pyqtSignal + from PySide2.QtCore import Slot as pyqtSlot + from PySide2.QtCore import Property as pyqtProperty + try: # may be limited to PySide-5.11a1 only + from PySide2.QtGui import QStringListModel + except: pass - try: - import sip - PYQT_QVARIANT_API_1 = sip.getapi('QVariant') < 2 - PYQT_QSTRING_API_1 = sip.getapi('QString') < 2 - except (ImportError, AttributeError): - PYQT_QVARIANT_API_1 = True - PYQT_QSTRING_API_1 = True - - if PYQT_QVARIANT_API_1: - to_qvariant = __to_qvariant_1 - from_qvariant = __from_qvariant_1 - else: - __QtCore.QVariant = QVariant = __QVariant_2 - to_qvariant = __to_qvariant_2 - from_qvariant = __from_qvariant_2 - - if not PYQT_QSTRING_API_1: - __QtCore.QString = QString = __QString_2 - __QtCore.QStringList = QStringList = __QStringList_2 - +elif PYQT4: from PyQt4.QtCore import * - -elif __backend == 'PyQt5': - from PyQt5 import QtCore as __QtCore - - # Alias PyQt-specific functions for PySide compatibility. - if hasattr(__QtCore, "pyqtSignal"): - Signal = __QtCore.pyqtSignal - if hasattr(__QtCore, "pyqtSlot"): - Slot = __QtCore.pyqtSlot - if hasattr(__QtCore, "pyqtProperty"): - Property = __QtCore.pyqtProperty - - try: - __api_version__ = __QtCore.QT_VERSION_STR - except AttributeError: - pass - - __QtCore.QVariant = QVariant = __QVariant_2 - to_qvariant = __to_qvariant_2 - from_qvariant = __from_qvariant_2 - __QtCore.QString = QString = __QString_2 - __QtCore.QStringList = QStringList = __QStringList_2 - - from PyQt5.QtCore import * - -elif __backend == 'PySide': - from PySide import QtCore as __QtCore + from PyQt4.QtCore import QCoreApplication + from PyQt4.QtCore import Qt + from PyQt4.QtCore import pyqtSignal as Signal + from PyQt4.QtCore import pyqtSlot as Slot + from PyQt4.QtCore import pyqtProperty as Property + from PyQt4.QtGui import (QItemSelection, QItemSelectionModel, + QItemSelectionRange, QSortFilterProxyModel, + QStringListModel) + from PyQt4.QtCore import QT_VERSION_STR as __version__ + from PyQt4.QtCore import qInstallMsgHandler as qInstallMessageHandler + + # QDesktopServices has has been split into (QDesktopServices and + # QStandardPaths) in Qt5 + # This creates a dummy class that emulates QStandardPaths + from PyQt4.QtGui import QDesktopServices as _QDesktopServices + + class QStandardPaths(): + StandardLocation = _QDesktopServices.StandardLocation + displayName = _QDesktopServices.displayName + DesktopLocation = _QDesktopServices.DesktopLocation + DocumentsLocation = _QDesktopServices.DocumentsLocation + FontsLocation = _QDesktopServices.FontsLocation + ApplicationsLocation = _QDesktopServices.ApplicationsLocation + MusicLocation = _QDesktopServices.MusicLocation + MoviesLocation = _QDesktopServices.MoviesLocation + PicturesLocation = _QDesktopServices.PicturesLocation + TempLocation = _QDesktopServices.TempLocation + HomeLocation = _QDesktopServices.HomeLocation + DataLocation = _QDesktopServices.DataLocation + CacheLocation = _QDesktopServices.CacheLocation + writableLocation = _QDesktopServices.storageLocation + +elif PYSIDE: from PySide.QtCore import * - __api_version__ = __QtCore.QT_VERSION_STR - - __QtCore.QVariant = QVariant = __QVariant_2 - to_qvariant = __to_qvariant_2 - from_qvariant = __from_qvariant_2 - __QtCore.QString = QString = __QString_2 - __QtCore.QStringList = QStringList = __QStringList_2 - - #a dummy pyqtsignature decorator - # CAUTION this totally nulifies the pupose of decorating with pyqtSignature - # todo: do a proper implementation of pyqtsignature - def pyqtSignature(f): - return f - - # Alias PySide functions for PyQt compatibility. - if hasattr(__QtCore, "Signal"): - pyqtSignal = Signal - if hasattr(__QtCore, "Slot"): - pyqtSlot = Slot - if hasattr(__QtCore, "Property"): - pyqtProperty = Property - -del API_NAME + from PySide.QtCore import Signal as pyqtSignal + from PySide.QtCore import Slot as pyqtSlot + from PySide.QtCore import Property as pyqtProperty + from PySide.QtGui import (QItemSelection, QItemSelectionModel, + QItemSelectionRange, QSortFilterProxyModel, + QStringListModel) + from PySide.QtCore import qInstallMsgHandler as qInstallMessageHandler + + # QDesktopServices has has been split into (QDesktopServices and + # QStandardPaths) in Qt5 + # This creates a dummy class that emulates QStandardPaths + from PySide.QtGui import QDesktopServices as _QDesktopServices + + class QStandardPaths(): + StandardLocation = _QDesktopServices.StandardLocation + displayName = _QDesktopServices.displayName + DesktopLocation = _QDesktopServices.DesktopLocation + DocumentsLocation = _QDesktopServices.DocumentsLocation + FontsLocation = _QDesktopServices.FontsLocation + ApplicationsLocation = _QDesktopServices.ApplicationsLocation + MusicLocation = _QDesktopServices.MusicLocation + MoviesLocation = _QDesktopServices.MoviesLocation + PicturesLocation = _QDesktopServices.PicturesLocation + TempLocation = _QDesktopServices.TempLocation + HomeLocation = _QDesktopServices.HomeLocation + DataLocation = _QDesktopServices.DataLocation + CacheLocation = _QDesktopServices.CacheLocation + writableLocation = _QDesktopServices.storageLocation + + import PySide.QtCore + __version__ = PySide.QtCore.__version__ +else: + raise PythonQtError('No Qt bindings could be found') \ No newline at end of file diff --git a/lib/taurus/external/qt/QtDesigner.py b/lib/taurus/external/qt/QtDesigner.py index e38e3e030..85738cde8 100644 --- a/lib/taurus/external/qt/QtDesigner.py +++ b/lib/taurus/external/qt/QtDesigner.py @@ -1,32 +1,22 @@ # -*- coding: utf-8 -*- +# +# Copyright © 2014-2015 Colin Duquesnoy +# +# Licensed under the terms of the MIT License +# (see LICENSE.txt for details) -############################################################################## -## -## This file is part of Taurus -## -## http://taurus-scada.org -## -## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain -## -## Taurus is free software: you can redistribute it and/or modify -## it under the terms of the GNU Lesser General Public License as published by -## the Free Software Foundation, either version 3 of the License, or -## (at your option) any later version. -## -## Taurus is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU Lesser General Public License for more details. -## -## You should have received a copy of the GNU Lesser General Public License -## along with Taurus. If not, see . -## -############################################################################## +""" +Provides QtDesigner classes and functions. +""" -"""This module exposes QtDesigner module""" +from . import PYQT5, PYQT4, PythonQtError -from taurus.external.qt import _updateQtSubModule -_updateQtSubModule(globals(), "QtDesigner") +if PYQT5: + from PyQt5.QtDesigner import * +elif PYQT4: + from PyQt4.QtDesigner import * +else: + raise PythonQtError('No Qt bindings could be found') -del _updateQtSubModule +del PYQT4, PYQT5, PYSIDE, PYSIDE2, PythonQtError diff --git a/lib/taurus/external/qt/QtGui.py b/lib/taurus/external/qt/QtGui.py index 110038b62..06ef8762b 100644 --- a/lib/taurus/external/qt/QtGui.py +++ b/lib/taurus/external/qt/QtGui.py @@ -1,37 +1,37 @@ # -*- coding: utf-8 -*- +# +# Copyright © 2018- CELLS / ALBA Synchrotron, Bellaterra, Spain +# Copyright © 2014-2015 Colin Duquesnoy +# Copyright © 2009-2018 The Spyder Development Team +# +# Licensed under the terms of the MIT License +# (see LICENSE.txt for details) -############################################################################## -## -## This file is part of Taurus -## -## http://taurus-scada.org -## -## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain -## -## Taurus is free software: you can redistribute it and/or modify -## it under the terms of the GNU Lesser General Public License as published by -## the Free Software Foundation, either version 3 of the License, or -## (at your option) any later version. -## -## Taurus is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU Lesser General Public License for more details. -## -## You should have received a copy of the GNU Lesser General Public License -## along with Taurus. If not, see . -## -############################################################################## +""" +Provides QtGui classes and functions. +.. warning:: Contrary to qtpy.QtGui, this module exposes the namespace + available in ``PyQt4.QtGui``. + See: http://pyqt.sourceforge.net/Docs/PyQt5/pyqt4_differences.html#qtgui-module +""" +import warnings -"""This module exposes QtGui module""" +from . import PYQT5, PYQT4, PYSIDE, PYSIDE2, PythonQtError -from taurus.external.qt import API_NAME, _updateQtSubModule -__backend = API_NAME +if PYQT5: + from PyQt5.QtGui import * + # import * from QtWidgets and QtPrintSupport for PyQt4 style compat + from PyQt5.QtWidgets import * + from PyQt5.QtPrintSupport import * +elif PYSIDE2: + from PySide2.QtGui import * + # import * from QtWidgets and QtPrintSupport for PyQt4 style compat + from PySide2.QtWidgets import * + from PySide2.QtPrintSupport import * +elif PYQT4: + from PyQt4.QtGui import * -_updateQtSubModule(globals(), "QtGui") - -if __backend == 'PyQt5': - _updateQtSubModule(globals(), "QtWidgets") - -del _updateQtSubModule, API_NAME +elif PYSIDE: + from PySide.QtGui import * +else: + raise PythonQtError('No Qt bindings could be found') diff --git a/lib/taurus/external/qt/QtHelp.py b/lib/taurus/external/qt/QtHelp.py index ce467bf4b..233c9e024 100755 --- a/lib/taurus/external/qt/QtHelp.py +++ b/lib/taurus/external/qt/QtHelp.py @@ -1,32 +1,24 @@ # -*- coding: utf-8 -*- +# +# Copyright © 2009- The Spyder Development Team +# +# Licensed under the terms of the MIT License +# (see LICENSE.txt for details) -############################################################################## -## -## This file is part of Taurus -## -## http://taurus-scada.org -## -## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain -## -## Taurus is free software: you can redistribute it and/or modify -## it under the terms of the GNU Lesser General Public License as published by -## the Free Software Foundation, either version 3 of the License, or -## (at your option) any later version. -## -## Taurus is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU Lesser General Public License for more details. -## -## You should have received a copy of the GNU Lesser General Public License -## along with Taurus. If not, see . -## -############################################################################## +"""QtHelp Wrapper.""" -"""This module exposes QtHelp module""" +from . import PYQT5 +from . import PYQT4 +from . import PYSIDE +from . import PYSIDE2 -from taurus.external.qt import _updateQtSubModule +if PYQT5: + from PyQt5.QtHelp import * +elif PYSIDE2: + from PySide2.QtHelp import * +elif PYQT4: + from PyQt4.QtHelp import * +elif PYSIDE: + from PySide.QtHelp import * -_updateQtSubModule(globals(), "QtHelp") - -del _updateQtSubModule +del PYQT4, PYQT5, PYSIDE, PYSIDE2 diff --git a/lib/taurus/external/qt/QtNetwork.py b/lib/taurus/external/qt/QtNetwork.py index f807a320d..49faded79 100644 --- a/lib/taurus/external/qt/QtNetwork.py +++ b/lib/taurus/external/qt/QtNetwork.py @@ -1,32 +1,25 @@ # -*- coding: utf-8 -*- +# +# Copyright © 2014-2015 Colin Duquesnoy +# Copyright © 2009- The Spyder Development Team +# +# Licensed under the terms of the MIT License +# (see LICENSE.txt for details) -############################################################################## -## -## This file is part of Taurus -## -## http://taurus-scada.org -## -## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain -## -## Taurus is free software: you can redistribute it and/or modify -## it under the terms of the GNU Lesser General Public License as published by -## the Free Software Foundation, either version 3 of the License, or -## (at your option) any later version. -## -## Taurus is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU Lesser General Public License for more details. -## -## You should have received a copy of the GNU Lesser General Public License -## along with Taurus. If not, see . -## -############################################################################## +""" +Provides QtNetwork classes and functions. +""" -"""This module exposes QtNetwork module""" +from . import PYQT5, PYSIDE2, PYQT4, PYSIDE, PythonQtError -from taurus.external.qt import _updateQtSubModule -_updateQtSubModule(globals(), "QtNetwork") - -del _updateQtSubModule +if PYQT5: + from PyQt5.QtNetwork import * +elif PYSIDE2: + from PySide2.QtNetwork import * +elif PYQT4: + from PyQt4.QtNetwork import * +elif PYSIDE: + from PySide.QtNetwork import * +else: + raise PythonQtError('No Qt bindings could be found') diff --git a/lib/taurus/external/qt/QtSvg.py b/lib/taurus/external/qt/QtSvg.py index a806a57bb..edc075eac 100644 --- a/lib/taurus/external/qt/QtSvg.py +++ b/lib/taurus/external/qt/QtSvg.py @@ -1,32 +1,24 @@ # -*- coding: utf-8 -*- +# ----------------------------------------------------------------------------- +# Copyright © 2009- The Spyder Development Team +# +# Licensed under the terms of the MIT License +# (see LICENSE.txt for details) +# ----------------------------------------------------------------------------- +"""Provides QtSvg classes and functions.""" -############################################################################## -## -## This file is part of Taurus -## -## http://taurus-scada.org -## -## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain -## -## Taurus is free software: you can redistribute it and/or modify -## it under the terms of the GNU Lesser General Public License as published by -## the Free Software Foundation, either version 3 of the License, or -## (at your option) any later version. -## -## Taurus is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU Lesser General Public License for more details. -## -## You should have received a copy of the GNU Lesser General Public License -## along with Taurus. If not, see . -## -############################################################################## +# Local imports +from . import PYQT4, PYSIDE2, PYQT5, PYSIDE, PythonQtError -"""This module exposes QtSvg module""" +if PYQT5: + from PyQt5.QtSvg import * +elif PYSIDE2: + from PySide2.QtSvg import * +elif PYQT4: + from PyQt4.QtSvg import * +elif PYSIDE: + from PySide.QtSvg import * +else: + raise PythonQtError('No Qt bindings could be found') -from taurus.external.qt import _updateQtSubModule - -_updateQtSubModule(globals(), "QtSvg") - -del _updateQtSubModule +del PYQT4, PYQT5, PYSIDE, PYSIDE2 diff --git a/lib/taurus/external/qt/QtUiTools.py b/lib/taurus/external/qt/QtUiTools.py index 4360ca354..dbfd99a5f 100644 --- a/lib/taurus/external/qt/QtUiTools.py +++ b/lib/taurus/external/qt/QtUiTools.py @@ -23,10 +23,46 @@ ## ############################################################################## -"""This module exposes QtUiTools module""" +# -*- coding: utf-8 -*- + +############################################################################## +## +## This file is part of Taurus +## +## http://taurus-scada.org +## +## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain +## +## Taurus is free software: you can redistribute it and/or modify +## it under the terms of the GNU Lesser General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## Taurus is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public License +## along with Taurus. If not, see . +## +############################################################################## + +"""This module exposes the QtUiTools module (deprecated in taurus). +Only makes sense when using PySide(2) (which were not supported before +taurus 4.5 +""" + -from taurus.external.qt import _updateQtSubModule +from . import PYSIDE, PYSIDE2, API_NAME +from taurus.core.util import log as __log -_updateQtSubModule(globals(), "QtUiTools") +__log.deprecated(dep="taurus.external.qt.QtUiTools", rel="4.5", + alt='PySide(2).QtUiTools or PyQt(4,5).loadUi') -del _updateQtSubModule +if PYSIDE2: + from PySide2.QtUiTools import * +elif PYSIDE: + from PySide.QtUiTools import * +else: + raise ImportError('QtUiTools not supported for {}'.format(API_NAME)) \ No newline at end of file diff --git a/lib/taurus/external/qt/QtWebKit.py b/lib/taurus/external/qt/QtWebKit.py index 2135721a2..37bdc8d4a 100644 --- a/lib/taurus/external/qt/QtWebKit.py +++ b/lib/taurus/external/qt/QtWebKit.py @@ -25,8 +25,20 @@ """This module exposes QtWebKit module""" -from taurus.external.qt import _updateQtSubModule +from . import PYQT5, PYQT4, PYSIDE, PYSIDE2, PythonQtError -_updateQtSubModule(globals(), "QtWebKit") -del _updateQtSubModule +if PYQT5: + from PyQt5.WebKit import * + # import * from QtWebkitWidgets for PyQt4 style compat + from PyQt5.WebKitWidgets import * +elif PYSIDE2: + from PySide2.WebKit import * + # import * from QtWebkitWidgets for PyQt4 style compat + from PySide2.WebKitWidgets import * +elif PYQT4: + from PyQt4.WebKit import * +elif PYSIDE: + from PySide.WebKit import * +else: + raise PythonQtError('No Qt bindings could be found') diff --git a/lib/taurus/external/qt/Qwt5.py b/lib/taurus/external/qt/Qwt5.py index aba6c6901..6fa8b3a30 100644 --- a/lib/taurus/external/qt/Qwt5.py +++ b/lib/taurus/external/qt/Qwt5.py @@ -25,8 +25,13 @@ """This module exposes Qwt5 module""" -from taurus.external.qt import _updateQtSubModule -_updateQtSubModule(globals(), "Qwt5") +from . import PYQT4, API_NAME +from taurus.core.util import log as __log -del _updateQtSubModule + +if PYQT4: + __log.deprecated(dep="taurus.external.qt.Qwt5", rel="4.5") + from PyQt4.QtNetwork import * +else: + raise RuntimeError('Qwt5 bindings not supported for {}'.format(API_NAME)) \ No newline at end of file diff --git a/lib/taurus/external/qt/__init__.py b/lib/taurus/external/qt/__init__.py index 5404ad295..5e0cd94a4 100644 --- a/lib/taurus/external/qt/__init__.py +++ b/lib/taurus/external/qt/__init__.py @@ -26,40 +26,20 @@ """This module exposes PyQt4/PyQt5/PySide module""" __all__ = ["initialize", "API_NAME", - "getQtName", "getQt", "_updateQtSubModule", "requires"] + "getQtName", "getQt", "requires"] import os +import sys +import platform +from distutils.version import LooseVersion from taurus.core.util import log as __log from taurus import tauruscustomsettings as __config -# -------------------------------------------------------------------------- -# Deprecated (in Jul17) pending to be removed later on - -def getQtName(name=None, strict=True): - __log.deprecated (dep='taurus.external.qt.getQtName', - alt='taurus.external.qt.API_NAME', rel='4.0.4') - return API_NAME - - -def initialize(name=None, strict=True, logging=True, - resources=True, remove_inputhook=True): - __log.deprecated (dep='taurus.external.qt.initialize', rel='4.0.4') - return getQt() - - -def requires(origin=None, exc_class=ImportError, **kwargs): - __log.deprecated (dep='taurus.external.qt.requires', rel='4.0.4') - return True +class PythonQtError(RuntimeError): + """Error raise if no bindings could be selected.""" + pass -# Handle rename of DEFAULT_QT_AUTO_API --> DEFAULT_QT_API -if hasattr(__config, 'DEFAULT_QT_AUTO_API'): - __log.deprecated(dep='DEFAULT_QT_AUTO_API', alt='DEFAULT_QT_API', - rel='4.0.4') - if not hasattr(__config, 'DEFAULT_QT_API'): - __config.DEFAULT_QT_API = __config.DEFAULT_QT_AUTO_API - -# -------------------------------------------------------------------------- #: Qt API environment variable name QT_API = 'QT_API' @@ -73,133 +53,199 @@ def requires(origin=None, exc_class=ImportError, **kwargs): #: names of the expected PySide api PYSIDE_API = ['pyside'] -os.environ.setdefault(QT_API, getattr(__config, 'DEFAULT_QT_API', 'pyqt')) -API = os.environ[QT_API].lower() -assert API in (PYQT5_API + PYQT4_API + PYSIDE_API) +#: names of the expected PySide2 api +PYSIDE2_API = ['pyside2'] + -is_old_pyqt = is_pyqt46 = False PYQT5 = True -PYQT4 = PYSIDE = False +PYQT4 = PYSIDE = PYSIDE2 = False + +if 'PyQt5' in sys.modules: + API = 'pyqt5' +elif 'PySide2' in sys.modules: + API = 'pyside2' +elif 'PyQt4' in sys.modules: + API = 'pyqt4' +elif 'PySide' in sys.modules: + API = 'pyside' +else: + # if no binding is already loaded, use (in this order): + # - QT_API environment variable + # - tauruscustomsettings.DEFAULT_QT_API + # - 'pyqt' + API = os.environ.get(QT_API, getattr(__config, 'DEFAULT_QT_API', 'pyqt5')) + API = API.lower() + +assert API in (PYQT5_API + PYQT4_API + PYSIDE_API + PYSIDE2_API) +if API in PYQT5_API: + try: + from PyQt5.QtCore import PYQT_VERSION_STR as PYQT_VERSION + from PyQt5.QtCore import QT_VERSION_STR as QT_VERSION -class PythonQtError(Exception): - """Error raise if no bindings could be selected""" - pass + PYSIDE_VERSION = None + if sys.platform == 'darwin': + macos_version = LooseVersion(platform.mac_ver()[0]) + if macos_version < LooseVersion('10.10'): + if LooseVersion(QT_VERSION) >= LooseVersion('5.9'): + raise PythonQtError("Qt 5.9 or higher only works in " + + "macOS 10.10 or higher. Your " + + "program will fail in this " + + "system.") + elif macos_version < LooseVersion('10.11'): + if LooseVersion(QT_VERSION) >= LooseVersion('5.11'): + raise PythonQtError("Qt 5.11 or higher only works in " + + "macOS 10.11 or higher. Your " + + "program will fail in this " + + "system.") + + del macos_version + except ImportError: + __log.debug('Cannot import PyQt5. Trying with PySide2') + API = os.environ['QT_API'] = 'pyside2' -if API in PYQT5_API: +if API in PYSIDE2_API: try: - from PyQt5.Qt import PYQT_VERSION_STR as PYQT_VERSION # analysis:ignore - from PyQt5.Qt import QT_VERSION_STR as QT_VERSION # analysis:ignore - PYSIDE_VERSION = None + from PySide2 import __version__ as PYSIDE_VERSION # analysis:ignore + from PySide2.QtCore import __version__ as QT_VERSION # analysis:ignore + + PYQT_VERSION = None + PYQT5 = False + PYSIDE2 = True + + if sys.platform == 'darwin': + macos_version = LooseVersion(platform.mac_ver()[0]) + if macos_version < LooseVersion('10.11'): + if LooseVersion(QT_VERSION) >= LooseVersion('5.11'): + raise PythonQtError("Qt 5.11 or higher only works in " + + "macOS 10.11 or higher. Your " + + "program will fail in this " + + "system.") + + del macos_version except ImportError: + __log.debug('Cannot import PyQt5. Trying with PySide2') API = os.environ['QT_API'] = 'pyqt' if API in PYQT4_API: try: import sip - try: - sip.setapi('QString', 2) - sip.setapi('QVariant', 2) - sip.setapi('QDate', 2) - sip.setapi('QDateTime', 2) - sip.setapi('QTextStream', 2) - sip.setapi('QTime', 2) - sip.setapi('QUrl', 2) - except AttributeError: - # PyQt < v4.6 - pass - from PyQt4.Qt import PYQT_VERSION_STR as PYQT_VERSION # analysis:ignore - from PyQt4.Qt import QT_VERSION_STR as QT_VERSION # analysis:ignore + + sip.setapi('QString', 2) + sip.setapi('QVariant', 2) + sip.setapi('QDate', 2) + sip.setapi('QDateTime', 2) + sip.setapi('QTextStream', 2) + sip.setapi('QTime', 2) + sip.setapi('QUrl', 2) + from PyQt4.QtCore import PYQT_VERSION_STR as PYQT_VERSION # analysis:ignore + from PyQt4.QtCore import QT_VERSION_STR as QT_VERSION # analysis:ignore + PYSIDE_VERSION = None PYQT5 = False PYQT4 = True API = os.environ['QT_API'] = 'pyqt' # in case the original was "pyqt4" except ImportError: + __log.debug('Cannot import PyQt4. Trying with PySide') API = os.environ['QT_API'] = 'pyside' - else: - is_old_pyqt = PYQT_VERSION.startswith(('4.4', '4.5', '4.6', '4.7')) - is_pyqt46 = PYQT_VERSION.startswith('4.6') if API in PYSIDE_API: try: from PySide import __version__ as PYSIDE_VERSION # analysis:ignore from PySide.QtCore import __version__ as QT_VERSION # analysis:ignore + PYQT_VERSION = None PYQT5 = False PYSIDE = True except ImportError: + __log.debug('Cannot import PySide') raise PythonQtError('No Qt bindings could be found') API_NAME = {'pyqt5': 'PyQt5', 'pyqt': 'PyQt4', 'pyqt4': 'PyQt4', - 'pyside': 'PySide'}[API] + 'pyside': 'PySide', 'pyside2': 'PySide2'}[API] def __initializeQtLogging(): - # from . import QtCore - QtCore = __importQt ('QtCore') + from importlib import import_module + QtCore = import_module(API_NAME + '.QtCore') QT_LEVEL_MATCHER = { - QtCore.QtDebugMsg: __log.debug, - QtCore.QtWarningMsg: __log.warning, - QtCore.QtCriticalMsg: __log.critical, - QtCore.QtFatalMsg: __log.fatal, - QtCore.QtSystemMsg: __log.critical, + QtCore.QtDebugMsg: __log.debug, + QtCore.QtWarningMsg: __log.warning, + QtCore.QtCriticalMsg: __log.critical, + QtCore.QtFatalMsg: __log.fatal, + QtCore.QtSystemMsg: __log.critical, } if hasattr(QtCore, "qInstallMessageHandler"): + # Qt5 def taurusMessageHandler(msg_type, log_ctx, msg): f = QT_LEVEL_MATCHER.get(msg_type) return f("Qt%s %s.%s[%s]: %a", log_ctx.category, log_ctx.file, log_ctx.function, log_ctx.line, msg) + QtCore.qInstallMessageHandler(taurusMessageHandler) elif hasattr(QtCore, "qInstallMsgHandler"): + # Qt4 def taurusMsgHandler(msg_type, msg): f = QT_LEVEL_MATCHER.get(msg_type) return f("Qt: " + msg) - QtCore.qInstallMsgHandler(taurusMsgHandler) + QtCore.qInstallMsgHandler(taurusMsgHandler) def __removePyQtInputHook(): - try: - from . import QtCore + from importlib import import_module + QtCore = import_module(API_NAME + '.QtCore') + if hasattr(QtCore, "pyqtRemoveInputHook"): QtCore.pyqtRemoveInputHook() - except AttributeError: - pass -def _updateQtSubModule(glob_dict, qt_sub_module_name): - glob_dict.update(__importQt(qt_sub_module_name).__dict__) +if getattr(__config, 'QT_AUTO_INIT_LOG', True): + __initializeQtLogging() + +if getattr(__config, 'QT_AUTO_REMOVE_INPUTHOOK', True): + __removePyQtInputHook() -def __import(name): - import sys - __import__(name) - return sys.modules[name] +__log.info('Using %s (v%s , with Qt %s)', + API_NAME, + PYQT_VERSION or PYSIDE_VERSION, + QT_VERSION) -def __importQt(name): - return __import(API_NAME + "." + name) +# -------------------------------------------------------------------------- +# Deprecated (in Jul17) pending to be removed later on def getQt(name=None, strict=True): - __log.deprecated (dep='taurus.external.qt.getQt', rel='4.0.4') - if PYQT5: - import PyQt5 as _qt - elif PYQT4: - import PyQt4 as _qt - elif PYSIDE: - import PySide as _qt - else: - raise ImportError("No suitable Qt found") - return _qt + __log.deprecated(dep='taurus.external.qt.getQt', rel='4.0.4') + from importlib import import_module + return import_module(API_NAME) -if getattr(__config, 'QT_AUTO_INIT_LOG', True): - __initializeQtLogging() +def getQtName(name=None, strict=True): + __log.deprecated(dep='taurus.external.qt.getQtName', + alt='taurus.external.qt.API_NAME', rel='4.0.4') + return API_NAME -if getattr(__config, 'QT_AUTO_REMOVE_INPUTHOOK', True): - __removePyQtInputHook() + +def initialize(name=None, strict=True, logging=True, + resources=True, remove_inputhook=True): + __log.deprecated(dep='taurus.external.qt.initialize', rel='4.0.4') + return getQt() + + +def requires(origin=None, exc_class=ImportError, **kwargs): + __log.deprecated(dep='taurus.external.qt.requires', rel='4.0.4') + return True -__log.info('Using "%s" for Qt', API_NAME) +# Handle rename of DEFAULT_QT_AUTO_API --> DEFAULT_QT_API +if hasattr(__config, 'DEFAULT_QT_AUTO_API'): + __log.deprecated(dep='DEFAULT_QT_AUTO_API', alt='DEFAULT_QT_API', + rel='4.0.4') + if not hasattr(__config, 'DEFAULT_QT_API'): + __config.DEFAULT_QT_API = __config.DEFAULT_QT_AUTO_API + +# -------------------------------------------------------------------------- diff --git a/lib/taurus/external/qt/uic.py b/lib/taurus/external/qt/uic.py index 35c9e3eaf..6e97f4e8a 100644 --- a/lib/taurus/external/qt/uic.py +++ b/lib/taurus/external/qt/uic.py @@ -1,137 +1,224 @@ -# -*- coding: utf-8 -*- - -############################################################################## -## -## This file is part of Taurus -## -## http://taurus-scada.org -## -## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain -## -## Taurus is free software: you can redistribute it and/or modify -## it under the terms of the GNU Lesser General Public License as published by -## the Free Software Foundation, either version 3 of the License, or -## (at your option) any later version. -## -## Taurus is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU Lesser General Public License for more details. -## -## You should have received a copy of the GNU Lesser General Public License -## along with Taurus. If not, see . -## -############################################################################## - -"""This module exposes PyQt4/PSide uic module""" - -from builtins import object -from taurus.core.util import log -from taurus.external.qt import API_NAME - -__backend = API_NAME - -if __backend == 'PyQt4': +# In PySide, loadUi does not exist, so we define it using QUiLoader, and +# then make sure we expose that function. This is adapted from qt-helpers +# which was released under a 3-clause BSD license: +# qt-helpers - a common front-end to various Qt modules +# +# Copyright (c) 2015, Chris Beaumont and Thomas Robitaille +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the +# distribution. +# * Neither the name of the Glue project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Which itself was based on the solution at +# +# https://gist.github.com/cpbotha/1b42a20c8f3eb9bb7cb8 +# +# which was released under the MIT license: +# +# Copyright (c) 2011 Sebastian Wiesner +# Modifications by Charl Botha +# +# 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. + +from . import PYSIDE, PYSIDE2, PYQT4, PYQT5 + +if PYQT5: + + from PyQt5.uic import * + +elif PYQT4: + from PyQt4.uic import * - from PyQt4.uic import uiparser - from PyQt4.uic import properties - # prevent ui parser from logging debug messages - class __IgnoreCalls(object): - def __call__(self, *args, **kwargs): - pass +else: - uiparser.DEBUG = __IgnoreCalls() - properties.DEBUG = __IgnoreCalls() + __all__ = ['loadUi'] - def loadUI(uiFilename, parent=None): - newWidget = loadUi(uiFilename) - newWidget.setParent(parent) - return newWidget + if PYSIDE: + from PySide.QtCore import QMetaObject + from PySide.QtUiTools import QUiLoader + elif PYSIDE2: + from PySide2.QtCore import QMetaObject + from PySide2.QtUiTools import QUiLoader -elif __backend == 'PyQt5': - from PyQt5.uic import * - from PyQt5.uic import uiparser - from PyQt5.uic import properties - - # prevent ui parser from logging debug messages - class __IgnoreCalls(object): - def __call__(self, *args, **kwargs): - pass - - uiparser.DEBUG = __IgnoreCalls() - properties.DEBUG = __IgnoreCalls() - - def loadUI(uiFilename, parent=None): - newWidget = loadUi(uiFilename) - newWidget.setParent(parent) - return newWidget - -elif __backend == 'PySide': - from . import QtCore as __QtCore - from . import QtUiTools as __QtUiTools - - __uiLoader = None - class UiLoader(__QtUiTools.QUiLoader): - def __init__(self): - super(UiLoader, self).__init__() - self._rootWidget = None - - def createWidget(self, className, parent=None, name=''): - widget = super(UiLoader, self).createWidget( - className, parent, name) - - if name: - if self._rootWidget is None: - self._rootWidget = widget - elif not hasattr(self._rootWidget, name): - setattr(self._rootWidget, name, widget) - else: - log.error("Qt: Name collision! Ignoring second " - "occurrance of %r.", name) + class UiLoader(QUiLoader): + """ + Subclass of :class:`~PySide.QtUiTools.QUiLoader` to create the user + interface in a base instance. + + Unlike :class:`~PySide.QtUiTools.QUiLoader` itself this class does not + create a new instance of the top-level widget, but creates the user + interface in an existing instance of the top-level class if needed. + + This mimics the behaviour of :func:`PyQt4.uic.loadUi`. + """ + + def __init__(self, baseinstance, customWidgets=None): + """ + Create a loader for the given ``baseinstance``. + + The user interface is created in ``baseinstance``, which must be an + instance of the top-level class in the user interface to load, or a + subclass thereof. + + ``customWidgets`` is a dictionary mapping from class name to class + object for custom widgets. Usually, this should be done by calling + registerCustomWidget on the QUiLoader, but with PySide 1.1.2 on + Ubuntu 12.04 x86_64 this causes a segfault. + + ``parent`` is the parent object of this loader. + """ + + QUiLoader.__init__(self, baseinstance) + + self.baseinstance = baseinstance + + if customWidgets is None: + self.customWidgets = {} + else: + self.customWidgets = customWidgets + + def createWidget(self, class_name, parent=None, name=''): + """ + Function that is called for each widget defined in ui file, + overridden here to populate baseinstance instead. + """ + + if parent is None and self.baseinstance: + # supposed to create the top-level widget, return the base + # instance instead + return self.baseinstance + + else: + + # For some reason, Line is not in the list of available + # widgets, but works fine, so we have to special case it here. + if class_name in self.availableWidgets() or class_name == 'Line': + # create a new widget for child widgets + widget = QUiLoader.createWidget(self, class_name, parent, name) - if parent is not None: - setattr(parent, name, widget) else: - # Sadly, we can't reparent it to self, since QUiLoader - # isn't a QWidget. - log.error("Qt: No parent specified! This will probably " - "crash due to C++ object deletion.") + # If not in the list of availableWidgets, must be a custom + # widget. This will raise KeyError if the user has not + # supplied the relevant class_name in the dictionary or if + # customWidgets is empty. + try: + widget = self.customWidgets[class_name](parent) + except KeyError: + raise Exception('No custom widget ' + class_name + ' ' + 'found in customWidgets') + + if self.baseinstance: + # set an attribute for the new child widget on the base + # instance, just like PyQt4.uic.loadUi does. + setattr(self.baseinstance, name, widget) + + return widget + + def _get_custom_widgets(ui_file): + """ + This function is used to parse a ui file and look for the + section, then automatically load all the custom widget classes. + """ + + import sys + import importlib + from xml.etree.ElementTree import ElementTree + + # Parse the UI file + etree = ElementTree() + ui = etree.parse(ui_file) + + # Get the customwidgets section + custom_widgets = ui.find('customwidgets') + + if custom_widgets is None: + return {} + + custom_widget_classes = {} + + for custom_widget in custom_widgets.getchildren(): + + cw_class = custom_widget.find('class').text + cw_header = custom_widget.find('header').text - return widget + module = importlib.import_module(cw_header) - def load(self, fileOrName, parentWidget=None): - if self._rootWidget is not None: - raise Exception("UiLoader is already started loading UI!") + custom_widget_classes[cw_class] = getattr(module, cw_class) - widget = super(UiLoader, self).load(fileOrName, parentWidget) + return custom_widget_classes - if widget != self._rootWidget: - log.error("Qt: Returned widget isn't the root widget... ") + def loadUi(uifile, baseinstance=None, workingDirectory=None): + """ + Dynamically load a user interface from the given ``uifile``. - self._rootWidget = None - return widget + ``uifile`` is a string containing a file name of the UI file to load. - def loadUI(uiFilename, parent=None): - global __uiLoader - if __uiLoader is None: - __uiLoader = UiLoader() + If ``baseinstance`` is ``None``, the a new instance of the top-level + widget will be created. Otherwise, the user interface is created within + the given ``baseinstance``. In this case ``baseinstance`` must be an + instance of the top-level widget class in the UI file to load, or a + subclass thereof. In other words, if you've created a ``QMainWindow`` + interface in the designer, ``baseinstance`` must be a ``QMainWindow`` + or a subclass thereof, too. You cannot load a ``QMainWindow`` UI file + with a plain :class:`~PySide.QtGui.QWidget` as ``baseinstance``. - uiFile = __QtCore.QFile(uiFilename, parent) - if not uiFile.open(__QtCore.QIODevice.ReadOnly): - log.error("Qt: Couldn't open file %r!", uiFilename) - return None + :method:`~PySide.QtCore.QMetaObject.connectSlotsByName()` is called on + the created user interface, so you can implemented your slots according + to its conventions in your widget class. - try: - return __uiLoader.load(uiFile, parent) + Return ``baseinstance``, if ``baseinstance`` is not ``None``. Otherwise + return the newly created instance of the user interface. + """ - except: - log.exception("Exception loading UI from %r!", uiFilename) + # We parse the UI file and import any required custom widgets + customWidgets = _get_custom_widgets(uifile) - finally: - uiFile.close() - uiFile.deleteLater() + loader = UiLoader(baseinstance, customWidgets) - return None + if workingDirectory is not None: + loader.setWorkingDirectory(workingDirectory) -del API_NAME + widget = loader.load(uifile) + QMetaObject.connectSlotsByName(widget) + return widget From 48da99ee4049b1491b9e8948301fe64c31435547 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 26 Oct 2018 23:28:01 +0200 Subject: [PATCH 144/252] Add taurus.external.qt.QtWidgets module Introduce QtWidgets to allow Qt5-style code in apps using taurus.external.qt. For the moment this is only experimental --- lib/taurus/external/qt/QtWidgets.py | 143 ++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 lib/taurus/external/qt/QtWidgets.py diff --git a/lib/taurus/external/qt/QtWidgets.py b/lib/taurus/external/qt/QtWidgets.py new file mode 100644 index 000000000..25d18b3b7 --- /dev/null +++ b/lib/taurus/external/qt/QtWidgets.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- +# +# Copyright © 2014-2015 Colin Duquesnoy +# Copyright © 2009- The Spyder Developmet Team +# +# Licensed under the terms of the MIT License +# (see LICENSE.txt for details) + +""" +Provides widget classes and functions. +.. warning:: Only PyQt4/PySide QtGui classes compatible with PyQt5.QtWidgets + are exposed here. Therefore, you need to treat/use this package as if it + were the ``PyQt5.QtWidgets`` module. +""" + +from . import PYQT5, PYSIDE2, PYQT4, PYSIDE, PythonQtError + + +from taurus.core.util import log as __log + +if PYQT5: + from PyQt5.QtWidgets import * +elif PYSIDE2: + from PySide2.QtWidgets import * +elif PYQT4: + from PyQt4.QtGui import * + QStyleOptionViewItem = QStyleOptionViewItemV4 + del QStyleOptionViewItemV4 + + # These objects belong to QtGui + try: + # Older versions of PyQt4 do not provide these + del (QGlyphRun, + QMatrix2x2, QMatrix2x3, QMatrix2x4, QMatrix3x2, QMatrix3x3, + QMatrix3x4, QMatrix4x2, QMatrix4x3, QMatrix4x4, + QQuaternion, QRadialGradient, QRawFont, QRegExpValidator, + QStaticText, QTouchEvent, QVector2D, QVector3D, QVector4D, + qFuzzyCompare) + except NameError: + pass + del (QAbstractTextDocumentLayout, QActionEvent, QBitmap, QBrush, QClipboard, + QCloseEvent, QColor, QConicalGradient, QContextMenuEvent, QCursor, + QDesktopServices, QDoubleValidator, QDrag, QDragEnterEvent, + QDragLeaveEvent, QDragMoveEvent, QDropEvent, QFileOpenEvent, + QFocusEvent, QFont, QFontDatabase, QFontInfo, QFontMetrics, + QFontMetricsF, QGradient, QHelpEvent, QHideEvent, + QHoverEvent, QIcon, QIconDragEvent, QIconEngine, QImage, + QImageIOHandler, QImageReader, QImageWriter, QInputEvent, + QInputMethodEvent, QKeyEvent, QKeySequence, QLinearGradient, + QMouseEvent, QMoveEvent, QMovie, QPaintDevice, QPaintEngine, + QPaintEngineState, QPaintEvent, QPainter, QPainterPath, + QPainterPathStroker, QPalette, QPen, QPicture, QPictureIO, QPixmap, + QPixmapCache, QPolygon, QPolygonF, + QRegion, QResizeEvent, QSessionManager, QShortcutEvent, QShowEvent, + QStandardItem, QStandardItemModel, QStatusTipEvent, + QSyntaxHighlighter, QTabletEvent, QTextBlock, QTextBlockFormat, + QTextBlockGroup, QTextBlockUserData, QTextCharFormat, QTextCursor, + QTextDocument, QTextDocumentFragment, QTextDocumentWriter, + QTextFormat, QTextFragment, QTextFrame, QTextFrameFormat, + QTextImageFormat, QTextInlineObject, QTextItem, QTextLayout, + QTextLength, QTextLine, QTextList, QTextListFormat, QTextObject, + QTextObjectInterface, QTextOption, QTextTable, QTextTableCell, + QTextTableCellFormat, QTextTableFormat, QTransform, + QValidator, QWhatsThisClickedEvent, + QWheelEvent, QWindowStateChangeEvent, qAlpha, qBlue, + qGray, qGreen, qIsGray, qRed, qRgb, qRgba, QIntValidator, + QStringListModel) + + # These objects belong to QtPrintSupport + del (QAbstractPrintDialog, QPageSetupDialog, QPrintDialog, QPrintEngine, + QPrintPreviewDialog, QPrintPreviewWidget, QPrinter, QPrinterInfo) + + # These objects belong to QtCore + del (QItemSelection, QItemSelectionModel, QItemSelectionRange, + QSortFilterProxyModel) + + # Patch QComboBox to allow Python objects to be passed to userData + # patch_qcombobox(QComboBox) # We don't do it to avoid changing behaviour + + # QHeaderView: renamed methods + QHeaderView.sectionsClickable = self.isClickable + QHeaderView.sectionsMovable = self.isMovable + QHeaderView.sectionResizeMode = self.resizeMode + QHeaderView.setSectionsClickable = self.setClickable + QHeaderView.setSectionsMovable = self.setMovable + QHeaderView.setSectionResizeMode = self.setResizeMode + +elif PYSIDE: + from PySide.QtGui import * + QStyleOptionViewItem = QStyleOptionViewItemV4 + del QStyleOptionViewItemV4 + + # These objects belong to QtGui + del (QAbstractTextDocumentLayout, QActionEvent, QBitmap, QBrush, QClipboard, + QCloseEvent, QColor, QConicalGradient, QContextMenuEvent, QCursor, + QDesktopServices, QDoubleValidator, QDrag, QDragEnterEvent, + QDragLeaveEvent, QDragMoveEvent, QDropEvent, QFileOpenEvent, + QFocusEvent, QFont, QFontDatabase, QFontInfo, QFontMetrics, + QFontMetricsF, QGradient, QHelpEvent, QHideEvent, + QHoverEvent, QIcon, QIconDragEvent, QIconEngine, QImage, + QImageIOHandler, QImageReader, QImageWriter, QInputEvent, + QInputMethodEvent, QKeyEvent, QKeySequence, QLinearGradient, + QMatrix2x2, QMatrix2x3, QMatrix2x4, QMatrix3x2, QMatrix3x3, + QMatrix3x4, QMatrix4x2, QMatrix4x3, QMatrix4x4, QMouseEvent, + QMoveEvent, QMovie, QPaintDevice, QPaintEngine, QPaintEngineState, + QPaintEvent, QPainter, QPainterPath, QPainterPathStroker, QPalette, + QPen, QPicture, QPictureIO, QPixmap, QPixmapCache, QPolygon, + QPolygonF, QQuaternion, QRadialGradient, QRegExpValidator, + QRegion, QResizeEvent, QSessionManager, QShortcutEvent, QShowEvent, + QStandardItem, QStandardItemModel, QStatusTipEvent, + QSyntaxHighlighter, QTabletEvent, QTextBlock, QTextBlockFormat, + QTextBlockGroup, QTextBlockUserData, QTextCharFormat, QTextCursor, + QTextDocument, QTextDocumentFragment, + QTextFormat, QTextFragment, QTextFrame, QTextFrameFormat, + QTextImageFormat, QTextInlineObject, QTextItem, QTextLayout, + QTextLength, QTextLine, QTextList, QTextListFormat, QTextObject, + QTextObjectInterface, QTextOption, QTextTable, QTextTableCell, + QTextTableCellFormat, QTextTableFormat, QTouchEvent, QTransform, + QValidator, QVector2D, QVector3D, QVector4D, QWhatsThisClickedEvent, + QWheelEvent, QWindowStateChangeEvent, qAlpha, qBlue, qGray, qGreen, + qIsGray, qRed, qRgb, qRgba, QIntValidator, QStringListModel) + + # These objects belong to QtPrintSupport + del (QAbstractPrintDialog, QPageSetupDialog, QPrintDialog, QPrintEngine, + QPrintPreviewDialog, QPrintPreviewWidget, QPrinter, QPrinterInfo) + + # These objects belong to QtCore + del (QItemSelection, QItemSelectionModel, QItemSelectionRange, + QSortFilterProxyModel) + + # Patch QComboBox to allow Python objects to be passed to userData + # patch_qcombobox(QComboBox) # We don't do it to avoid changing behaviour + + # QHeaderView: renamed methods + QHeaderView.sectionsClickable = self.isClickable + QHeaderView.sectionsMovable = self.isMovable + QHeaderView.sectionResizeMode = self.resizeMode + QHeaderView.setSectionsClickable = self.setClickable + QHeaderView.setSectionsMovable = self.setMovable + QHeaderView.setSectionResizeMode = self.setResizeMode + +else: + raise PythonQtError('No Qt bindings could be found') From 08b9ddde5e0dfea0843ba915ff62cf70405e4a1b Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 26 Oct 2018 23:29:24 +0200 Subject: [PATCH 145/252] Update old-style signal connection to use new-stye --- lib/taurus/qt/qtgui/panel/taurusdemo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/panel/taurusdemo.py b/lib/taurus/qt/qtgui/panel/taurusdemo.py index 79e179e19..405a76a62 100644 --- a/lib/taurus/qt/qtgui/panel/taurusdemo.py +++ b/lib/taurus/qt/qtgui/panel/taurusdemo.py @@ -96,7 +96,7 @@ def addDemo(self, name, f, group): button = Qt.QPushButton(name, self) button._f = f layout.addWidget(button, row, 0) - button.connect(button, Qt.SIGNAL("clicked()"), self.go) + button.clicked.connect(self.go) def go(self): b = self.sender() From 4397c8c70ec1580adae2c62c6f5d78dc872a3456 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 26 Oct 2018 23:30:17 +0200 Subject: [PATCH 146/252] Avoid direct import of PyQt4 in Taurus --- lib/taurus/qt/qtcore/util/signal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtcore/util/signal.py b/lib/taurus/qt/qtcore/util/signal.py index 57ff3a46b..af3e2bfe8 100644 --- a/lib/taurus/qt/qtcore/util/signal.py +++ b/lib/taurus/qt/qtcore/util/signal.py @@ -3,7 +3,7 @@ from builtins import object -from PyQt4 import Qt +from taurus.external.qt import Qt from threading import Lock from weakref import WeakKeyDictionary From 26518ecd2870b6962342f3d78ae928d4fb0b94bb Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 26 Oct 2018 23:35:31 +0200 Subject: [PATCH 147/252] Use keyword args instead of positional pars in mixin classes PyQt5 and PyQt4 differ in the way they treat the multiple inheritance. This is causing exceptions when instantiating classes that inherit from a Qt class and a mixin class. A workaround seems to be to use only kwargs in the init of the mixins. TODO: This requires more attention to check if everything is really working as it should. --- lib/taurus/core/tauruslistener.py | 2 +- lib/taurus/qt/qtgui/base/taurusbase.py | 6 +++--- lib/taurus/qt/qtgui/container/taurusbasecontainer.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/taurus/core/tauruslistener.py b/lib/taurus/core/tauruslistener.py index e232097dd..6a33127cd 100644 --- a/lib/taurus/core/tauruslistener.py +++ b/lib/taurus/core/tauruslistener.py @@ -38,7 +38,7 @@ class TaurusListener(Logger): """ TaurusListener Interface""" - def __init__(self, name, parent=None): + def __init__(self, name='', parent=None): self.call__init__(Logger, name, parent) def eventReceived(self, src, type, evt_value): diff --git a/lib/taurus/qt/qtgui/base/taurusbase.py b/lib/taurus/qt/qtgui/base/taurusbase.py index 22cb359ee..e5b20ccbd 100644 --- a/lib/taurus/qt/qtgui/base/taurusbase.py +++ b/lib/taurus/qt/qtgui/base/taurusbase.py @@ -110,7 +110,7 @@ class TaurusBaseComponent(TaurusListener, BaseConfigurableClass): taurusEvent = baseSignal('taurusEvent', object, object, object) - def __init__(self, name, parent=None, designMode=False): + def __init__(self, name='', parent=None, designMode=False): """Initialization of TaurusBaseComponent""" self.modelObj = None self.modelName = '' @@ -1306,7 +1306,7 @@ class TaurusBaseWidget(TaurusBaseComponent): _dragEnabled = False - def __init__(self, name, parent=None, designMode=False): + def __init__(self, name='', parent=None, designMode=False): self._disconnect_on_hide = False self._supportedMimeTypes = None self._autoTooltip = True @@ -1910,7 +1910,7 @@ class TaurusBaseWritableWidget(TaurusBaseWidget): applied = baseSignal('applied') - def __init__(self, name, taurus_parent=None, designMode=False): + def __init__(self, name='', taurus_parent=None, designMode=False): self.call__init__(TaurusBaseWidget, name, parent=taurus_parent, designMode=designMode) diff --git a/lib/taurus/qt/qtgui/container/taurusbasecontainer.py b/lib/taurus/qt/qtgui/container/taurusbasecontainer.py index 8432374be..2ef19d98e 100644 --- a/lib/taurus/qt/qtgui/container/taurusbasecontainer.py +++ b/lib/taurus/qt/qtgui/container/taurusbasecontainer.py @@ -52,7 +52,7 @@ class TaurusBaseContainer(TaurusBaseWidget): stateWidget.model = 'sys/database/2/state' """ - def __init__(self, name, parent=None, designMode=False): + def __init__(self, name='', parent=None, designMode=False): name = name or self.__class__.__name__ self.call__init__(TaurusBaseWidget, name, From 104798927d63090dcc45ba75ba8b814511a2d80e Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 26 Oct 2018 23:37:39 +0200 Subject: [PATCH 148/252] Use conditional code depending on qt version for message handlers The api for installing message handlers changes with Qt5. Adapt the code to handle both Qt4 and Qt5 --- lib/taurus/qt/qtcore/util/tauruslog.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/taurus/qt/qtcore/util/tauruslog.py b/lib/taurus/qt/qtcore/util/tauruslog.py index 393f2fab3..296ba461a 100644 --- a/lib/taurus/qt/qtcore/util/tauruslog.py +++ b/lib/taurus/qt/qtcore/util/tauruslog.py @@ -50,14 +50,30 @@ def getQtLogger(): return qtLogger -def qtTaurusMsgHandler(type, msg): +def qtTaurusMessageHandler(msg_type, log_ctx, msg): + # Qt5 version global qtLogger if qtLogger is not None: - caller = QT_LEVEL_MATCHER.get(type) + caller = QT_LEVEL_MATCHER.get(msg_type) + return caller("Qt%s %s.%s[%s]: %a", log_ctx.category, log_ctx.file, + log_ctx.function, log_ctx.line, msg) + +def qtTaurusMsgHandler(msg_type, msg): + # Qt4 version + global qtLogger + if qtLogger is not None: + caller = QT_LEVEL_MATCHER.get(msg_type) caller(qtLogger, msg) def initTaurusQtLogger(): global qtLogger if not qtLogger: - Qt.qInstallMsgHandler(qtTaurusMsgHandler) + if hasattr(Qt, "qInstallMessageHandler"): + # Qt5 + Qt.qInstallMessageHandler(qtTaurusMessageHandler) + + elif hasattr(Qt, "qInstallMsgHandler"): + # Qt4 + Qt.qInstallMsgHandler(qtTaurusMsgHandler) + From 71b8a503a7c127951b23297d92850eff4b021fed Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 26 Oct 2018 23:39:09 +0200 Subject: [PATCH 149/252] Avoid calling obsolete QLayout.setMargin method --- lib/taurus/qt/qtgui/container/qcontainer.py | 4 ++-- lib/taurus/qt/qtgui/display/qfallback.py | 2 +- lib/taurus/qt/qtgui/display/qsevensegment.py | 2 +- lib/taurus/qt/qtgui/input/qwheel.py | 2 +- lib/taurus/qt/qtgui/input/taurusspinbox.py | 1 - 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/taurus/qt/qtgui/container/qcontainer.py b/lib/taurus/qt/qtgui/container/qcontainer.py index 3176bbf08..5bb98328f 100644 --- a/lib/taurus/qt/qtgui/container/qcontainer.py +++ b/lib/taurus/qt/qtgui/container/qcontainer.py @@ -139,14 +139,14 @@ def __init__(self, parent=None, designMode=False): def __init(self): panelLayout = Qt.QVBoxLayout() panelLayout.setSpacing(0) - panelLayout.setMargin(0) + panelLayout.setContentsMargins(0, 0, 0, 0) self.setLayout(panelLayout) self._titleBar = titleBar = Qt.QFrame() panelLayout.addWidget(titleBar, 0) l = Qt.QHBoxLayout() - l.setMargin(2) + l.setContentsMargins(2, 2, 2, 2) l.setSpacing(2) self._titleBar.setLayout(l) diff --git a/lib/taurus/qt/qtgui/display/qfallback.py b/lib/taurus/qt/qtgui/display/qfallback.py index ec8e8aae2..a1e771497 100644 --- a/lib/taurus/qt/qtgui/display/qfallback.py +++ b/lib/taurus/qt/qtgui/display/qfallback.py @@ -58,7 +58,7 @@ def __init__(self, replaces=None, parent=None, *args, **kwargs): self.replaces = replaces self.exc_info = exc_info = kwargs.get("exc_info") layout = Qt.QVBoxLayout(self) - layout.setMargin(2) + layout.setContentsMargins(2, 2, 2, 2) layout.setSpacing(2) self.setLayout(layout) self.label = Qt.QLabel(self) diff --git a/lib/taurus/qt/qtgui/display/qsevensegment.py b/lib/taurus/qt/qtgui/display/qsevensegment.py index e85dbff45..191723045 100644 --- a/lib/taurus/qt/qtgui/display/qsevensegment.py +++ b/lib/taurus/qt/qtgui/display/qsevensegment.py @@ -504,7 +504,7 @@ def __init__(self, qt_parent=None): def __init(self): l = Qt.QHBoxLayout() l.setSpacing(10) - l.setMargin(5) + l.setContentsMargins(5, 5, 5, 5) self.setLayout(l) self._digits = [] diff --git a/lib/taurus/qt/qtgui/input/qwheel.py b/lib/taurus/qt/qtgui/input/qwheel.py index 48dd9da0e..d6a6ba103 100755 --- a/lib/taurus/qt/qtgui/input/qwheel.py +++ b/lib/taurus/qt/qtgui/input/qwheel.py @@ -252,7 +252,7 @@ def _build(self): l = self.layout() l.setSpacing(0) - l.setMargin(0) + l.setContentsMargin(0, 0, 0, 0) id = self.getIntDigitCount() dd = self.getDecDigitCount() diff --git a/lib/taurus/qt/qtgui/input/taurusspinbox.py b/lib/taurus/qt/qtgui/input/taurusspinbox.py index cddfc5562..e7edf2ccc 100644 --- a/lib/taurus/qt/qtgui/input/taurusspinbox.py +++ b/lib/taurus/qt/qtgui/input/taurusspinbox.py @@ -220,7 +220,6 @@ class TaurusValueSpinBoxEx(Qt.QWidget): def __init__(self, qt_parent=None, designMode=False): Qt.QWidget.__init__(self, qt_parent) layout = Qt.QGridLayout() - layout.setMargin(0) layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) self.setLayout(layout) From 87ae64e64b80a18fc94d9865c7e19296d17d95e4 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Sat, 27 Oct 2018 06:33:40 +0200 Subject: [PATCH 150/252] Update TEP18 --- doc/source/tep/TEP18.md | 63 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index 40a0b8ef2..c620189d8 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -136,6 +136,28 @@ in debian9 introduces disruptive patching of the PyQt4 binding ([qtpy_issue119]) also be weighted in the decision. The final decision on this aspect can be left to the implementation phase itself where the various options can be tested in practice. +## Importing from taurus.external.qt VS importing directly from a binding + +Should I import from `taurus.external.qt` or directly from PyQt5 / PyQt4 / ... ? + +Until now, we recommended our users to always import the QtCore, QtGui, etc +from `taurus.external.qt`. But with the improved support to multiple bindings +in this TEP, this recommendation can be revised as follows: + +- For code that is going to be part of Taurus (and consequently potentially + used as library by other other people), Qt, QtGui, QtCore, etc. should be + imported from `taurus.external.qt`. The same applies to plugins to taurus + that intend to be used as a library (otherwise, the plugins should be capable + failing gracefully in case of incompatible bindings). + +- For an end-user application based on taurus it is probably better to import + directly from the binding (PyQt5 is the best supported) and let taurus to + adapt to that choice. Using the `taurus.external.qt` shim is also possible if + one wants to make the code binding-agnostic, but in that case one must keep + in mind that the resulting code will be less idiomatic and that the shim's + API may be eventually altered to better fit with taurus own requirements. + + ## Some examples of code that should work @@ -291,6 +313,47 @@ w = QtWidgets.QLabel() l = TaurusLabel() ``` +## Tips for writing code that is Qt binding agnostic: + +Apart from using taurus.external.qt for importing the Qt submodules, the +following tips were found useful when porting applications to taurus 4.5 + +- all signal usage must be ["new-style signals"]() + +- Multiple inheritance. See + http://pyqt.sf.net/Docs/PyQt5/pyqt4_differences.html#cooperative-multi-inheritance + - Note that in Taurus we use explicit calls to __init__ methods which + in some cases it can lead to double-calls to initialization code in pyqt5. + This needs to be addressed. + - Also note that we had to convert some positional args into keyword args in + our mixin classes (TaurusBaseComponent,...) to make them work with Qt5 + +- QLayout margin, setMargin were deprecated in Qt 4.8 , Use Use setContentsMargins() and getContentsMargins() instead. + http://doc.qt.io/archives/qt-4.8/qlayout-obsolete.html + +- be careful with qInstallMsgHandler (Qt4) vs qInstallMessageHandler (Qt5). + The following code can be used as a reference: + +``` + if hasattr(QtCore, "qInstallMessageHandler"): + # Qt5 + def taurusMessageHandler(msg_type, log_ctx, msg): + f = QT_LEVEL_MATCHER.get(msg_type) + return f("Qt%s %s.%s[%s]: %a", log_ctx.category, log_ctx.file, + log_ctx.function, log_ctx.line, msg) + + QtCore.qInstallMessageHandler(taurusMessageHandler) + elif hasattr(QtCore, "qInstallMsgHandler"): + # Qt4 + def taurusMsgHandler(msg_type, msg): + f = QT_LEVEL_MATCHER.get(msg_type) + return f("Qt: " + msg) + + QtCore.qInstallMsgHandler(taurusMsgHandler) +``` + +TODO: complete this section + ## Links to more details and discussions Discussions for this TEP (and eventually the candidate implementation) From 08d61e2cb4fce7c3290f74d2c74cfd749e34ab69 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Sat, 27 Oct 2018 06:34:34 +0200 Subject: [PATCH 151/252] Set pyqt5 as the default qt binding --- lib/taurus/tauruscustomsettings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/tauruscustomsettings.py b/lib/taurus/tauruscustomsettings.py index d1a3243da..089117f2e 100755 --- a/lib/taurus/tauruscustomsettings.py +++ b/lib/taurus/tauruscustomsettings.py @@ -109,7 +109,7 @@ # ---------------------------------------------------------------------------- #: Set preffered API if not is already loaded -DEFAULT_QT_API = 'pyqt' +DEFAULT_QT_API = 'pyqt5' #: Auto initialize Qt logging to python logging QT_AUTO_INIT_LOG = True From a70f96a2392d0032905c8cabca44c23060f88b2c Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Sat, 27 Oct 2018 06:41:52 +0200 Subject: [PATCH 152/252] Changing TEP18 state from DRAFT to CANDIDATE --- doc/source/tep/TEP18.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index c620189d8..a3bb69eef 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -1,6 +1,6 @@ Title: Implement support for Qt5 in taurus TEP: 18 - State: DRAFT + State: CANDIDATE Date: 2018-10-04 Drivers: Carlos Pascual-Izarra cpascual@cells.es URL: https://github.com/cpascual/taurus/blob/tep18/doc/source/tep/TEP18.md (provisional) @@ -393,6 +393,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ## Changes - 2018-10-04 [cpascual][]. Initial version +- 2018-11-27 [cpascual][]. Moving to CANDIDATE. Prototype implementation underway From 375859513c017b59f912ffa9e2dc58f67b006854 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Sat, 27 Oct 2018 06:54:56 +0200 Subject: [PATCH 153/252] Updating TEP18 stage in TEP index --- doc/source/tep/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/tep/index.md b/doc/source/tep/index.md index f0c77a377..3c3fdbdeb 100644 --- a/doc/source/tep/index.md +++ b/doc/source/tep/index.md @@ -24,7 +24,7 @@ Proposals list [TEP15][] | ACCEPTED | fragment-based slicing support in URIs [TEP16][] | ACCEPTED | Moving Taurus to Github [TEP17][] | DRAFT | Implement plots with pyqtgraph - [TEP18][] | DRAFT | Implement support for Qt5 in taurus + [TEP18][] | CANDIDATE | Implement support for Qt5 in taurus [TEP0]: http://www.taurus-scada.org/tep/?TEP0.md [TEP3]: http://www.taurus-scada.org/tep/?TEP3.md From b8b33096bdfd93de9d06042f1b57bfbf28509d24 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 7 Nov 2018 13:12:16 +0100 Subject: [PATCH 154/252] Add excepthook on Qt5 Since PyQt 5.5 , unhandled python exceptions cause the application to abort: http://pyqt.sf.net/Docs/PyQt5/incompatibilities.html#unhandled-python-exceptions Restore the old behaviour (just print the exception trace) for Qt5 (this can be disabled in tauruscustomsettings.QT_AVOID_ABORT_ON_EXCEPTION). --- lib/taurus/external/qt/__init__.py | 18 ++++++++++++++++++ lib/taurus/tauruscustomsettings.py | 7 +++++++ 2 files changed, 25 insertions(+) diff --git a/lib/taurus/external/qt/__init__.py b/lib/taurus/external/qt/__init__.py index 5e0cd94a4..e91448519 100644 --- a/lib/taurus/external/qt/__init__.py +++ b/lib/taurus/external/qt/__init__.py @@ -202,12 +202,30 @@ def __removePyQtInputHook(): QtCore.pyqtRemoveInputHook() +def __addExceptHook(): + """ + Since PyQt 5.5 , unhandled python exceptions cause the application to + abort: + + http://pyqt.sf.net/Docs/PyQt5/incompatibilities.html#unhandled-python-exceptions + + By calling __addExceptHook, we restore the old behaviour (just print the + exception trace). + """ + import traceback + sys.excepthook = traceback.print_exception + + if getattr(__config, 'QT_AUTO_INIT_LOG', True): __initializeQtLogging() if getattr(__config, 'QT_AUTO_REMOVE_INPUTHOOK', True): __removePyQtInputHook() +if PYQT5 and getattr(__config, 'QT_AVOID_ABORT_ON_EXCEPTION', True): + # TODO: check if we also want to do this for PySide(2) + __addExceptHook() + __log.info('Using %s (v%s , with Qt %s)', API_NAME, PYQT_VERSION or PYSIDE_VERSION, diff --git a/lib/taurus/tauruscustomsettings.py b/lib/taurus/tauruscustomsettings.py index 089117f2e..3f7967990 100755 --- a/lib/taurus/tauruscustomsettings.py +++ b/lib/taurus/tauruscustomsettings.py @@ -117,6 +117,13 @@ #: Remove input hook (only valid for PyQt4) QT_AUTO_REMOVE_INPUTHOOK = True +#: Avoid application abort on unhandled python exceptions +#: (which happens since PyQt 5.5). +#: http://pyqt.sf.net/Docs/PyQt5/incompatibilities.html#unhandled-python-exceptions +#: If True (or commented out) an except hook is added to force the old +# behaviour (exception is just printed) on pyqt5 +QT_AVOID_ABORT_ON_EXCEPTION = True + #: Select the theme to be used: set the theme dir and the theme name. #: The path can be absolute or relative to the dir of taurus.qt.qtgui.icon #: If not set, the dir of taurus.qt.qtgui.icon will be used From 1c8ab9887f87c2ec6f1280e4e91c9d04c98ff497 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 7 Nov 2018 17:20:27 +0100 Subject: [PATCH 155/252] Add QString to taurus.external.qt.QtCore QString is deprecated since taurus 4.0.1 but it is still used internally in various taurus modules and it is likely to be used in existing taurus applications. Add it to help in transition, but its use should be discouraged --- lib/taurus/external/qt/QtCore.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/taurus/external/qt/QtCore.py b/lib/taurus/external/qt/QtCore.py index a91c3fee6..c510e647e 100644 --- a/lib/taurus/external/qt/QtCore.py +++ b/lib/taurus/external/qt/QtCore.py @@ -10,9 +10,14 @@ """ Provides QtCore classes and functions. """ +from builtins import str from . import PYQT5, PYSIDE2, PYQT4, PYSIDE, PythonQtError +# Deprecated. QString is kept for now to facilitate transition, of existing +# codebut using QString should be avoided since it was deprecated +QString = str +# TODO: remove all occurrences of QString in taurus if PYQT5: from PyQt5.QtCore import * From dd2ceb7dbbef7759bc82502a36734b6224b25daf Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 7 Nov 2018 17:30:15 +0100 Subject: [PATCH 156/252] Avoid using QAbstractItemModel.reset() QAbstractItemModel is not available in Qt5. Use beginResetModel() and .endResetModel() instead. --- lib/taurus/qt/qtcore/model/taurusmodel.py | 6 ------ lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py | 3 ++- lib/taurus/qt/qtgui/panel/taurusmodellist.py | 3 ++- lib/taurus/qt/qtgui/plot/curveprops.py | 3 ++- lib/taurus/qt/qtgui/table/taurusvaluestable.py | 3 ++- lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py | 3 ++- 6 files changed, 10 insertions(+), 11 deletions(-) diff --git a/lib/taurus/qt/qtcore/model/taurusmodel.py b/lib/taurus/qt/qtcore/model/taurusmodel.py index 9239b0eed..3021514ed 100644 --- a/lib/taurus/qt/qtcore/model/taurusmodel.py +++ b/lib/taurus/qt/qtcore/model/taurusmodel.py @@ -180,12 +180,6 @@ class TaurusBaseModel(Qt.QAbstractItemModel, Logger): def __init__(self, parent=None, data=None): Qt.QAbstractItemModel.__init__(self, parent) Logger.__init__(self) - # if qt < 4.6, beginResetModel and endResetModel don't exist. In this - # case we set beginResetModel to be an empty function and endResetModel - # to be reset. - if not hasattr(Qt.QAbstractItemModel, "beginResetModel"): - self.beginResetModel = lambda: None - self.endResetModel = self.reset self._data_src = None self._rootItem = None self._filters = [] diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py index e2f1ae7b6..6d4224f34 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py @@ -296,10 +296,11 @@ def insertRows(self, position=None, rows=1, parentindex=None): def removeRows(self, position, rows=1, parentindex=None): if parentindex is None: parentindex = Qt.QModelIndex() + self.beginResetModel() self.beginRemoveRows(parentindex, position, position + rows - 1) self.curves = self.curves[:position] + self.curves[position + rows:] self.endRemoveRows() - self.reset() + self.endResetModel() return True def clearAll(self): diff --git a/lib/taurus/qt/qtgui/panel/taurusmodellist.py b/lib/taurus/qt/qtgui/panel/taurusmodellist.py index 49677870b..41e73fe9e 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmodellist.py +++ b/lib/taurus/qt/qtgui/panel/taurusmodellist.py @@ -208,10 +208,11 @@ def removeRows(self, position, rows=1, parentindex=None): '''reimplemented from :class:`Qt.QAbstractListModel`''' if parentindex is None: parentindex = Qt.QModelIndex() + self.beginResetModel() self.beginRemoveRows(parentindex, position, position + rows - 1) self.items = self.items[:position] + self.items[position + rows:] self.endRemoveRows() - self.reset() + self.endResetModel() return True def clearAll(self): diff --git a/lib/taurus/qt/qtgui/plot/curveprops.py b/lib/taurus/qt/qtgui/plot/curveprops.py index 845686e7b..983884898 100755 --- a/lib/taurus/qt/qtgui/plot/curveprops.py +++ b/lib/taurus/qt/qtgui/plot/curveprops.py @@ -274,10 +274,11 @@ def insertRows(self, position=None, rows=1, parentindex=None): def removeRows(self, position, rows=1, parentindex=None): if parentindex is None: parentindex = Qt.QModelIndex() + self.beginResetModel() self.beginRemoveRows(parentindex, position, position + rows - 1) self.curves = self.curves[:position] + self.curves[position + rows:] self.endRemoveRows() - self.reset() + self.endResetModel() return True def mimeTypes(self): diff --git a/lib/taurus/qt/qtgui/table/taurusvaluestable.py b/lib/taurus/qt/qtgui/table/taurusvaluestable.py index 81a64421e..9cf537df1 100755 --- a/lib/taurus/qt/qtgui/table/taurusvaluestable.py +++ b/lib/taurus/qt/qtgui/table/taurusvaluestable.py @@ -194,7 +194,8 @@ def setAttr(self, attr): repr(attr.data_format)) if (self._rowCount != rows) or (self._columnCount != columns): - self.reset() + self.beginResetModel() + self.endResetModel() self._rowCount = rows self._columnCount = columns diff --git a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py index e3d8432f1..4f9774b20 100644 --- a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py +++ b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py @@ -545,10 +545,11 @@ def insertRows(self, position=None, rows=1, parentindex=None): def removeRows(self, position, rows=1, parentindex=None): if parentindex is None: parentindex = Qt.QModelIndex() + self.beginResetModel() self.beginRemoveRows(parentindex, position, position + rows - 1) self.__table = self.__table[:position] + self.__table[position + rows:] self.endRemoveRows() - self.reset() + self.endResetModel() return True @staticmethod From ed03685401ce17dd9b568b918e30fecd93f9b3db Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 7 Nov 2018 19:41:50 +0100 Subject: [PATCH 157/252] Add QVariant to taurus.external.qt.QtCore if Qt4 Add a dummy QVariant implementation to taurus.external.qt.QtCore when using PyQt4 (for backwards compatibility). Make raise a deprecation warning (it was already deprecated since 4.0.1, but no warning was raised) TODO: remove QVariant from taurus code --- lib/taurus/external/qt/QtCore.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/taurus/external/qt/QtCore.py b/lib/taurus/external/qt/QtCore.py index c510e647e..1b2ac1804 100644 --- a/lib/taurus/external/qt/QtCore.py +++ b/lib/taurus/external/qt/QtCore.py @@ -74,6 +74,15 @@ class QStandardPaths(): CacheLocation = _QDesktopServices.CacheLocation writableLocation = _QDesktopServices.storageLocation + + # Deprecated. QVariant is kept for now to facilitate transition of existing + # code but using QVariant should be avoided (with API 2 it is superfluous) + # TODO: Remove all references to QVariant in taurus + from taurus.core.util.log import deprecation_decorator + @deprecation_decorator(rel='4.0.1', alt='python objects directly') + def QVariant(pyobj=None): + return pyobj + elif PYSIDE: from PySide.QtCore import * from PySide.QtCore import Signal as pyqtSignal From 2a60acddb272f93be5cb7cc02d7563e5223dc063 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 7 Nov 2018 19:42:33 +0100 Subject: [PATCH 158/252] (m) Avoid polluting the QtCore namespace --- lib/taurus/external/qt/QtCore.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/taurus/external/qt/QtCore.py b/lib/taurus/external/qt/QtCore.py index 1b2ac1804..f6c6e8277 100644 --- a/lib/taurus/external/qt/QtCore.py +++ b/lib/taurus/external/qt/QtCore.py @@ -10,13 +10,13 @@ """ Provides QtCore classes and functions. """ -from builtins import str +from builtins import str as __str from . import PYQT5, PYSIDE2, PYQT4, PYSIDE, PythonQtError -# Deprecated. QString is kept for now to facilitate transition, of existing -# codebut using QString should be avoided since it was deprecated -QString = str +# Deprecated. QString is kept for now to facilitate transition of existing +# code but using QString should be avoided since it was deprecated +QString = __str # TODO: remove all occurrences of QString in taurus if PYQT5: From 78aa983d3c0ff50c3f6f2ed6e958d8b8e5bf6bc4 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 7 Nov 2018 19:45:35 +0100 Subject: [PATCH 159/252] (doc) Update TEP18 --- doc/source/tep/TEP18.md | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index a3bb69eef..92ed822ec 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -93,7 +93,8 @@ a side-efect in an application that uses valid code (similar to the compromise t ### Plugin support -The priority is on adding PyQt5 binding support while maintaining the PyQt4 binding support. +The priority is on adding PyQt5 (v>=5.6) binding support while maintaining the PyQt4 binding (v>=4.6) +support. PySide and PySide2 support is also desirable (and probably easy since we already have the examples of the existing implementations that do so), but it is not the main goal of this propossal and therefore the TEP may get accepted even if the support for PySide/PySide2 is @@ -152,10 +153,12 @@ in this TEP, this recommendation can be revised as follows: - For an end-user application based on taurus it is probably better to import directly from the binding (PyQt5 is the best supported) and let taurus to - adapt to that choice. Using the `taurus.external.qt` shim is also possible if - one wants to make the code binding-agnostic, but in that case one must keep - in mind that the resulting code will be less idiomatic and that the shim's - API may be eventually altered to better fit with taurus own requirements. + adapt to that choice. In this way, one can write idiomatic code that matches + better the binding that has been chosen. Using the `taurus.external.qt` shim + is also possible if one wants to make the code binding-agnostic, but in that + case one must keep in mind that the resulting code will be less idiomatic + and that the shim's API may be eventually altered to better fit with taurus + own requirements. @@ -318,7 +321,29 @@ l = TaurusLabel() Apart from using taurus.external.qt for importing the Qt submodules, the following tips were found useful when porting applications to taurus 4.5 -- all signal usage must be ["new-style signals"]() +- all signal usage must be ["new-style signals"](http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html) + - and keep in mind that signals with default arguments are not + supported in exposed as various signals in PyQt>=5.3 + +- Use only APIv2 (e.g. QString should *not* be used,...). One way to ensure that + your code uses APIv2 (in case that you use PyQt4) is to + [explicitly set it](http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html) + **before importing PyQt4**: + ```python + import sip + sip.setapi('QString', 2) + sip.setapi('QVariant', 2) + sip.setapi('QDate', 2) + sip.setapi('QDateTime', 2) + sip.setapi('QTextStream', 2) + sip.setapi('QTime', 2) + sip.setapi('QUrl', 2) + ``` + +- The code should not use deprecated features. See the following for a + list of things to keep in mind: + - https://pyqt.readthedocs.io/en/latest/incompatibilities.html + - https://pyqt.readthedocs.io/en/latest/pyqt4_differences.html - Multiple inheritance. See http://pyqt.sf.net/Docs/PyQt5/pyqt4_differences.html#cooperative-multi-inheritance From 8b604031d2fda1aa1abccc56830b01c61c0b7ae6 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 7 Nov 2018 19:46:17 +0100 Subject: [PATCH 160/252] Update Changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dce6407ea..b7a944cdc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ develop branch) won't be reflected in this file. ### Added - Support of Python3 (beta stage, not yet production ready) (#703) +- Support of other Qt bindings: PyQt4, PyQt5, PySide2, PySide + (beta stage, not yet production ready) (TEP18) From 16e03b9a821cd4baf2602a82d34d8c711da631cb Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 8 Nov 2018 12:34:19 +0100 Subject: [PATCH 161/252] Fix Qt4+Qt5 problems with overloaded signals PyQt4 and PyQt5 require different syntaxes for connecting overloaded signals if the slot has optional arguments. Change such connections so that the resultant code is Qt version-agnostic by using some of the following techniques: - do not select an overladed signal when the slot does not have optional arguments - use functools.partial to "freeze" optional arguments of the slot - decorate slots with pyqtSlot - create dummy slots without optional arguments --- .../qt/qtgui/compact/abstractswitcher.py | 4 +- .../qt/qtgui/container/taurusmainwindow.py | 34 ++++++++++++---- .../qt/qtgui/extra_nexus/taurusnexuswidget.py | 6 ++- lib/taurus/qt/qtgui/graphic/taurusgraphic.py | 3 +- lib/taurus/qt/qtgui/panel/taurusform.py | 16 ++++---- lib/taurus/qt/qtgui/plot/arrayedit.py | 18 ++++----- lib/taurus/qt/qtgui/plot/curveStatsDlg.py | 2 +- lib/taurus/qt/qtgui/plot/qwtdialog.py | 7 +++- lib/taurus/qt/qtgui/plot/taurusarrayedit.py | 14 ++++--- lib/taurus/qt/qtgui/plot/taurusplot.py | 39 +++++++++++-------- lib/taurus/qt/qtgui/plot/taurustrend.py | 9 +++-- .../qtgui/table/taurusdevicepropertytable.py | 6 +-- .../qt/qtgui/table/taurusvaluestable.py | 2 +- lib/taurus/qt/qtgui/util/taurusaction.py | 3 +- 14 files changed, 103 insertions(+), 60 deletions(-) diff --git a/lib/taurus/qt/qtgui/compact/abstractswitcher.py b/lib/taurus/qt/qtgui/compact/abstractswitcher.py index 4bdf299ee..9ef5bf24e 100644 --- a/lib/taurus/qt/qtgui/compact/abstractswitcher.py +++ b/lib/taurus/qt/qtgui/compact/abstractswitcher.py @@ -138,8 +138,8 @@ def __init__(self, parent=None, designMode=False, self.exitEditAction.setShortcutContext( Qt.Qt.WidgetWithChildrenShortcut) self.addAction(self.exitEditAction) - self.enterEditAction.triggered[()].connect(self._onEnterEditActionTriggered) - self.exitEditAction.triggered[()].connect(self._onExitEditActionTriggered) + self.enterEditAction.triggered.connect(self._onEnterEditActionTriggered) + self.exitEditAction.triggered.connect(self._onExitEditActionTriggered) # add read and write widgets if self.readWClass is not None: diff --git a/lib/taurus/qt/qtgui/container/taurusmainwindow.py b/lib/taurus/qt/qtgui/container/taurusmainwindow.py index 2cf251ce9..eaf708f91 100644 --- a/lib/taurus/qt/qtgui/container/taurusmainwindow.py +++ b/lib/taurus/qt/qtgui/container/taurusmainwindow.py @@ -34,6 +34,8 @@ import os import sys +from functools import partial + from future.utils import string_types from taurus import tauruscustomsettings @@ -390,39 +392,45 @@ def __createActions(self): '''initializes the application-wide actions''' self.quitApplicationAction = Qt.QAction( Qt.QIcon.fromTheme("process-stop"), 'Exit Application', self) - self.quitApplicationAction.triggered[()].connect(self.close) + self.quitApplicationAction.triggered.connect(self.close) self.changeTangoHostAction = Qt.QAction(Qt.QIcon.fromTheme( "network-server"), 'Change Tango Host ...', self) - self.changeTangoHostAction.triggered[()].connect(self._onChangeTangoHostAction) + self.changeTangoHostAction.triggered.connect(self._onChangeTangoHostAction) # make this action invisible since it is deprecated self.changeTangoHostAction.setVisible(False) self.loadPerspectiveAction = Qt.QAction(Qt.QIcon.fromTheme( "document-open"), 'Load Perspective ...', self) - self.loadPerspectiveAction.triggered[()].connect(self.loadPerspective) + self.loadPerspectiveAction.triggered.connect( + partial(self.loadPerspective, name=None, settings=None)) self.savePerspectiveAction = Qt.QAction(Qt.QIcon.fromTheme( "document-save"), 'Save Perspective ...', self) - self.savePerspectiveAction.triggered[()].connect(self.savePerspective) + self.savePerspectiveAction.triggered.connect( + partial(self.savePerspective, name=None)) self.deletePerspectiveAction = Qt.QAction( Qt.QIcon("actions:edit-delete.svg"), 'Delete Perspective ...', self) - self.deletePerspectiveAction.triggered[()].connect(self.removePerspective) + self.deletePerspectiveAction.triggered.connect( + partial(self.removePerspective, name=None, settings=None)) self.exportSettingsFileAction = Qt.QAction( Qt.QIcon.fromTheme("document-save"), 'Export Settings ...', self) - self.exportSettingsFileAction.triggered[()].connect(self.exportSettingsFile) + self.exportSettingsFileAction.triggered.connect( + partial(self.exportSettingsFile, fname=None)) self.importSettingsFileAction = Qt.QAction( Qt.QIcon.fromTheme("document-open"), 'Import Settings ...', self) - self.importSettingsFileAction.triggered[()].connect(self.importSettingsFile) + self.importSettingsFileAction.triggered.connect( + partial(self.importSettingsFile, fname=None)) #self.resetSettingsAction = Qt.QAction(Qt.QIcon.fromTheme("edit-undo"),'Reset Settings', self) #self.connect(self.resetSettingsAction, Qt.SIGNAL("triggered()"), self.resetSettings) self.configurationAction = Qt.QAction(Qt.QIcon.fromTheme( "preferences-system"), 'Configurations ...', self) - self.configurationAction.triggered[()].connect(self.configurationDialog.show) + self.configurationAction.triggered.connect( + self.configurationDialog.show) #self.rpdb2Action = Qt.QAction("Spawn rpdb2", self) self.spawnRpdb2Shortcut = Qt.QShortcut(self) @@ -675,6 +683,8 @@ def saveSettings(self, group=None): settings.endGroup() self.info('MainWindow settings saved in "%s"' % settings.fileName()) + @Qt.pyqtSlot() + @Qt.pyqtSlot('QString') def savePerspective(self, name=None): '''Stores current state of the application as a perspective with the given name @@ -700,6 +710,8 @@ def savePerspective(self, name=None): self.saveSettings(group="Perspectives/%s" % name) self.updatePerspectivesMenu() + @Qt.pyqtSlot() + @Qt.pyqtSlot('QString') def loadPerspective(self, name=None, settings=None): '''Loads the settings saved for the given perspective. It emits a 'perspectiveChanged' signal with name as its parameter @@ -738,6 +750,8 @@ def getPerspectivesList(self, settings=None): settings.endGroup() return names + @Qt.pyqtSlot() + @Qt.pyqtSlot('QString') def removePerspective(self, name=None, settings=None): '''removes the given perspective from the settings @@ -765,6 +779,8 @@ def removePerspective(self, name=None, settings=None): settings.endGroup() self.updatePerspectivesMenu() + @Qt.pyqtSlot() + @Qt.pyqtSlot('QString') def exportSettingsFile(self, fname=None): '''copies the current settings file into the given file name. @@ -785,6 +801,8 @@ def exportSettingsFile(self, fname=None): msg = 'Settings could not be exported to %s' % str(fname) Qt.QMessageBox.warning(self, 'Export error', msg) + @Qt.pyqtSlot() + @Qt.pyqtSlot('QString') def importSettingsFile(self, fname=None): ''' loads settings (including importing all perspectives) from a given ini diff --git a/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py b/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py index 6d78ebd89..1ca1cedfb 100644 --- a/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py +++ b/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py @@ -31,6 +31,7 @@ import numpy import posixpath +from functools import partial from taurus.external.qt import Qt from PyMca5.PyMcaGui.io.hdf5 import HDF5Widget, HDF5Info, HDF5DatasetTable @@ -104,13 +105,16 @@ def __init__(self, *args, **kwargs): # connections self.__fileModel.sigFileAppended.connect(self.treeWidget.fileAppended) self.treeWidget.sigHDF5WidgetSignal.connect(self.onHDF5WidgetSignal) - self.openFileAction.triggered[()].connect(self.openFile) + self.openFileAction.triggered.connect( + partial(self.openFile, fname=None)) self.togglePreviewAction.toggled.connect(self.__previewStack.setVisible) # configuration self.registerConfigProperty( self.togglePreviewAction.isChecked, self.togglePreviewAction.setChecked, 'showPreview') + @Qt.pyqtSlot() + @Qt.pyqtSlot('QString') def openFile(self, fname=None): if fname is None: fname = str(Qt.QFileDialog.getOpenFileName( diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py index 6a19554f6..f962916ac 100755 --- a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py +++ b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py @@ -440,7 +440,8 @@ def addMenuAction(menu, k, action, last_was_separator=False): if k: configDialogAction = menu.addAction(k) if action: - configDialogAction.triggered[()].connect(lambda dev=obj_name, act=action: act(dev)) + configDialogAction.triggered.connect( + lambda dev=obj_name, act=action: act(dev)) else: configDialogAction.setEnabled(False) last_was_separator = False diff --git a/lib/taurus/qt/qtgui/panel/taurusform.py b/lib/taurus/qt/qtgui/panel/taurusform.py index ff63b514e..df1071f51 100644 --- a/lib/taurus/qt/qtgui/panel/taurusform.py +++ b/lib/taurus/qt/qtgui/panel/taurusform.py @@ -29,6 +29,7 @@ from __future__ import absolute_import from datetime import datetime +from functools import partial from future.utils import string_types @@ -137,7 +138,7 @@ def __init__(self, parent=None, self.chooseModelsAction = Qt.QAction('Modify Contents', self) self.addAction(self.chooseModelsAction) - self.chooseModelsAction.triggered[()].connect(self.chooseModels) + self.chooseModelsAction.triggered.connect(self.chooseModels) self.showButtonsAction = Qt.QAction('Show Buttons', self) self.showButtonsAction.setCheckable(True) @@ -147,7 +148,7 @@ def __init__(self, parent=None, self.changeLabelsAction = Qt.QAction('Change labels (all items)', self) self.addAction(self.changeLabelsAction) - self.changeLabelsAction.triggered[()].connect(self.onChangeLabelsAction) + self.changeLabelsAction.triggered.connect(self.onChangeLabelsAction) self.compactModeAction = Qt.QAction('Compact mode (all items)', self) self.compactModeAction.setCheckable(True) @@ -156,7 +157,7 @@ def __init__(self, parent=None, self.setFormatterAction = Qt.QAction('Set formatter (all items)', self) self.addAction(self.setFormatterAction) - self.setFormatterAction.triggered[()].connect(self.onSetFormatter) + self.setFormatterAction.triggered.connect(self.onSetFormatter) self.resetModifiableByUser() self.setSupportedMimeTypes([TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_DEV_MIME_TYPE, @@ -1076,15 +1077,16 @@ def taurusFormMain(): quitApplicationAction = Qt.QAction( Qt.QIcon.fromTheme("process-stop"), 'Close Form', dialog) - quitApplicationAction.triggered[()].connect(dialog.close) + quitApplicationAction.triggered.connect(dialog.close) saveConfigAction = Qt.QAction("Save current settings...", dialog) saveConfigAction.setShortcut(Qt.QKeySequence.Save) - saveConfigAction.triggered[()].connect(dialog.saveConfigFile) - + saveConfigAction.triggered.connect( + partial(dialog.saveConfigFile, ofile=None)) loadConfigAction = Qt.QAction("&Retrieve saved settings...", dialog) loadConfigAction.setShortcut(Qt.QKeySequence.Open) - loadConfigAction.triggered[()].connect(dialog.loadConfigFile) + loadConfigAction.triggered.connect( + partial(dialog.loadConfigFile, ifile=None)) dialog.addActions( (saveConfigAction, loadConfigAction, quitApplicationAction)) diff --git a/lib/taurus/qt/qtgui/plot/arrayedit.py b/lib/taurus/qt/qtgui/plot/arrayedit.py index dd579025b..f3c36dfc6 100644 --- a/lib/taurus/qt/qtgui/plot/arrayedit.py +++ b/lib/taurus/qt/qtgui/plot/arrayedit.py @@ -156,11 +156,11 @@ def __init__(self, parent=None): # Qt.QTimer.singleShot(0, ) # connections - self.addCPointsBT.clicked[()].connect(self._addCPointsDialog.show) - self._addCPointsDialog.editBT.clicked[()].connect(self.showEditCPointsDialog) - self._addCPointsDialog.cleanBT.clicked[()].connect(self.resetCorrection) - self._addCPointsDialog.addSingleCPointBT.clicked[()].connect(self.onAddSingleCPointBT) - self._addCPointsDialog.addRegEspCPointsBT.clicked[()].connect(self.onAddRegEspCPointsBT) + self.addCPointsBT.clicked.connect(self._addCPointsDialog.show) + self._addCPointsDialog.editBT.clicked.connect(self.showEditCPointsDialog) + self._addCPointsDialog.cleanBT.clicked.connect(self.resetCorrection) + self._addCPointsDialog.addSingleCPointBT.clicked.connect(self.onAddSingleCPointBT) + self._addCPointsDialog.addRegEspCPointsBT.clicked.connect(self.onAddRegEspCPointsBT) def plot1MousePressEvent(self, event): self.plotMousePressEvent(event, self.plot1) @@ -232,10 +232,10 @@ def makeControllerVisible(self, ctrl=None): def connectToController(self, ctrl): ctrl.selected.connect(self.changeCPointSelection) ctrl.corrSB.valueChanged.connect(self.onCorrSBChanged) - ctrl.lCopyBT.clicked[()].connect(self.onLCopy) - ctrl.rCopyBT.clicked[()].connect(self.onRCopy) - ctrl.lScaleBT.clicked[()].connect(self.onLScale) - ctrl.rScaleBT.clicked[()].connect(self.onRScale) + ctrl.lCopyBT.clicked.connect(self.onLCopy) + ctrl.rCopyBT.clicked.connect(self.onRCopy) + ctrl.lScaleBT.clicked.connect(self.onLScale) + ctrl.rScaleBT.clicked.connect(self.onRScale) def onAddSingleCPointBT(self): x = self._addCPointsDialog.singleCPointXSB.value() diff --git a/lib/taurus/qt/qtgui/plot/curveStatsDlg.py b/lib/taurus/qt/qtgui/plot/curveStatsDlg.py index 7250b2279..807b31b80 100644 --- a/lib/taurus/qt/qtgui/plot/curveStatsDlg.py +++ b/lib/taurus/qt/qtgui/plot/curveStatsDlg.py @@ -114,7 +114,7 @@ def __init__(self, parent=None): refreshAction = Qt.QAction(Qt.QIcon.fromTheme( 'view-refresh'), "Refresh available curves", self.ui.statsTW) refreshAction.setShortcut(Qt.Qt.Key_F5) - refreshAction.triggered[()].connect(self.refreshCurves) + refreshAction.triggered.connect(self.refreshCurves) self.ui.statsTW.addAction(refreshAction) # connections diff --git a/lib/taurus/qt/qtgui/plot/qwtdialog.py b/lib/taurus/qt/qtgui/plot/qwtdialog.py index 36f4ce005..f01a4c128 100644 --- a/lib/taurus/qt/qtgui/plot/qwtdialog.py +++ b/lib/taurus/qt/qtgui/plot/qwtdialog.py @@ -30,6 +30,7 @@ from __future__ import absolute_import import time +from functools import partial from taurus.external.qt import Qt, Qwt5 from taurus.qt.qtgui.util.ui import UILoadable @@ -220,8 +221,10 @@ def __init__(self, parent=None, flags=Qt.Qt.WindowFlags()): # self.connect(self.curvesAppearanceChooser, # Qt.SIGNAL("controlChanged"),self.apply) #"autoapply" mode for *all* # the curve appearance controls - self.curvesAppearanceChooser.assignToY1BT.clicked[()].connect(self.setCurvesYAxis) - self.curvesAppearanceChooser.assignToY2BT.clicked[()].connect(self.setCurvesYAxis) + self.curvesAppearanceChooser.assignToY1BT.clicked.connect( + partial(self.setCurvesYAxis, curvesNamesList=None, axis=None)) + self.curvesAppearanceChooser.assignToY2BT.clicked.connect( + partial(self.setCurvesYAxis, curvesNamesList=None, axis=None)) self.curvesAppearanceChooser.bckgndBT.clicked.connect(self.changeBackgroundColor) self.curvesAppearanceChooser.changeTitlesBT.clicked.connect(self.onChangeTitles) self.curvesAppearanceChooser.CurveTitleEdited.connect(self.onCurveTitleEdited) diff --git a/lib/taurus/qt/qtgui/plot/taurusarrayedit.py b/lib/taurus/qt/qtgui/plot/taurusarrayedit.py index a42db4d51..7cfde0950 100644 --- a/lib/taurus/qt/qtgui/plot/taurusarrayedit.py +++ b/lib/taurus/qt/qtgui/plot/taurusarrayedit.py @@ -31,7 +31,7 @@ from taurus.qt.qtgui.container import TaurusWidget from .arrayedit import ArrayEditor - +from functools import partial class TaurusArrayEditor(TaurusWidget): @@ -57,10 +57,10 @@ def __init__(self, parent=None, designMode=False): layout.addWidget(self.fromAttrBT, 1, 2) layout.addWidget(self.toAttrBT, 1, 3) - self.fromFileBT.clicked[()].connect(self.onFromFile) - self.toFileBT.clicked[()].connect(self.onToFile) - self.fromAttrBT.clicked[()].connect(self.onFromAttr) - self.toAttrBT.clicked[()].connect(self.onToAttr) + self.fromFileBT.clicked.connect(self._onFromFile) + self.toFileBT.clicked.connect(self.onToFile) + self.fromAttrBT.clicked.connect(partial(self.onFromAttr, quiet=False)) + self.toAttrBT.clicked.connect(partial(self.onToAttr, quiet=False)) def arrayEditor(self): return self._arrayEditor @@ -93,6 +93,10 @@ def setModel(self, model): return ok + def _onFromFile(self): + """dummy, just to be used as an unambiguous slot""" + self.onFromFile() + def onFromFile(self, filename=None, **kwargs): '''imports Master curve from a two-column ASCII file. The first colum will be interpreted to be the abcissas. diff --git a/lib/taurus/qt/qtgui/plot/taurusplot.py b/lib/taurus/qt/qtgui/plot/taurusplot.py index 351f775e2..f5df3fc6e 100644 --- a/lib/taurus/qt/qtgui/plot/taurusplot.py +++ b/lib/taurus/qt/qtgui/plot/taurusplot.py @@ -42,6 +42,7 @@ import time import numpy from future.utils import string_types +from functools import partial from taurus.external.qt import Qt, Qwt5 import taurus @@ -1197,11 +1198,11 @@ def __initActions(self): self._dataInspectorAction.toggled[bool].connect(self.toggleDataInspectorMode) self._setFormatterAction = Qt.QAction("Set Formatter...", None) - self._setFormatterAction.triggered[()].connect(self.onSetFormatter) + self._setFormatterAction.triggered.connect(self.onSetFormatter) self._curveStatsAction = Qt.QAction("Calculate statistics", None) self._curveStatsAction.setShortcut(Qt.Qt.Key_S) - self._curveStatsAction.triggered[()].connect(self.onCurveStatsAction) + self._curveStatsAction.triggered.connect(self.onCurveStatsAction) self._pauseAction = Qt.QAction("&Pause", None) self._pauseAction.setShortcuts([Qt.Qt.Key_P, Qt.Qt.Key_Pause]) @@ -1211,28 +1212,31 @@ def __initActions(self): self._autoscaleAllAxisAction = Qt.QAction("Autoscale all axes", None) self._autoscaleAllAxisAction.setShortcut(Qt.Qt.Key_Escape) - self._autoscaleAllAxisAction.triggered[()].connect(self.autoScaleAllAxes) + self._autoscaleAllAxisAction.triggered.connect(self.autoScaleAllAxes) self._toggleZoomAxisAction = Qt.QAction("Toggle Zoom-aware axis", None) self._toggleZoomAxisAction.setShortcut(Qt.Qt.Key_Z) - self._toggleZoomAxisAction.triggered[()].connect(self.toggleZoomer) + self._toggleZoomAxisAction.triggered.connect( + partial(self.toggleZoomer, axis=None)) self._configDialogAction = Qt.QAction("Plot configuration...", None) self._configDialogAction.setShortcut(Qt.QKeySequence("Alt+C")) - self._configDialogAction.triggered[()].connect(self.showConfigDialog) + self._configDialogAction.triggered.connect(self.showConfigDialog) self._inputDataAction = Qt.QAction("Input data selection...", None) self._inputDataAction.setShortcut(Qt.QKeySequence.New) - self._inputDataAction.triggered[()].connect(self.showDataImportDlg) + self._inputDataAction.triggered.connect(self.showDataImportDlg) self._saveConfigAction = Qt.QAction("Save current settings...", None) self._saveConfigAction.setShortcut(Qt.QKeySequence.Save) - self._saveConfigAction.triggered[()].connect(self.saveConfig) + self._saveConfigAction.triggered.connect( + partial(self.saveConfig, ofile=None, curvenames=None)) self._loadConfigAction = Qt.QAction( "&Retrieve saved settings...", None) self._loadConfigAction.setShortcut(Qt.QKeySequence.Open) - self._loadConfigAction.triggered[()].connect(self.loadConfig) + self._loadConfigAction.triggered.connect( + partial(self.loadConfig, ifile=None)) self._showLegendAction = Qt.QAction("Show &Legend", None) self._showLegendAction.setShortcut(Qt.QKeySequence("Ctrl+L")) @@ -1252,21 +1256,24 @@ def __initActions(self): self._showMinAction.toggled[bool].connect(self.showMinPeaks) self._printAction = Qt.QAction("&Print plot...", None) - self._printAction.triggered[()].connect(self.exportPrint) + self._printAction.triggered.connect(self.exportPrint) self._exportPdfAction = Qt.QAction("Export plot to PD&F...", None) - self._exportPdfAction.triggered[()].connect(self.exportPdf) + self._exportPdfAction.triggered.connect( + partial(self.exportPdf, fileName=None)) self._exportAsciiAction = Qt.QAction("Export data to &ASCII...", None) - self._exportAsciiAction.triggered[()].connect(self.exportAscii) + self._exportAsciiAction.triggered.connect( + partial(self.exportAscii, curves=None)) self._setCurvesTitleAction = Qt.QAction( "Change Curves Titles...", None) - self._setCurvesTitleAction.triggered[()].connect(self.changeCurvesTitlesDialog) + self._setCurvesTitleAction.triggered.connect( + partial(self.changeCurvesTitlesDialog, curveNamesList=None)) self._closeWindowAction = Qt.QAction( Qt.QIcon.fromTheme("process-stop"), 'Close Plot', self) - self._closeWindowAction.triggered[()].connect(self.close) + self._closeWindowAction.triggered.connect(self.close) # add all actions and limit the scope of the key shortcuts to the # widget (default is Window) @@ -2225,20 +2232,20 @@ def _axisContextMenu(self, axis=None): autoScaleThisAxis = lambda: self.setAxisAutoScale(axis=axis) autoscaleAction = menu.addAction("AutoScale %s" % axisname) - autoscaleAction.triggered[()].connect(autoScaleThisAxis) + autoscaleAction.triggered.connect(autoScaleThisAxis) if not self.getXIsTime(): switchThisAxis = lambda: self.setAxisScaleType( axis=axis, scale=None) switchThisAxisAction = menu.addAction( "Toggle linear/log for %s" % axisname) - switchThisAxisAction.triggered[()].connect(switchThisAxis) + switchThisAxisAction.triggered.connect(switchThisAxis) if axis in (Qwt5.QwtPlot.yLeft, Qwt5.QwtPlot.yRight): zoomOnThisAxis = lambda: self.toggleZoomer(axis=axis) zoomOnThisAxisAction = menu.addAction( "Zoom-to-region acts on %s" % axisname) - zoomOnThisAxisAction.triggered[()].connect(zoomOnThisAxis) + zoomOnThisAxisAction.triggered.connect(zoomOnThisAxis) elif axis in (Qwt5.QwtPlot.xBottom, Qwt5.QwtPlot.xTop): if self.isXDynScaleSupported(): diff --git a/lib/taurus/qt/qtgui/plot/taurustrend.py b/lib/taurus/qt/qtgui/plot/taurustrend.py index 3ef34e130..518d21257 100644 --- a/lib/taurus/qt/qtgui/plot/taurustrend.py +++ b/lib/taurus/qt/qtgui/plot/taurustrend.py @@ -36,6 +36,7 @@ import re import gc import weakref +from functools import partial from taurus.external.qt import Qt, Qwt5 import taurus.core @@ -946,12 +947,14 @@ def __initActions(self): self._usePollingBufferAction.toggled.connect(self.setUsePollingBuffer) self._setForcedReadingPeriodAction = Qt.QAction( "Set forced reading period...", None) - self._setForcedReadingPeriodAction.triggered[()].connect(self.setForcedReadingPeriod) + self._setForcedReadingPeriodAction.triggered.connect( + partial(self.setForcedReadingPeriod, msec=None, tsetnames=None)) self._clearBuffersAction = Qt.QAction("Clear Buffers", None) - self._clearBuffersAction.triggered[()].connect(self.clearBuffers) + self._clearBuffersAction.triggered.connect(self.clearBuffers) self._setMaxBufferSizeAction = Qt.QAction( "Change buffers size...", None) - self._setMaxBufferSizeAction.triggered[()].connect(self.setMaxDataBufferSize) + self._setMaxBufferSizeAction.triggered.connect( + partial(self.setMaxDataBufferSize, maxSize=None)) self._autoClearOnScanAction = Qt.QAction( "Auto-clear on new scans", None) self._autoClearOnScanAction.setCheckable(True) diff --git a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py index eb4d2c4b4..9860bb04a 100755 --- a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py +++ b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py @@ -202,11 +202,11 @@ def contextMenuEvent(self, event): self.info('TaurusPropTable.contextMenuEvent()') menu = Qt.QMenu(self) configDialogAction = menu.addAction("Add new property") - configDialogAction.triggered[()].connect(self.addProperty) + configDialogAction.triggered.connect(self.addProperty) configDialogAction = menu.addAction("Delete property") - configDialogAction.triggered[()].connect(self.deleteProperty) + configDialogAction.triggered.connect(self.deleteProperty) configDialogAction = menu.addAction("Edit property") - configDialogAction.triggered[()].connect(self.editProperty) + configDialogAction.triggered.connect(self.editProperty) menu.addSeparator() menu.exec_(event.globalPos()) del menu diff --git a/lib/taurus/qt/qtgui/table/taurusvaluestable.py b/lib/taurus/qt/qtgui/table/taurusvaluestable.py index 9cf537df1..9cd965d65 100755 --- a/lib/taurus/qt/qtgui/table/taurusvaluestable.py +++ b/lib/taurus/qt/qtgui/table/taurusvaluestable.py @@ -662,7 +662,7 @@ def _initActions(self): self.chooseModelAction = Qt.QAction("Choose &Model", self) self.chooseModelAction.setEnabled(self.isModifiableByUser()) self.addAction(self.chooseModelAction) - self.chooseModelAction.triggered[()].connect(self.chooseModel) + self.chooseModelAction.triggered.connect(self.chooseModel) def getModelClass(self): '''see :meth:`TaurusWidget.getModelClass`''' diff --git a/lib/taurus/qt/qtgui/util/taurusaction.py b/lib/taurus/qt/qtgui/util/taurusaction.py index 6e99b0d50..8e6d8559b 100644 --- a/lib/taurus/qt/qtgui/util/taurusaction.py +++ b/lib/taurus/qt/qtgui/util/taurusaction.py @@ -32,6 +32,7 @@ import os import xml.dom.minidom +from functools import partial from future.utils import string_types from taurus.external.qt import Qt @@ -93,7 +94,7 @@ def __init__(self, cmdargs, text=None, icon=None, parent=None, interactive=True) self.interactive = interactive self._process = [] self.setCmdArgs(cmdargs) - self.triggered.connect(self.actionTriggered) + self.triggered.connect(partial(self.actionTriggered, args=None)) self.setToolTip("Launches %s (external application)" % text) self.registerConfigProperty(self.cmdArgs, self.setCmdArgs, 'cmdArgs') From 99410c206dc42f50f1d26a7f7127c66cd9a3cb92 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 8 Nov 2018 13:00:39 +0100 Subject: [PATCH 162/252] Use 'QString' instead of str in signal signatures Change occurrences of str for "QString" in signal signatures (when selecting among signal overloads). This is more python2/python3 agnostic, as discussed in https://github.com/piertoni/taurus/issues/16#issuecomment-430583045 --- lib/taurus/qt/qtgui/display/demo/tauruslabeldemo.py | 4 ++-- lib/taurus/qt/qtgui/display/demo/tauruslcddemo.py | 4 ++-- lib/taurus/qt/qtgui/display/demo/taurusleddemo.py | 6 +++--- lib/taurus/qt/qtgui/panel/qdataexportdialog.py | 2 +- lib/taurus/qt/qtgui/tree/taurusdevicetree.py | 10 +++++----- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/taurus/qt/qtgui/display/demo/tauruslabeldemo.py b/lib/taurus/qt/qtgui/display/demo/tauruslabeldemo.py index 3bdafe6da..93136d3d5 100644 --- a/lib/taurus/qt/qtgui/display/demo/tauruslabeldemo.py +++ b/lib/taurus/qt/qtgui/display/demo/tauruslabeldemo.py @@ -97,8 +97,8 @@ def __init__(self, parent=None): model_widget.textChanged.connect(w.setModel) format_widget.textChanged.connect(w.setFormat) - fg_widget.currentIndexChanged[str].connect(w.setFgRole) - bg_widget.currentIndexChanged[str].connect(w.setBgRole) + fg_widget.currentIndexChanged['QString'].connect(w.setFgRole) + bg_widget.currentIndexChanged['QString'].connect(w.setBgRole) prefix_widget.textChanged.connect(w.setPrefixText) suffix_widget.textChanged.connect(w.setSuffixText) model_index_widget.textChanged.connect(w.setModelIndex) diff --git a/lib/taurus/qt/qtgui/display/demo/tauruslcddemo.py b/lib/taurus/qt/qtgui/display/demo/tauruslcddemo.py index e55ea38c0..91b674863 100644 --- a/lib/taurus/qt/qtgui/display/demo/tauruslcddemo.py +++ b/lib/taurus/qt/qtgui/display/demo/tauruslcddemo.py @@ -88,8 +88,8 @@ def __init__(self, parent=None): model_widget.textChanged.connect(w.setModel) model_index_widget.textChanged.connect(w.setModelIndex) - fg_widget.currentIndexChanged[str].connect(w.setFgRole) - bg_widget.currentIndexChanged[str].connect(w.setBgRole) + fg_widget.currentIndexChanged['QString'].connect(w.setFgRole) + bg_widget.currentIndexChanged['QString'].connect(w.setBgRole) model_widget.setText("sys/tg_test/1/double_scalar") fg_widget.setCurrentIndex(0) diff --git a/lib/taurus/qt/qtgui/display/demo/taurusleddemo.py b/lib/taurus/qt/qtgui/display/demo/taurusleddemo.py index 0df9382c6..796b1ccba 100644 --- a/lib/taurus/qt/qtgui/display/demo/taurusleddemo.py +++ b/lib/taurus/qt/qtgui/display/demo/taurusleddemo.py @@ -94,10 +94,10 @@ def __init__(self, parent=None): inverted_widget.toggled.connect(w.setLedInverted) model_widget.textChanged.connect(w.setModel) - fg_widget.currentIndexChanged[str].connect(w.setFgRole) + fg_widget.currentIndexChanged['QString'].connect(w.setFgRole) model_index_widget.textChanged.connect(w.setModelIndex) - on_color_widget.currentIndexChanged[str].connect(w.setOnColor) - off_color_widget.currentIndexChanged[str].connect(w.setOffColor) + on_color_widget.currentIndexChanged['QString'].connect(w.setOnColor) + off_color_widget.currentIndexChanged['QString'].connect(w.setOffColor) inverted_widget.setChecked(False) model_widget.setText("sys/tg_test/1/state") diff --git a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py index 3740a547d..12b3ff776 100755 --- a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py +++ b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py @@ -62,7 +62,7 @@ def __init__(self, parent=None, datadict=None, sortedNames=None): # connections self.exportBT.clicked.connect(self.exportData) - self.dataSetCB.currentIndexChanged[str].connect(self.onDataSetCBChange) + self.dataSetCB.currentIndexChanged['QString'].connect(self.onDataSetCBChange) self.setDataSets(datadict, sortedNames) diff --git a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py index ea702417e..c617daf0a 100644 --- a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py +++ b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py @@ -1676,11 +1676,11 @@ def defineStyle(self): # Event forwarding ... self.tree.refreshTree.connect(self.refreshTree) self.tree.nodeFound.connect(self.nodeFound) - self.tree.deviceSelected[str].connect(self.deviceSelected) - self.tree.search[str].connect(self.search) - self.tree.addAttrSelected[str].connect(self.addAttrSelected) - self.tree.removeAttrSelected[str].connect(self.removeAttrSelected) - self.tree.modelChanged[str].connect(self.modelChanged) + self.tree.deviceSelected['QString'].connect(self.deviceSelected) + self.tree.search['QString'].connect(self.search) + self.tree.addAttrSelected['QString'].connect(self.addAttrSelected) + self.tree.removeAttrSelected['QString'].connect(self.removeAttrSelected) + self.tree.modelChanged['QString'].connect(self.modelChanged) #for signal in TaurusDevTree.__pyqtSignals__: # getattr(self.tree, signal).connect( # lambda args, f=self, s=signal: getattr(f, signal).emit(args)) From b98d460f32646e3598cde1365711ed59e39339f4 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 8 Nov 2018 14:23:14 +0100 Subject: [PATCH 163/252] Remove taurusdevicetree taurus.qt.qtgui.tree.traurusdevicetree is unused in taurus, unmaintained, obsolete and marked as deprecated since 2015. A similar alternative exists as taurusdbtree. Therefore it is not worth updating it to make it compatible with Qt5. Remove it. --- CHANGELOG.md | 3 +- lib/taurus/qt/qtgui/tree/__init__.py | 3 - lib/taurus/qt/qtgui/tree/taurusdevicetree.py | 1742 ------------------ 3 files changed, 2 insertions(+), 1746 deletions(-) delete mode 100644 lib/taurus/qt/qtgui/tree/taurusdevicetree.py diff --git a/CHANGELOG.md b/CHANGELOG.md index b7a944cdc..86905828f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,8 @@ develop branch) won't be reflected in this file. - Support of other Qt bindings: PyQt4, PyQt5, PySide2, PySide (beta stage, not yet production ready) (TEP18) - +### Removed +- taurus.qt.qtgui.tree.taurusdevicetree submodule (obsolete, unused) ## [4.4.0] - 2018-07-26 diff --git a/lib/taurus/qt/qtgui/tree/__init__.py b/lib/taurus/qt/qtgui/tree/__init__.py index 01bbccc33..7bb9a4af9 100644 --- a/lib/taurus/qt/qtgui/tree/__init__.py +++ b/lib/taurus/qt/qtgui/tree/__init__.py @@ -30,6 +30,3 @@ from .qtree import * from .taurustree import * from .taurusdbtree import * - -# taurusdevicetree should be removed from taurus or merged with taurusdbtree -# from .taurusdevicetree import * diff --git a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py b/lib/taurus/qt/qtgui/tree/taurusdevicetree.py deleted file mode 100644 index c617daf0a..000000000 --- a/lib/taurus/qt/qtgui/tree/taurusdevicetree.py +++ /dev/null @@ -1,1742 +0,0 @@ -#!/usr/bin/env python - -############################################################################# -## -# This file is part of Taurus -## -# http://taurus-scada.org -## -# Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain -## -# Taurus is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -## -# Taurus is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -## -# You should have received a copy of the GNU Lesser General Public License -# along with Taurus. If not, see . -## -############################################################################# - -""" -taurusdevicetree.py: -""" - -# @todo: This module is not being used anywhere in Taurus and depends on -# non-standard and non-provided modules. It is also quite specific and -# tango-centric, so it should be removed from Taurus or merged with -# Taurusdbtree - -from __future__ import print_function - -from builtins import next -from builtins import object - -import time -import os -import re -import traceback -from functools import partial - -from future.utils import string_types - -# @todo: icons_dev_tree is not an included or standard module. -# Is anybody using it? If not, the following lines should be removed and -# the TaurusDevTree.setStateIcon method should be cleaned -try: - import icons_dev_tree -except: - icons_dev_tree = None - -from taurus.external.qt import Qt - -import taurus.core -from taurus.core.util.colors import DEVICE_STATE_PALETTE, ATTRIBUTE_QUALITY_PALETTE -from taurus.core.util.containers import CaselessDict -from taurus.core.util.fandango_search import ( - isCallable, isString, split_model_list, isSequence, isMap, - get_matching_devices, matchCl, get_alias_for_device, extend_regexp) -from taurus.qt.qtcore.util.emitter import SingletonWorker -from taurus.qt.qtcore.mimetypes import (TAURUS_MODEL_LIST_MIME_TYPE, - TAURUS_DEV_MIME_TYPE, - TAURUS_ATTR_MIME_TYPE, - TAURUS_MODEL_MIME_TYPE - ) -from taurus.qt.qtcore.util import properties -from taurus.qt.qtcore.util.properties import djoin -from taurus.qt.qtgui.base import TaurusBaseComponent, TaurusBaseWidget -from taurus.qt.qtgui.container import TaurusWidget - - -__all__ = ["TaurusDevTree", "TaurusSearchTree", "TaurusDevTreeOptions"] -TREE_ITEM_MIME_TYPE = 'application/x-qabstractitemmodeldatalist' - -############################################################################### - - -class TaurusTreeNodeContainer(object): - """ - Interface that provides Node-focused methods to TaurusDevTree - This methods should be moved to TaurusDevTreeNode class when it will be able to retrieve currentItem from Tree. - """ - _icon_map = {} # A dictionary like {device_regexp:pixmap_url} - - addAttrSelected = Qt.pyqtSignal('QStringList') - removeAttrSelected = Qt.pyqtSignal('QStringList') - - def __init__(self): - raise Exception( - 'This class is just an interface, do not instantiate it!') - - @classmethod - def setIconMap(klass, filters): - """A dictionary like {device_regexp:pixmap_url}""" - klass._icon_map = filters - - @classmethod - def getIconMap(klass): - return klass._icon_map - - def createItem(self, parent, value, text=None): - self.debug('createItem(%s,%s)' % (value, text)) - USE_TREE_NODE = False - if USE_TREE_NODE: - item = TaurusTreeNode(parent) - else: - item = Qt.QTreeWidgetItem(parent) - if text is None: - text = value - item.isAttribute = False - item.DeviceName = '' - item.draggable = '' - item.setText(0, Qt.QApplication.translate( - '', text, None, Qt.QApplication.UnicodeUTF8)) - self.setNodeParent(item, parent) - item.adminNode = None - if not item.parentNode or '/' in text: - f = item.font(0) - if not item.parentNode: - f.setBold(True) - if '/' in text: - f.setItalic(True) - item.setFont(0, f) - item.parentTree = self # hook used to call external methods with item as single argument - self.item_index[value.strip().split()[0]] = item - try: - icon = self.getNodeIcon(item) - if icon: - item.setIcon(0, icon) - except: - pass - self.item_list.add(item) - return item - - ########################################################################### - # Item members methods - - def setNodeParent(self, node, parent): - """ Used to know which parent attributes must be expanded if found """ - node.parentNode = parent if isinstance( - parent, Qt.QTreeWidgetItem) else None - - def setNodeAdmin(self, node, admin): - """ Used to assign a controller to its controlled devices in the tree """ - node.adminNode = admin.getNodeText(admin) if isinstance( - admin, Qt.QTreeWidgetItem) else None - - def getNodeAdmin(self, node): - return node.adminNode(node) if isCallable(node.adminNode) else node.adminNode - - def getNodeText(self, node=None, full=False): - """ Get the text of the node as shown in the tree, @full allows to get the first word or the whole text""" - if node is None: - node = self.currentItem() - if hasattr(node, 'text'): - txt = str(node.text(0)).strip() - if not full: - return txt.split()[0] - return txt - else: - return '' - - def getNodeDeviceName(self, node=None): - if node is None: - node = self.currentItem() - return str(getattr(node, 'DeviceName', '')) or self.getNodeText(node) - - def getNodeParentName(self, node=None): - if node is None: - node = self.currentItem() - return self.getNodeText(node.parentNode) - - def getNodePath(self, node=None): - """ Returns all parent nodes prior to current """ - if node is None: - node = self.currentItem() - p, path, names = node.parentNode, [], [] - while p is not None: - path.insert(0, p) - names.insert(0, self.getNodeDeviceName(p)) - p = p.parentNode - return path - - def getNodeAlias(self, node=None): - if node is None: - node = self.currentItem() - alias = getattr(node, 'AttributeAlias', '') - return (alias or self.getNodeText(node)) - - def getNodeIcon(self, node=None): - #self.debug('TaurusDevTree.getNodeIcon(node) not implemented, overrided in subclasses') - - #self,url = node.parentTree,'' - if node is None: - node = self.getNode() - try: - name, url = self.getNodeText(node), '' - for k, v in self.getIconMap().items(): - if re.match(k.lower(), name.lower()): - url = v - if not url: - for k, v in self.getIconMap().items(): - if k.lower() in name.lower(): - url = v - # if name.count('/')==2: - # if any(a.startswith(name+'/') for a in getArchivedAttributes()): - #url = wdir('image/icons/clock.png') - # else: - #url = wdir('image/equips/icon-%s.gif'%name.split('/')[2].split('-')[0].lower()) - # elif name.count('/')==3: - #url = filterAttributes(name) or wdir('image/icons/closetab.png') - # else: - #url = wdir('image/equips/icon-%s.gif'%name.lower()) - except: - self.warning(traceback.format_exc()) - if not url or not os.path.isfile(url): - return None - else: - return Qt.QIcon(url) - - def getNodeDraggable(self, node=None): - """ This method will return True only if the selected node belongs to a numeric Tango attribute """ - import PyTango # TODO: tango-centric - numtypes = [PyTango.DevDouble, PyTango.DevFloat, PyTango.DevLong, PyTango.DevLong64, - PyTango.DevULong, PyTango.DevShort, PyTango.DevUShort, PyTango.DevBoolean] - if node is None: - node = self.currentItem() - try: - name = self.getNodeText(node).lower() - drag = name - if node.isAttribute and getattr(node, 'DeviceName', '') and '/' not in name: - name = node.DeviceName + '/' + name - if name.count('/') == 2: # A Device Name - drag = name # +'/state' #False - elif name.count('/') == 3: # An Attribute Name - #dtype = PyTango.AttributeProxy(name).get_config().data_type - #if dtype in numtypes: self.debug('The attribute %s is a Numeric Attribute'%(name)) - drag = getattr(node, 'draggable', '') or name - # else: drag = False - self.debug('Node(%s,%s,%s): drag: %s' % - (name, node.isAttribute, node.DeviceName, drag)) - return drag.split()[0] - except: - import traceback - self.warning(traceback.format_exc()) - return False - - ########################################################################### - # Context Menu Actions - - @staticmethod - def setDefaultPanelClass(other): - TaurusTreeNodeContainer._defaultClass = other - - @staticmethod - def defaultPanelClass(): - if not hasattr(TaurusTreeNodeContainer, '_defaultClass'): - from taurus.qt.qtgui.panel import TaurusDevicePanel - TaurusTreeNodeContainer._defaultClass = TaurusDevicePanel - obj = TaurusTreeNodeContainer._defaultClass - return obj - - def showPanel(self): - '''Display widget taurusDevicePanel''' - device = self.getNodeText() - nameclass = self.defaultPanelClass()() - nameclass.setModel(device) - nameclass.show() - # nameclass.setSpectraAtkMode(True) - # Dialog is used to make new floating panels persistent - if isinstance(nameclass, TaurusWidget): - PopupDialog(self, nameclass) - - def showProperties(self): - '''Display widget TaurusPropTable''' - import taurus.qt.qtgui.table - device = self.getNodeText() - nameclass = taurus.qt.qtgui.table.TaurusPropTable() - nameclass.setModel(device) - nameclass.show() - # Dialog is used to make new floating panels persistent - PopupDialog(self, nameclass) - - def addToPlot(self): - """ This method will send a signal with the current selected node """ - items = self.getSelectedNodes() - for item in items: - attr = self.getNodeAlias(item) - self.trace('In addToPlot(%s->%s)' % (item.text(0), attr)) - self.addAttrToPlot(attr) - return - - def addAttrToPlot(self, attr): - """ This method will send a signal with the given attr name, in a separate method to be called with a pre-filled list """ - self.addAttrSelected.emit(Qt.QStringList([str(attr)])) - - def removeFromPlot(self): - """ This method will send a signal with the current selected node """ - items = self.getSelectedNodes() - for item in items: - item = self.currentItem() - attr = getattr(item, 'AttributeAlias', - '') or self.getNodeText(item) - self.removeAttrFromPlot(attr) - return - - def removeAttrFromPlot(self, attr): - """ This method will send a signal with the given attr name, in a separate method to be called with a pre-filled list """ - self.removeAttrSelected.emit(Qt.QStringList([str(attr)])) - - -############################################################################### - -class TaurusDevTree(TaurusTreeNodeContainer, Qt.QTreeWidget, TaurusBaseWidget): - ''' - This widget displays a list of servers, devices or instances. - To set a new Model use either setModel(filters), addModels(list), setFilters(...) or loadTree(filters) - setModel and loadTree are equivalent; adding a new branch to the tree - addModels merges the tree with new models - setFilters clears previous models and adds new one - ''' - - # TODO: tango-centric - __properties__ = ( - 'ModelInConfig', - 'modifiableByUser', - #'useParentModel', - 'Filters', - 'Source', - 'ShowAlias', - 'ShowColors', - 'ShowNotExported', - 'MaxDevices', - ) - __slots__ = ( - "setTangoHost", - #"setModel", - #"setFilters", - "addModels", - "setModelCheck", - "loadTree", # Applies regexp filters to database - "setTree", - "findInTree", - "setIcons", - "expandAll", - "expandNode", - "collapseNode", - ) - - TRACE_ALL = False - - refreshTree = Qt.pyqtSignal() - nodeFound = Qt.pyqtSignal() - deviceSelected = Qt.pyqtSignal('QString') - addAttrSelected = Qt.pyqtSignal('QStringList') - removeAttrSelected = Qt.pyqtSignal('QStringList') - - def __init__(self, parent=None, designMode=False): - name = "TaurusDevTree" - self._useParentModel = True - self._localModel = '' - self.call__init__wo_kw(Qt.QTreeWidget, parent) - self.call__init__(TaurusBaseWidget, name, designMode=designMode) - - self.setObjectName(name) - self._filters = [] - self.__attr_filter = None - self.__expand = 1 - self.collapsing_search = True - self.index = 0 - self._nameTopItem = "" - - # This is a list of regular expressions to exclude objects from - # searches - self.excludeFromSearch = [] - self.dictionary = {} - self.item_index = CaselessDict() - # NOTE: as several nodes may share the same name this list will be - # different from item_index.values()!!! - self.item_list = set() - self.setSelectionMode(self.ExtendedSelection) - - self.ContextMenu = [] - self.ExpertMenu = [] - - # The SingletonWorker Threads are used for expanding nodes and also for - # loading a new tree; both objects are the same thread, but read from - # different queues - self.__loader = None - self.__expander = None - - if not designMode: - self.Loader - self.Expander - - self.initConfig() - - # Signal - self.itemClicked.connect(self.deviceClicked) - self.nodeFound.connect(self.expandNode) - self.setDragDropMode(Qt.QAbstractItemView.DragDrop) - self.setModifiableByUser(True) - self.setModelInConfig(False) # We store Filters instead! - self.setAcceptDrops(True) - self.viewport().setAcceptDrops(True) - self.setDragEnabled(True) - self.setSupportedMimeTypes([ - TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_DEV_MIME_TYPE, TAURUS_ATTR_MIME_TYPE, - TAURUS_MODEL_MIME_TYPE, TREE_ITEM_MIME_TYPE, 'text/plain']) - - self.setTangoHost() - self.defineStyle() - - @property - def Loader(self): - loader = self.__loader - if loader is None: - loader = SingletonWorker(parent=self, name='TreeLoader', - cursor=True, start=True) - self.__loader = loader - return loader - - @property - def Expander(self): - expander = self.__expander - if expander is None: - expander = SingletonWorker(parent=self, name='NodeExpander', - method=lambda node, expand: node.setExpanded( - expand), - cursor=True, start=True) - self.__expander = expander - return expander - - def getConfig(self, name): - properties.get_property(self, name) - - def initConfig(self): - """ - Initializing the attributes that will be kept persitent as Qt settings. - e.g. for Filters property, the following attributes are created: - - - self.filters - - self._filters - - self.setFilters - - self.getFilters - - self.resetFilters - - """ - properties.set_property_methods(self, 'Models', 'QStringList', default='', - #setter = self.setFilters, - setter=self.addModels, # Not trivial!; it avoids QSettings erasing default model - #set_callback=lambda v,s=self:v and s.loadTree(v,clear=True), - #reset_callback=lambda s=self:s.setFilters(''), - qt=False, config=True - ) - properties.set_property_methods( - self, 'MaxDevices', 'int', default=150, qt=False, config=True) - properties.set_property_methods( - self, 'ShowAlias', 'bool', default=False, qt=False, config=True) - properties.set_property_methods( - self, 'ShowNotExported', 'bool', default=True, qt=False, config=True) - properties.set_property_methods( - self, 'ShowColors', 'bool', default=True, qt=False, config=True) - # properties.set_property_methods(self,'Expand','int',default=0) - - @staticmethod - def setDefaultAttrFilter(other): - TaurusDevTree._defattrfilter = staticmethod(other) - - @staticmethod - def defaultAttrFilter(): - if not hasattr(TaurusDevTree, '_defattrfilter'): - TaurusDevTree._defattrfilter = None - return TaurusDevTree._defattrfilter - - def setAttrFilter(self, other): - self._attrfilter = other - - def getAttrFilter(self): - if not isCallable(getattr(self, '_attrfilter', None)): - self._attrfilter = None - return self._attrfilter - - def matchAttrFilter(self, target): - def printf(s): - print(s) - if self.getAttrFilter() and isCallable(self._attrfilter): - return self._attrfilter(target, p=printf) - elif TaurusDevTree.defaultAttrFilter() and isCallable(TaurusDevTree._defattrfilter): - return TaurusDevTree._defattrfilter(target, p=printf) - else: - return True - - #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- - # TaurusBaseWidget over writing methods - #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- - - def sizeHint(self): - return Qt.QTreeWidget.sizeHint(self) - - def minimumSizeHint(self): - return Qt.QTreeWidget.minimumSizeHint(self) - - @classmethod - def getQtDesignerPluginInfo(cls): - ret = TaurusBaseWidget.getQtDesignerPluginInfo() - ret['module'] = 'taurus.qt.qtgui.tree' - ret['group'] = 'Taurus Views' - ret['icon'] = "designer:listview.png" - return ret - - def defineStyle(self): - self.setWindowTitle('TaurusDevTree') - self.setHeaderLabel( - 'Device Browser (right-click on any element to search/show options)') - self.setGeometry(Qt.QRect(90, 60, 256, 192)) - self.actionFindInTree = Qt.QAction(self) - self.actionFindInTree.setShortcut(Qt.QKeySequence.Find) - self.actionFindInTree.triggered[()].connect(self.findDialog) - #self.connect(self, Qt.SIGNAL("itemClicked"), self.clickedEvent) - from taurus.qt.qtgui.table.qdictionary import QDictionaryEditor, QListEditor - self.ExpertMenu.append( - ('Edit Model Filters', - lambda: QListEditor.main( - self._filters, - modal=True, - title='Edit Model Filters', - callback=lambda d: self.loadTree(d) - ) - # lambda:self.loadTree( - #str(Qt.QInputDialog.getText(None,'Set Tree Model','Enter a list of regexp separated by comma:',Qt.QLineEdit.Normal,','.join(str(f) for f in self._filters))[0]) - # or None) - )) - self.ExpertMenu.append( - ('Edit Tree', - lambda: QDictionaryEditor.main( - self.dictionary, modal=True, title='Edit Tree', callback=lambda d: self.setTree(d, clear=True)) - )) - self.ExpertMenu.append( - ('Expand All', - lambda: self.expandAll() - )) - self.ExpertMenu.append( - ('Collapse All', - lambda: self.collapseNode(ALL=True) - )) - self.ExpertMenu.append( - ('Save Config', - lambda: self.saveConfigFile() - )) - if not getattr(self, 'DeviceMenu', None): - self.DeviceMenu = {} - self.DeviceMenu.update({ - 'Show Properties': 'showProperties', - 'Refresh Tree': 'refreshTree', - }) - if not getattr(self, 'AttributeMenu', None): - self.AttributeMenu = [] - [self.AttributeMenu.append(a) for a in [ - ('Add to trends', 'addToPlot'), - ('Remove from trends', 'removeFromPlot'), - ] if a not in self.AttributeMenu] - try: - from PyTangoArchiving.widget.history import show_history - self.debug('Adding show_history from archiving...') - self.AttributeMenu.append(('Show History', show_history)) - except: - pass - - def trace(self, msg): - if self.TRACE_ALL or self.getLogLevel() in ('DEBUG', 40,): - # @TODO: use the taurus logger instead! ~~cpascual 20121121 - print('TaurusDevTree.%s: %s' % (self.getLogLevel(), msg)) - - def setTangoHost(self, tango_host=None): - self.db = taurus.Authority(tango_host) - - # model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel, - # TaurusBaseWidget.setModel, - # TaurusBaseWidget.resetModel) - - def getModel(self): - return self._filters - - def getModelClass(self): - return list # taurus.core.taurusauthority.TaurusAuthority - - def setModel(self, model): - TaurusBaseWidget.setModel(self, model) - - def setModelCheck(self, model): - # Called from TaurusBaseWidget.setModel() - self.trace('setModelCheck(%s)' % str(model)[:80]) - self.loadTree(model) - - @Qt.pyqtSlot('QStringList') - def addModels(self, modelNames): - '''Adds models to the existing ones: - :param modelNames: (sequence) the names of the models to be added - .. seealso:: :meth:`removeModels` - ''' - self.trace('In addModels(%s)' % str(modelNames)[:80]) - modelNames = split_model_list(modelNames) - self.setTree(self.getTangoDict(modelNames), clear=False) - if isSequence(modelNames): - self._filters = sorted( - set(split_model_list(self._filters) + modelNames)) - elif isMap(modelNames): - if isMap(self._filters): - self._filters.update(modelNames) - else: - self._filters = modelNames - - ########################################################################## - # Loading/Cleaning the tree - - # def loadTree(self,filters,clear=False): - #''' - # This method show a list of instances and devices depending on the given servers in QTProperty or in another widget, - # this method can be used to connect TauDevTree with another widget such as LineEdit. - #''' - #self.trace('In loadTree(%s)'%str(filters)) - #if clear: self.setWindowTitle('TaurusDevTree:%s'%str(filters)) - # self.setTree(self.getTangoDict(filters),clear=clear,alias=False) - - def loadTree(self, filters): - try: - if isString(filters): - try: - assert '{' in filters - filters = dict(filters) - except: - filters = split_model_list(filters) - self.trace('loadTree(%s)' % (filters)) - assert isMap(filters) or isSequence( - filters), "Filters have to be map, string or list type!" - # self._filters = filters - properties.set_property(self, 'Filters', filters) - if isSequence(filters): - self.setWindowTitle('TaurusDevTree:%s' % str(filters)) - dct = self.getTangoDict(filters) - else: # if isMap(filters): - self.setWindowTitle('TaurusDevTree:%s' % - ','.join(filters)) - - def expand_dict(d): - return [x for v in d.values() for x in (expand_dict(v) if hasattr(v, 'values') else (v,))] - targets = [t.upper() for t in get_matching_devices( - ['*%s*' % f if '*' not in f else f for f in expand_dict(filters)])] - - def get_devs(f): - return dict.fromkeys(t for t in targets if matchCl(f, t)) - - def expand_filter(f): - return dict((k, expand_filter(v) if hasattr(v, 'values') else get_devs(v)) for k, v in f.items() if v) - dct = expand_filter(filters) - # self.Loader.next([self.setTree,dct,True]) - self.setTree(dct, clear=True) - except: - self.warning('TaurusDeviceTree.loadTree(%s):\n%s' % - (filters, traceback.format_exc())) - - def setTree(self, diction, clear=False): - """ - Initializes the tree from a dictionary {'Node0.0':{'Node1.0':None,'Node1.1':None}} - """ - K = len(str(dict(diction))) - self.trace('In setTree(%d) ...' % K) - self.debug(diction) - if diction is None: - return - if clear or self.dictionary: - if not clear: - # Merging new and old models - diction = djoin(diction, self.dictionary) - self.clear() - self.dictionary = diction - if len(diction): - self.setNodeTree(self, diction, alias=( - self.getShowAlias() or K < self.getMaxDevices() * 20)) - # Auto-Expand caused problems when loading filters from QSettings - if 0 < len(self.item_list) < self.getMaxDevices(): - self.expandAll(queue=False) - - def setNodeTree(self, parent, diction, alias=False): - """ - It has parent as argument to allow itself to be recursive - Initializes the node tree from a dictionary {'Node0.0':{'Node1.0':None,'Node1.1':None}} - """ - self.debug('In setNodeTree(%d,alias=%s) ...' % (len(diction), alias)) - if not hasattr(diction, 'keys'): - diction = dict.fromkeys(diction) - for node in sorted(diction.keys()): - assert int(self.index) < 10000000000, 'TooManyIterations!' - self.index = self.index + 1 - dev_alias = alias and str(node).count( - '/') == 2 and get_alias_for_device(node) - text = '%s (%s)' % (node, dev_alias) if dev_alias else node - if diction[node] and any(diction[node]): - item = self.createItem(parent, node, text) - self.setNodeTree(item, diction[node], alias) - else: - item = self.createItem(parent, node, text) - - def clear(self): - while not self.Expander.getQueue().empty(): - self.Expander.getQueue().get() - self.item_index.clear() - while self.item_list: - self.item_list.pop() - Qt.QTreeWidget.clear(self) - - def refreshTree(self): - self.loadTree(self._filters) - self.refreshTree.emit() - - #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- - # @name Methods for building server/devices/attributes tree - # @{ - #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- - - def getTangoDict(self, filters): - self.trace('In TaurusDevTree.getTangoDict(%s(%s))' % - (type(filters), str(filters)[:80])) - if filters is None: - return - result = {} - filters = split_model_list(filters) - targets = get_matching_devices(filters) - targets = [t.upper() for t in targets] - domains = set(t.split('/')[0] for t in targets) - for d in domains: - families = set(t.split('/')[1] - for t in targets if t.startswith('%s/' % d)) - result[d] = dict((f, dict.fromkeys( - t for t in targets if t.startswith('%s/%s/' % (d, f)))) for f in families) - return result - - def addAttrToDev(self, my_device, expert=False, allow_types=None): - """ This command returns the list of attributes of a given device applying display level and type filters. - @argin expert If False only PyTango.DispLevel.OPERATOR attributes are displayed - @argin allow_types Only those types included in the list will be displayed (e.g. may be restricted to numeric types only) - """ - import PyTango # TODO: tango-centric - numeric_types = [PyTango.DevDouble, PyTango.DevFloat, PyTango.DevLong, PyTango.DevLong64, - PyTango.DevULong, PyTango.DevShort, PyTango.DevUShort, PyTango.DevBoolean, PyTango.DevState] - allow_types = allow_types or [PyTango.DevString] + numeric_types - dct = {} - self.trace('In addAttrToDev(%s)' % my_device) - try: - proxy = PyTango.DeviceProxy(my_device) - timeout = proxy.get_timeout_millis() - proxy.set_timeout_millis(50) - proxy.ping() - list_attr = proxy.attribute_list_query() - proxy.set_timeout_millis(timeout) - - for aname, my_attr in sorted([(a.name, a) for a in list_attr]): - if allow_types and my_attr.data_type not in allow_types: - continue - if not expert and my_attr.disp_level == PyTango.DispLevel.EXPERT: - continue - label = aname == my_attr.label and aname.lower( - ) or "%s (%s)" % (aname.lower(), my_attr.label) - dct[str(my_device).lower() + '/' + label] = 0 - except PyTango.DevFailed as e: - self.warning('addAttrToDev(%s): %s' % (my_device, str(e))) - qmsg = Qt.QMessageBox(Qt.QMessageBox.Critical, '%s Error' % - my_device, '%s not available' % my_device, Qt.QMessageBox.Ok, self) - qmsg.show() - except Exception as e: - self.warning('addAttrToDev(%s): %s' % (my_device, str(e))) - qmsg = Qt.QMessageBox(Qt.QMessageBox.Critical, '%s Error' % - my_device, str(e), Qt.QMessageBox.Ok, self) - qmsg.show() - return dct - - def addAttrToNode(self, node=None, full=False): - node = node or self.currentItem() - dev = self.getNodeDeviceName(node) - self.trace('In addAttrToNode(%s)' % dev) - attrs = self.addAttrToDev(dev) - children = [str(node.child(i).text(0)).lower() - for i in range(node.childCount())] - for aname in sorted(attrs): - tag = aname.rsplit('/')[-1] - if tag.lower() in children: - continue - elif not full and not self.matchAttrFilter(aname): - continue - else: - natt = self.createItem(node, value=aname, text=tag) - natt.draggable = aname.split()[0].strip() - natt.isAttribute = True - natt.DeviceName = dev - icon = self.getNodeIcon(natt) - if icon: - natt.setIcon(0, icon) - # it gets all aliases for this device attributes - alias = getattr(node, 'AttributeAlias', {}) - if alias: - self.trace('Got aliases for %s: %s' % (aname, alias)) - [setattr(natt, 'AttributeAlias', v) - for k, v in alias.items() if k in aname.lower()] - else: - natt.AttributeAlias = aname.split()[0].strip() - node.setExpanded(True) - return - - ########################################################################### - # Node getters - - def getNode(self, target=None): - """ Gets currrent node or node by name or by regexp """ - if target is None: - return self.currentItem() - else: - nodes = self.getMatchingNodes(target, 1) - if not nodes: - return None - else: - return nodes[0] - return - - def getNodeByName(self, key): - return self.item_index[key] - - def getNodeList(self): - return list(self.item_index.keys()) - - def getMatchingNodes(self, regexp, limit=0, all=False, exclude=None): - """ It returns all nodes matching the given expression. """ - result, regexp = [], str(regexp).lower() - exclude = exclude or [] - self.trace('In TauDevTree.getMatchingNodes(%s,%s,%s,%s)' % - (regexp, limit, all, exclude)) - if not all: - node = self.item_index.get(regexp, None) - if node is not None: - return [node] - regexp = re.compile(extend_regexp(regexp)) - for k, node in self.item_index.items(): - nname = self.getNodeText(node, full=True).lower() - if (regexp.match(k) or regexp.match(nname)) and \ - (not exclude or not any(re.match(x.lower(), y) for x in exclude for y in (k.lower(), nname))): - result.append(node) - if not all and len(result) == 1: - break - if limit and len(result) >= limit: - break - return result - - def getSelectedNodes(self): - return self.selectedItems() - - def getAllNodes(self): - """ Returns a list with all node objects. """ - def get_child_nodes(dct, node, fun=None): - if fun: - fun(node) - dct.update([(str(node.text(0)), node)]) - for j in range(node.childCount()): - get_child_nodes(dct, node.child(j)) - return dct - dct = {} - for i in range(self.topLevelItemCount()): - get_child_nodes(dct, self.topLevelItem(i)) - return dct - - def unpackChildren(self): - """ removes all nodes from the tree and returns them in a list, used for resorting """ - allChildren = [] - - for node in self.getAllNodes().values(): - allChildren.extend(node.takeChildren()) - while self.topLevelItemCount(): - allChildren.append(self.takeTopLevelItem(0)) - return allChildren - - # @} - ########################################################################## - - ########################################################################### - # Expand/Collapse/Search nodes - - def collapseNode(self, ALL=False, filters='', fun=None): - """ Collapses the whole tree or from a given node. - @argin ALL tells whether to collapse from current item or the whole tree - @argin filters Allows to set a list of nodes to not be filtered - - """ - filters = str(filters).lower() - found = '' - self.debug('In TaurusTree.collapseAll(%s)' % filters) - todelete = [] - - def expand_child_nodes(node): - result = int(bool(filters)) - if fun: - fun(node) - if not node: - return '' - for j in range(node.childCount()): - child = node.child(j) - result = expand_child_nodes(child) - if filters and re.search(filters, str(child.text(0)).lower()): - self.debug('In TaurusTree.collapseAll(%s): %s matches!' % ( - filters, str(child.text(0)).lower())) - result = True - elif not result: - child.setExpanded(False) - # When collapsing all attribute lists are cleaned up - aname = '/'.join(['[0-9a-zA-Z\-\_]+'] * 4) - if re.match(aname, str(child.text(0))): - todelete.append((node, child)) - if not result: - node.setExpanded(False) - return result - if ALL: - for i in range(self.topLevelItemCount()): - found = expand_child_nodes(self.topLevelItem(i)) or found - else: - found = expand_child_nodes(self.currentItem()) or found - for node, child in todelete: # Pruning attribute nodes - node.removeChild(child) - del child - return found - - ########################################################################### - # New expand/search methods - - def expandNode(self, node=None, expand=True): - """ Needed to do threaded expansion of the tree """ - if node is None: - node = self.getNode() - if isinstance(node, string_types + (Qt.QString,)): - name, node = str(node), self.getNode(node) - else: - name = self.getNodeText(node) - node.setExpanded(expand) - return expand - - def expandAll(self, queue=True): - self.findInTree('*', select=False, queue=queue) - - def findDialog(self): - self.findInTree(str(Qt.QInputDialog.getText( - self, 'Search ...', 'Write a part of the name', Qt.QLineEdit.Normal)[0])) - - @Qt.pyqtSlot('QString') - def findInTree(self, regexp, collapseAll=None, exclude=None, select=True, queue=True): - self.trace('In TauTree.findInTree(%s)' % regexp) - if collapseAll is None: - collapseAll = self.collapsing_search - regexp = str(regexp).lower().strip() - exclude = (lambda x: x if hasattr(x, '__iter__') else [x])( - exclude or self.excludeFromSearch or []) - if not regexp: - return - try: - t0 = time.time() - nodes = self.getMatchingNodes(regexp, all=True, exclude=exclude) - if len(nodes) > 150: - v = Qt.QMessageBox.warning(None, 'Device Tree Search', - 'Your search matches too many devices (%d) and may slow down the application.\nDo you want to continue?' % len( - nodes), - Qt.QMessageBox.Ok | Qt.QMessageBox.Cancel) - if v == Qt.QMessageBox.Cancel: - self.debug('Search cancelled by user.') - return - if nodes: - # It's good to have first node matched to be selected fast - if select: - nodes[0].setSelected(True) - self.setCurrentItem(nodes[0]) - # Searches must not trigger events! - self.emitSelected(self.getNodeDeviceName(nodes[0])) - self.debug('The selected node is %s' % - self.getNodeText(nodes[0])) - # Then proceed to expand/close the rest of nodes - parents = set( - parent for node in nodes for parent in self.getNodePath(node) if parent) - for item in self.item_list: - matched, expanded = item in parents, item.isExpanded() - if (matched and not expanded): - if queue: - self.Expander.getQueue().put((item, True)) - else: - item.setExpanded(True) - elif (not matched and expanded and self.collapsing_search): - if queue: - self.Expander.getQueue().put((item, False)) - else: - item.setExpanded(False) - if select: - self.scrollTo(self.indexFromItem( - nodes[0]), Qt.QAbstractItemView.PositionAtTop) # Center) - self.debug('\tfindInTree(%s): %d nodes found in %f s' % - (regexp, len(nodes), time.time() - t0)) - else: - if collapseAll: - if queue: - [self.Expander.getQueue().put((item, False)) - for item in self.item_list if item.isExpanded()] - else: - [item.setExpanded(False) - for item in self.item_list if item.isExpanded()] - self.debug('findInTree(%s): Node not found' % (regexp)) - if queue: - self.Expander.next() - except: - self.warning('findInTree(%s): failed' % (regexp)) - self.error(traceback.format_exc()) - - def sortCustom(self, order): - assert order and len(order), 'sortCustom(order) must not be empty' - allChildren = {} - while self.topLevelItemCount(): - it = self.takeTopLevelItem(0) - allChildren[str(it.text(0))] = it - - sorter = lambda k, ks=[re.compile(c) for c in order]: str( - next((i for i, r in enumerate(ks) if r.match(k.lower())))) + str(k) - for c, it in sorted(allChildren.items(), key=lambda k: sorter(k[0])): - self.debug('tree.sortCustom(%s): %s inserted at %d' % - (order, it.text(0), self.topLevelItemCount())) - self.insertTopLevelItem(self.topLevelItemCount(), it) - return - - ########################################################################### - # Update node colors - - def setIcons(self, dct={}, root_name=None, regexps=True): - ''' - This method change the icons depending of the status of the devices - Dict is a dictionary with name of device and colors such as {name_device:color,name_device2:color2} - An alternative may be an icon name! - ''' - #secs = time.time() - #ID = int(100*random.random()) - state2color = lambda state: Qt.QColor( - DEVICE_STATE_PALETTE.number(state)) - #quality2color = lambda attr: Qt.QColor(ATTRIBUTE_QUALITY_PALETTE.number(quality)) - - def update_node(node, key, dct): - if hasattr(node, 'CustomForeground'): - node.setForeground(0, Qt.QBrush( - Qt.QColor(node.CustomForeground))) - if hasattr(node, 'CustomBackground'): - node.setBackground(0, Qt.QBrush( - Qt.QColor(node.CustomBackground))) - elif hasattr(node, 'StateBackground'): - node.setBackground(0, Qt.QBrush(state2color(dct[key]))) - if hasattr(node, 'CustomIcon'): - node.setIcon(0, Qt.QIcon(node.CustomIcon)) - else: - #key = str(node.text(0)).split(' ')[0] - if key.count('/') == 2: - self.setStateIcon(node, dct and dct[key] or '') - return - - if not isinstance(dct, dict): - dct = dict.fromkeys(dct, '') - nodes = self.getAllNodes() - for name, node in nodes.items(): - name = str(name).split()[0] - if node.isHidden(): - continue - if regexps: - matches = [v for k, v in dct.items() if re.match( - k.lower(), name.lower())] - if matches: - update_node(node, name, {name: matches[0]}) - elif name in dct or not dct: - update_node(node, name, dct or {name: ''}) - return - - def setStateIcon(self, child, color): - if icons_dev_tree is None: - self.debug('In setStateIcon(...): Icons for states not available!') - return - if color == "#00ff00" or color in 'ON,OPEN,EXTRACT': - icon = Qt.QIcon(":/ICON_GREEN") - child.setIcon(0, icon) - elif color == "#ff0000" or color in 'OFF,FAULT': - icon = Qt.QIcon(":/ICON_RED") - child.setIcon(0, icon) - elif color == "#ff8c00" or color in 'ALARM': - icon = Qt.QIcon(":/ICON_ORANGE") - child.setIcon(0, icon) - elif color == "#ffffff" or color in 'CLOSE,INSERT': - icon = Qt.QIcon(":/ICON_WHITE") - child.setIcon(0, icon) - elif color == "#80a0ff" or color in 'MOVING,RUNNING': - icon = Qt.QIcon(":/ICON_BLUE") - child.setIcon(0, icon) - elif color == "#ffff00" or color in 'STANDBY': - icon = Qt.QIcon(":/ICON_YELLOW") - child.setIcon(0, icon) - elif color == "#cccc7a" or color in 'INIT': - icon = Qt.QIcon(":/ICON_BRAWN") - child.setIcon(0, icon) - elif color == "#ff00ff" or color in 'DISABLE': - icon = Qt.QIcon(":/ICON_PINK") - child.setIcon(0, icon) - elif color == "#808080f" or color in 'UNKNOWN': - icon = Qt.QIcon(":/ICON_GREY") - child.setIcon(0, icon) - else: - icon = Qt.QIcon(":/ICON_WHITE") - child.setIcon(0, icon) - - ########################################################################## - #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- - # Event methods - #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- - - def deviceClicked(self, item, column): - self.trace("In TaurusDevTree.deviceClicked(%s)" % item.text(column)) - self.emitSelected(self.getNodeDeviceName()) - - def emitSelected(self, device_name=''): - '''QSIGNAL: this method is used to emit deviceSelected(QString) signal''' - self.trace("In TaurusDevTree.emitSelected(%s)" % device_name) - try: - #item = self.currentItem() - device_name = device_name or self.getNodeDeviceName() # item.text(0) - if str(device_name).count('/') != 2: - return - # Signal - self.trace('TaurusTree emit deviceSelected(%s) signal ...' % - device_name) - self.deviceSelected.emit(Qt.QString(device_name)) - except: - self.error(traceback.format_exc()) - pass - - def getModelMimeData(self): - '''Returns a MimeData object containing the model data. The default implementation - fills the `TAURUS_MODEL_MIME_TYPE`. If the widget's Model class is - Attribute or Device, it also fills `TAURUS_ATTR_MIME_TYPE` or - `TAURUS_DEV_MIME_TYPE`, respectively - ''' - mimeData = Qt.QMimeData() - node = self.currentItem() - draggable = self.getNodeDraggable(node) - if draggable: - slashes = draggable.count('/') - draggable.count(':') - # mimeData.setData('application/x-qabstractitemmodeldatalist',draggable) - if slashes == 3: - mimeData.setData(TAURUS_ATTR_MIME_TYPE, draggable) - elif slashes == 2: - mimeData.setData(TAURUS_DEV_MIME_TYPE, draggable) - else: - mimeData.setData(TAURUS_MODEL_MIME_TYPE, draggable) - return mimeData - - def checkHeaderClicked(self, position): - if self.itemAt(position) is self.headerItem(): - node = self.headerItem() - self.showNodeContextMenu(node, event) - #node.ContextMenu = ['Search ...'] - - def mouseMoveEvent(self, event): - ''' - copied from TaurusBaseWidget to provide drag events - It had to be rewritten as QTreeWidget does not allow drag events - ''' - self.debug('In TaurusDevTree.mouseMoveEvent') - if not self._dragEnabled or not event.buttons() & Qt.Qt.LeftButton: - return self.getQtClass().mouseMoveEvent(self, event) - if (event.pos() - self.dragStartPosition).manhattanLength() < Qt.QApplication.startDragDistance(): - return self.getQtClass().mouseMoveEvent(self, event) - # The mouseMoveEvent of QTreeWidget do not allow drag, commented - ret = None # self.getQtClass().mouseMoveEvent(self, event) #call the superclass - event.accept() # we make sure we accept after having called the superclass so that it is not propagated (many default implementations of mouseMoveEvent call event.ignore()) - drag = Qt.QDrag(self) - drag.setMimeData(self.getModelMimeData()) - drag.exec_(Qt.Qt.CopyAction, Qt.Qt.CopyAction) - return ret - - def mimeTypes(self): - return self.getSupportedMimeTypes() - - def dropEvent(self, event): - '''reimplemented to support dropping of modelnames in forms''' - self.debug('dropEvent(%s): %s,%s' % (event, event.mimeData(), - split_model_list(event.mimeData().formats()))) - if event.source() is self: - self.info('Internal drag/drop not allowed') - return - if any(s in event.mimeData().formats() for s in self.getSupportedMimeTypes()): - # mtype = - # self.handleMimeData(event.mimeData(),self.addModels)#lambda - # m:self.addModels('^%s$'%m)) - event.acceptProposedAction() - else: - self.warning('Invalid model in dropped data') - - # 3 - # @name Context Menu Actions - # @{ - - def contextMenuEvent(self, event): - ''' - This function is called when right clicking on TaurusDevTree area. - ''' - node = self.currentItem() - self.showNodeContextMenu(node, event) - return - - def showNodeContextMenu(self, node, event): - """ - A pop up menu will be shown with the available options. - Menus are managed using two tuple lists for each node: node.ContextMenu and node.ExpertMenu - """ - obj = self.getNodeDraggable(node) - position = event.globalPos() - self.debug('showNodeContextMenu(%s)' % obj) - if self.itemAt(position) is self.headerItem(): - node = self.headerItem() - #node.ContextMenu = ['Search ...'] - if node is None: - node = self - else: - if not hasattr(node, 'ContextMenu'): - node.ContextMenu = [] - # Creating default menu - if not 'Search ...' in [k for k, a in node.ContextMenu]: - # DEVICE NODE CONTEXT MENU - if obj.count('/') == 2: - - node.ContextMenu.append(("Open Panel", self.showPanel)) - node.ContextMenu.append( - ("Show Attributes", self.addAttrToNode)) - if self.getNodeAdmin(node): - node.ContextMenu.append(("Go to %s" % self.getNodeAdmin(node), - lambda p=self.getNodeAdmin( - node): p and self.findInTree(p) - )) - if not hasattr(node, 'ExpertMenu'): - setattr(node, 'ExpertMenu', self.ExpertMenu) # []) - if not 'Show Properties' in [k for k, a in node.ExpertMenu]: - node.ExpertMenu.append( - ("Show Properties", self.showProperties)) - - def test_device(): - device = str(self.getNodeDeviceName()) - if device: - comm = 'tg_devtest %s &' % device - os.system(comm) - else: - self.debug( - 'TaurusDevTree.TestDevice: Selected Device is None!') - node.ExpertMenu.append(("Test Device", test_device)) - node.ExpertMenu.append( - ("Show ALL Attributes", lambda s=self: s.addAttrToNode(full=True))) - node.ContextMenu.append(('', None)) - - # ATTRIBUTE NODE CONTEXT MENU - elif obj.count('/') == 3: - for k, v in self.AttributeMenu: - self.debug('Adding action %s' % k) - if type(v) is str and hasattr(self, v): - node.ContextMenu.append((k, getattr(self, v))) - else: - node.ContextMenu.append( - (k, lambda s=self.getNodeAlias(node): v(s))) - #node.ContextMenu.append(("add to Trends", self.addToPlot)) - #node.ContextMenu.append(("remove from Trends", self.removeFromPlot)) - node.ContextMenu.append(('', None)) - elif not hasattr(node, 'ExpertMenu'): - setattr(node, 'ExpertMenu', self.ExpertMenu) # []) - #node.ContextMenu.append(("Expand Node", self.expandNode)) - #node.ContextMenu.append(("Collapse Node", self.collapseNode)) - if node.isExpanded() and node.childCount() < 10 and all(self.getNodeText(node.child(j)).count('/') == 2 for j in range(node.childCount())): - node.ContextMenu.append(("Show Attributes", lambda n=node, s=self: [ - s.addAttrToNode(n.child(j)) for j in range(n.childCount())])) - node.ContextMenu.append(("Search ...", - lambda: self.findInTree(str(Qt.QInputDialog.getText( - self, 'Search ...', 'Write a part of the name', Qt.QLineEdit.Normal)[0])) - )) - #configDialogAction = menu.addAction("Refresh Tree") - #self.connect(configDialogAction, Qt.SIGNAL("triggered()"), self.refreshTree) - menu = Qt.QMenu(self) - - if hasattr(node, 'ContextMenu'): - last_was_separator = True - for t in (type(node.ContextMenu) is dict and list(node.ContextMenu.items()) or node.ContextMenu): - try: - k, action = t - if k: - configDialogAction = menu.addAction(k) - if action: - configDialogAction.triggered.connect(action) - else: - configDialogAction.setEnabled(False) - last_was_separator = False - elif not last_was_separator: - menu.addSeparator() - last_was_separator = True - except Exception as e: - self.warning('Unable to add Menu Action: %s:%s' % (t, e)) - - if hasattr(node, 'ExpertMenu'): - menu.addSeparator() - expert = menu.addMenu('Expert') - # expert.addSeparator() - last_was_separator = True - for t in (type(node.ContextMenu) is dict and list(node.ExpertMenu.items()) or node.ExpertMenu): - try: - k, action = t - if k: - configDialogAction = expert.addAction(k) - if action: - configDialogAction.triggered.connect(action) - else: - configDialogAction.setEnabled(False) - last_was_separator = False - elif not last_was_separator: - expert.addSeparator() - last_was_separator = True - except Exception as e: - self.warning('Unable to add Expert Action: %s:%s' % (t, e)) - # menu.addSeparator() - menu.exec_(event.globalPos()) - del menu - - -class PopupDialog(Qt.QDialog): - """ - This class create the dialog - Dialog is used to make new floating panels persistent - """ - - def __init__(self, parent=None, target=None): - Qt.QDialog.__init__(self, parent) - if target: - self.initComponents(target) - - def initComponents(self, newWidget, show=True): - widgetLayout = Qt.QVBoxLayout(self) - widgetLayout.setContentsMargins(10, 10, 10, 10) - widgetLayout.addWidget(newWidget) - self.setWindowTitle(newWidget.windowTitle()) - self.setModal(False) - self.setVisible(True) - if show: - self.exec_() - -########################################################################## - - -class TaurusTreeNode(Qt.QTreeWidgetItem, TaurusBaseComponent): - """ - Unused; one day should replace TaurusTreeNodeContainer and all methods moved here. - Base class for all Taurus Tree Node Items - """ - - #------------------------------------------------------------------------- - # Write your own code here to define the signals generated by this widget - # - - modelChanged = Qt.pyqtSignal('const QString &') - - def __init__(self, name=None, parent=None): - name = name or self.__class__.__name__ - self.call__init__wo_kw(Qt.QTreeWidgetItem, parent) - self.call__init__(TaurusBaseComponent, name, parent) - # self.defineStyle() - - # def defineStyle(self): - #""" Defines the initial style for the widget """ - # ----------------------------------------------------------------------- - # Write your own code here to set the initial style of your widget - ## - # self.updateStyle() - - #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- - # Mandatory methods to be implemented in any subclass of TaurusComponent - #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- - - def getParentTaurusComponent(self): - """ Returns a parent Taurus component or None if no parent TaurusBaseComponent - is found.""" - p = self.parentItem() - while p and not isinstance(p, TaurusTreeNode): - p = self.parentItem() - return p - - def updateStyle(self): - """ Method called when the component detects an event that triggers a change - in the style.""" - - # if self.scene(): - # self.scene().updateSceneItem(self) - - #---------------------------------------------------------------------- - # Write your own code here to update your widget style - - # send a repaint in the end - # self.repaint() - #if self._parent: self._parent.repaint() - - state2color = lambda state: Qt.QColor( - DEVICE_STATE_PALETTE.number(state)) - quality2color = lambda attr: Qt.QColor( - ATTRIBUTE_QUALITY_PALETTE.number(attr)) - v = self.getModelValueObj() - if isinstance(v, PyTango.DevState): # TODO: maybe change to Taurus.tango.DevState - # @TODO: node is undefined. Check code - node.setBackground(0, Qt.QBrush(state2color(v))) - if hasattr(v, 'quality'): - self.setForeground(0, Qt.QBrush(quality2color(v.quality))) - - def isReadOnly(self): - return True - - def __str__(self): - return self.log_name + "(" + self.modelName + ")" - - def getModelClass(self): - return taurus.core.taurusdevice.TaurusDevice - - #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- - # TaurusBaseComponent over writing - #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- - - # def attach(self): - #"""Attaches the widget to the model""" - # if self.isAttached(): - # return True - # ----------------------------------------------------------------------- - # Write your own code here before attaching widget to attribute connect - # the proper signal so that the first event is correctly received by the - # widget - ## - # Typical code is: - # self.connect(self, Qt.SIGNAL('valueChangedDueToEvent(QString)'), - # self.setTextValue) - #ret = TaurusBaseWidget.attach(self) - # by default enable/disable widget according to attach state - # self.setEnabled(ret) - # return ret - - # def detach(self): - #"""Detaches the widget from the model""" - # TaurusBaseWidget.detach(self) - - # ----------------------------------------------------------------------- - # Write your own code here after detaching the widget from the model - ## - # Typical code is: - # self.emit(Qt.SIGNAL('valueChangedDueToEvent(QString)'), - # Qt.QString(value_str)) - # self.disconnect(self, Qt.SIGNAL('valueChangedDueToEvent(QString)'), - # self.setTextValue) - # by default disable widget when dettached - # self.setEnabled(False) - - #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- - # QT properties - #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- - - model = Qt.pyqtProperty("QString", TaurusBaseWidget.getModel, - TaurusBaseWidget.setModel, - TaurusBaseWidget.resetModel) - - useParentModel = Qt.pyqtProperty("bool", - TaurusBaseWidget.getUseParentModel, - TaurusBaseWidget.setUseParentModel, - TaurusBaseWidget.resetUseParentModel) - - #------------------------------------------------------------------------- - # Write your own code here for your own widget properties - - -class TaurusDevTreeOptions(Qt.QWidget): - """ This class provides a search(QString) signal to be connected to TaurusDevTree.findInTree slot """ - - search = Qt.pyqtSignal('QString') - loadTree = Qt.pyqtSignal('QString') - hideUnarchived = Qt.pyqtSignal() - hideUnexported = Qt.pyqtSignal() - - def __init__(self, parent=None, icon=None): - Qt.QWidget.__init__(self, parent) - - self.setLayout(Qt.QHBoxLayout()) - try: - self._pixmap = Qt.QPixmap(icon or 'image/icons/search.png') - self._label = Qt.QLabel(self) - self._label.setPixmap(self._pixmap) - self.layout().addWidget(self._label) - except: - pass - - self._edit = Qt.QLineEdit() - self._button = Qt.QPushButton() - self._button.setText('Search') - self._edit.returnPressed.connect(self._button.animateClick) - self._button.clicked.connect(self._emitSearch) - self.layout().addWidget(self._edit) - self.layout().addWidget(self._button) - - def connectWithTree(self, tree): - self.search.connect(tree.findInTree) - - def _emitSearch(self): - text = self._edit.text() - if text: - self.search.emit(text) - return - -SearchEdit = TaurusDevTreeOptions - -########################################################################## - - -class ServerBrowser(TaurusDevTree): - """ This class is used only when browsing by Server/Instance instead of Domain/Family/Member scheme """ - - def getDeviceDict(self, filters): - ''' - This method build a dictionary of instances and devices depending on the given servers,devices or instances in QTProperty or in another widget - --- filters is a string with names of devices/servers such as "LT/VC/ALL,LT02/VC/IP-01" or "modbus,pyplc" - --- filters is a list of devices such as ["LT/VC/ALL","LT02/VC/IP-01"] - ''' - self.trace('In TaurusDevTree.buildDictFromFilters(%s)' % filters) - self._filters = filters - # @TODO:QString and QStringList should not be used (They disappear in API2) - if type(filters) == type("") or isinstance(filters, Qt.QString): - filters = str(filters).split(',') - # @TODO:QString and QStringList should not be used (They disappear in API2) - elif isinstance(filters, Qt.QStringList): - filters = list(filters) - elif type(filters) != type([]): - self.debug("'filters' has to be a string or the list type!") - vals = {} - if not filters: - return vals - if filters[0].count('/') == 0: - self.debug( - 'In TaurusDevTree.buildDictFromFilters(%s): Getting Servers' % filters) - targets, addMe = self.db.get_server_name_list( - ), self.addInstToServ # Searching servers - elif filters[0].count('/') == 1: - self.debug( - 'In TaurusDevTree.buildDictFromFilters(%s): Getting Instances' % filters) - targets, addMe = self.db.get_server_list(), self.addDevToInst # Searching instances - elif filters[0].count('/') == 2: - self.debug( - 'In TaurusDevTree.buildDictFromFilters(%s): Getting Devices' % filters) - targets, addMe = self.db.get_device_exported( - "*"), lambda s: {s: {}} # self.addAttrToDev #Searching devices - else: - raise Exception('UnknownFilter!: %s' % filters[0]) - - for t in targets: - for f in filters: - f = str(f) - exp = f.replace( - '*', '.*').lower() if '*' in f and '.*' not in f else f.lower() - if re.match(exp, t.lower()): - self.debug('Adding node %s' % t) - vals[t] = addMe(t) - self.trace('Out of TaurusDevTree.getDeviceDict(%s)' % filters) - return vals - - def addInstToServ(self, my_server): - dict = {} - list_inst = self.get_instances_for_server(my_server) - lower_list_inst = [s.lower() for s in list_inst] - for my_inst in lower_list_inst: - if self._expand: - dict[my_inst] = self.addDevtoInst(my_inst) - else: - dict[my_inst] = 0 - return dict - - def addDevtoInst(self, my_inst, expand_attrs=False): - d = {} - list_dev = self.get_devices_for_instance(my_inst) - lower_list_dev = [s.lower() for s in list_dev] - for my_dev in lower_list_dev: - if self._expand: - d[my_dev] = self.addAttrToDev( - my_dev) if expand_attrs else {my_dev: {}} - else: - d[my_dev] = 0 - return d - - def addFamilyToDomain(self, prev, expand_attrs): - d = {} - #children = self.get_devices_for_instance(my_inst) - # @TODO: list_dev is undefined. Check code - lower_list_dev = [s.lower() for s in list_dev] - for my_dev in lower_list_dev: - if self._expand: - d[my_dev] = self.addAttrToDev( - my_dev) if expand_attrs else {my_dev: {}} - else: - d[my_dev] = 0 - return d - - #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- - # Methods for database commands - #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- - - def get_instances_for_server(self, server_name): - #executable_name = class_name - instances = self.db.get_instance_name_list(server_name) - return [server_name + '/' + instance for instance in instances] - - def get_devices_for_instance(self, instance_name): - devslist = self.db.get_device_class_list(instance_name) - return [dev for dev in devslist if '/' in dev and not dev.startswith('dserver')] - - # @} - -########################################################################## - - -class TaurusSearchTree(TaurusWidget): - """ - This Class is a mere wrapper providing a TaurusDevTree connected with an options panel and some optional checkboxes. - """ - __slots__ = ( - "setTangoHost", - #"setModel", - "addModels", - "setModelCheck", - "setTree", - "findInTree", - "expandAll", - "loadTree", - ) - - refreshTree = Qt.pyqtSignal() - nodeFound = Qt.pyqtSignal() - deviceSelected = Qt.pyqtSignal('QString') - addAttrSelected = Qt.pyqtSignal('QStringList') - removeAttrSelected = Qt.pyqtSignal('QStringList') - modelChanged = Qt.pyqtSignal('const QString &') - search = Qt.pyqtSignal('QString') - - @staticmethod - def method_forwarder(*args, **kwargs): - m, o = kwargs['method'], kwargs['object'] - # print 'Calling %s.%s'%(o,m) - getattr(o.__class__, m)(o, *args) - - def defineStyle(self): - #print('In TaurusSearchTree.defineStyle()') - self.setWindowTitle('TaurusDevTree') - self.setLayout(Qt.QVBoxLayout()) - self.edit = TaurusDevTreeOptions(self) - self.tree = TaurusDevTree(self) - self.layout().addWidget(self.edit) - self.layout().addWidget(self.tree) - self.registerConfigDelegate(self.tree) - # Slot forwarding ... - for k in TaurusDevTree.__dict__: - # if k in ['__init__','defineStyle']: continue - if k not in self.__slots__: - continue - try: - setattr(self, k, partial( - self.method_forwarder, method=k, object=self.tree)) - except Exception as e: - self.warning('Unable to add slot %s: %s' % (k, e)) - # Event forwarding ... - self.tree.refreshTree.connect(self.refreshTree) - self.tree.nodeFound.connect(self.nodeFound) - self.tree.deviceSelected['QString'].connect(self.deviceSelected) - self.tree.search['QString'].connect(self.search) - self.tree.addAttrSelected['QString'].connect(self.addAttrSelected) - self.tree.removeAttrSelected['QString'].connect(self.removeAttrSelected) - self.tree.modelChanged['QString'].connect(self.modelChanged) - #for signal in TaurusDevTree.__pyqtSignals__: - # getattr(self.tree, signal).connect( - # lambda args, f=self, s=signal: getattr(f, signal).emit(args)) - self.edit.connectWithTree(self) - return - - -########################################################################## - -def taurusDevTreeMain(): - import sys - from taurus.qt.qtgui.application import TaurusApplication - from taurus.core.util import argparse - - if False: - app = Qt.QApplication([]) - args = sys.argv[1:] - #args = app.get_command_line_args() - #app = TaurusApplication(sys.argv) - if not args: - args = ['database'] - else: - taurus.setLogLevel(taurus.Debug) - parser = argparse.get_taurus_parser() - parser.set_usage("%prog [options] devname [attrs]") - parser.set_description( - "Taurus Application inspired in Jive and Atk Panel") - parser.add_option("--config", "--config-file", dest="config_file", default=None, - help="use the given config file for initialization") - app = TaurusApplication(cmd_line_parser=parser, app_name="TaurusDevicePanel", - app_version=taurus.Release.version) - args = app.get_command_line_args() - options = app.get_command_line_options() - - form = TaurusSearchTree() - # try: - # if options.tango_host is None: - #options.tango_host = taurus.Authority().getNormalName() - # form.setTangoHost(options.tango_host) - # except: pass - - def trace(m): - print(m) - [setattr(form.tree, f, trace) - for f in ('info', 'warning', 'error', 'trace')] - - form.setLogLevel(taurus.Debug) - form.tree.setLogLevel(taurus.Debug) - # set a model list from the command line or launch the chooser - if options.config_file is not None: - form.tree.loadConfigFile(options.config_file) - if len(args) > 0: - models = args - form.setModel(models) - form.show() - sys.exit(app.exec_()) - -if __name__ == "__main__": - taurusDevTreeMain() From 90986b9e38eb12883306c5bc2b5bc9b4429ba536 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 8 Nov 2018 16:02:25 +0100 Subject: [PATCH 164/252] Protect QHeaderView resize mode Fix to problems related to QHeaderView resize mode: - QHeaderView.setResizeMode was renamed to setSectionResizeMode in Qt5. Handle both cases. - Calling setSectionResizeMode on empty headers causes the application to *crash* in Qt5 (IMHO this is a bug). Workaround by checking that there are contents before setting the resize mode. --- lib/taurus/qt/qtgui/table/qlogtable.py | 6 ++++- .../qtgui/table/taurusdevicepropertytable.py | 19 ++++++++++----- lib/taurus/qt/qtgui/table/taurusgrid.py | 15 +++++++++--- .../qt/qtgui/table/taurusvaluestable.py | 24 +++++++++++++++---- lib/taurus/qt/qtgui/tree/qtree.py | 6 ++++- 5 files changed, 55 insertions(+), 15 deletions(-) diff --git a/lib/taurus/qt/qtgui/table/qlogtable.py b/lib/taurus/qt/qtgui/table/qlogtable.py index 6bbd6c955..af8e3e5fb 100644 --- a/lib/taurus/qt/qtgui/table/qlogtable.py +++ b/lib/taurus/qt/qtgui/table/qlogtable.py @@ -482,7 +482,11 @@ def createViewWidget(self, klass=None): klass = QLoggingTable view = QBaseTableWidget.createViewWidget(self, klass=klass) hh = view.horizontalHeader() - hh.setSectionResizeMode(MSG, Qt.QHeaderView.Stretch) + if hh.length() > 0: + try: + hh.setSectionResizeMode(MSG, Qt.QHeaderView.Stretch) + except AttributeError: # PyQt4 + hh.setResizeMode(MSG, Qt.QHeaderView.Stretch) view.setShowGrid(False) view.sortByColumn(TIME, Qt.Qt.AscendingOrder) return view diff --git a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py index 9860bb04a..74f5565bc 100755 --- a/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py +++ b/lib/taurus/qt/qtgui/table/taurusdevicepropertytable.py @@ -186,15 +186,22 @@ def defineStyle(self): headerItem1.setText(QtGui.QApplication.translate( "PLCTabWidget", "Value", None, QtGui.QApplication.UnicodeUTF8)) self.setHorizontalHeaderItem(1, headerItem1) - self.horizontalHeader().setSectionResizeMode( - QtGui.QHeaderView.ResizeToContents) # .Stretch) + hh = self.horizontalHeader() + if hh.length() > 0: + try: + hh.setSectionResizeMode(hh.ResizeToContents) + except AttributeError: # PyQt4 + hh.setResizeMode(hh.ResizeToContents) def updateStyle(self): self.resizeRowsToContents() - self.horizontalHeader().setSectionResizeMode( - QtGui.QHeaderView.ResizeToContents) # .Stretch) - # self.resizeColumnsToContents() - pass + hh = self.horizontalHeader() + if hh.length() > 0: + try: + hh.setSectionResizeMode(hh.ResizeToContents) + except AttributeError: # PyQt4 + hh.setResizeMode(hh.ResizeToContents) + # self.resizeColumnsToContents() def contextMenuEvent(self, event): ''' This function is called when right clicking on qwt plot area. A pop up menu will be diff --git a/lib/taurus/qt/qtgui/table/taurusgrid.py b/lib/taurus/qt/qtgui/table/taurusgrid.py index 8e5c082e5..d89d09a33 100644 --- a/lib/taurus/qt/qtgui/table/taurusgrid.py +++ b/lib/taurus/qt/qtgui/table/taurusgrid.py @@ -905,11 +905,20 @@ def build_table(self, values): # table.resizeColumnsToContents() # table.resizeRowsToContents() - table.horizontalHeader().setSectionResizeMode(QtGui.QHeaderView.Stretch) + hh = table.horizontalHeader() + if hh.length() > 0: + try: + hh.setSectionResizeMode(hh.Stretch) + except AttributeError: # PyQt4 + hh.setResizeMode(hh.Stretch) # table.verticalHeader().setSectionResizeMode(QtGui.QHeaderView.Stretch) # table.horizontalHeader().setSectionResizeMode(QtGui.QHeaderView.ResizeToContents) - table.verticalHeader().setSectionResizeMode( - QtGui.QHeaderView.ResizeToContents) + vh = table.verticalHeader() + if vh.length() > 0: + try: + vh.setSectionResizeMode(vh.ResizeToContents) + except AttributeError: # PyQt4 + hh.setResizeMode(vh.ResizeToContents) return table diff --git a/lib/taurus/qt/qtgui/table/taurusvaluestable.py b/lib/taurus/qt/qtgui/table/taurusvaluestable.py index 9cd965d65..34e3fa849 100755 --- a/lib/taurus/qt/qtgui/table/taurusvaluestable.py +++ b/lib/taurus/qt/qtgui/table/taurusvaluestable.py @@ -521,9 +521,17 @@ def setModelData(self, editor, model, index): if(text != self._initialText) & (text != ""): model.addValue(index, Qt.QVariant(text)) hh = self.parent().horizontalHeader() - hh.setSectionResizeMode(Qt.QHeaderView.Fixed) + if hh.length() > 0: + try: + hh.setSectionResizeMode(hh.Fixed) + except AttributeError: # PyQt4 + hh.setResizeMode(hh.Fixed) vh = self.parent().verticalHeader() - vh.setSectionResizeMode(Qt.QHeaderView.Fixed) + if vh.length() > 0: + try: + vh.setSectionResizeMode(vh.Fixed) + except AttributeError: # PyQt4 + hh.setResizeMode(vh.Fixed) index.model().editedIndex = None @@ -727,9 +735,17 @@ def handleEvent(self, evt_src, evt_type, evt_value): model.setWriteMode(self._writeMode) hh = self._tableView.horizontalHeader() - hh.setSectionResizeMode(Qt.QHeaderView.Fixed) + if hh.length() > 0: + try: + hh.setSectionResizeMode(hh.Fixed) + except AttributeError: # PyQt4 + hh.setResizeMode(hh.Fixed) vh = self._tableView.verticalHeader() - vh.setSectionResizeMode(Qt.QHeaderView.Fixed) + if vh.length() > 0: + try: + vh.setSectionResizeMode(vh.Fixed) + except AttributeError: # PyQt4 + hh.setResizeMode(vh.Fixed) if self.defaultWriteMode == "r": isWritable = False else: diff --git a/lib/taurus/qt/qtgui/tree/qtree.py b/lib/taurus/qt/qtgui/tree/qtree.py index 919e44995..3c0ecdc2c 100644 --- a/lib/taurus/qt/qtgui/tree/qtree.py +++ b/lib/taurus/qt/qtgui/tree/qtree.py @@ -236,7 +236,11 @@ def createViewWidget(self, klass=None): tree.clicked.connect(self._onClicked) tree.doubleClicked.connect(self._onDoubleClicked) h = tree.header() - h.setSectionResizeMode(0, Qt.QHeaderView.Stretch) + if h.length() > 0: + try: + h.setSectionResizeMode(0, h.Stretch) + except AttributeError: + h.setResizeMode(0, h.Stretch) return tree def treeView(self): From 76aa8159cba105437b52d00d8ccde2b925de8db6 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 8 Nov 2018 16:18:20 +0100 Subject: [PATCH 165/252] (doc) Update TEP18 --- doc/source/tep/TEP18.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index 92ed822ec..9382ab431 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -359,7 +359,7 @@ following tips were found useful when porting applications to taurus 4.5 - be careful with qInstallMsgHandler (Qt4) vs qInstallMessageHandler (Qt5). The following code can be used as a reference: -``` + ```python if hasattr(QtCore, "qInstallMessageHandler"): # Qt5 def taurusMessageHandler(msg_type, log_ctx, msg): @@ -375,8 +375,21 @@ following tips were found useful when porting applications to taurus 4.5 return f("Qt: " + msg) QtCore.qInstallMsgHandler(taurusMsgHandler) -``` + ``` +- Be aware of the [renamed methods in QHeaderView](http://doc.qt.io/qt-5/sourcebreaks.html#changes-to-qheaderview) (from Qt4 to Qt5) + and the fact that in Qt5, setSectionResizeMode may **crash the GUI** if + called on an empty header. The following code snippet takes care of both + issues: + ```python + headerView = ... # <-- QHeaderView + if headerView.length() > 0: + try: + headerView.setSectionResizeMode(headerView.Stretch) + except AttributeError: # PyQt4 + headerView.setResizeMode(headerView.Stretch) + ``` + TODO: complete this section ## Links to more details and discussions From 51095544ce0a2867f47170a6d46571fed13b3d06 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 9 Nov 2018 16:14:04 +0100 Subject: [PATCH 166/252] Fix exception in QLoggingTableModel QLoggingTableModel does not comply with expected constructor signature for a QAbstractTableModel (it lacks a `parent` optional argument). This causes an exception when using py3. Add the parent kwarg to fix the issue. --- lib/taurus/qt/qtgui/model/qbasemodel.py | 2 +- lib/taurus/qt/qtgui/table/qlogtable.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/taurus/qt/qtgui/model/qbasemodel.py b/lib/taurus/qt/qtgui/model/qbasemodel.py index e5b79cda8..a43db5394 100644 --- a/lib/taurus/qt/qtgui/model/qbasemodel.py +++ b/lib/taurus/qt/qtgui/model/qbasemodel.py @@ -528,7 +528,7 @@ def _setPerspective(self, perspective): # reversed qmodel_class, qmodel_proxy_classes = qmodel_classes[ -1], qmodel_classes[-2::-1] - qmodel = qmodel_class(self) + qmodel = qmodel_class(parent=self) qmodel_source = qmodel if self._proxyModel is None: # applies the chain of proxies for qmodel_proxy_class in qmodel_proxy_classes: diff --git a/lib/taurus/qt/qtgui/table/qlogtable.py b/lib/taurus/qt/qtgui/table/qlogtable.py index 6bbd6c955..19fe2d145 100644 --- a/lib/taurus/qt/qtgui/table/qlogtable.py +++ b/lib/taurus/qt/qtgui/table/qlogtable.py @@ -147,7 +147,7 @@ class QLoggingTableModel(Qt.QAbstractTableModel, logging.Handler): DftColSize = Qt.QSize(80, 20), Qt.QSize(200, 20), \ Qt.QSize(300, 20), Qt.QSize(180, 20), Qt.QSize(240, 20), - def __init__(self, capacity=500000, freq=0.25): + def __init__(self, parent=None, capacity=500000, freq=0.25): super(Qt.QAbstractTableModel, self).__init__() logging.Handler.__init__(self) self._capacity = capacity @@ -369,8 +369,7 @@ def __init__(self, view=None, parent=None, designMode=False): self._logLevelComboBox = logLevelComboBox = Qt.QComboBox() levels = "Trace", "Debug", "Info", "Warning", "Error", "Critical" for level in levels: - logLevelComboBox.addItem( - level, Qt.QVariant(getattr(taurus, level))) + logLevelComboBox.addItem(level, getattr(taurus, level)) logLevelComboBox.setCurrentIndex(0) logLevelComboBox.currentIndexChanged.connect(self.onLogLevelChanged) logLevelComboBox.setToolTip("Filter by log level") From a4741c6030dad831b4c3c75c2d976523e4b718b5 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 14 Nov 2018 13:36:11 +0100 Subject: [PATCH 167/252] Fix py3 compatibility issue The implementation of TaurusTreeDbBaseItem was problematic on py3 due to new handling og bound/ubound methods. Fix it by explicitly defining a method instead of relying in py2 unbound method references. --- lib/taurus/qt/qtcore/model/taurusdatabasemodel.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py index cf42778a9..56328bb4b 100644 --- a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py +++ b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py @@ -84,11 +84,16 @@ def getDevStateToolTip(*args, **kwargs): class TaurusTreeDbBaseItem(TaurusBaseTreeItem): try: # TODO: tango-centric - from taurus.core.tango.tangodatabase import TangoInfo - DisplayFunc = TangoInfo.name + import taurus.core.tango + + @staticmethod + def DisplayFunc(obj): + from taurus.core.tango.tangodatabase import TangoInfo + return TangoInfo.name(obj) except: pass + class TaurusTreeDevicePartItem(TaurusTreeDbBaseItem): """A node designed to represent a 'part' (or totality) of a device name""" From dc7fc90d7fc8da5b69b7e6298f44e21c62bc296b Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 20 Nov 2018 18:00:57 +0100 Subject: [PATCH 168/252] Fix py3 drag&drop in TaurusDbBaseModel The drag&drop -related methods do not differentiate between bytes and str (unicode). This is ok in py2 but not in py3, where Qt's mimeData only accept working with bytes. This issue affects many parts of taurus. Fix it for: - TaurusDbBaseModel --- lib/taurus/qt/qtcore/model/taurusdatabasemodel.py | 12 +++++++----- lib/taurus/qt/qtgui/base/taurusbase.py | 6 +++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py index 56328bb4b..a6ac39f2c 100644 --- a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py +++ b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py @@ -26,7 +26,7 @@ """This module provides widgets that display the database in a tree format""" # TODO: tango-centric -from builtins import str +from builtins import str, bytes from taurus.external.qt import Qt from taurus.core.taurusbasetypes import TaurusElementType, TaurusDevState @@ -424,13 +424,15 @@ def mimeData(self, indexes): mime_data_item = tree_item.mimeData(index) if mime_data_item is None: continue - data.append(mime_data_item) + data.append(bytes(mime_data_item, encoding='utf8')) ret.setData( - taurus.qt.qtcore.mimetypes.TAURUS_MODEL_LIST_MIME_TYPE, "\r\n".join(data)) - ret.setText(", ".join(data)) + taurus.qt.qtcore.mimetypes.TAURUS_MODEL_LIST_MIME_TYPE, + b"\r\n".join(data) + ) + ret.setText(", ".join(map(str, data))) if len(data) == 1: ret.setData( - taurus.qt.qtcore.mimetypes.TAURUS_MODEL_MIME_TYPE, str(data[0])) + taurus.qt.qtcore.mimetypes.TAURUS_MODEL_MIME_TYPE, data[0]) return ret def pyData(self, index, role): diff --git a/lib/taurus/qt/qtgui/base/taurusbase.py b/lib/taurus/qt/qtgui/base/taurusbase.py index e5b20ccbd..3fb0a447c 100644 --- a/lib/taurus/qt/qtgui/base/taurusbase.py +++ b/lib/taurus/qt/qtgui/base/taurusbase.py @@ -30,7 +30,7 @@ import sys import threading from types import MethodType -from future.builtins import str +from future.builtins import str, bytes from future.utils import string_types from taurus.external.qt import Qt @@ -1727,7 +1727,7 @@ def handleMimeData(self, mimeData, method): formats = mimeData.formats() for mtype in supported: if mtype in formats: - d = str(mimeData.data(mtype)) + d = bytes(mimeData.data(mtype)) if d is None: return None try: @@ -1748,7 +1748,7 @@ def getModelMimeData(self): :return: (QMimeData) ''' mimeData = Qt.QMimeData() - modelname = self.getModelName() + modelname = bytes(self.getModelName(), encoding='utf8') mimeData.setData(TAURUS_MODEL_MIME_TYPE, modelname) try: modelclass = self.getModelClass() From 38f483d12d45e6b5b55cf5a098f8c8c11dc30771 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 20 Nov 2018 18:01:53 +0100 Subject: [PATCH 169/252] Fix py3 drag&drop in TaurusForm The drag&drop -related methods do not differentiate between bytes and str (unicode). This is ok in py2 but not in py3, where Qt's mimeData only accept working with bytes. This issue affects many parts of taurus. Fix it for: - TaurusForm --- lib/taurus/qt/qtgui/panel/taurusform.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/taurus/qt/qtgui/panel/taurusform.py b/lib/taurus/qt/qtgui/panel/taurusform.py index df1071f51..13572f4a0 100644 --- a/lib/taurus/qt/qtgui/panel/taurusform.py +++ b/lib/taurus/qt/qtgui/panel/taurusform.py @@ -31,7 +31,7 @@ from datetime import datetime from functools import partial -from future.utils import string_types +from future.utils import string_types, binary_type from taurus.external.qt import Qt @@ -180,7 +180,9 @@ def __len__(self): def _splitModel(self, modelNames): '''convert str to list if needed (commas and whitespace are considered as separators)''' - if isinstance(modelNames, string_types + (Qt.QString,)): + if isinstance(modelNames, binary_type): + modelNames = modelNames.decode() + if isinstance(modelNames, string_types): modelNames = str(modelNames).replace(',', ' ') modelNames = modelNames.split() return modelNames From 025ec085ef3c27fa7c67292488d644d52fe87cce Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 28 Nov 2018 17:24:29 +0100 Subject: [PATCH 170/252] Add (deprecated) qvariant methods for bck-compat Add taurus.external.QtCore.{from,to}_qvariant methods to provide backwards-compatibility. These methods (and the QVariant API in general) should be avoided in new code and are now marked as deprecated (the deprecation is effective since v4.0.1, but it is only now that we raise a warning) --- lib/taurus/external/qt/QtCore.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/taurus/external/qt/QtCore.py b/lib/taurus/external/qt/QtCore.py index f6c6e8277..1926f4f84 100644 --- a/lib/taurus/external/qt/QtCore.py +++ b/lib/taurus/external/qt/QtCore.py @@ -11,13 +11,30 @@ Provides QtCore classes and functions. """ from builtins import str as __str +from taurus.core.util.log import deprecation_decorator as __deprecation from . import PYQT5, PYSIDE2, PYQT4, PYSIDE, PythonQtError + +# -------------------------------------------------------------------------- # Deprecated. QString is kept for now to facilitate transition of existing # code but using QString should be avoided since it was deprecated QString = __str # TODO: remove all occurrences of QString in taurus +# -------------------------------------------------------------------------- + +# -------------------------------------------------------------------------- +# Deprecated. from_qvariant and to_qvariant are kept for now to facilitate +# transition of existing code but using them (or QVariant in general) should be +# avoided (with API 2 it is superfluous) +@__deprecation(rel='4.0.1', alt='python objects directly') +def from_qvariant(qobj=None, convfunc=None): + return qobj + +@__deprecation(rel='4.0.1', alt='python objects directly') +def to_qvariant(pyobj=None): + return pyobj +# -------------------------------------------------------------------------- if PYQT5: from PyQt5.QtCore import * @@ -78,11 +95,11 @@ class QStandardPaths(): # Deprecated. QVariant is kept for now to facilitate transition of existing # code but using QVariant should be avoided (with API 2 it is superfluous) # TODO: Remove all references to QVariant in taurus - from taurus.core.util.log import deprecation_decorator - @deprecation_decorator(rel='4.0.1', alt='python objects directly') + @__deprecation(rel='4.0.1', alt='python objects directly') def QVariant(pyobj=None): return pyobj + elif PYSIDE: from PySide.QtCore import * from PySide.QtCore import Signal as pyqtSignal From 286939a4d622443cafc5ab8f12ac91818e10dfd1 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 28 Nov 2018 17:37:49 +0100 Subject: [PATCH 171/252] Remove all usages of from_qvariant in Taurus from_qvariant is deprecated and does not have any effect. Avoid calling it from taurus. --- lib/taurus/qt/qtcore/model/taurusmodel.py | 6 +---- .../qt/qtgui/container/taurusmainwindow.py | 15 ++++-------- .../qtgui/display/demo/qpixmapwidgetdemo.py | 2 -- .../qt/qtgui/extra_guiqwt/curvesmodel.py | 6 ++--- lib/taurus/qt/qtgui/input/tauruscombobox.py | 1 - .../qt/qtgui/panel/taurusconfigeditor.py | 23 +++++++++---------- lib/taurus/qt/qtgui/panel/taurusinputpanel.py | 4 ++-- .../qt/qtgui/panel/taurusmessagepanel.py | 2 +- lib/taurus/qt/qtgui/panel/taurusmodellist.py | 11 ++++----- lib/taurus/qt/qtgui/plot/curveprops.py | 6 ++--- .../qtgui/plot/curvesAppearanceChooserDlg.py | 4 ++-- lib/taurus/qt/qtgui/table/qlogtable.py | 4 ++-- .../qt/qtgui/table/taurusvaluestable.py | 7 +++--- .../qtgui/taurusgui/paneldescriptionwizard.py | 3 +-- 14 files changed, 35 insertions(+), 59 deletions(-) diff --git a/lib/taurus/qt/qtcore/model/taurusmodel.py b/lib/taurus/qt/qtcore/model/taurusmodel.py index 3021514ed..c3d338b24 100644 --- a/lib/taurus/qt/qtcore/model/taurusmodel.py +++ b/lib/taurus/qt/qtcore/model/taurusmodel.py @@ -285,11 +285,7 @@ def data(self, index, role=QtQt.DisplayRole): def _setData(self, index, qvalue, role=QtQt.EditRole): item = index.internalPointer() - pyobj = Qt.from_qvariant(qvalue) - if pyobj is NotImplemented: - self.warning( - "Failed attempt to convert a QValue. Maybe it is due to Qt<4.6") - item.setData(index, pyobj) + item.setData(index, qvalue) return True def flags(self, index): diff --git a/lib/taurus/qt/qtgui/container/taurusmainwindow.py b/lib/taurus/qt/qtgui/container/taurusmainwindow.py index eaf708f91..40915c024 100644 --- a/lib/taurus/qt/qtgui/container/taurusmainwindow.py +++ b/lib/taurus/qt/qtgui/container/taurusmainwindow.py @@ -624,16 +624,11 @@ def loadSettings(self, settings=None, group=None, ignoreGeometry=False, factoryS if group is not None: settings.beginGroup(group) if not ignoreGeometry: - # With API2, from_qvariant is returning None instead - ba = Qt.from_qvariant(settings.value( - "MainWindow/Geometry"), 'toByteArray') or Qt.QByteArray() - # of an empty QByTeArray - # and this caused an exception later on. Hence the "or" + ba = settings.value("MainWindow/Geometry") or Qt.QByteArray() self.restoreGeometry(ba) # restore the Taurus config try: - ba = Qt.from_qvariant(settings.value( - "TaurusConfig"), 'toByteArray') or Qt.QByteArray() + ba = settings.value("TaurusConfig") or Qt.QByteArray() self.applyQConfig(ba) except Exception as e: msg = 'Problem loading configuration from "%s". Some settings may not be restored.\n Details: %s' % ( @@ -641,8 +636,7 @@ def loadSettings(self, settings=None, group=None, ignoreGeometry=False, factoryS self.error(msg) Qt.QMessageBox.warning( self, 'Error Loading settings', msg, Qt.QMessageBox.Ok) - ba = Qt.from_qvariant(settings.value( - "MainWindow/State"), 'toByteArray') or Qt.QByteArray() + ba = settings.value("MainWindow/State") or Qt.QByteArray() self.restoreState(ba) # hide all dockwidgets (so that they are shown only if they were # present in the settings) @@ -651,8 +645,7 @@ def loadSettings(self, settings=None, group=None, ignoreGeometry=False, factoryS for d in dockwidgets: r = self.restoreDockWidget(d) d.hide() - ba = Qt.from_qvariant(settings.value( - "MainWindow/State"), 'toByteArray') or Qt.QByteArray() + ba = settings.value("MainWindow/State") or Qt.QByteArray() self.restoreState(ba) if group is not None: diff --git a/lib/taurus/qt/qtgui/display/demo/qpixmapwidgetdemo.py b/lib/taurus/qt/qtgui/display/demo/qpixmapwidgetdemo.py index 1ec7c3b20..0227bda15 100644 --- a/lib/taurus/qt/qtgui/display/demo/qpixmapwidgetdemo.py +++ b/lib/taurus/qt/qtgui/display/demo/qpixmapwidgetdemo.py @@ -134,9 +134,7 @@ def changeTransformationMode(self, i): def changeAlignment(self, i): halign = self.w_halign.itemData(self.w_halign.currentIndex()) - halign = Qt.from_qvariant(halign, int) valign = self.w_valign.itemData(self.w_valign.currentIndex()) - valign = Qt.from_qvariant(valign, int) self.w.alignment = halign | valign panel = Qt.QWidget() diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py index 6d4224f34..2dc408ca6 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py @@ -269,7 +269,6 @@ def setData(self, index, value=None, role=Qt.Qt.EditRole): row = index.row() curve = self.curves[row] column = index.column() - value = Qt.from_qvariant(value, str) if column == X: curve.taurusparam.xModel = value curve.x.processSrc(value) @@ -346,9 +345,8 @@ def dropMimeData(self, data, action, row, column, parent): def mimeData(self, indexes): mimedata = Qt.QAbstractTableModel.mimeData(self, indexes) if len(indexes) == 1: - # data = Qt.from_qvariant(self.data(indexes[0], str) - # mimedata.setData(TAURUS_ATTR_MIME_TYPE, data) - data = Qt.from_qvariant(self.data(indexes[0], role=SRC_ROLE), str) + data = self.data(indexes[0], role=SRC_ROLE) + # mimedata.setData(TAURUS_ATTR_MIME_TYPE, data) mimedata.setText(data) return mimedata # mimedata.setData() diff --git a/lib/taurus/qt/qtgui/input/tauruscombobox.py b/lib/taurus/qt/qtgui/input/tauruscombobox.py index 9baebcbca..213d94395 100644 --- a/lib/taurus/qt/qtgui/input/tauruscombobox.py +++ b/lib/taurus/qt/qtgui/input/tauruscombobox.py @@ -108,7 +108,6 @@ def getValue(self): func = bool else: return None - new_value = Qt.from_qvariant(new_value, func) return new_value def setValue(self, value): diff --git a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py index bd38fea32..1a3925cb1 100644 --- a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py +++ b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py @@ -61,13 +61,12 @@ def __init__(self, parent=None, designMode=False): def setData(self, index, value, role=Qt.Qt.DisplayRole): '''see :meth:`Qt.QAbstractTableModel.setData`''' - idx_data_str = Qt.from_qvariant(index.data(), str) - value_str = Qt.from_qvariant(value, str) - if idx_data_str == value_str: + idx_data_str = index.data() + if idx_data_str == value: return False #self.itemFromIndex(index).setData(value, role) try: - self.valueChanged(value_str, index) + self.valueChanged(value, index) except: self.showError.emit('Wrong value!', 'The value you entered is wrong. The old value will be restored.') @@ -101,7 +100,7 @@ def deleteBranch(self): ''' tmpindex = self._toDeleteIndex item = self.itemFromIndex(tmpindex) - path = Qt.from_qvariant(item.data(Qt.Qt.UserRole), str) + path = item.data(Qt.Qt.UserRole) self._delete = False self._configurationDictionaries = self.removeBranch( self._configurationDictionaries, path) @@ -169,7 +168,7 @@ def valueChanged(self, value, index): :param index: (QModelIndex) index of the model ''' changedItem = self.itemFromIndex(index) - path = Qt.from_qvariant(changedItem.data(Qt.Qt.UserRole), str) + path = changedItem.data(Qt.Qt.UserRole) self._configurationDictionaries = self.changeTreeValue( self._configurationDictionaries, path, value) try: @@ -276,7 +275,7 @@ def fillTaurusConfig(self, item, configdict): child.setEditable(False) item.appendRow(child) - txt = Qt.from_qvariant(item.data(Qt.Qt.UserRole), str) + txt = item.data(Qt.Qt.UserRole) path = Qt.QVariant(txt + ";__itemConfigurations__;" + k) child.setData(path, Qt.Qt.UserRole) # recursive call to fill all nodes @@ -290,7 +289,7 @@ def fillTaurusConfig(self, item, configdict): item.appendRow([child, typeV, valueV]) - txt = Qt.from_qvariant(item.data(Qt.Qt.UserRole), str) + txt = item.data(Qt.Qt.UserRole) path = Qt.QVariant(txt + ";__itemConfigurations__;" + k) child.setEditable(False) typeV.setEditable(False) @@ -316,7 +315,7 @@ def fillTaurusConfig(self, item, configdict): if BaseConfigurableClass.isTaurusConfig(value): child.setEditable(False) item.appendRow(child) - txt = Qt.from_qvariant(item.data(Qt.Qt.UserRole), str) + txt = item.data(Qt.Qt.UserRole) path = Qt.QVariant(txt + ";" + k) child.setData(path, Qt.Qt.UserRole) # recursive call to fill all nodes @@ -327,7 +326,7 @@ def fillTaurusConfig(self, item, configdict): typeV.setForeground(Qt.QBrush(Qt.QColor('gray'))) child.setForeground(Qt.QBrush(Qt.QColor('gray'))) item.appendRow([child, typeV, valueV]) - txt = Qt.from_qvariant(item.data(Qt.Qt.UserRole), str) + txt = item.data(Qt.Qt.UserRole) path = Qt.QVariant(txt + ";" + k) child.setData(path, Qt.Qt.UserRole) @@ -346,7 +345,7 @@ def getTaurusConfigFromSettings(self, key='TaurusConfig'): :returns (dict) ''' result = None - qstate = Qt.from_qvariant(self._settings.value(key), 'toByteArray') + qstate = self._settings.value(key) if qstate is not None and not qstate.isNull(): try: result = pickle.loads(qstate.data()) @@ -438,7 +437,7 @@ def contextMenuEvent(self, event): '''Reimplemented from :meth:`QWidget.contextMenuEvent`''' self.tree._toDeleteIndex = self.treeview.selectedIndexes()[0] - text = Qt.from_qvariant(self.tree._toDeleteIndex.data(), str) + text = self.tree._toDeleteIndex.data() if self.tree._toDeleteIndex.column() in [1, 2] or text in ['LAST', '[custom]'] or text in self.tree.perspectives: return menu = Qt.QMenu() diff --git a/lib/taurus/qt/qtgui/panel/taurusinputpanel.py b/lib/taurus/qt/qtgui/panel/taurusinputpanel.py index 27ecaa381..6df5d2462 100644 --- a/lib/taurus/qt/qtgui/panel/taurusinputpanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusinputpanel.py @@ -178,7 +178,7 @@ def _create_combobox_panel(self, input_data): def _get_combobox_value(self): combo = self._ui.inputWidget - return Qt.from_qvariant(combo.itemData(combo.currentIndex())) + return combo.itemData(combo.currentIndex()) def _create_radiobutton_panel(self, input_data): panel = self._create_group_panel(input_data) @@ -239,7 +239,7 @@ def _create_multi_selection_panel(self, input_data): def _get_multi_selection_value(self): listwidget = self._ui.inputWidget - return [Qt.from_qvariant(item.data(Qt.Qt.UserRole)) for item in listwidget.selectedItems()] + return [item.data(Qt.Qt.UserRole) for item in listwidget.selectedItems()] def _create_group_panel(self, input_data): title = input_data.get('key', '') diff --git a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py index ff9a1f504..aecdbff3f 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py @@ -290,7 +290,7 @@ def _initReportCombo(self): def _onReportTriggered(self, index): report_handlers = get_report_handlers() combo = self.reportComboBox() - name = Qt.from_qvariant(combo.itemData(index), str) + name = combo.itemData(index) report_handler = report_handlers[name] report = report_handler(self) app = Qt.QApplication.instance() diff --git a/lib/taurus/qt/qtgui/panel/taurusmodellist.py b/lib/taurus/qt/qtgui/panel/taurusmodellist.py index 41e73fe9e..6faaf2537 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmodellist.py +++ b/lib/taurus/qt/qtgui/panel/taurusmodellist.py @@ -178,7 +178,6 @@ def setData(self, index, value=None, role=Qt.Qt.EditRole): if index.isValid() and (0 <= index.row() < self.rowCount()): row = index.row() item = self.items[row] - value = Qt.from_qvariant(value, str) if role == Qt.Qt.EditRole: item.src = value elif role == Qt.Qt.DisplayRole: @@ -272,9 +271,8 @@ def mimeData(self, indexes): '''reimplemented from :class:`Qt.QAbstractListModel`''' mimedata = Qt.QAbstractListModel.mimeData(self, indexes) if len(indexes) == 1: - # mimedata.setData(TAURUS_ATTR_MIME_TYPE, - # Qt.from_qvariant(self.data(indexes[0]), str))) - txt = Qt.from_qvariant(self.data(indexes[0], role=SRC_ROLE), str) + # mimedata.setData(TAURUS_ATTR_MIME_TYPE, self.data(indexes[0])) + txt = self.data(indexes[0], role=SRC_ROLE) mimedata.setText(txt) return mimedata # mimedata.setData() @@ -337,9 +335,8 @@ def _onEditDisplay(self): idx = selected[0] else: return - value = Qt.from_qvariant(self._model.data( - idx, role=Qt.Qt.DisplayRole), str) - src = Qt.from_qvariant(self._model.data(idx, role=SRC_ROLE), str) + value = self._model.data(idx, role=Qt.Qt.DisplayRole) + src = self._model.data(idx, role=SRC_ROLE) value, ok = Qt.QInputDialog.getText( self, "Display Value", "Display value for %s?" % src, Qt.QLineEdit.Normal, value) if not ok: diff --git a/lib/taurus/qt/qtgui/plot/curveprops.py b/lib/taurus/qt/qtgui/plot/curveprops.py index 983884898..c01186426 100755 --- a/lib/taurus/qt/qtgui/plot/curveprops.py +++ b/lib/taurus/qt/qtgui/plot/curveprops.py @@ -247,7 +247,6 @@ def setData(self, index, value=None, role=Qt.Qt.EditRole): row, 0), self.index(row, self.ncolumns - 1)) else: column = index.column() - value = Qt.from_qvariant(value, str) if column == X: curve.x.setSrc(value) elif column == Y: @@ -321,9 +320,8 @@ def dropMimeData(self, data, action, row, column, parent): def mimeData(self, indexes): mimedata = Qt.QAbstractTableModel.mimeData(self, indexes) if len(indexes) == 1: - # txt = Qt.from_qvariant(self.data(indexes[0], str) - # mimedata.setData(TAURUS_ATTR_MIME_TYPE, txt) - txt = Qt.from_qvariant(self.data(indexes[0], role=SRC_ROLE), str) + txt = self.data(indexes[0], role=SRC_ROLE) + # mimedata.setData(TAURUS_ATTR_MIME_TYPE, txt) mimedata.setText(txt) return mimedata # mimedata.setData() diff --git a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py index e11e9b149..9fe20ce4f 100644 --- a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py +++ b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py @@ -178,7 +178,7 @@ def setCurves(self, curvePropDict): def onItemChanged(self, item): '''slot used when an item data has changed''' - name = Qt.from_qvariant(item.data(self.NAME_ROLE), str) + name = item.data(self.NAME_ROLE) previousTitle = self.curvePropDict[name].title currentTitle = item.text() if previousTitle != currentTitle: @@ -207,7 +207,7 @@ def getSelectedCurveNames(self): :return: (string_list) the names of the selected curves ''' - return [Qt.from_qvariant(item.data(self.NAME_ROLE), str) for item in self.curvesLW.selectedItems()] + return [item.data(self.NAME_ROLE) for item in self.curvesLW.selectedItems()] def showProperties(self, prop=None): '''Updates the dialog to show the given properties. diff --git a/lib/taurus/qt/qtgui/table/qlogtable.py b/lib/taurus/qt/qtgui/table/qlogtable.py index 068801868..0c2e1fdc2 100644 --- a/lib/taurus/qt/qtgui/table/qlogtable.py +++ b/lib/taurus/qt/qtgui/table/qlogtable.py @@ -397,12 +397,12 @@ def getLogLevelComboBox(self): def getLogLevel(self): combo = self.getLogLevelComboBox() - return Qt.from_qvariant(combo.itemData(combo.currentIndex())) + return combo.itemData(combo.currentIndex()) def setLogLevel(self, level): combo = self.getLogLevelComboBox() for i in range(combo.count()): - l = Qt.from_qvariant(combo.itemData(i)) + l = combo.itemData(i) if l == level: combo.setCurrentIndex(i) diff --git a/lib/taurus/qt/qtgui/table/taurusvaluestable.py b/lib/taurus/qt/qtgui/table/taurusvaluestable.py index 34e3fa849..2af5d1bbd 100755 --- a/lib/taurus/qt/qtgui/table/taurusvaluestable.py +++ b/lib/taurus/qt/qtgui/table/taurusvaluestable.py @@ -270,7 +270,7 @@ def getModifiedWriteData(self): if kind in 'SU': table = table.tolist() # we want to allow the strings to be larger than the original ones for (r, c), v in self._modifiedDict.items(): - table[r][c] = Qt.from_qvariant(v, str) + table[r][c] = v table = numpy.array(table, dtype=str) else: for k, v in self._modifiedDict.items(): @@ -279,7 +279,6 @@ def getModifiedWriteData(self): q = _value2Quantity(v, units) table[k] = q elif kind == 'b': - # TODO: This does not work Qt.from_qvariant(v, bool) if str(v) == "true": table[k] = True else: @@ -489,13 +488,13 @@ def setEditorData(self, editor, index): self._initialText = None if index.model().getType() == bool: editor.addItems(['true', 'false']) - a = str(Qt.from_qvariant(index.data(), bool)).lower() + a = str(index.data()).lower() self._initialText = a editor.setCurrentIndex(editor.findText(a)) else: data = index.model().data(index, Qt.Qt.EditRole) - self._initialText = Qt.from_qvariant(data, str) + self._initialText = data editor.setText(str(self._initialText)) def setModelData(self, editor, model, index): diff --git a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py index 4f9774b20..fd4091ff6 100644 --- a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py +++ b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py @@ -308,7 +308,7 @@ def validatePage(self): raise ValueError # set the name now because it might have changed since the # PanelDescription was created - paneldesc.name = Qt.from_qvariant(self.field('panelname'), str) + paneldesc.name = self.field('panelname') # allow the wizard to proceed return True except Exception as e: @@ -524,7 +524,6 @@ def setData(self, index, value=None, role=Qt.Qt.EditRole): if index.isValid() and (0 <= index.row() < self.rowCount()): row = index.row() column = index.column() - value = Qt.from_qvariant(value, str) self.__table[row][column] = value self.dataChanged.emit(index, index) return True From 7c3286a180a77a5badab0bbcffaad47f4b1c47f6 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 28 Nov 2018 18:27:12 +0100 Subject: [PATCH 172/252] Remove all usages of QVariant in Taurus Avoid calling QVariant from taurus (use the python objects directly). --- lib/taurus/external/qt/QtCore.py | 1 - lib/taurus/qt/qtcore/model/taurusmodel.py | 8 +- .../qt/qtgui/container/taurusmainwindow.py | 7 +- .../qtgui/display/demo/qpixmapwidgetdemo.py | 12 +- .../qt/qtgui/extra_guiqwt/curvesmodel.py | 75 ++++++------- lib/taurus/qt/qtgui/help/helppanel.py | 2 +- lib/taurus/qt/qtgui/input/tauruscombobox.py | 6 +- .../qt/qtgui/panel/taurusconfigeditor.py | 38 ++++--- .../qt/qtgui/panel/taurusmessagepanel.py | 1 - lib/taurus/qt/qtgui/panel/taurusmodellist.py | 20 ++-- lib/taurus/qt/qtgui/plot/curveprops.py | 105 +++++++++--------- .../qtgui/plot/curvesAppearanceChooserDlg.py | 22 ++-- lib/taurus/qt/qtgui/plot/taurusplotconf.py | 2 +- lib/taurus/qt/qtgui/table/qlogtable.py | 56 +++++----- .../qt/qtgui/table/taurusvaluestable.py | 28 ++--- .../qtgui/taurusgui/paneldescriptionwizard.py | 24 ++-- lib/taurus/qt/qtgui/util/tauruscolor.py | 15 +-- 17 files changed, 202 insertions(+), 220 deletions(-) diff --git a/lib/taurus/external/qt/QtCore.py b/lib/taurus/external/qt/QtCore.py index 1926f4f84..3d71acd94 100644 --- a/lib/taurus/external/qt/QtCore.py +++ b/lib/taurus/external/qt/QtCore.py @@ -94,7 +94,6 @@ class QStandardPaths(): # Deprecated. QVariant is kept for now to facilitate transition of existing # code but using QVariant should be avoided (with API 2 it is superfluous) - # TODO: Remove all references to QVariant in taurus @__deprecation(rel='4.0.1', alt='python objects directly') def QVariant(pyobj=None): return pyobj diff --git a/lib/taurus/qt/qtcore/model/taurusmodel.py b/lib/taurus/qt/qtcore/model/taurusmodel.py index c3d338b24..1bd10ae99 100644 --- a/lib/taurus/qt/qtcore/model/taurusmodel.py +++ b/lib/taurus/qt/qtcore/model/taurusmodel.py @@ -272,15 +272,11 @@ def pyData(self, index, role=QtQt.DisplayRole): elif role == QtQt.FontRole: ret = self.DftFont elif role == QtQt.UserRole: - ret = Qt.QVariant(item) + ret = item return ret def data(self, index, role=QtQt.DisplayRole): ret = self.pyData(index, role) - if ret is None: - ret = Qt.QVariant() - else: - ret = Qt.QVariant(ret) return ret def _setData(self, index, qvalue, role=QtQt.EditRole): @@ -317,7 +313,7 @@ def headerData(self, section, orientation, role=QtQt.DisplayRole): elif role == QtQt.DecorationRole: ret = self.columnIcon(section) - return Qt.QVariant(ret) + return ret def index(self, row, column, parent=Qt.QModelIndex()): if not self.hasIndex(row, column, parent): diff --git a/lib/taurus/qt/qtgui/container/taurusmainwindow.py b/lib/taurus/qt/qtgui/container/taurusmainwindow.py index 40915c024..00f2b6e43 100644 --- a/lib/taurus/qt/qtgui/container/taurusmainwindow.py +++ b/lib/taurus/qt/qtgui/container/taurusmainwindow.py @@ -666,12 +666,11 @@ def saveSettings(self, group=None): if group is not None: settings.beginGroup(group) # main window geometry - settings.setValue("MainWindow/State", Qt.QVariant(self.saveState())) - settings.setValue("MainWindow/Geometry", - Qt.QVariant(self.saveGeometry())) + settings.setValue("MainWindow/State", self.saveState()) + settings.setValue("MainWindow/Geometry", self.saveGeometry()) # store the config dict - settings.setValue("TaurusConfig", Qt.QVariant(self.createQConfig())) + settings.setValue("TaurusConfig", self.createQConfig()) if group is not None: settings.endGroup() self.info('MainWindow settings saved in "%s"' % settings.fileName()) diff --git a/lib/taurus/qt/qtgui/display/demo/qpixmapwidgetdemo.py b/lib/taurus/qt/qtgui/display/demo/qpixmapwidgetdemo.py index 0227bda15..b72f721ee 100644 --- a/lib/taurus/qt/qtgui/display/demo/qpixmapwidgetdemo.py +++ b/lib/taurus/qt/qtgui/display/demo/qpixmapwidgetdemo.py @@ -88,12 +88,12 @@ def __init__(self, parent=None): aspect_ratio_widget.addItems( ["Ignore", "Keep", "Keep by expanding"]) transformation_widget.addItems(["Fast", "Smooth"]) - halign_widget.addItem("Left", Qt.QVariant(Qt.Qt.AlignLeft)) - halign_widget.addItem("Center", Qt.QVariant(Qt.Qt.AlignHCenter)) - halign_widget.addItem("Right", Qt.QVariant(Qt.Qt.AlignRight)) - valign_widget.addItem("Top", Qt.QVariant(Qt.Qt.AlignTop)) - valign_widget.addItem("Center", Qt.QVariant(Qt.Qt.AlignVCenter)) - valign_widget.addItem("Bottom", Qt.QVariant(Qt.Qt.AlignBottom)) + halign_widget.addItem("Left", Qt.Qt.AlignLeft) + halign_widget.addItem("Center", Qt.Qt.AlignHCenter) + halign_widget.addItem("Right", Qt.Qt.AlignRight) + valign_widget.addItem("Top", Qt.Qt.AlignTop) + valign_widget.addItem("Center", Qt.Qt.AlignVCenter) + valign_widget.addItem("Bottom", Qt.Qt.AlignBottom) pixmap_widget.textChanged.connect(self.changePixmap) aspect_ratio_widget.currentIndexChanged.connect(self.changeAspectRatio) diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py index 2dc408ca6..8dc49bdec 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/curvesmodel.py @@ -181,78 +181,76 @@ def columnCount(self, index=Qt.QModelIndex()): def data(self, index, role=Qt.Qt.DisplayRole): if not index.isValid() or not (0 <= index.row() < self.rowCount()): - return Qt.QVariant() + return None row = index.row() column = index.column() # Display Role if role == Qt.Qt.DisplayRole: if column == X: - return Qt.QVariant(str(self.curves[row].x.display)) + return str(self.curves[row].x.display) elif column == Y: - return Qt.QVariant(str(self.curves[row].y.display)) + return str(self.curves[row].y.display) elif column == TITLE: - return Qt.QVariant(str(self.curves[row].curveparam.label)) + return str(self.curves[row].curveparam.label) else: - return Qt.QVariant() + return None elif role == Qt.Qt.DecorationRole: if column == X: - return Qt.QVariant(self.curves[row].x.icon) + return self.curves[row].x.icon elif column == Y: - return Qt.QVariant(self.curves[row].y.icon) + return self.curves[row].y.icon else: - return Qt.QVariant() + return None elif role == Qt.Qt.TextColorRole: if column == X: - Qt.QVariant( - Qt.QColor(self.curves[row].x.ok and 'green' or 'red')) + Qt.QColor(self.curves[row].x.ok and 'green' or 'red') elif column == Y: - Qt.QVariant( - Qt.QColor(self.curves[row].y.ok and 'green' or 'red')) + Qt.QColor(self.curves[row].y.ok and 'green' or 'red') else: - return Qt.QVariant() + return None elif role == SRC_ROLE: if column == X: - return Qt.QVariant(str(self.curves[row].taurusparam.xModel)) + return str(self.curves[row].taurusparam.xModel) elif column == Y: - return Qt.QVariant(str(self.curves[row].taurusparam.yModel)) + return str(self.curves[row].taurusparam.yModel) else: - return Qt.QVariant() + return None elif role == Qt.Qt.ToolTipRole: if column == X: - return Qt.QVariant(str(self.curves[row].taurusparam.xModel)) + return str(self.curves[row].taurusparam.xModel) elif column == Y: - return Qt.QVariant(str(self.curves[row].taurusparam.yModel)) + return str(self.curves[row].taurusparam.yModel) else: - return Qt.QVariant() + return None if role == Qt.Qt.EditRole: if column == X: - return Qt.QVariant(str(self.curves[row].taurusparam.xModel)) + return str(self.curves[row].taurusparam.xModel) elif column == Y: - return Qt.QVariant(str(self.curves[row].taurusparam.yModel)) + return str(self.curves[row].taurusparam.yModel) elif column == TITLE: - return Qt.QVariant(str(self.curves[row].curveparam.label)) + return str(self.curves[row].curveparam.label) else: - return Qt.QVariant() - return Qt.QVariant() + return None + return None def headerData(self, section, orientation, role=Qt.Qt.DisplayRole): if role == Qt.Qt.TextAlignmentRole: if orientation == Qt.Qt.Horizontal: - return Qt.QVariant(int(Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter)) - return Qt.QVariant(int(Qt.Qt.AlignRight | Qt.Qt.AlignVCenter)) + return int(Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter) + return int(Qt.Qt.AlignRight | Qt.Qt.AlignVCenter) if role != Qt.Qt.DisplayRole: - return Qt.QVariant() + return None # So this is DisplayRole... if orientation == Qt.Qt.Horizontal: if section == X: - return Qt.QVariant("X source") + return "X source" elif section == Y: - return Qt.QVariant("Y Source") + return "Y Source" elif section == TITLE: - return Qt.QVariant("Title") - return Qt.QVariant() + return "Title" + return None else: - return Qt.QVariant(str(section + 1)) + return str(section + 1) def flags(self, index): # use this to set the editable flag when fix is selected if not index.isValid(): @@ -323,22 +321,20 @@ def dropMimeData(self, data, action, row, column, parent): column = parent.columnCount() if data.hasFormat(TAURUS_ATTR_MIME_TYPE): self.setData(self.index(row, column), - value=Qt.QVariant(str(data.data(TAURUS_ATTR_MIME_TYPE)))) + value=str(data.data(TAURUS_ATTR_MIME_TYPE))) return True elif data.hasFormat(TAURUS_MODEL_LIST_MIME_TYPE): models = str(data.data(TAURUS_MODEL_LIST_MIME_TYPE)).split() if len(models) == 1: - self.setData(self.index(row, column), - value=Qt.QVariant(models[0])) + self.setData(self.index(row, column), value=models[0]) return True else: self.insertRows(row, len(models)) for i, m in enumerate(models): - self.setData(self.index(row + i, column), - value=Qt.QVariant(m)) + self.setData(self.index(row + i, column), value=m) return True elif data.hasText(): - self.setData(self.index(row, column), Qt.QVariant(data.text())) + self.setData(self.index(row, column), data.text()) return True return False @@ -459,8 +455,7 @@ def onModelsAdded(self, models): rowcount = self.model.rowCount() self.model.insertRows(rowcount, nmodels) for i, m in enumerate(models): - self.model.setData(self.model.index( - rowcount + i, Y), value=Qt.QVariant(m)) + self.model.setData(self.model.index(rowcount + i, Y), value=m) title = self.model.data(self.model.index( rowcount + i, Y)) # the display data self.model.setData(self.model.index( diff --git a/lib/taurus/qt/qtgui/help/helppanel.py b/lib/taurus/qt/qtgui/help/helppanel.py index e90e8229b..d08b49127 100644 --- a/lib/taurus/qt/qtgui/help/helppanel.py +++ b/lib/taurus/qt/qtgui/help/helppanel.py @@ -51,7 +51,7 @@ def setHelpEngine(self, help_engine): def loadResource(self, type, url): if url.scheme() == "qthelp": if self.__help_engine: - return Qt.QVariant(self.__help_engine.fileData(url)) + return self.__help_engine.fileData(url) return Qt.QTextBrowser.loadResource(self, type, url) diff --git a/lib/taurus/qt/qtgui/input/tauruscombobox.py b/lib/taurus/qt/qtgui/input/tauruscombobox.py index 213d94395..d7ec36029 100644 --- a/lib/taurus/qt/qtgui/input/tauruscombobox.py +++ b/lib/taurus/qt/qtgui/input/tauruscombobox.py @@ -115,7 +115,7 @@ def setValue(self, value): Set the value for the widget to display, not the value of the attribute. """ - index = self.findData(Qt.QVariant(value)) + index = self.findData(value) self._setCurrentIndex(index) def updateStyle(self): @@ -179,7 +179,7 @@ def addValueNames(self, names): bs = self.blockSignals(True) try: for k, v in names: - self.addItem(k, Qt.QVariant(v)) + self.addItem(k, v) # Ok, now we should see if the current value matches any # of the newly added names. This is kinda a refresh: @@ -200,7 +200,7 @@ def getValueString(self, value, default='UNKNOWN(%s)'): a '%s' placeholder which will be substituted with str(value). It defaults to 'UNKNOWN(%s)'. """ - item = self.findData(Qt.QVariant(value)) + item = self.findData(value) if item < 0: if '%s' in default: return default % str(value) diff --git a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py index 1a3925cb1..15c956147 100644 --- a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py +++ b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py @@ -111,8 +111,8 @@ def deleteBranch(self): group = str(path).split(';', 1)[0] itemToMark = self.itemFromIndex(tmpindex.parent()) while(itemToMark is not None): - itemToMark.setData(Qt.QVariant( - Qt.QFont("Arial", 10, Qt.QFont.Bold)), Qt.Qt.FontRole) + itemToMark.setData( + Qt.QFont("Arial", 10, Qt.QFont.Bold), Qt.Qt.FontRole) itemToMark = self.itemFromIndex(itemToMark.index().parent()) self.markedItems.append(self._toDeleteIndex.parent()) @@ -180,14 +180,14 @@ def valueChanged(self, value, index): self.itemFromIndex(index.sibling(index.row(), 1) ).setText(str(type(eval(value)))) - changedItem.setData(Qt.QVariant( - 'Value has been changed. Old value: ' + str(changedItem.text())), + changedItem.setData( + 'Value has been changed. Old value: ' + str(changedItem.text()), Qt.Qt.ToolTipRole) - itemToMark.setData(Qt.QVariant(Qt.QIcon.fromTheme('emblem-important')), + itemToMark.setData(Qt.QIcon.fromTheme('emblem-important'), Qt.Qt.DecorationRole) while(itemToMark is not None): - itemToMark.setData(Qt.QVariant( - Qt.QFont("Arial", 10, Qt.QFont.Bold)), Qt.Qt.FontRole) + itemToMark.setData( + Qt.QFont("Arial", 10, Qt.QFont.Bold), Qt.Qt.FontRole) itemToMark = self.itemFromIndex(itemToMark.index().parent()) self.saveSettings(group) @@ -235,7 +235,7 @@ def fillTopLevel(self): configdict = self.getTaurusConfigFromSettings() if configdict is not None: mainConfig[None] = configdict - item.setData(Qt.QVariant('None'), Qt.Qt.UserRole) + item.setData('None', Qt.Qt.UserRole) self.fillTaurusConfig(item, configdict) self._settings.beginGroup("Perspectives") self.perspectives = self._settings.childGroups() @@ -243,7 +243,7 @@ def fillTopLevel(self): item = Qt.QStandardItem(name) item.setEditable(False) # item.setSelectable(False) - path = Qt.QVariant("Perspectives/" + name) + path = "Perspectives/" + name item.setData(path, Qt.Qt.UserRole) root.appendRow(item) self._settings.beginGroup(name) @@ -276,7 +276,7 @@ def fillTaurusConfig(self, item, configdict): item.appendRow(child) txt = item.data(Qt.Qt.UserRole) - path = Qt.QVariant(txt + ";__itemConfigurations__;" + k) + path = txt + ";__itemConfigurations__;" + k child.setData(path, Qt.Qt.UserRole) # recursive call to fill all nodes self.fillTaurusConfig(child, value) @@ -290,7 +290,7 @@ def fillTaurusConfig(self, item, configdict): item.appendRow([child, typeV, valueV]) txt = item.data(Qt.Qt.UserRole) - path = Qt.QVariant(txt + ";__itemConfigurations__;" + k) + path = txt + ";__itemConfigurations__;" + k child.setEditable(False) typeV.setEditable(False) @@ -316,7 +316,7 @@ def fillTaurusConfig(self, item, configdict): child.setEditable(False) item.appendRow(child) txt = item.data(Qt.Qt.UserRole) - path = Qt.QVariant(txt + ";" + k) + path = txt + ";" + k child.setData(path, Qt.Qt.UserRole) # recursive call to fill all nodes self.fillTaurusConfig(child, value) @@ -327,7 +327,7 @@ def fillTaurusConfig(self, item, configdict): child.setForeground(Qt.QBrush(Qt.QColor('gray'))) item.appendRow([child, typeV, valueV]) txt = item.data(Qt.Qt.UserRole) - path = Qt.QVariant(txt + ";" + k) + path = txt + ";" + k child.setData(path, Qt.Qt.UserRole) child.setEditable(False) @@ -380,8 +380,10 @@ def saveSettings(self, group=None): self._settings.beginGroup(group) # store the config dict - self._settings.setValue("TaurusConfig", Qt.QVariant( - Qt.QByteArray(pickle.dumps(self._configurationDictionaries[group])))) + self._settings.setValue( + "TaurusConfig", + Qt.QByteArray(pickle.dumps(self._configurationDictionaries[group])) + ) if group is not None: self._settings.endGroup() #self.info('MainWindow settings saved in "%s"'%self._settings.fileName()) @@ -403,9 +405,9 @@ def clearChanges(self): for index in self.markedItems: itemToMark = self.itemFromIndex(index) while(itemToMark is not None): - itemToMark.setData(Qt.QVariant( - Qt.QFont("Arial", 10, Qt.QFont.Normal)), Qt.Qt.FontRole) - itemToMark.setData(Qt.QVariant(), Qt.Qt.DecorationRole) + itemToMark.setData(Qt.QFont("Arial", 10, Qt.QFont.Normal), + Qt.Qt.FontRole) + itemToMark.setData(None, Qt.Qt.DecorationRole) itemToMark = self.itemFromIndex(itemToMark.index().parent()) diff --git a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py index aecdbff3f..ae0554a8c 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusmessagepanel.py @@ -284,7 +284,6 @@ def _initReportCombo(self): report_handlers = get_report_handlers() combo = self.reportComboBox() for name, report_handler in report_handlers.items(): - name = Qt.QVariant(name) combo.addItem(report_handler.Label, name) def _onReportTriggered(self, index): diff --git a/lib/taurus/qt/qtgui/panel/taurusmodellist.py b/lib/taurus/qt/qtgui/panel/taurusmodellist.py index 6faaf2537..e5dc8712b 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmodellist.py +++ b/lib/taurus/qt/qtgui/panel/taurusmodellist.py @@ -148,24 +148,24 @@ def rowCount(self, index=Qt.QModelIndex()): def data(self, index, role=Qt.Qt.DisplayRole): '''reimplemented from :class:`Qt.QAbstractListModel`''' if not index.isValid() or not (0 <= index.row() < self.rowCount()): - return Qt.QVariant() + return None row = index.row() # Display Role if role == Qt.Qt.DisplayRole: - return Qt.QVariant(Qt.QString(self.items[row].display)) + return Qt.QString(self.items[row].display) elif role == Qt.Qt.DecorationRole: - return Qt.QVariant(self.items[row].icon) + return self.items[row].icon elif role == Qt.Qt.TextColorRole: if not self.items[row].src: - return Qt.QVariant(Qt.QColor('gray')) - return Qt.QVariant(Qt.QColor(self.items[row].ok and 'green' or 'red')) + return Qt.QColor('gray') + return Qt.QColor(self.items[row].ok and 'green' or 'red') elif role == SRC_ROLE: - return Qt.QVariant(Qt.QString(self.items[row].src)) + return Qt.QString(self.items[row].src) elif role == Qt.Qt.ToolTipRole: - return Qt.QVariant(Qt.QString(self.items[row].src)) + return Qt.QString(self.items[row].src) if role == Qt.Qt.EditRole: - return Qt.QVariant(Qt.QString(self.items[row].src)) - return Qt.QVariant() + return Qt.QString(self.items[row].src) + return None def flags(self, index): '''reimplemented from :class:`Qt.QAbstractListModel`''' @@ -341,7 +341,7 @@ def _onEditDisplay(self): self, "Display Value", "Display value for %s?" % src, Qt.QLineEdit.Normal, value) if not ok: return - self._model.setData(idx, Qt.QVariant(value), role=Qt.Qt.DisplayRole) + self._model.setData(idx, value, role=Qt.Qt.DisplayRole) def _onSelectionChanged(self, selected, deselected): '''updates the status of the actions that depend on the selection''' diff --git a/lib/taurus/qt/qtgui/plot/curveprops.py b/lib/taurus/qt/qtgui/plot/curveprops.py index c01186426..ccf6fca19 100755 --- a/lib/taurus/qt/qtgui/plot/curveprops.py +++ b/lib/taurus/qt/qtgui/plot/curveprops.py @@ -139,93 +139,90 @@ def columnCount(self, index=Qt.QModelIndex()): def data(self, index, role=Qt.Qt.DisplayRole): if not index.isValid() or not (0 <= index.row() < self.rowCount()): - return Qt.QVariant() + return None row = index.row() column = index.column() # Display Role if role == Qt.Qt.DisplayRole: if column == X: - return Qt.QVariant(Qt.QString(self.curves[row].x.display)) + return Qt.QString(self.curves[row].x.display) elif column == Y: - return Qt.QVariant(Qt.QString(self.curves[row].y.display)) + return Qt.QString(self.curves[row].y.display) elif column == TITLE: - return Qt.QVariant(Qt.QString(self.curves[row].title)) + return Qt.QString(self.curves[row].title) elif column == VIS: - return Qt.QVariant(Qt.QString(self.curves[row].vis)) + return Qt.QString(self.curves[row].vis) else: - return Qt.QVariant() + return None elif role == Qt.Qt.DecorationRole: if column == X: - return Qt.QVariant(self.curves[row].x.icon) + return self.curves[row].x.icon elif column == Y: - return Qt.QVariant(self.curves[row].y.icon) + return self.curves[row].y.icon elif column == TITLE: - return Qt.QVariant(Qt.QColor(self.curves[row].properties.lColor or 'black')) + return Qt.QColor(self.curves[row].properties.lColor or 'black') else: - return Qt.QVariant() + return None elif role == Qt.Qt.TextColorRole: if column == X: - Qt.QVariant( - Qt.QColor(self.curves[row].x.ok and 'green' or 'red')) + Qt.QColor(self.curves[row].x.ok and 'green' or 'red') elif column == Y: - Qt.QVariant( - Qt.QColor(self.curves[row].y.ok and 'green' or 'red')) + Qt.QColor(self.curves[row].y.ok and 'green' or 'red') else: - return Qt.QVariant() + return None elif role == SRC_ROLE: if column == X: - return Qt.QVariant(Qt.QString(self.curves[row].x.src)) + return Qt.QString(self.curves[row].x.src) elif column == Y: - return Qt.QVariant(Qt.QString(self.curves[row].y.src)) + return Qt.QString(self.curves[row].y.src) else: - return Qt.QVariant() + return None elif role == PROPS_ROLE: return self.curves[row].properties elif role == Qt.Qt.ToolTipRole: if column == X: - return Qt.QVariant(Qt.QString(self.curves[row].x.src)) + return Qt.QString(self.curves[row].x.src) elif column == Y: - return Qt.QVariant(Qt.QString(self.curves[row].y.src)) + return Qt.QString(self.curves[row].y.src) else: - return Qt.QVariant() + return None if role == Qt.Qt.EditRole: if column == X: - return Qt.QVariant(Qt.QString(self.curves[row].x.src)) + return Qt.QString(self.curves[row].x.src) elif column == Y: - return Qt.QVariant(Qt.QString(self.curves[row].y.src)) + return Qt.QString(self.curves[row].y.src) elif column == TITLE: - return Qt.QVariant(Qt.QString(self.curves[row].title)) + return Qt.QString(self.curves[row].title) else: - return Qt.QVariant() + return None # Alignment # elif role == Qt.Qt.TextAlignmentRole: -# return QVariant(int(Qt.AlignHCenter|Qt.AlignVCenter)) +# return int(Qt.AlignHCenter|Qt.AlignVCenter) # Text Color # elif role == Qt.Qt.TextColorRole: -# return Qt.QVariant(Qt.QColor(self.curves[row].properties.lColor or -# 'black')) - return Qt.QVariant() +# return Qt.QColor(self.curves[row].properties.lColor or 'black') + return None def headerData(self, section, orientation, role=Qt.Qt.DisplayRole): if role == Qt.Qt.TextAlignmentRole: if orientation == Qt.Qt.Horizontal: - return Qt.QVariant(int(Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter)) - return Qt.QVariant(int(Qt.Qt.AlignRight | Qt.Qt.AlignVCenter)) + return int(Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter) + return int(Qt.Qt.AlignRight | Qt.Qt.AlignVCenter) if role != Qt.Qt.DisplayRole: - return Qt.QVariant() + return None # So this is DisplayRole... if orientation == Qt.Qt.Horizontal: if section == X: - return Qt.QVariant("X source") + return "X source" elif section == Y: - return Qt.QVariant("Y Source") + return "Y Source" elif section == TITLE: - return Qt.QVariant("Title") + return "Title" elif section == VIS: - return Qt.QVariant("Shown at") - return Qt.QVariant() + return "Shown at" + return None else: - return Qt.QVariant(Qt.QString.number(section + 1)) + return Qt.QString.number(section + 1) def flags(self, index): # use this to set the editable flag when fix is selected if not index.isValid(): @@ -298,22 +295,20 @@ def dropMimeData(self, data, action, row, column, parent): column = parent.columnCount() if data.hasFormat(TAURUS_ATTR_MIME_TYPE): self.setData(self.index(row, column), - value=Qt.QVariant(str(data.data(TAURUS_ATTR_MIME_TYPE)))) + value=str(data.data(TAURUS_ATTR_MIME_TYPE))) return True elif data.hasFormat(TAURUS_MODEL_LIST_MIME_TYPE): models = str(data.data(TAURUS_MODEL_LIST_MIME_TYPE)).split() if len(models) == 1: - self.setData(self.index(row, column), - value=Qt.QVariant(models[0])) + self.setData(self.index(row, column), value=models[0]) return True else: self.insertRows(row, len(models)) for i, m in enumerate(models): - self.setData(self.index(row + i, column), - value=Qt.QVariant(m)) + self.setData(self.index(row + i, column), value=m) return True elif data.hasText(): - self.setData(self.index(row, column), Qt.QVariant(data.text())) + self.setData(self.index(row, column), data.text()) return True return False @@ -366,8 +361,8 @@ def __init__(self, parent=None, designMode=False): self.ui.lColorCB.addItem("") for color in NamedColors: icon = self._colorIcon(color) - self.ui.sColorCB.addItem(icon, "", Qt.QVariant(Qt.QColor(color))) - self.ui.lColorCB.addItem(icon, "", Qt.QVariant(Qt.QColor(color))) + self.ui.sColorCB.addItem(icon, "", Qt.QColor(color)) + self.ui.lColorCB.addItem(icon, "", Qt.QColor(color)) self._emptyProps = CurveAppearanceProperties() self.showProperties(self._emptyProps) @@ -516,22 +511,24 @@ def showProperties(self, prop, blockSignals=True): if prop.sColor is None: index = 0 else: - index = self.ui.sColorCB.findData( - Qt.QVariant(Qt.QColor(prop.sColor))) + index = self.ui.sColorCB.findData(Qt.QColor(prop.sColor)) if index == -1: # if the color is not one of the supported colors, add it to the combobox index = self.ui.sColorCB.count() # set the index to what will be the added one - self.ui.sColorCB.addItem(self._colorIcon( - Qt.QColor(prop.sColor)), "", Qt.QVariant(Qt.QColor(prop.sColor))) + self.ui.sColorCB.addItem(self._colorIcon(Qt.QColor(prop.sColor)), + "", + Qt.QColor(prop.sColor) + ) self.ui.sColorCB.setCurrentIndex(index) if prop.lColor is None: index = 0 else: - index = self.ui.lColorCB.findData( - Qt.QVariant(Qt.QColor(prop.lColor))) + index = self.ui.lColorCB.findData(Qt.QColor(prop.lColor)) if index == -1: # if the color is not one of the supported colors, add it to the combobox index = self.ui.lColorCB.count() # set the index to what will be the added one - self.ui.lColorCB.addItem(self._colorIcon( - Qt.QColor(prop.lColor)), "", Qt.QVariant(Qt.QColor(prop.lColor))) + self.ui.lColorCB.addItem(self._colorIcon(Qt.QColor(prop.lColor)), + "", + Qt.QColor(prop.lColor) + ) self.ui.lColorCB.setCurrentIndex(index) # set the Fill Checkbox. The prop.sFill value can be in 3 states: True, # False and None diff --git a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py index 9fe20ce4f..67fb42d7e 100644 --- a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py +++ b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py @@ -124,8 +124,8 @@ def __init__(self, parent=None, curvePropDict={}, showButtons=False, autoApply=F self.resetBT.hide() for color in NamedColors: icon = self._colorIcon(color) - self.sColorCB.addItem(icon, "", Qt.QVariant(Qt.QColor(color))) - self.lColorCB.addItem(icon, "", Qt.QVariant(Qt.QColor(color))) + self.sColorCB.addItem(icon, "", Qt.QColor(color)) + self.lColorCB.addItem(icon, "", Qt.QColor(color)) self.__itemsDict = CaselessDict() self.setCurves(curvePropDict) # set the icon for the background button (stupid designer limitations @@ -170,7 +170,7 @@ def setCurves(self, curvePropDict): # create and insert the item item = Qt.QListWidgetItem(Qt.QString(prop.title), self.curvesLW) self.__itemsDict[name] = item - item.setData(self.NAME_ROLE, Qt.QVariant(Qt.QString(name))) + item.setData(self.NAME_ROLE, Qt.QString(name)) item.setToolTip("Curve Name: %s" % name) item.setFlags(Qt.Qt.ItemIsEnabled | Qt.Qt.ItemIsSelectable | Qt.Qt.ItemIsUserCheckable | Qt.Qt.ItemIsDragEnabled | Qt.Qt.ItemIsEditable) @@ -235,20 +235,24 @@ def showProperties(self, prop=None): if prop.sColor is None: index = 0 else: - index = self.sColorCB.findData(Qt.QVariant(Qt.QColor(prop.sColor))) + index = self.sColorCB.findData(Qt.QColor(prop.sColor)) if index == -1: # if the color is not one of the supported colors, add it to the combobox index = self.sColorCB.count() # set the index to what will be the added one - self.sColorCB.addItem(self._colorIcon( - Qt.QColor(prop.sColor)), "", Qt.QVariant(Qt.QColor(prop.sColor))) + self.sColorCB.addItem(self._colorIcon(Qt.QColor(prop.sColor)), + "", + Qt.QColor(prop.sColor) + ) self.sColorCB.setCurrentIndex(index) if prop.lColor is None: index = 0 else: - index = self.lColorCB.findData(Qt.QVariant(Qt.QColor(prop.lColor))) + index = self.lColorCB.findData(Qt.QColor(prop.lColor)) if index == -1: # if the color is not one of the supported colors, add it to the combobox index = self.lColorCB.count() # set the index to what will be the added one - self.lColorCB.addItem(self._colorIcon( - Qt.QColor(prop.lColor)), "", Qt.QVariant(Qt.QColor(prop.lColor))) + self.lColorCB.addItem(self._colorIcon(Qt.QColor(prop.lColor)), + "", + Qt.QColor(prop.lColor) + ) self.lColorCB.setCurrentIndex(index) # set the Fill Checkbox. The prop.sFill value can be in 3 states: True, # False and None diff --git a/lib/taurus/qt/qtgui/plot/taurusplotconf.py b/lib/taurus/qt/qtgui/plot/taurusplotconf.py index 1a7c5f022..d6a8e5095 100644 --- a/lib/taurus/qt/qtgui/plot/taurusplotconf.py +++ b/lib/taurus/qt/qtgui/plot/taurusplotconf.py @@ -130,7 +130,7 @@ def onModelsAdded(self, models): self.model.insertRows(rowcount, nmodels) for i, m in enumerate(models): self.model.setData(self.model.index(rowcount + i, curveprops.Y), - value=Qt.QVariant(m)) + value=m) def onApply(self): print("APPLY!!! (todo)") diff --git a/lib/taurus/qt/qtgui/table/qlogtable.py b/lib/taurus/qt/qtgui/table/qlogtable.py index 0c2e1fdc2..3c61cb8d6 100644 --- a/lib/taurus/qt/qtgui/table/qlogtable.py +++ b/lib/taurus/qt/qtgui/table/qlogtable.py @@ -181,74 +181,74 @@ def getRecord(self, index): def data(self, index, role=Qt.Qt.DisplayRole): if not index.isValid() or not (0 <= index.row() < len(self._records)): - return Qt.QVariant() + return None record = self.getRecord(index) column = index.column() if role == Qt.Qt.DisplayRole: if column == LEVEL: - return Qt.QVariant(record.levelname) + return record.levelname elif column == TIME: dt = datetime.datetime.fromtimestamp(record.created) - return Qt.QVariant(str(dt)) - # return Qt.QVariant(dt.strftime("%Y-%m-%d %H:%m:%S.%f")) + return str(dt) + # return dt.strftime("%Y-%m-%d %H:%m:%S.%f") elif column == MSG: - return Qt.QVariant(record.getMessage()) + return record.getMessage() elif column == NAME: - return Qt.QVariant(record.name) + return record.name elif column == ORIGIN: - return Qt.QVariant(_get_record_origin_str(record)) + return _get_record_origin_str(record) elif role == Qt.Qt.TextAlignmentRole: if column in (LEVEL, MSG): - return Qt.QVariant(Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter) - return Qt.QVariant(Qt.Qt.AlignRight | Qt.Qt.AlignVCenter) + return Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter + return Qt.Qt.AlignRight | Qt.Qt.AlignVCenter elif role == Qt.Qt.BackgroundRole: if column == LEVEL: - return Qt.QVariant(getBrushForLevel(record.levelno)[0]) + return getBrushForLevel(record.levelno)[0] elif role == Qt.Qt.ForegroundRole: if column == LEVEL: - return Qt.QVariant(getBrushForLevel(record.levelno)[1]) + return getBrushForLevel(record.levelno)[1] elif role == Qt.Qt.ToolTipRole: - return Qt.QVariant(_get_record_origin_tooltip(record)) + return _get_record_origin_tooltip(record) elif role == Qt.Qt.SizeHintRole: return self._getSizeHint(column) # elif role == Qt.Qt.StatusTipRole: # elif role == Qt.Qt.CheckStateRole: elif role == Qt.Qt.FontRole: - return Qt.QVariant(self.DftFont) - return Qt.QVariant() + return self.DftFont + return None def _getSizeHint(self, column): - return Qt.QVariant(QLoggingTableModel.DftColSize[column]) + return QLoggingTableModel.DftColSize[column] def headerData(self, section, orientation, role=Qt.Qt.DisplayRole): if role == Qt.Qt.TextAlignmentRole: if orientation == Qt.Qt.Horizontal: - return Qt.QVariant(int(Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter)) - return Qt.QVariant(int(Qt.Qt.AlignRight | Qt.Qt.AlignVCenter)) + return int(Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter) + return int(Qt.Qt.AlignRight | Qt.Qt.AlignVCenter) elif role == Qt.Qt.SizeHintRole: if orientation == Qt.Qt.Vertical: - return Qt.QVariant(Qt.QSize(50, 20)) + return Qt.QSize(50, 20) else: return self._getSizeHint(section) elif role == Qt.Qt.FontRole: - return Qt.QVariant(Qt.QFont("Mono", 8)) + return Qt.QFont("Mono", 8) elif role == Qt.Qt.ToolTipRole: if section == LEVEL: - return Qt.QVariant("log level") + return "log level" elif section == TIME: - return Qt.QVariant("log time stamp") + return "log time stamp" elif section == MSG: - return Qt.QVariant("log message") + return "log message" elif section == NAME: - return Qt.QVariant("object who recorded the log") + return "object who recorded the log" elif section == ORIGIN: - return Qt.QVariant("the host, process and thread where the " - "log was executed from") + return ("the host, process and thread where the" + + " log was executed from") if role != Qt.Qt.DisplayRole: - return Qt.QVariant() + return None if orientation == Qt.Qt.Horizontal: - return Qt.QVariant(HORIZ_HEADER[section]) - return Qt.QVariant(int(section + 1)) + return HORIZ_HEADER[section] + return int(section + 1) def insertRows(self, position, rows=1, index=Qt.QModelIndex()): self.beginInsertRows(Qt.QModelIndex(), position, position + rows - 1) diff --git a/lib/taurus/qt/qtgui/table/taurusvaluestable.py b/lib/taurus/qt/qtgui/table/taurusvaluestable.py index 2af5d1bbd..567ea37cf 100755 --- a/lib/taurus/qt/qtgui/table/taurusvaluestable.py +++ b/lib/taurus/qt/qtgui/table/taurusvaluestable.py @@ -103,7 +103,7 @@ def data(self, index, role=Qt.Qt.DisplayRole): else: tabledata = self._wtabledata if not index.isValid() or not (0 <= index.row() < len(tabledata)): - return Qt.QVariant() + return None elif role == Qt.Qt.DisplayRole: value = None rc = (index.row(), index.column()) @@ -118,7 +118,7 @@ def data(self, index, role=Qt.Qt.DisplayRole): value = value.magnitude # cast the value to a standard python type value = self.typeCastingMap[tabledata.dtype.kind](value) - return Qt.QVariant(value) + return value elif role == Qt.Qt.DecorationRole: if ((index.row(), index.column()) in self._modifiedDict and self._writeMode): @@ -130,7 +130,7 @@ def data(self, index, role=Qt.Qt.DisplayRole): icon = Qt.QIcon.fromTheme('emblem-important') else: icon = Qt.QIcon.fromTheme('document-save') - return Qt.QVariant(icon) + return icon elif role == Qt.Qt.EditRole: value = None if ((index.row(), index.column()) in self._modifiedDict @@ -140,36 +140,36 @@ def data(self, index, role=Qt.Qt.DisplayRole): value = tabledata[index.row(), index.column()] if tabledata.dtype == bool: value = bool(value) - return Qt.QVariant(value) + return value elif role == Qt.Qt.BackgroundRole: if self._writeMode: - return Qt.QVariant(Qt.QColor(22, 223, 21, 50)) + return Qt.QColor(22, 223, 21, 50) else: - return Qt.QVariant(Qt.QColor('white')) + return Qt.QColor('white') elif role == Qt.Qt.ForegroundRole: if ((index.row(), index.column()) in self._modifiedDict and self._writeMode): if self.getAttr().type in [DataType.Integer, DataType.Float]: value = self._modifiedDict[(index.row(), index.column())] if not self.inAlarmRange(value): - return Qt.QVariant(Qt.QColor('blue')) + return Qt.QColor('blue') else: - return Qt.QVariant(Qt.QColor('orange')) + return Qt.QColor('orange') else: - return Qt.QVariant(Qt.QColor('blue')) - return Qt.QVariant(Qt.QColor('black')) + return Qt.QColor('blue') + return Qt.QColor('black') elif role == Qt.Qt.FontRole: if ((index.row(), index.column()) in self._modifiedDict and self._writeMode): - return Qt.QVariant(Qt.QFont("Arial", 10, Qt.QFont.Bold)) + return Qt.QFont("Arial", 10, Qt.QFont.Bold) elif role == Qt.Qt.ToolTipRole: if ((index.row(), index.column()) in self._modifiedDict and self._writeMode): value = str(self._modifiedDict[(index.row(), index.column())]) msg = 'Original value: %s.\nNew value that will be saved: %s' %\ (str(tabledata[index.row(), index.column()]), value) - return Qt.QVariant(msg) - return Qt.QVariant() + return msg + return None def getAttr(self): return self._attr @@ -518,7 +518,7 @@ def setModelData(self, editor, model, index): text = editor.text() text = str(text) if(text != self._initialText) & (text != ""): - model.addValue(index, Qt.QVariant(text)) + model.addValue(index, text) hh = self.parent().horizontalHeader() if hh.length() > 0: try: diff --git a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py index fd4091ff6..3cd3cd9c7 100644 --- a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py +++ b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py @@ -485,25 +485,25 @@ def columnCount(self, index=Qt.QModelIndex()): def headerData(self, section, orientation, role=Qt.Qt.DisplayRole): if role == Qt.Qt.TextAlignmentRole: if orientation == Qt.Qt.Horizontal: - return Qt.QVariant(int(Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter)) - return Qt.QVariant(int(Qt.Qt.AlignRight | Qt.Qt.AlignVCenter)) + return int(Qt.Qt.AlignLeft | Qt.Qt.AlignVCenter) + return int(Qt.Qt.AlignRight | Qt.Qt.AlignVCenter) if role != Qt.Qt.DisplayRole: - return Qt.QVariant() + return None # So this is DisplayRole... if orientation == Qt.Qt.Horizontal: if section == self.UID: - return Qt.QVariant("Data UID") + return "Data UID" elif section == self.R: - return Qt.QVariant("Reader (slot)") + return "Reader (slot)" elif section == self.W: - return Qt.QVariant("Writer (signal)") - return Qt.QVariant() + return "Writer (signal)" + return None else: - return Qt.QVariant(Qt.QString('%i' % (section + 1))) + return Qt.QString('%i' % (section + 1)) def data(self, index, role=Qt.Qt.DisplayRole): if not index.isValid() or not (0 <= index.row() < self.rowCount()): - return Qt.QVariant() + return None row = index.row() column = index.column() # Display Role @@ -514,8 +514,8 @@ def data(self, index, role=Qt.Qt.DisplayRole): text = '(enter UID)' else: text = '(not registered)' - return Qt.QVariant(Qt.QString(text)) - return Qt.QVariant() + return Qt.QString(text) + return None def flags(self, index): return (Qt.Qt.ItemIsEnabled | Qt.Qt.ItemIsEditable | Qt.Qt.ItemIsDragEnabled | Qt.Qt.ItemIsDropEnabled | Qt.Qt.ItemIsSelectable) @@ -589,7 +589,7 @@ def setEditorData(self, editor, index): editor.setEditText('') def setModelData(self, editor, model, index): - model.setData(index, Qt.QVariant(editor.currentText())) + model.setData(index, editor.currentText()) class PanelDescriptionWizard(Qt.QWizard, TaurusBaseWidget): diff --git a/lib/taurus/qt/qtgui/util/tauruscolor.py b/lib/taurus/qt/qtgui/util/tauruscolor.py index f9a469fb6..ab53fcf2d 100644 --- a/lib/taurus/qt/qtgui/util/tauruscolor.py +++ b/lib/taurus/qt/qtgui/util/tauruscolor.py @@ -37,6 +37,7 @@ from taurus.core.util.colors import ColorPalette, \ DEVICE_STATE_DATA, ATTRIBUTE_QUALITY_DATA from taurus.core.taurusbasetypes import AttrQuality +from taurus.core.util.log import deprecation_decorator class QtColorPalette(ColorPalette): @@ -47,8 +48,6 @@ def __init__(self, dat, int_decoder_dict): self._qcolor_cache_bg = dict() self._qbrush_cache_fg = dict() self._qbrush_cache_bg = dict() - self._qvariant_cache_fg = dict() - self._qvariant_cache_bg = dict() def qbrush(self, stoq): # print stoq @@ -81,18 +80,10 @@ def qcolor(self, stoq): return (b[name], f[name]) + @deprecation_decorator(alt='QtColorPalette.qcolor()', rel='4.5') def qvariant(self, stoq): """Returns the color for the specified state or quality""" - name = self._decoder(stoq) - - f = self._qvariant_cache_fg - b = self._qvariant_cache_bg - if name not in f: - (back, fore) = self.qcolor(name) - f[name] = Qt.QVariant(fore) - b[name] = Qt.QVariant(back) - - return (b[name], f[name]) + return self.qcolor(stoq) From bb6e0af3e0b0653e3fb5b311a8ab247e911a29d8 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 28 Nov 2018 19:33:59 +0100 Subject: [PATCH 173/252] Remove all usages of QtCore.QString in Taurus taurus.external.qt.QtCore.QString is deprecated. Use str instead. --- lib/taurus/core/util/fandango_search.py | 2 +- lib/taurus/external/qt/QtCore.py | 1 - .../qt/qtcore/model/taurusdatabasemodel.py | 7 ++---- lib/taurus/qt/qtcore/model/taurusmodel.py | 13 +++------- lib/taurus/qt/qtcore/util/properties.py | 5 ++-- .../qtdesigner/taurusplugin/taurusplugin.py | 4 ++-- lib/taurus/qt/qtgui/button/taurusbutton.py | 2 +- .../qt/qtgui/compact/abstractswitcher.py | 2 +- .../qt/qtgui/container/taurusmainwindow.py | 2 +- lib/taurus/qt/qtgui/extra_guiqwt/plot.py | 4 ++-- lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py | 2 +- .../qt/qtgui/graphic/jdraw/jdraw_view.py | 5 +--- lib/taurus/qt/qtgui/graphic/taurusgraphic.py | 2 +- .../qt/qtgui/panel/qdataexportdialog.py | 2 +- lib/taurus/qt/qtgui/panel/taurusmodellist.py | 8 +++---- lib/taurus/qt/qtgui/panel/taurusvalue.py | 2 +- lib/taurus/qt/qtgui/plot/curveprops.py | 24 +++++++++---------- .../qtgui/plot/curvesAppearanceChooserDlg.py | 6 ++--- lib/taurus/qt/qtgui/plot/qwtdialog.py | 2 +- lib/taurus/qt/qtgui/plot/taurusplot.py | 2 +- lib/taurus/qt/qtgui/plot/taurustrend.py | 10 ++++---- lib/taurus/qt/qtgui/table/taurusgrid.py | 13 +--------- .../qtgui/taurusgui/paneldescriptionwizard.py | 4 ++-- lib/taurus/qt/qtgui/util/taurusaction.py | 6 ++--- 24 files changed, 53 insertions(+), 77 deletions(-) diff --git a/lib/taurus/core/util/fandango_search.py b/lib/taurus/core/util/fandango_search.py index c14ae05a1..9ef480406 100644 --- a/lib/taurus/core/util/fandango_search.py +++ b/lib/taurus/core/util/fandango_search.py @@ -97,7 +97,7 @@ def isSequence(obj): def split_model_list(modelNames): '''convert str to list if needed (commas and whitespace are considered as separators)''' - if isString(modelNames): # isinstance(modelNames,(basestring,Qt.QString)): + if isString(modelNames): modelNames = str(modelNames).replace(',', ' ') modelNames = modelNames.split() if isSequence(modelNames): # isinstance(modelNames,(list.Qt.QStringList)): diff --git a/lib/taurus/external/qt/QtCore.py b/lib/taurus/external/qt/QtCore.py index 3d71acd94..b96f036ac 100644 --- a/lib/taurus/external/qt/QtCore.py +++ b/lib/taurus/external/qt/QtCore.py @@ -20,7 +20,6 @@ # Deprecated. QString is kept for now to facilitate transition of existing # code but using QString should be avoided since it was deprecated QString = __str -# TODO: remove all occurrences of QString in taurus # -------------------------------------------------------------------------- # -------------------------------------------------------------------------- diff --git a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py index a6ac39f2c..1a2c1063f 100644 --- a/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py +++ b/lib/taurus/qt/qtcore/model/taurusdatabasemodel.py @@ -736,13 +736,11 @@ def filterAcceptsRow(self, sourceRow, sourceParent): def deviceMatches(self, device, regexp): name = device.name() - # if Qt.QString(name).contains(regexp): if regexp.indexIn(name) != -1: return True name = device.alias() if name is None: return False - # return Qt.QString(name).contains(regexp) return regexp.indexIn(name) != -1 @@ -760,14 +758,13 @@ def filterAcceptsRow(self, sourceRow, sourceParent): serverName = treeItem.display() serverInstances = sourceModel.getServerNameInstances(serverName) for serverInstance in serverInstances: - # if Qt.QString(serverInstance.name()).contains(regexp): if regexp.indexIn(serverInstance.name()) != -1: return True return False if isinstance(treeItem, TaurusTreeServerItem): # return treeItem.qdisplay().contains(regexp) - return regexp.indexIn(treeItem.qdisplay()) != -1 + return regexp.indexIn(treeItem.display()) != -1 return True @@ -786,4 +783,4 @@ def filterAcceptsRow(self, sourceRow, sourceParent): regexp = self.filterRegExp() # return treeItem.qdisplay().contains(regexp) - return regexp.indexIn(treeItem.qdisplay()) != -1 + return regexp.indexIn(treeItem.display()) != -1 diff --git a/lib/taurus/qt/qtcore/model/taurusmodel.py b/lib/taurus/qt/qtcore/model/taurusmodel.py index 1bd10ae99..7b60f3322 100644 --- a/lib/taurus/qt/qtcore/model/taurusmodel.py +++ b/lib/taurus/qt/qtcore/model/taurusmodel.py @@ -29,7 +29,7 @@ from taurus.external.qt import Qt from taurus.core.taurusbasetypes import TaurusElementType -from taurus.core.util.log import Logger +from taurus.core.util.log import Logger, deprecation_decorator QtQt = Qt.Qt @@ -141,16 +141,9 @@ def display(self): self._display = self.DisplayFunc(self._itemData) return self._display + @deprecation_decorator(alt='display', rel='4.5') def qdisplay(self): - """Returns the display QString for this node - - :return: (Qt.QString) the node's display string""" - if not hasattr(self, "_qdisplay"): - d = self.display() - if d is None: - return None - self._qdisplay = Qt.QString(d) - return self._qdisplay + return str(self.display()) def mimeData(self, index): return self.data(index) diff --git a/lib/taurus/qt/qtcore/util/properties.py b/lib/taurus/qt/qtcore/util/properties.py index 287cdb1e8..b7b225ed9 100644 --- a/lib/taurus/qt/qtcore/util/properties.py +++ b/lib/taurus/qt/qtcore/util/properties.py @@ -142,8 +142,9 @@ def set_property_methods(obj, name, type_="QString", default=None, getter=None, setattr(obj, 'get%s' % mname, getter) setattr(obj, 'reset%s' % mname, reset) if qt: - setattr(klass, lname, Qt.pyqtProperty( - "QString", getter, setter, reset)) + setattr(klass, lname, + Qt.pyqtProperty("QString", getter, setter, reset) + ) if config: obj.registerConfigProperty(getter, setter, name) reset() diff --git a/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py b/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py index d8d4dffd3..0034f8d72 100644 --- a/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py +++ b/lib/taurus/qt/qtdesigner/taurusplugin/taurusplugin.py @@ -47,8 +47,8 @@ def Q_TYPEID(class_name): - """ Helper function to generate an IID for Qt. Returns a QString.""" - return Qt.QString("com.trolltech.Qt.Designer.%s" % class_name) + """ Helper function to generate an IID for Qt.""" + return "com.trolltech.Qt.Designer.%s" % class_name designer_logger = Logger("PyQtDesigner") diff --git a/lib/taurus/qt/qtgui/button/taurusbutton.py b/lib/taurus/qt/qtgui/button/taurusbutton.py index aed923b6d..9649065e4 100644 --- a/lib/taurus/qt/qtgui/button/taurusbutton.py +++ b/lib/taurus/qt/qtgui/button/taurusbutton.py @@ -445,7 +445,7 @@ def setParameters(self, parameters): quotes will be removed and the quoted text will not be splitted. ''' - if isinstance(parameters, string_types + (Qt.QString,)): + if isinstance(parameters, string_types): parameters = str(parameters).strip() if parameters[0] in ('"', "'") and parameters[0] == parameters[-1]: parameters = [parameters[1:-1]] diff --git a/lib/taurus/qt/qtgui/compact/abstractswitcher.py b/lib/taurus/qt/qtgui/compact/abstractswitcher.py index 9ef5bf24e..610eea45e 100644 --- a/lib/taurus/qt/qtgui/compact/abstractswitcher.py +++ b/lib/taurus/qt/qtgui/compact/abstractswitcher.py @@ -160,7 +160,7 @@ def _classifyTriggers(self, triggers): shortcuts.append(Qt.QKeySequence(e)) elif isinstance(e, Qt.QEvent.Type): eventTypes.append(e) - elif isinstance(e, string_types +(Qt.QString,)): + elif isinstance(e, string_types): signals.append(e) else: raise TypeError('Unsupported trigger type: %s' % repr(type(e))) diff --git a/lib/taurus/qt/qtgui/container/taurusmainwindow.py b/lib/taurus/qt/qtgui/container/taurusmainwindow.py index 00f2b6e43..7f3524ab7 100644 --- a/lib/taurus/qt/qtgui/container/taurusmainwindow.py +++ b/lib/taurus/qt/qtgui/container/taurusmainwindow.py @@ -62,7 +62,7 @@ def __init__(self, extapp, *args): self.textEdited.connect(self.setCmdText) def setCmdText(self, cmdargs): - if not isinstance(cmdargs, string_types + (Qt.QString,)): + if not isinstance(cmdargs, string_types): cmdargs = " ".join(cmdargs) self.setText(cmdargs) self._extapp.setCmdArgs(self.getCmdArgs(), False) diff --git a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py index 895a33476..2ec85ac93 100644 --- a/lib/taurus/qt/qtgui/extra_guiqwt/plot.py +++ b/lib/taurus/qt/qtgui/extra_guiqwt/plot.py @@ -87,7 +87,7 @@ def getModelClass(self): def _splitModel(self, modelNames): '''convert str to list if needed (commas and whitespace are considered as separators)''' - if isinstance(modelNames, string_types + (Qt.QString,)): + if isinstance(modelNames, string_types): modelNames = str(modelNames).replace(',', ' ') modelNames = modelNames.split() return modelNames @@ -242,7 +242,7 @@ def getTaurusTrendItems(self): def _splitModel(self, modelNames): '''convert str to list if needed (commas and whitespace are considered as separators)''' - if isinstance(modelNames, string_types + (Qt.QString,)): + if isinstance(modelNames, string_types): modelNames = str(modelNames).replace(',', ' ') modelNames = modelNames.split() return modelNames diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py index f2a337a16..5f99ead13 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw.py @@ -247,7 +247,7 @@ def readLabelObj(self, item, params): if txt: if any(isinstance(txt, t) for t in (list, tuple, set)): # Parsing several lines of text txt = '\n'.join(txt) - item.setPlainText(Qt.QString(txt)) + item.setPlainText(str(txt)) item._currText = txt def getGroupObj(self, params): diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py index fb8bbd683..f87082fb7 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py @@ -447,7 +447,7 @@ def getQtDesignerPluginInfo(cls): model = Qt.pyqtProperty("QString", getModel, setModel) def setSelectionStyle(self, selectionStyle): - if isinstance(selectionStyle, string_types + (Qt.QString,)): + if isinstance(selectionStyle, string_types): selectionStyle = str(selectionStyle).upper() try: selectionStyle = SynopticSelectionStyle[selectionStyle] @@ -495,9 +495,6 @@ def jdraw_view_main(): # print '%s setModel(%s)'%(time.ctime(),sys.argv[1]) form.setModel(sys.argv[1]) form.setWindowTitle(sys.argv[1].rsplit('.', 1)[0]) - #def kk(*args):print("\tgraphicItemSelected(%s)"%str(args)) - #form.connect(form,Qt.SIGNAL("graphicItemSelected(QString)"), kk) - # form.fitting() sys.exit(app.exec_()) if __name__ == "__main__": diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py index f962916ac..f831d0352 100755 --- a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py +++ b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py @@ -697,7 +697,7 @@ def getSelectionMark(self, picture=None, w=10, h=10): else: if isinstance(picture, Qt.QPixmap): pixmap = picture - elif isinstance(picture, string_types + (Qt.QString,)): + elif isinstance(picture, string_types): picture = str(picture) pixmap = Qt.QPixmap(os.path.realpath(picture)) SelectionMark = Qt.QGraphicsPixmapItem() diff --git a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py index 12b3ff776..486edfd6d 100755 --- a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py +++ b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py @@ -150,7 +150,7 @@ def exportAllData(self, preffix=None): if preffix is not given, the user is prompted for a directory path""" if preffix is None: outputdir = Qt.QFileDialog.getExistingDirectory( - self, 'Export Directory', Qt.QString()) + self, 'Export Directory', '') if not outputdir: return False preffix = os.path.join(str(outputdir), "set") diff --git a/lib/taurus/qt/qtgui/panel/taurusmodellist.py b/lib/taurus/qt/qtgui/panel/taurusmodellist.py index e5dc8712b..fef186b5e 100644 --- a/lib/taurus/qt/qtgui/panel/taurusmodellist.py +++ b/lib/taurus/qt/qtgui/panel/taurusmodellist.py @@ -152,7 +152,7 @@ def data(self, index, role=Qt.Qt.DisplayRole): row = index.row() # Display Role if role == Qt.Qt.DisplayRole: - return Qt.QString(self.items[row].display) + return str(self.items[row].display) elif role == Qt.Qt.DecorationRole: return self.items[row].icon elif role == Qt.Qt.TextColorRole: @@ -160,11 +160,11 @@ def data(self, index, role=Qt.Qt.DisplayRole): return Qt.QColor('gray') return Qt.QColor(self.items[row].ok and 'green' or 'red') elif role == SRC_ROLE: - return Qt.QString(self.items[row].src) + return str(self.items[row].src) elif role == Qt.Qt.ToolTipRole: - return Qt.QString(self.items[row].src) + return str(self.items[row].src) if role == Qt.Qt.EditRole: - return Qt.QString(self.items[row].src) + return str(self.items[row].src) return None def flags(self, index): diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py index 1b7c49569..27f07c832 100644 --- a/lib/taurus/qt/qtgui/panel/taurusvalue.py +++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py @@ -1147,7 +1147,7 @@ def createConfig(self, allowUnpickable=False): for key in ('LabelWidget', 'ReadWidget', 'WriteWidget', 'UnitsWidget', 'CustomWidget', 'ExtraWidget'): # calls self.getLabelWidgetClass, self.getReadWidgetClass,... classID = getattr(self, 'get%sClass' % key)() - if (isinstance(classID, string_types + (Qt.QString,)) + if (isinstance(classID, string_types) or allowUnpickable): #configdict[key] = classID configdict[key] = {'classid': classID} diff --git a/lib/taurus/qt/qtgui/plot/curveprops.py b/lib/taurus/qt/qtgui/plot/curveprops.py index ccf6fca19..e5a4054f2 100755 --- a/lib/taurus/qt/qtgui/plot/curveprops.py +++ b/lib/taurus/qt/qtgui/plot/curveprops.py @@ -145,13 +145,13 @@ def data(self, index, role=Qt.Qt.DisplayRole): # Display Role if role == Qt.Qt.DisplayRole: if column == X: - return Qt.QString(self.curves[row].x.display) + return str(self.curves[row].x.display) elif column == Y: - return Qt.QString(self.curves[row].y.display) + return str(self.curves[row].y.display) elif column == TITLE: - return Qt.QString(self.curves[row].title) + return str(self.curves[row].title) elif column == VIS: - return Qt.QString(self.curves[row].vis) + return str(self.curves[row].vis) else: return None elif role == Qt.Qt.DecorationRole: @@ -172,27 +172,27 @@ def data(self, index, role=Qt.Qt.DisplayRole): return None elif role == SRC_ROLE: if column == X: - return Qt.QString(self.curves[row].x.src) + return str(self.curves[row].x.src) elif column == Y: - return Qt.QString(self.curves[row].y.src) + return str(self.curves[row].y.src) else: return None elif role == PROPS_ROLE: return self.curves[row].properties elif role == Qt.Qt.ToolTipRole: if column == X: - return Qt.QString(self.curves[row].x.src) + return str(self.curves[row].x.src) elif column == Y: - return Qt.QString(self.curves[row].y.src) + return str(self.curves[row].y.src) else: return None if role == Qt.Qt.EditRole: if column == X: - return Qt.QString(self.curves[row].x.src) + return str(self.curves[row].x.src) elif column == Y: - return Qt.QString(self.curves[row].y.src) + return str(self.curves[row].y.src) elif column == TITLE: - return Qt.QString(self.curves[row].title) + return str(self.curves[row].title) else: return None # Alignment @@ -222,7 +222,7 @@ def headerData(self, section, orientation, role=Qt.Qt.DisplayRole): return "Shown at" return None else: - return Qt.QString.number(section + 1) + return str(section + 1) def flags(self, index): # use this to set the editable flag when fix is selected if not index.isValid(): diff --git a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py index 67fb42d7e..724a058fd 100644 --- a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py +++ b/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py @@ -168,9 +168,9 @@ def setCurves(self, curvePropDict): self.__itemsDict = CaselessDict() for name, prop in self.curvePropDict.items(): # create and insert the item - item = Qt.QListWidgetItem(Qt.QString(prop.title), self.curvesLW) + item = Qt.QListWidgetItem(str(prop.title), self.curvesLW) self.__itemsDict[name] = item - item.setData(self.NAME_ROLE, Qt.QString(name)) + item.setData(self.NAME_ROLE, str(name)) item.setToolTip("Curve Name: %s" % name) item.setFlags(Qt.Qt.ItemIsEnabled | Qt.Qt.ItemIsSelectable | Qt.Qt.ItemIsUserCheckable | Qt.Qt.ItemIsDragEnabled | Qt.Qt.ItemIsEditable) @@ -418,7 +418,7 @@ def __init__(self, sStyle=None, sSize=None, sColor=None, sFill=None, - curvestyle is one of Qwt5.QwtPlotCurve.CurveStyle - axis is one of Qwt5.QwtPlot.Axis - title is something that Qwt5.QwtText() accepts in its constructor - (i.e. a QwtText, QString or any basestring) + (i.e. a QwtText or a string type) """ self.sStyle = sStyle self.sSize = sSize diff --git a/lib/taurus/qt/qtgui/plot/qwtdialog.py b/lib/taurus/qt/qtgui/plot/qwtdialog.py index f01a4c128..83441e6df 100644 --- a/lib/taurus/qt/qtgui/plot/qwtdialog.py +++ b/lib/taurus/qt/qtgui/plot/qwtdialog.py @@ -563,7 +563,7 @@ def onCurveTitleEdited(self, name, newTitle): '''slot used when a curve title is edited :param name: (str) curve name - :param name: (QString) new title + :param name: (str) new title ''' newTitlesDict = self.parent.setCurvesTitle(newTitle, [name]) self.curvesAppearanceChooser.updateTitles(newTitlesDict) diff --git a/lib/taurus/qt/qtgui/plot/taurusplot.py b/lib/taurus/qt/qtgui/plot/taurusplot.py index f5df3fc6e..988d2f7c8 100644 --- a/lib/taurus/qt/qtgui/plot/taurusplot.py +++ b/lib/taurus/qt/qtgui/plot/taurusplot.py @@ -3264,7 +3264,7 @@ def resetGridWidth(self): #-~-~-~-~-~-~-~-~-~-~-~-~ def _splitModel(self, modelNames): '''convert str to list if needed (commas and whitespace are considered as separators)''' - if isinstance(modelNames, string_types + (Qt.QString,)): + if isinstance(modelNames, string_types): modelNames = str(modelNames).replace(',', ' ') modelNames = modelNames.split() return modelNames diff --git a/lib/taurus/qt/qtgui/plot/taurustrend.py b/lib/taurus/qt/qtgui/plot/taurustrend.py index 518d21257..ae117de61 100644 --- a/lib/taurus/qt/qtgui/plot/taurustrend.py +++ b/lib/taurus/qt/qtgui/plot/taurustrend.py @@ -457,7 +457,7 @@ def handleEvent(self, evt_src, evt_type, evt_value): c._xValues, c._yValues = self._xValues, self._yValues[:, i] c._updateMarkers() - self.dataChanged.emit(Qt.QString(self.getModel())) + self.dataChanged.emit(str(self.getModel())) def _checkDataDimensions(self, value): ''' @@ -785,7 +785,7 @@ def _createTrends(self, datadesc): curve.setAppearanceProperties(prop) self.addCurve(name, curve) self.parent().autoShowYAxes() - self.dataChanged.emit(Qt.QString(self.getModel())) + self.dataChanged.emit(str(self.getModel())) def _scanLineReceived(self, recordData): '''Receives a recordData dictionary and updates the curves associated to it @@ -843,7 +843,7 @@ def _scanLineReceived(self, recordData): c._yValues = numpy.append(c._yValues, v) c._updateMarkers() - self.dataChanged.emit(Qt.QString(self.getModel())) + self.dataChanged.emit(str(self.getModel())) def connectWithQDoor(self, qdoor): '''connects this ScanTrendsSet to a QDoor @@ -1302,7 +1302,7 @@ def changeCurvesTitlesDialog(self, curveNamesList=None): and it will also be used as default for newly created ones) - :return: (caselessDict or None) The return value will be + :return: (caselessDict or None) The return value will be `None` if `curveNamesList` is None. Otherwise it will be a dictionary with key=curvename and value=newtitle. @@ -1400,7 +1400,7 @@ def curveDataChanged(self, name): self.xBottom, currmin + step, currmax + step) finally: self.curves_lock.release() - self.dataChanged.emit(Qt.QString(name)) + self.dataChanged.emit(str(name)) if not self.xIsTime: self.replot() else: diff --git a/lib/taurus/qt/qtgui/table/taurusgrid.py b/lib/taurus/qt/qtgui/table/taurusgrid.py index d89d09a33..8ccd71b0e 100644 --- a/lib/taurus/qt/qtgui/table/taurusgrid.py +++ b/lib/taurus/qt/qtgui/table/taurusgrid.py @@ -364,10 +364,6 @@ def attach(self): # Write your own code here before attaching widget to attribute connect # the proper signal so that the first event is correctly received by the # widget - # - # Typical code is: - # self.connect(self, QtCore.SIGNAL('valueChangedDueToEvent(QString)'), - # self.setTextValue) ret = TaurusBaseWidget.attach(self) @@ -382,12 +378,6 @@ def detach(self): # ---------------------------------------------------------------------- # Write your own code here after detaching the widget from the model - # - # Typical code is: - # self.emit(QtCore.SIGNAL('valueChangedDueToEvent(QString)'), - # QtCore.QString(value_str)) - # self.disconnect(self, QtCore.SIGNAL('valueChangedDueToEvent(QString)'), - # self.setTextValue) # by default disable widget when dettached self.setEnabled(False) @@ -435,8 +425,7 @@ def setModel(self, model, devsInRows=False, delayed=False, append=False, if isinstance(model, dict): self.load(model) else: - model = isinstance(model, string_types + (QtCore.QString,)) and [ - model] or list(model) + model = isinstance(model, string_types) and [model] or list(model) self.trace('#' * 80) self.trace('In TaurusGrid.setModel(%s)' % str(model)[:100]) diff --git a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py index 3cd3cd9c7..a4fa08cae 100644 --- a/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py +++ b/lib/taurus/qt/qtgui/taurusgui/paneldescriptionwizard.py @@ -499,7 +499,7 @@ def headerData(self, section, orientation, role=Qt.Qt.DisplayRole): return "Writer (signal)" return None else: - return Qt.QString('%i' % (section + 1)) + return str('%i' % (section + 1)) def data(self, index, role=Qt.Qt.DisplayRole): if not index.isValid() or not (0 <= index.row() < self.rowCount()): @@ -514,7 +514,7 @@ def data(self, index, role=Qt.Qt.DisplayRole): text = '(enter UID)' else: text = '(not registered)' - return Qt.QString(text) + return str(text) return None def flags(self, index): diff --git a/lib/taurus/qt/qtgui/util/taurusaction.py b/lib/taurus/qt/qtgui/util/taurusaction.py index 8e6d8559b..5c8ec4778 100644 --- a/lib/taurus/qt/qtgui/util/taurusaction.py +++ b/lib/taurus/qt/qtgui/util/taurusaction.py @@ -76,7 +76,7 @@ def __init__(self, cmdargs, text=None, icon=None, parent=None, interactive=True) :param icon: (QIcon or any other object that can be passed to QIcon creator) see :class:`Qt.QAction` :param parent: (QObject) The parent object ''' - if isinstance(cmdargs, string_types + (Qt.QString,)): + if isinstance(cmdargs, string_types): import shlex cmdargs = shlex.split(str(cmdargs)) self.path = os.path.realpath(cmdargs and cmdargs[0] or '') @@ -108,7 +108,7 @@ def setCmdArgs(self, cmdargs, emitsignal=True): application. It can also be a string containing a command, which will be automatically converted to a list ''' - if isinstance(cmdargs, string_types + (Qt.QString,)): + if isinstance(cmdargs, string_types): import shlex cmdargs = shlex.split(str(cmdargs)) self.__cmdargs = cmdargs @@ -124,7 +124,7 @@ def actionTriggered(self, args=None): import subprocess try: if args is not None: - if isinstance(args, string_types + (Qt.QString,)): + if isinstance(args, string_types): import shlex args = shlex.split(str(args)) args = self.cmdArgs() + args From bc5c9f81a3129d8f1cc62338056704fba46c090e Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 29 Nov 2018 08:41:29 +0100 Subject: [PATCH 174/252] Update CHANGELOG with QVariant and QString deprecations --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86905828f..43cfc5aa0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,16 @@ develop branch) won't be reflected in this file. ### Removed - taurus.qt.qtgui.tree.taurusdevicetree submodule (obsolete, unused) +### Deprecated +- `QtColorPalette.qvariant` +- `TaurusBaseTreeItem.qdisplay()` +- The following have been implicitly deprecated since 4.0 (when API1 + support was dropped) but only now we deprecate them explicitly + - `taurus.external.qt.QtCore.QString` + - `taurus.external.qt.QtCore.QVariant` + - `taurus.external.qt.QtCore.from_qvariant` + - `taurus.external.qt.QtCore.to_qvariant` + ## [4.4.0] - 2018-07-26 ### Deprecated From 99c90e411257e1948ed31817364d8e67ba44ddc7 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 29 Nov 2018 09:14:02 +0100 Subject: [PATCH 175/252] Raise deprecation warnings when QString is used --- lib/taurus/external/qt/QtCore.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/taurus/external/qt/QtCore.py b/lib/taurus/external/qt/QtCore.py index b96f036ac..b59c794be 100644 --- a/lib/taurus/external/qt/QtCore.py +++ b/lib/taurus/external/qt/QtCore.py @@ -17,15 +17,13 @@ # -------------------------------------------------------------------------- -# Deprecated. QString is kept for now to facilitate transition of existing -# code but using QString should be avoided since it was deprecated -QString = __str -# -------------------------------------------------------------------------- +# QString, from_qvariant and to_qvariant are kept for now to +# facilitate transition of existing code but using them +# should be avoided (they only make sense with API 1, which is not supported) +@deprecation_decorator(rel='4.0.1', alt='str') +class QString(__str): + pass -# -------------------------------------------------------------------------- -# Deprecated. from_qvariant and to_qvariant are kept for now to facilitate -# transition of existing code but using them (or QVariant in general) should be -# avoided (with API 2 it is superfluous) @__deprecation(rel='4.0.1', alt='python objects directly') def from_qvariant(qobj=None, convfunc=None): return qobj From 1176da8f7069a110e67bd0e3aceeab37780b5a5d Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 29 Nov 2018 09:38:22 +0100 Subject: [PATCH 176/252] Fix exception introduced in last commit. deprecation_decorator is imported as __deprecation in QtCore but the last commit used it as deprecation_decorator. Fix it. --- lib/taurus/external/qt/QtCore.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/taurus/external/qt/QtCore.py b/lib/taurus/external/qt/QtCore.py index b59c794be..deeafb626 100644 --- a/lib/taurus/external/qt/QtCore.py +++ b/lib/taurus/external/qt/QtCore.py @@ -20,14 +20,16 @@ # QString, from_qvariant and to_qvariant are kept for now to # facilitate transition of existing code but using them # should be avoided (they only make sense with API 1, which is not supported) -@deprecation_decorator(rel='4.0.1', alt='str') +@__deprecation(rel='4.0.1', alt='str') class QString(__str): pass + @__deprecation(rel='4.0.1', alt='python objects directly') def from_qvariant(qobj=None, convfunc=None): return qobj + @__deprecation(rel='4.0.1', alt='python objects directly') def to_qvariant(pyobj=None): return pyobj From 3d0efca7d71c898e93107cfbde29a647ecda1c23 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 29 Nov 2018 09:51:37 +0100 Subject: [PATCH 177/252] Avoid NameError in QtDesigner Fix attempt to remove undeclared constants --- lib/taurus/external/qt/QtDesigner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/external/qt/QtDesigner.py b/lib/taurus/external/qt/QtDesigner.py index 85738cde8..6e3e60e43 100644 --- a/lib/taurus/external/qt/QtDesigner.py +++ b/lib/taurus/external/qt/QtDesigner.py @@ -19,4 +19,4 @@ else: raise PythonQtError('No Qt bindings could be found') -del PYQT4, PYQT5, PYSIDE, PYSIDE2, PythonQtError +del PYQT4, PYQT5, PythonQtError From e8ffbd41a0dfd8f6bfeeabdbfc4f98b1895ab752 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 4 Dec 2018 11:35:27 +0100 Subject: [PATCH 178/252] Avoid exceptions due to sardana not yet supporting Qt5 This is a workaround to avoid taurus-gui --new-gui failing when using Qt5 due to sardana not yet being Qt5-ready. Note that this is an ugly workaround which should not be necessary if we finally move all the sardana-related code to sardana --- lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py index f4c6080a4..8d6935e04 100644 --- a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py +++ b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py @@ -1547,6 +1547,9 @@ def _loadPages(self): try: from sardana.taurus.qt.qtgui.extra_macroexecutor.common import \ TaurusMacroConfigurationDialog + # try to instantiate the dialog (e.g. this fails if using Qt5 with + # versions of sardana which do not support it) + _ = TaurusMacroConfigurationDialog() self.SARDANA_INSTALLED = True except: self.SARDANA_INSTALLED = False From 368e77faf6ecbe147576d6ef2740ac9f84214a43 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 4 Dec 2018 13:07:57 +0100 Subject: [PATCH 179/252] Fix syntax error introduced in commit 71b8a5 --- lib/taurus/qt/qtgui/input/qwheel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/input/qwheel.py b/lib/taurus/qt/qtgui/input/qwheel.py index d6a6ba103..c6341eba2 100755 --- a/lib/taurus/qt/qtgui/input/qwheel.py +++ b/lib/taurus/qt/qtgui/input/qwheel.py @@ -252,7 +252,7 @@ def _build(self): l = self.layout() l.setSpacing(0) - l.setContentsMargin(0, 0, 0, 0) + l.setContentsMargins(0, 0, 0, 0) id = self.getIntDigitCount() dd = self.getDecDigitCount() From f162e8c7b9b31dc4e210fb91f5c7da6977e041bd Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 4 Dec 2018 16:23:49 +0100 Subject: [PATCH 180/252] Avoid using QProcess.setEnvironment QProcess.setEnvironment was removed in PyQt5. Use QProcess.setProcessEnvironment instead. --- CHANGELOG.md | 3 +- lib/taurus/qt/qtdesigner/taurusdesigner.py | 35 ++++++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43cfc5aa0..8a44ab4dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,8 +18,9 @@ develop branch) won't be reflected in this file. - taurus.qt.qtgui.tree.taurusdevicetree submodule (obsolete, unused) ### Deprecated -- `QtColorPalette.qvariant` +- `QtColorPalette.qvariant()` - `TaurusBaseTreeItem.qdisplay()` +- `taurus.qt.qtdesigner.qtdesigner_prepare_taurus()` - The following have been implicitly deprecated since 4.0 (when API1 support was dropped) but only now we deprecate them explicitly - `taurus.external.qt.QtCore.QString` diff --git a/lib/taurus/qt/qtdesigner/taurusdesigner.py b/lib/taurus/qt/qtdesigner/taurusdesigner.py index 75c430d3d..3ceee9903 100644 --- a/lib/taurus/qt/qtdesigner/taurusdesigner.py +++ b/lib/taurus/qt/qtdesigner/taurusdesigner.py @@ -30,7 +30,7 @@ import taurus from taurus.external.qt import Qt - +from taurus.core.util.log import deprecation_decorator def env_index(env, env_name): env_name = str(env_name) @@ -95,8 +95,8 @@ def get_taurus_designer_path(): return [taurus_qt_designer_path] +@deprecation_decorator(alt='get_taurus_designer_env', rel='4.5') def qtdesigner_prepare_taurus(env=None, taurus_extra_path=None): - # Tell Qt Designer where it can find the directory containing the plugins if env is None: env = Qt.QProcess.systemEnvironment() @@ -116,13 +116,35 @@ def qtdesigner_prepare_taurus(env=None, taurus_extra_path=None): return env +def get_taurus_designer_env(taurus_extra_path=None): + + env = Qt.QProcessEnvironment.systemEnvironment() + + # Set PYQTDESIGNERPATH to look inside taurus for designer plugins + (taurus_designer_path,) = get_taurus_designer_path() + env.insert("PYQTDESIGNERPATH", taurus_designer_path) + + # Set TAURUSQTDESIGNERPATH + if taurus_extra_path is not None: + env.insert("TAURUSQTDESIGNERPATH", taurus_extra_path) + env.insert("PYTHONPATH", taurus_extra_path) + + return env + + def qtdesigner_start(args, env=None): + # Start Designer. designer_bin = get_qtdesigner_bin() designer = Qt.QProcess() designer.setProcessChannelMode(Qt.QProcess.ForwardedChannels) - designer.setEnvironment(env) + if isinstance(env, Qt.QProcessEnvironment): + designer.setProcessEnvironment(env) + else: # obsolete call, only for bck-compat + taurus.deprecated(dep='passing env which is not a QProcessEnvironment', + alt='QProcessEnvironment', rel='4.5') + designer.setEnvironment(env) designer.start(designer_bin, args) designer.waitForFinished(-1) @@ -130,6 +152,9 @@ def qtdesigner_start(args, env=None): def main(env=None): + if env is not None: + taurus.info('ignoring obsolete env parameter to qtdesigner_start') + version = "taurusdesigner %s" % (taurus.Release.version) usage = "Usage: %prog [options] " description = "The Qt designer application customized for taurus" @@ -147,8 +172,8 @@ def main(env=None): if len(options.tauruspath) > 0: taurus_extra_path = options.tauruspath - env = qtdesigner_prepare_taurus( - env=env, taurus_extra_path=taurus_extra_path) + if env is None: + env = get_taurus_designer_env(taurus_extra_path=taurus_extra_path) sys.exit(qtdesigner_start(args, env=env)) From c2a10a86a63f2531a26bef156c3170b05d8fbb2e Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 5 Dec 2018 12:48:13 +0100 Subject: [PATCH 181/252] Make TangoAttrValue copyable TangoAttrValue implements __getattr__ to map some API from TangoAttribute and PyTango values. But the current implementation makes copy.copy() on a TangoAttrValue to fail because some special methods such as `__getstate__` are also mapped (which is not ok). Avoid that by limiting the mapping to non-special methods. --- lib/taurus/core/tango/tangoattribute.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/taurus/core/tango/tangoattribute.py b/lib/taurus/core/tango/tangoattribute.py index e8dcabcf0..08543db00 100755 --- a/lib/taurus/core/tango/tangoattribute.py +++ b/lib/taurus/core/tango/tangoattribute.py @@ -140,7 +140,16 @@ def __init__(self, attr=None, pytango_dev_attr=None, config=None): self.quality = quality_from_tango(p.quality) def __getattr__(self, name): + """ + If the member `name` is not defined in this class, try to get it + from the TangoAttribute (configuration) or from the PyTango value + """ + # Do not try to delegate special methods + if name.startswith('__') and name.endswith('__'): + raise AttributeError("'%s' object has no attribute %s" + % (self.__class__.__name__, name)) try: + # maybe name is defined in the TangoAttribute? try: # Use the attr reference if the attr is still valid ret = getattr(self._attrRef, name) @@ -152,6 +161,7 @@ def __getattr__(self, name): ret = getattr(a, name) except AttributeError: try: + # maybe name is defined in the PyTango value? ret = getattr(self._pytango_dev_attr, name) except AttributeError: raise AttributeError("'%s' object has no attribute %s" From f86c48413ea28fd8a3d5e5b91e9f66344bfd3673 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 5 Dec 2018 13:09:58 +0100 Subject: [PATCH 182/252] Avoid using QMatrix QMatrix was removed in PyQt5. Use QTransform instead. --- lib/taurus/qt/qtgui/input/qwheel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/input/qwheel.py b/lib/taurus/qt/qtgui/input/qwheel.py index c6341eba2..7965ea317 100755 --- a/lib/taurus/qt/qtgui/input/qwheel.py +++ b/lib/taurus/qt/qtgui/input/qwheel.py @@ -94,7 +94,7 @@ def getPixmap(self): pm = Qt.QPixmapCache.find(_DownArrowButton.ArrowPixmapKey) if pm is None: pm = Qt.QPixmap(self.ArrowPixmapName) - pm = pm.transformed(Qt.QMatrix().rotate(180)) + pm = pm.transformed(Qt.QTransform().rotate(180)) Qt.QPixmapCache.insert(_DownArrowButton.ArrowPixmapKey, pm) return pm From b6713a547672d066af5402b849d3fc6bb4b797e3 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 10 Dec 2018 20:19:10 +0100 Subject: [PATCH 183/252] Remove Trend panel from TaurusDevPanel TaurusDevPanel uses a TaurusTrend widget which cannot be used with Qt5. Remove this widget since it is not essential for TaurusDevPanel. --- CHANGELOG.md | 1 + .../qt/qtgui/panel/taurusdevicepanel.py | 2 - .../qt/qtgui/panel/ui/TaurusDevPanel.ui | 49 +++---------------- 3 files changed, 8 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a44ab4dd..85c59a146 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ develop branch) won't be reflected in this file. ### Removed - taurus.qt.qtgui.tree.taurusdevicetree submodule (obsolete, unused) +- Trend dockwidget in TaurusDevPanel ### Deprecated - `QtColorPalette.qvariant()` diff --git a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py index b38a0143a..63dd49262 100644 --- a/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py +++ b/lib/taurus/qt/qtgui/panel/taurusdevicepanel.py @@ -557,8 +557,6 @@ def createActions(self): self._ui.attrDW.toggleViewAction()) self.showCommandsAction = self.viewMenu.addAction( self._ui.commandsDW.toggleViewAction()) - self.showTrendAction = self.viewMenu.addAction( - self._ui.trendDW.toggleViewAction()) def setTangoHost(self, host): '''extended from :class:setTangoHost''' diff --git a/lib/taurus/qt/qtgui/panel/ui/TaurusDevPanel.ui b/lib/taurus/qt/qtgui/panel/ui/TaurusDevPanel.ui index f4eaf77fb..a155f1ba5 100644 --- a/lib/taurus/qt/qtgui/panel/ui/TaurusDevPanel.ui +++ b/lib/taurus/qt/qtgui/panel/ui/TaurusDevPanel.ui @@ -1,3 +1,4 @@ + TaurusDevPanel @@ -29,8 +30,8 @@ - - + + true @@ -51,8 +52,8 @@ - - + + true @@ -60,52 +61,17 @@ - - - Trends - - - 8 - - - - - - - - - - - TaurusWidget - QWidget -
taurus.qt.qtgui.container
-
- - TaurusPlot - QwtPlot -
taurus.qt.qtgui.plot
-
- - TaurusTrend - TauPlot -
taurus.qt.qtgui.plot
-
- - QwtPlot - QFrame -
qwt_plot.h
-
TaurusCommandsForm - TauWidget + QWidget
taurus.qt.qtgui.panel
1
TaurusAttrForm - TauWidget + QWidget
taurus.qt.qtgui.panel
1
@@ -113,4 +79,3 @@
- From 271ea849ccfc1534c1d1e91170275d7e548115b4 Mon Sep 17 00:00:00 2001 From: mrosanes Date: Tue, 11 Dec 2018 15:39:13 +0100 Subject: [PATCH 184/252] Update travis file with docker py3qt5 Update travis file to allow tests on docker taurus-test with python3 and qt5. taurus-test:debian-stretch-py3qt5 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 1fbab951b..37332adda 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,6 +20,7 @@ env: - DOCKER_IMG=cpascual/taurus-test:debian-stretch - DOCKER_IMG=cpascual/taurus-test:debian-buster - DOCKER_IMG=cpascual/taurus-test:debian-stretch-py3 + - DOCKER_IMG=cpascual/taurus-test:debian-stretch-py3qt5 matrix: allow_failures: From fec892bd2701c1a5b2ba0aa01d223949f05b9510 Mon Sep 17 00:00:00 2001 From: mrosanes Date: Fri, 14 Dec 2018 10:06:23 +0100 Subject: [PATCH 185/252] Cast newstr to str Cast newstr to string to be able to setData. This fixes drag & drop in taurusforms. --- lib/taurus/qt/qtgui/panel/taurusvalue.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py index 27f07c832..4554166ad 100644 --- a/lib/taurus/qt/qtgui/panel/taurusvalue.py +++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py @@ -160,13 +160,13 @@ def getModelMimeData(self): '''reimplemented to use the taurusValueBuddy model instead of its own model''' mimeData = TaurusLabel.getModelMimeData(self) mimeData.setData(TAURUS_MODEL_MIME_TYPE, - self.taurusValueBuddy().getModelName()) + str(self.taurusValueBuddy().getModelName())) if self.taurusValueBuddy().getModelType() == TaurusElementType.Device: mimeData.setData(TAURUS_DEV_MIME_TYPE, - self.taurusValueBuddy().getModelName()) + str(self.taurusValueBuddy().getModelName())) elif self.taurusValueBuddy().getModelType() == TaurusElementType.Attribute: mimeData.setData(TAURUS_ATTR_MIME_TYPE, - self.taurusValueBuddy().getModelName()) + str(self.taurusValueBuddy().getModelName())) return mimeData @classmethod From 530870344934b02f92d2b9769e3a747ce522a197 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 11 Dec 2018 11:43:47 +0100 Subject: [PATCH 186/252] Avoid Qwt5 in TaurusNexusWidget Use pyqtgraph (or fallback to a table) instead of a qwt5 plot widget to be Qt5-compatible. --- lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py b/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py index 1ca1cedfb..f01c9ec3a 100644 --- a/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py +++ b/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py @@ -135,9 +135,13 @@ def neXusPreviewWidgetFactory(self, ddict): node = ddict['name'] data = self.__nexusFile[node] if len(data.shape) == 1 and isinstance(data[0], (numpy.floating, numpy.integer, int, float)): - from taurus.qt.qtgui.plot import TaurusPlot - w = TaurusPlot() - w.attachRawData({"x": numpy.arange(len(data)), "y": data}) + try: + import pyqtgraph as pg + w = pg.PlotWidget() + w.plot(data) + except ImportError: + w = HDF5DatasetTable.HDF5DatasetTable() + w.setDataset(data) else: w = HDF5DatasetTable.HDF5DatasetTable() w.setDataset(data) From 9a4e9240dd2d13ebf2fa12f00b5788e479107121 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 12 Dec 2018 16:01:02 +0100 Subject: [PATCH 187/252] Fix wrong import module taurus.external.qt.Qwt5 has a copy-paste error and is ttempting to import QtNetwork instead of Qwt5. Fix that. Also raise ImportError instead of RuntimeError in case Qwt5 cannot be imported. --- lib/taurus/external/qt/Qwt5.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/taurus/external/qt/Qwt5.py b/lib/taurus/external/qt/Qwt5.py index 6fa8b3a30..0345fa8b5 100644 --- a/lib/taurus/external/qt/Qwt5.py +++ b/lib/taurus/external/qt/Qwt5.py @@ -32,6 +32,6 @@ if PYQT4: __log.deprecated(dep="taurus.external.qt.Qwt5", rel="4.5") - from PyQt4.QtNetwork import * + from PyQt4.Qwt5 import * else: - raise RuntimeError('Qwt5 bindings not supported for {}'.format(API_NAME)) \ No newline at end of file + raise ImportError('Qwt5 bindings not supported for {}'.format(API_NAME)) \ No newline at end of file From 25998c8da7565ff92cea7f4bff6a29895dd44d83 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 12 Dec 2018 16:12:15 +0100 Subject: [PATCH 188/252] Rename plot submodule to qwt5 Rename taurus.qt.qtgui.plot to taurus.qt.qtgui.qwt5 (leave plot for backwards compatibility with a deprecation warning and with a shim for providing minimal API based on tpg when Qwt5 is not available) --- CHANGELOG.md | 5 ++ lib/taurus/qt/qtgui/plot/__init__.py | 52 ++++++++++++++----- lib/taurus/qt/qtgui/qwt5/__init__.py | 47 +++++++++++++++++ .../qt/qtgui/{plot => qwt5}/arrayedit.py | 0 .../qt/qtgui/{plot => qwt5}/curveStatsDlg.py | 0 .../qt/qtgui/{plot => qwt5}/curveprops.py | 0 .../curvesAppearanceChooserDlg.py | 0 lib/taurus/qt/qtgui/{plot => qwt5}/monitor.py | 2 +- .../qt/qtgui/{plot => qwt5}/qwtdialog.py | 0 lib/taurus/qt/qtgui/{plot => qwt5}/qwtplot.py | 0 lib/taurus/qt/qtgui/{plot => qwt5}/scales.py | 0 .../qtgui/{plot => qwt5}/taurusarrayedit.py | 0 .../qt/qtgui/{plot => qwt5}/taurusplot.py | 4 +- .../qt/qtgui/{plot => qwt5}/taurusplotconf.py | 0 .../qt/qtgui/{plot => qwt5}/taurustrend.py | 2 +- .../{plot => qwt5}/ui/AddCPointsDialog.ui | 0 .../qt/qtgui/{plot => qwt5}/ui/ArrayEditor.ui | 0 .../qtgui/{plot => qwt5}/ui/ControllerBox.ui | 0 .../{plot => qwt5}/ui/CurvePropertiesView.ui | 0 .../{plot => qwt5}/ui/CurveStatsDialog.ui | 0 .../ui/CurvesAppearanceChooser.ui | 0 .../{plot => qwt5}/ui/EditCPointsDialog.ui | 0 .../{plot => qwt5}/ui/TaurusPlotConfDlg.ui | 0 .../ui/TaurusPlotConfigDialog.ui | 0 24 files changed, 94 insertions(+), 18 deletions(-) mode change 100644 => 100755 lib/taurus/qt/qtgui/plot/__init__.py create mode 100644 lib/taurus/qt/qtgui/qwt5/__init__.py rename lib/taurus/qt/qtgui/{plot => qwt5}/arrayedit.py (100%) rename lib/taurus/qt/qtgui/{plot => qwt5}/curveStatsDlg.py (100%) rename lib/taurus/qt/qtgui/{plot => qwt5}/curveprops.py (100%) rename lib/taurus/qt/qtgui/{plot => qwt5}/curvesAppearanceChooserDlg.py (100%) rename lib/taurus/qt/qtgui/{plot => qwt5}/monitor.py (99%) rename lib/taurus/qt/qtgui/{plot => qwt5}/qwtdialog.py (100%) rename lib/taurus/qt/qtgui/{plot => qwt5}/qwtplot.py (100%) rename lib/taurus/qt/qtgui/{plot => qwt5}/scales.py (100%) rename lib/taurus/qt/qtgui/{plot => qwt5}/taurusarrayedit.py (100%) rename lib/taurus/qt/qtgui/{plot => qwt5}/taurusplot.py (99%) rename lib/taurus/qt/qtgui/{plot => qwt5}/taurusplotconf.py (100%) rename lib/taurus/qt/qtgui/{plot => qwt5}/taurustrend.py (99%) rename lib/taurus/qt/qtgui/{plot => qwt5}/ui/AddCPointsDialog.ui (100%) rename lib/taurus/qt/qtgui/{plot => qwt5}/ui/ArrayEditor.ui (100%) rename lib/taurus/qt/qtgui/{plot => qwt5}/ui/ControllerBox.ui (100%) rename lib/taurus/qt/qtgui/{plot => qwt5}/ui/CurvePropertiesView.ui (100%) rename lib/taurus/qt/qtgui/{plot => qwt5}/ui/CurveStatsDialog.ui (100%) rename lib/taurus/qt/qtgui/{plot => qwt5}/ui/CurvesAppearanceChooser.ui (100%) rename lib/taurus/qt/qtgui/{plot => qwt5}/ui/EditCPointsDialog.ui (100%) rename lib/taurus/qt/qtgui/{plot => qwt5}/ui/TaurusPlotConfDlg.ui (100%) rename lib/taurus/qt/qtgui/{plot => qwt5}/ui/TaurusPlotConfigDialog.ui (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85c59a146..6cf775470 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,12 @@ develop branch) won't be reflected in this file. - taurus.qt.qtgui.tree.taurusdevicetree submodule (obsolete, unused) - Trend dockwidget in TaurusDevPanel +### Changed +- `taurus.qt.qtgui.plot` is now deprecated, but the same Qwt5-based + API is now available in `taurus.qt.qtgui.qwt5` + ### Deprecated +- `taurus.qt.qtgui.plot` - `QtColorPalette.qvariant()` - `TaurusBaseTreeItem.qdisplay()` - `taurus.qt.qtdesigner.qtdesigner_prepare_taurus()` diff --git a/lib/taurus/qt/qtgui/plot/__init__.py b/lib/taurus/qt/qtgui/plot/__init__.py old mode 100644 new mode 100755 index 9a8011352..dbf6fdfa6 --- a/lib/taurus/qt/qtgui/plot/__init__.py +++ b/lib/taurus/qt/qtgui/plot/__init__.py @@ -24,20 +24,44 @@ ############################################################################# """ -Taurus Widget Plot module -========================== +Taurus Plot module (old) +======================== + +This module is now deprecated. + +If available, it exposes the plot API now implemented in +`taurus.qt.qtgui.qwt5`. Otherwise it tries to provide a minimal API +(essentially the TaurusPlot and TaurusTrend classes from taurus_pyqtgraph) +to help with the transition to another plotting module such as +taurus.qt.qtgui.tpg. + +Note that if you really want to continue using the old Qwt5-based widgets and +avoid deprecation warnings, you can import the old API from +taurus.qt.qtgui.qwt5 + +Note that `PyQwt5 module `_ +only works with Python2 and PyQt4 and is no longer supported, +so taurus is moving to other modules for plotting (pyqtgraph, silx, ...) -This module is part of Taurus Widgets. It contains specialized widgets for 2D plotting -in Taurus. It depends on the `PyQwt module `_ """ -from .qwtdialog import TaurusPlotConfigDialog -from .scales import * -from .taurusplot import * -from .taurustrend import * -from .arrayedit import ArrayEditor -from .taurusarrayedit import TaurusArrayEditor -from .curvesAppearanceChooserDlg import CurveAppearanceProperties, CurvesAppearanceChooser -from .curveprops import CurvePropertiesView -from .monitor import TaurusMonitorTiny -from .curveStatsDlg import CurveStatsDialog +from __future__ import absolute_import +from taurus.core.util import log as __log + +__log.deprecated(dep='taurus.qt.qtgui.plot', rel='4.5', + alt='taurus.qt.qtgui.tpg or taurus.qt.qtgui.qwt5') + +try: + from taurus.qt.qtgui.qwt5 import * +except: + __log.warning('taurus.qt.qtgui.qwt5 cannot be imported') + try: + from taurus.qt.qtgui.tpg import TaurusPlot, TaurusTrend + __log.info('Using taurus.qt.qtgui.tpg to provide a minimal API ' + + 'to facilitate the transition') + except: + __log.info('Cannot import taurus.qt.qtgui.tpg to provide a minimal ' + + 'API for transition') + + + diff --git a/lib/taurus/qt/qtgui/qwt5/__init__.py b/lib/taurus/qt/qtgui/qwt5/__init__.py new file mode 100644 index 000000000..38e0ee7ce --- /dev/null +++ b/lib/taurus/qt/qtgui/qwt5/__init__.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python + +############################################################################# +## +# This file is part of Taurus +## +# http://taurus-scada.org +## +# Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain +## +# Taurus is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +## +# Taurus is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +## +# You should have received a copy of the GNU Lesser General Public License +# along with Taurus. If not, see . +## +############################################################################# + +""" +Taurus Widget qwt5 (former `plot`) module +========================================== + + +This module provides the Qwt5-based widgets previously provided by +`taurus.qt.qtgui.plot`. +Note that `PyQwt5 module `_ +only works with Python2 and PyQt4 and is no longer supported, +so taurus is moving to other modules for plotting (pyqtgraph, silx, ...) +""" + +from .qwtdialog import TaurusPlotConfigDialog +from .scales import * +from .taurusplot import * +from .taurustrend import * +from .arrayedit import ArrayEditor +from .taurusarrayedit import TaurusArrayEditor +from .curvesAppearanceChooserDlg import CurveAppearanceProperties, CurvesAppearanceChooser +from .curveprops import CurvePropertiesView +from .monitor import TaurusMonitorTiny +from .curveStatsDlg import CurveStatsDialog diff --git a/lib/taurus/qt/qtgui/plot/arrayedit.py b/lib/taurus/qt/qtgui/qwt5/arrayedit.py similarity index 100% rename from lib/taurus/qt/qtgui/plot/arrayedit.py rename to lib/taurus/qt/qtgui/qwt5/arrayedit.py diff --git a/lib/taurus/qt/qtgui/plot/curveStatsDlg.py b/lib/taurus/qt/qtgui/qwt5/curveStatsDlg.py similarity index 100% rename from lib/taurus/qt/qtgui/plot/curveStatsDlg.py rename to lib/taurus/qt/qtgui/qwt5/curveStatsDlg.py diff --git a/lib/taurus/qt/qtgui/plot/curveprops.py b/lib/taurus/qt/qtgui/qwt5/curveprops.py similarity index 100% rename from lib/taurus/qt/qtgui/plot/curveprops.py rename to lib/taurus/qt/qtgui/qwt5/curveprops.py diff --git a/lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py b/lib/taurus/qt/qtgui/qwt5/curvesAppearanceChooserDlg.py similarity index 100% rename from lib/taurus/qt/qtgui/plot/curvesAppearanceChooserDlg.py rename to lib/taurus/qt/qtgui/qwt5/curvesAppearanceChooserDlg.py diff --git a/lib/taurus/qt/qtgui/plot/monitor.py b/lib/taurus/qt/qtgui/qwt5/monitor.py similarity index 99% rename from lib/taurus/qt/qtgui/plot/monitor.py rename to lib/taurus/qt/qtgui/qwt5/monitor.py index 2843bcce4..deab6d7f6 100644 --- a/lib/taurus/qt/qtgui/plot/monitor.py +++ b/lib/taurus/qt/qtgui/qwt5/monitor.py @@ -30,7 +30,7 @@ from __future__ import print_function from taurus.external.qt import Qt -from taurus.qt.qtgui.plot import TaurusTrend +from taurus.qt.qtgui.qwt5 import TaurusTrend class TaurusMonitorTiny(TaurusTrend): diff --git a/lib/taurus/qt/qtgui/plot/qwtdialog.py b/lib/taurus/qt/qtgui/qwt5/qwtdialog.py similarity index 100% rename from lib/taurus/qt/qtgui/plot/qwtdialog.py rename to lib/taurus/qt/qtgui/qwt5/qwtdialog.py diff --git a/lib/taurus/qt/qtgui/plot/qwtplot.py b/lib/taurus/qt/qtgui/qwt5/qwtplot.py similarity index 100% rename from lib/taurus/qt/qtgui/plot/qwtplot.py rename to lib/taurus/qt/qtgui/qwt5/qwtplot.py diff --git a/lib/taurus/qt/qtgui/plot/scales.py b/lib/taurus/qt/qtgui/qwt5/scales.py similarity index 100% rename from lib/taurus/qt/qtgui/plot/scales.py rename to lib/taurus/qt/qtgui/qwt5/scales.py diff --git a/lib/taurus/qt/qtgui/plot/taurusarrayedit.py b/lib/taurus/qt/qtgui/qwt5/taurusarrayedit.py similarity index 100% rename from lib/taurus/qt/qtgui/plot/taurusarrayedit.py rename to lib/taurus/qt/qtgui/qwt5/taurusarrayedit.py diff --git a/lib/taurus/qt/qtgui/plot/taurusplot.py b/lib/taurus/qt/qtgui/qwt5/taurusplot.py similarity index 99% rename from lib/taurus/qt/qtgui/plot/taurusplot.py rename to lib/taurus/qt/qtgui/qwt5/taurusplot.py index 988d2f7c8..ec0767a38 100644 --- a/lib/taurus/qt/qtgui/plot/taurusplot.py +++ b/lib/taurus/qt/qtgui/qwt5/taurusplot.py @@ -55,7 +55,7 @@ from taurus.qt.qtcore.util.signal import baseSignal from taurus.qt.qtcore.mimetypes import TAURUS_MODEL_LIST_MIME_TYPE, TAURUS_ATTR_MIME_TYPE from taurus.qt.qtgui.base import TaurusBaseComponent, TaurusBaseWidget -from taurus.qt.qtgui.plot import TaurusPlotConfigDialog, FancyScaleDraw,\ +from taurus.qt.qtgui.qwt5 import TaurusPlotConfigDialog, FancyScaleDraw,\ DateTimeScaleEngine, FixedLabelsScaleEngine, FixedLabelsScaleDraw from .curvesAppearanceChooserDlg import CurveAppearanceProperties @@ -3103,7 +3103,7 @@ def onCurveStatsAction(self): then shows curve statistics on that range. ''' if getattr(self, '_curveStatsDialog', None) is None: - from taurus.qt.qtgui.plot import CurveStatsDialog + from taurus.qt.qtgui.qwt5 import CurveStatsDialog self._curveStatsDialog = CurveStatsDialog(self) self._curveStatsDialog.closed.connect(self._onCurveStatsDialogClosed) self._curveStatsDialog.finished.connect(self._onCurveStatsDialogClosed) diff --git a/lib/taurus/qt/qtgui/plot/taurusplotconf.py b/lib/taurus/qt/qtgui/qwt5/taurusplotconf.py similarity index 100% rename from lib/taurus/qt/qtgui/plot/taurusplotconf.py rename to lib/taurus/qt/qtgui/qwt5/taurusplotconf.py diff --git a/lib/taurus/qt/qtgui/plot/taurustrend.py b/lib/taurus/qt/qtgui/qwt5/taurustrend.py similarity index 99% rename from lib/taurus/qt/qtgui/plot/taurustrend.py rename to lib/taurus/qt/qtgui/qwt5/taurustrend.py index ae117de61..723bc5cad 100644 --- a/lib/taurus/qt/qtgui/plot/taurustrend.py +++ b/lib/taurus/qt/qtgui/qwt5/taurustrend.py @@ -43,7 +43,7 @@ from taurus.core.taurusattribute import TaurusAttribute from taurus.core.util.containers import CaselessDict, CaselessList, ArrayBuffer from taurus.qt.qtgui.base import TaurusBaseComponent -from taurus.qt.qtgui.plot import TaurusPlot +from taurus.qt.qtgui.qwt5 import TaurusPlot __all__ = ["ScanTrendsSet", "TaurusTrend", "TaurusTrendsSet"] diff --git a/lib/taurus/qt/qtgui/plot/ui/AddCPointsDialog.ui b/lib/taurus/qt/qtgui/qwt5/ui/AddCPointsDialog.ui similarity index 100% rename from lib/taurus/qt/qtgui/plot/ui/AddCPointsDialog.ui rename to lib/taurus/qt/qtgui/qwt5/ui/AddCPointsDialog.ui diff --git a/lib/taurus/qt/qtgui/plot/ui/ArrayEditor.ui b/lib/taurus/qt/qtgui/qwt5/ui/ArrayEditor.ui similarity index 100% rename from lib/taurus/qt/qtgui/plot/ui/ArrayEditor.ui rename to lib/taurus/qt/qtgui/qwt5/ui/ArrayEditor.ui diff --git a/lib/taurus/qt/qtgui/plot/ui/ControllerBox.ui b/lib/taurus/qt/qtgui/qwt5/ui/ControllerBox.ui similarity index 100% rename from lib/taurus/qt/qtgui/plot/ui/ControllerBox.ui rename to lib/taurus/qt/qtgui/qwt5/ui/ControllerBox.ui diff --git a/lib/taurus/qt/qtgui/plot/ui/CurvePropertiesView.ui b/lib/taurus/qt/qtgui/qwt5/ui/CurvePropertiesView.ui similarity index 100% rename from lib/taurus/qt/qtgui/plot/ui/CurvePropertiesView.ui rename to lib/taurus/qt/qtgui/qwt5/ui/CurvePropertiesView.ui diff --git a/lib/taurus/qt/qtgui/plot/ui/CurveStatsDialog.ui b/lib/taurus/qt/qtgui/qwt5/ui/CurveStatsDialog.ui similarity index 100% rename from lib/taurus/qt/qtgui/plot/ui/CurveStatsDialog.ui rename to lib/taurus/qt/qtgui/qwt5/ui/CurveStatsDialog.ui diff --git a/lib/taurus/qt/qtgui/plot/ui/CurvesAppearanceChooser.ui b/lib/taurus/qt/qtgui/qwt5/ui/CurvesAppearanceChooser.ui similarity index 100% rename from lib/taurus/qt/qtgui/plot/ui/CurvesAppearanceChooser.ui rename to lib/taurus/qt/qtgui/qwt5/ui/CurvesAppearanceChooser.ui diff --git a/lib/taurus/qt/qtgui/plot/ui/EditCPointsDialog.ui b/lib/taurus/qt/qtgui/qwt5/ui/EditCPointsDialog.ui similarity index 100% rename from lib/taurus/qt/qtgui/plot/ui/EditCPointsDialog.ui rename to lib/taurus/qt/qtgui/qwt5/ui/EditCPointsDialog.ui diff --git a/lib/taurus/qt/qtgui/plot/ui/TaurusPlotConfDlg.ui b/lib/taurus/qt/qtgui/qwt5/ui/TaurusPlotConfDlg.ui similarity index 100% rename from lib/taurus/qt/qtgui/plot/ui/TaurusPlotConfDlg.ui rename to lib/taurus/qt/qtgui/qwt5/ui/TaurusPlotConfDlg.ui diff --git a/lib/taurus/qt/qtgui/plot/ui/TaurusPlotConfigDialog.ui b/lib/taurus/qt/qtgui/qwt5/ui/TaurusPlotConfigDialog.ui similarity index 100% rename from lib/taurus/qt/qtgui/plot/ui/TaurusPlotConfigDialog.ui rename to lib/taurus/qt/qtgui/qwt5/ui/TaurusPlotConfigDialog.ui From b28b57cd00c3c8bf4934edf33a310bad10733452 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 12 Dec 2018 16:17:52 +0100 Subject: [PATCH 189/252] (m) Add TODO --- lib/taurus/qt/qtgui/taurusgui/macrolistener.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py index a04bb70b5..84f02dec1 100644 --- a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py +++ b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py @@ -197,7 +197,7 @@ def _updateTemporaryTrends1D(self, trends1d): :returns: (tuple) two lists new,rm:new contains the names of the new panels and rm contains the names of the removed panels ''' - from taurus.qt.qtgui.plot import TaurusTrend + from taurus.qt.qtgui.plot import TaurusTrend # TODO: use tpg instead! newpanels = [] for axes, plotables in trends1d.items(): if not axes: From d602215f8c261287c0d3915c94df9593de4bc3b2 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 14 Dec 2018 10:35:01 +0100 Subject: [PATCH 190/252] (m) simplify log messages in plot module --- lib/taurus/qt/qtgui/plot/__init__.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/taurus/qt/qtgui/plot/__init__.py b/lib/taurus/qt/qtgui/plot/__init__.py index dbf6fdfa6..1d4326cb6 100755 --- a/lib/taurus/qt/qtgui/plot/__init__.py +++ b/lib/taurus/qt/qtgui/plot/__init__.py @@ -54,14 +54,13 @@ try: from taurus.qt.qtgui.qwt5 import * except: - __log.warning('taurus.qt.qtgui.qwt5 cannot be imported') try: from taurus.qt.qtgui.tpg import TaurusPlot, TaurusTrend - __log.info('Using taurus.qt.qtgui.tpg to provide a minimal API ' + __log.info('plot: Using taurus.qt.qtgui.tpg to provide a minimal API ' + 'to facilitate the transition') except: - __log.info('Cannot import taurus.qt.qtgui.tpg to provide a minimal ' - + 'API for transition') + __log.info('plot: Cannot import taurus.qt.qtgui.tpg to provide a ' + + 'minimal API for transition') From a67c7a370ef28320bd50950d38002ea0b3d7ecd9 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 14 Dec 2018 13:51:41 +0100 Subject: [PATCH 191/252] Remove aliasing of qInstallMsgHandler as qInstallMessageHandler The taurus.external.qt.QtCore shim is defining qInstallMsgHandler as qInstallMessageHandler in PyQt4 (qInstallMessageHandler was introduced in Qt5) but the API is not compatible and causes exceptions. Remove this extra definition. --- lib/taurus/external/qt/QtCore.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/taurus/external/qt/QtCore.py b/lib/taurus/external/qt/QtCore.py index deeafb626..1a902f7ea 100644 --- a/lib/taurus/external/qt/QtCore.py +++ b/lib/taurus/external/qt/QtCore.py @@ -67,7 +67,6 @@ def to_qvariant(pyobj=None): QItemSelectionRange, QSortFilterProxyModel, QStringListModel) from PyQt4.QtCore import QT_VERSION_STR as __version__ - from PyQt4.QtCore import qInstallMsgHandler as qInstallMessageHandler # QDesktopServices has has been split into (QDesktopServices and # QStandardPaths) in Qt5 @@ -106,7 +105,6 @@ def QVariant(pyobj=None): from PySide.QtGui import (QItemSelection, QItemSelectionModel, QItemSelectionRange, QSortFilterProxyModel, QStringListModel) - from PySide.QtCore import qInstallMsgHandler as qInstallMessageHandler # QDesktopServices has has been split into (QDesktopServices and # QStandardPaths) in Qt5 From 8ee611a4b0f61d7da812ef00d78ef8ce6eab5316 Mon Sep 17 00:00:00 2001 From: mrosanes Date: Fri, 14 Dec 2018 15:01:34 +0100 Subject: [PATCH 192/252] Use bytes for setting mime data Use bytes instead of string for setting mime data. --- lib/taurus/qt/qtgui/panel/taurusvalue.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py index 4554166ad..0b2b8de75 100644 --- a/lib/taurus/qt/qtgui/panel/taurusvalue.py +++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py @@ -39,6 +39,7 @@ import weakref import re +from builtins import bytes from taurus.external.qt import Qt import taurus.core from taurus.core import DataType, DataFormat, TaurusEventType @@ -159,14 +160,13 @@ def contextMenuEvent(self, event): def getModelMimeData(self): '''reimplemented to use the taurusValueBuddy model instead of its own model''' mimeData = TaurusLabel.getModelMimeData(self) - mimeData.setData(TAURUS_MODEL_MIME_TYPE, - str(self.taurusValueBuddy().getModelName())) + modelname = bytes(self.taurusValueBuddy().getModelName(), + encoding='utf8') + mimeData.setData(TAURUS_MODEL_MIME_TYPE, modelname) if self.taurusValueBuddy().getModelType() == TaurusElementType.Device: - mimeData.setData(TAURUS_DEV_MIME_TYPE, - str(self.taurusValueBuddy().getModelName())) + mimeData.setData(TAURUS_DEV_MIME_TYPE, modelname) elif self.taurusValueBuddy().getModelType() == TaurusElementType.Attribute: - mimeData.setData(TAURUS_ATTR_MIME_TYPE, - str(self.taurusValueBuddy().getModelName())) + mimeData.setData(TAURUS_ATTR_MIME_TYPE, modelname) return mimeData @classmethod From f7bc6ab9b83d201bdb6e7870f7a23a79f6f42ee5 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 17 Dec 2018 09:33:58 +0100 Subject: [PATCH 193/252] Skip tests on taurus.qt.qtgui.qwt5 The plot module now should always be importable (even if it is deprecated, but the qwt5 module is only importable under py2 + Qt4 (and has become optional). Treat qwt5 just as the other qtgui.extra_* modules. --- lib/taurus/test/test_import.py | 8 ++------ lib/taurus/test/testsuite.py | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/taurus/test/test_import.py b/lib/taurus/test/test_import.py index d0d287df6..2c92951fe 100644 --- a/lib/taurus/test/test_import.py +++ b/lib/taurus/test/test_import.py @@ -48,7 +48,8 @@ def testImportSubmodules(self): Expected Results: It is expected to get no warning message on module importing """ - exclude_patterns = [r'taurus\.qt\.qtgui\.extra_.*'] + exclude_patterns = [r'taurus\.qt\.qtgui\.extra_.*', + r'taurus\.qt\.qtgui\.qwt5'] try: import PyTango @@ -59,11 +60,6 @@ def testImportSubmodules(self): except ImportError: exclude_patterns.append(r'taurus\.core\.epics') - if sys.version_info.major > 2: - # PyQwt4.Qwt5 not available for PY3 - exclude_patterns.append(r'taurus\.qt\.qtgui\.plot') - - moduleinfo, wrn = self.explore('taurus', verbose=False, exclude_patterns=exclude_patterns) msg = None diff --git a/lib/taurus/test/testsuite.py b/lib/taurus/test/testsuite.py index 19d9fe9be..488bf259a 100644 --- a/lib/taurus/test/testsuite.py +++ b/lib/taurus/test/testsuite.py @@ -38,15 +38,20 @@ import re import unittest import taurus - +from taurus.external.qt import PYQT4 __docformat__ = 'restructuredtext' PY3_EXCLUDED = ( - 'unittest.loader._FailedTest.taurus.qt.qtgui.plot', + 'unittest.loader._FailedTest.taurus.qt.qtgui.qwt5', 'unittest.loader._FailedTest.taurus.qt.qtgui.extra_sardana', 'unittest.loader._FailedTest.taurus.qt.qtgui.extra_pool', - 'unittest.loader._FailedTest.taurus.qt.qtgui.extra_macroexecutor') + 'unittest.loader._FailedTest.taurus.qt.qtgui.extra_macroexecutor' +) + +ONLY_PYQT4 = ( + 'unittest.loader._FailedTest.taurus.qt.qtgui.qwt5', +) def _filter_suite(suite, exclude_pattern, ret=None): """removes TestCases from a suite based on regexp matching on the Test id""" @@ -61,6 +66,10 @@ def _filter_suite(suite, exclude_pattern, ret=None): if sys.version_info.major > 2 and e.id() in PY3_EXCLUDED: print("Excluded %s" % e.id()) continue + + if not PYQT4 and e.id() in ONLY_PYQT4: + print("Excluded %s" % e.id()) + continue if re.match(exclude_pattern, e.id()): print("Excluded %s" % e.id()) From 1ea472340124a3a34a73796a68274b8cda1d4f41 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 17 Dec 2018 09:56:13 +0100 Subject: [PATCH 194/252] Update metadata of designer plugin for Qwt5 widgets Rename the 'module' info: taurus.qt.qtgui.plot -> taurus.qt.qtgui.qwt5 --- lib/taurus/qt/qtgui/qwt5/taurusarrayedit.py | 2 +- lib/taurus/qt/qtgui/qwt5/taurusplot.py | 2 +- lib/taurus/qt/qtgui/qwt5/taurustrend.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/taurus/qt/qtgui/qwt5/taurusarrayedit.py b/lib/taurus/qt/qtgui/qwt5/taurusarrayedit.py index 7cfde0950..51ab70b4b 100644 --- a/lib/taurus/qt/qtgui/qwt5/taurusarrayedit.py +++ b/lib/taurus/qt/qtgui/qwt5/taurusarrayedit.py @@ -205,7 +205,7 @@ def getQtDesignerPluginInfo(cls): :return: (dict) a map with pertinent designer information""" ret = TaurusWidget.getQtDesignerPluginInfo() - ret['module'] = 'taurus.qt.qtgui.plot' + ret['module'] = 'taurus.qt.qtgui.qwt5' ret['group'] = 'Taurus Input' ret['icon'] = 'designer:arrayedit.png' ret['container'] = False diff --git a/lib/taurus/qt/qtgui/qwt5/taurusplot.py b/lib/taurus/qt/qtgui/qwt5/taurusplot.py index ec0767a38..ba11ef0e1 100644 --- a/lib/taurus/qt/qtgui/qwt5/taurusplot.py +++ b/lib/taurus/qt/qtgui/qwt5/taurusplot.py @@ -3674,7 +3674,7 @@ def getQtDesignerPluginInfo(cls): :return: (dict) a map with pertinent designer information""" ret = TaurusBaseWidget.getQtDesignerPluginInfo() - ret['module'] = 'taurus.qt.qtgui.plot' + ret['module'] = 'taurus.qt.qtgui.qwt5' ret['group'] = 'Taurus Display' ret['icon'] = 'designer:qwtplot.png' return ret diff --git a/lib/taurus/qt/qtgui/qwt5/taurustrend.py b/lib/taurus/qt/qtgui/qwt5/taurustrend.py index 723bc5cad..df069d4de 100644 --- a/lib/taurus/qt/qtgui/qwt5/taurustrend.py +++ b/lib/taurus/qt/qtgui/qwt5/taurustrend.py @@ -1546,7 +1546,7 @@ def getQtDesignerPluginInfo(cls): :return: (dict) a map with pertinent designer information""" return { - 'module': 'taurus.qt.qtgui.plot', + 'module': 'taurus.qt.qtgui.qwt5', 'group': 'Taurus Display', 'icon': 'designer:qwtplot.png', 'container': False} From bfce97530ffbcb87acdf58bade8ba5a5894f08bc Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 17 Dec 2018 10:52:39 +0100 Subject: [PATCH 195/252] Do not force PyQ4 in example01 config --- .../taurusgui/conf/tgconf_example01/config.py | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py index 95b224bc4..f61c76848 100644 --- a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py +++ b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py @@ -98,24 +98,28 @@ model=['sys/tg_test/1/wave', 'sys/tg_test/1/boolean_scalar']) -trend = PanelDescription('Trend', - classname='TaurusTrend', - model=['sys/tg_test/1/double_scalar']) +trend = PanelDescription( + 'Trend', + classname='taurus.qt.qtgui.plot.TaurusTrend', + model=['sys/tg_test/1/double_scalar'] +) -connectionDemo = PanelDescription('Selected Instrument', - classname='PyQt4.Qt.QLineEdit', - sharedDataRead={ - 'SelectedInstrument': 'setText'}, - sharedDataWrite={'SelectedInstrument': 'textEdited'}) +connectionDemo = PanelDescription( + 'Selected Instrument', + classname='taurus.external.qt.Qt.QLineEdit', # A pure Qt widget! + sharedDataRead={'SelectedInstrument': 'setText'}, + sharedDataWrite={'SelectedInstrument': 'textEdited'} +) #========================================================================= # Define custom toolbars to be shown. To define a toolbar, instantiate a # ToolbarDescription object (see documentation for the gblgui_utils module) #========================================================================= -dummytoolbar = ToolBarDescription('Empty Toolbar', - classname='QToolBar', - modulename='PyQt4.Qt') +dummytoolbar = ToolBarDescription( + 'Empty Toolbar', + classname='taurus.external.qt.Qt.QToolBar' +) # panictoolbar = ToolBarDescription('Panic Toolbar', # classname = 'PanicToolbar', @@ -127,9 +131,9 @@ # object (see documentation for the gblgui_utils module) #========================================================================= -mon2 = AppletDescription('Dummy Monitor', - classname='TaurusMonitorTiny', - model='eval:1000*rand(2)') +# mon2 = AppletDescription('Dummy Monitor', +# classname='TaurusMonitorTiny', +# model='eval:1000*rand(2)') #========================================================================= @@ -153,8 +157,8 @@ # MACROEDITORS_PATH = #========================================================================= -# Monitor widget (This is *obsolete* now, you can get the same result defining a -# custom applet with classname='TaurusMonitorTiny') +# Monitor widget (This is *obsolete* now, you can get the same result defining +# a custom applet with classname='TaurusMonitorTiny') #========================================================================= # MONITOR = ['sys/tg_test/1/double_scalar_rww'] @@ -165,10 +169,11 @@ # -screenshot can either be a resource URL, a file name (either relative to # the application dir or with an absolute path) or None #========================================================================= -EXTRA_CATALOG_WIDGETS = [('PyQt4.Qt.QLineEdit', 'logos:taurus.png'), # a resource - ('PyQt4.Qt.QSpinBox', 'images/syn2.jpg'), # relative - #('PyQt4.Qt.QTextEdit','/tmp/foo.png'), # absolute - ('PyQt4.Qt.QLabel', None)] # none +EXTRA_CATALOG_WIDGETS = [ + ('taurus.external.qt.Qt.QLineEdit', 'logos:taurus.png'), # a resource + ('taurus.external.qt.Qt.QSpinBox', 'images/syn2.jpg'), # relative + # ('taurus.external.Qt.QTextEdit','/tmp/foo.png'), # absolute + ('taurus.external.qt.Qt.QLabel', None)] # none #========================================================================= # Define one or more embedded consoles in the GUI. From 1582fd0055e25a520f2abb7c01b603e7c51362b5 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 17 Dec 2018 10:55:33 +0100 Subject: [PATCH 196/252] Use module names in example01 config Include the module name in the class name for the examples in taurusgui's example01 config. Do this in preparation for an eventual deprecation of TaurusWidgetFactory in favor of importlib. --- .../taurusgui/conf/tgconf_example01/config.py | 48 +++++++++++-------- .../qt/qtgui/util/tauruswidgetfactory.py | 3 ++ 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py index f61c76848..6e1d6df20 100644 --- a/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py +++ b/lib/taurus/qt/qtgui/taurusgui/conf/tgconf_example01/config.py @@ -74,29 +74,35 @@ #========================================================================= # Define panels to be shown. -# To define a panel, instantiate a PanelDescription object (see documentation -# for the gblgui_utils module) +# To define a panel, instantiate a PanelDescription object #========================================================================= -nxbrowser = PanelDescription('NeXus Browser', - classname='TaurusNeXusBrowser', - area=None) +nxbrowser = PanelDescription( + 'NeXus Browser', + classname='taurus.qt.qtgui.extra_nexus.TaurusNeXusBrowser' +) -i0 = PanelDescription('BigInstrument', - classname='TaurusAttrForm', - model='sys/tg_test/1') +i0 = PanelDescription( + 'BigInstrument', + classname='taurus.qt.qtgui.panel.TaurusAttrForm', + model='sys/tg_test/1' +) -i1 = PanelDescription('instrument1', - classname='TaurusForm', - model=['sys/tg_test/1/double_scalar', - 'sys/tg_test/1/short_scalar_ro', - 'sys/tg_test/1/float_spectrum_ro', - 'sys/tg_test/1/double_spectrum']) +i1 = PanelDescription( + 'instrument1', + classname='taurus.qt.qtgui.panel.TaurusForm', + model=['sys/tg_test/1/double_scalar', + 'sys/tg_test/1/short_scalar_ro', + 'sys/tg_test/1/float_spectrum_ro', + 'sys/tg_test/1/double_spectrum'] +) -i2 = PanelDescription('instrument2', - classname='TaurusForm', - model=['sys/tg_test/1/wave', - 'sys/tg_test/1/boolean_scalar']) +i2 = PanelDescription( + 'instrument2', + classname='taurus.qt.qtgui.panel.TaurusForm', + model=['sys/tg_test/1/wave', + 'sys/tg_test/1/boolean_scalar'] +) trend = PanelDescription( 'Trend', @@ -141,8 +147,8 @@ # To define an external application, instantiate an ExternalApp object # See TaurusMainWindow.addExternalAppLauncher for valid values of ExternalApp #========================================================================= -xterm = ExternalApp(cmdargs=['xterm', 'spock'], - text="Spock", icon='utilities-terminal') +xterm = ExternalApp( + cmdargs=['xterm', 'spock'], text="Spock", icon='utilities-terminal') hdfview = ExternalApp(["hdfview"]) pymca = ExternalApp(['pymca']) @@ -165,7 +171,7 @@ #========================================================================= # Adding other widgets to the catalog of the "new panel" dialog. # pass a tuple of (classname,screenshot) -# -classname may contain the module name. +# -classname should contain the module name. # -screenshot can either be a resource URL, a file name (either relative to # the application dir or with an absolute path) or None #========================================================================= diff --git a/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py b/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py index 24508269f..4b5c28205 100644 --- a/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py +++ b/lib/taurus/qt/qtgui/util/tauruswidgetfactory.py @@ -27,6 +27,7 @@ tauruswidgetfactory.py: """ + __all__ = ["TaurusWidgetFactory", "getWidgetsOfType"] __docformat__ = 'restructuredtext' @@ -67,6 +68,8 @@ def getWidgetsOfType(widget, class_or_type_or_tuple): return widgets +# TODO: TaurusWidgetFactory should be deprecated in favor of using importlib + class TaurusWidgetFactory(Singleton, Logger): """The TaurusWidgetFactory is a utility class that provides information about all Qt widgets (Taurus and non Taurus) that are found in the From 3979f4acd50109c6aa92200ff3a5756a10f78abb Mon Sep 17 00:00:00 2001 From: cfalcon Date: Mon, 17 Dec 2018 15:49:18 +0100 Subject: [PATCH 197/252] Add scheme entry point in TaurusManager Add entry point access `taurus.core.schemes` as another option to register schemes in Taurus. TaurusManager._get_plugin_classes method add this code as experimental feature --- lib/taurus/core/taurusmanager.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/taurus/core/taurusmanager.py b/lib/taurus/core/taurusmanager.py index 1a8dbfaa4..5ef57107e 100755 --- a/lib/taurus/core/taurusmanager.py +++ b/lib/taurus/core/taurusmanager.py @@ -30,6 +30,7 @@ import os import atexit +import pkg_resources from .util.singleton import Singleton from .util.log import Logger, taurus4_deprecation @@ -42,8 +43,10 @@ from .taurusexception import TaurusException from .taurusfactory import TaurusFactory from .taurushelper import getSchemeFromName +import taurus from taurus import tauruscustomsettings + __all__ = ["TaurusManager"] __docformat__ = "restructuredtext" @@ -369,6 +372,18 @@ def _get_plugin_classes(self): full_module_names.extend( getattr(tauruscustomsettings, 'EXTRA_SCHEME_MODULES', [])) + full_module_names.extend( + getattr(taurus.core, 'PLUGIN_SCHEME_MODULES', [])) + + # --------------------------------------------------------------------- + # Note: this is an experimental feature introduced in v 4.5.0a + # It may be removed or changed in future releases + + # Discover the taurus.core.schemes plugins + schemes_ep = pkg_resources.iter_entry_points('taurus.core.schemes') + full_module_names.extend([p.name for p in schemes_ep]) + # --------------------------------------------------------------------- + for full_module_name in full_module_names: try: m = __import__(full_module_name, fromlist=['*'], level=0) From 4b24740f6b23d2213782eac969e9bfe9c4325f4f Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 20 Dec 2018 11:13:20 +0100 Subject: [PATCH 198/252] Remove problematic findCaller implementation taurus.core.util.log reimplements logging.Logger class to overwrite the findCaller method. This reimplementation is not simultaneously py2+py3 compatible and it is almost identical to the py3 implementation, breaking things on py2. Remove our reimplementation and use the logging ones (py2 or py3) instead. --- lib/taurus/core/util/log.py | 37 +------------------------------------ 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/lib/taurus/core/util/log.py b/lib/taurus/core/util/log.py index 7277b06de..2a78dfdf2 100644 --- a/lib/taurus/core/util/log.py +++ b/lib/taurus/core/util/log.py @@ -414,41 +414,6 @@ def report(self, *exc_info): self._log.log(self._level, "Unhandled exception:\n%s", text) -class _Logger(logging.Logger): - - - def findCaller(self, stack_info=False): - """ - Find the stack frame of the caller so that we can note the source - file name, line number and function name. - """ - f = currentframe() - # On some versions of IronPython, currentframe() returns None if - # IronPython isn't run with -X:Frames. - if f is not None: - f = f.f_back - rv = "(unknown file)", 0, "(unknown function)", None - while hasattr(f, "f_code"): - co = f.f_code - filename = os.path.normcase(co.co_filename) - if filename in (_srcfile, logging._srcfile): - f = f.f_back - continue - - sinfo = None - if stack_info: - sio = io.StringIO() - sio.write('Stack (most recent call last):\n') - traceback.print_stack(f, file=sio) - sinfo = sio.getvalue() - if sinfo[-1] == '\n': - sinfo = sinfo[:-1] - sio.close() - rv = (co.co_filename, f.f_lineno, co.co_name, sinfo) - break - return rv - - class Logger(Object): """The taurus logger class. All taurus pertinent classes should inherit directly or indirectly from this class if they need taurus logging @@ -662,7 +627,7 @@ def getRootLog(cls): def _getLogger(name=None): orig_logger_class = logging.getLoggerClass() try: - logging.setLoggerClass(_Logger) + logging.setLoggerClass(logging.Logger) ret = logging.getLogger(name) return ret finally: From 38302884fa2f800bac07a828f841777a873bcebc Mon Sep 17 00:00:00 2001 From: cfalcon Date: Thu, 20 Dec 2018 15:47:12 +0100 Subject: [PATCH 199/252] Adapt TaurusRoundRectItem to be compatible with qt5 TaurusRoundRectItem's constructor signature has changed. Use qt4 and qt5 compatible signature. --- lib/taurus/qt/qtgui/graphic/taurusgraphic.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py index f831d0352..eb242535a 100755 --- a/lib/taurus/qt/qtgui/graphic/taurusgraphic.py +++ b/lib/taurus/qt/qtgui/graphic/taurusgraphic.py @@ -1281,7 +1281,9 @@ def paint(self, painter, option, widget): class TaurusRoundRectItem(Qt.QGraphicsPathItem): def __init__(self, name=None, parent=None, scene=None): - Qt.QGraphicsPathItem.__init__(self, parent, scene) + Qt.QGraphicsPathItem.__init__(self, parent) + if scene is not None: + scene.addItem(self) self.__rect = None self.setCornerWidth(0, 0) From bbe36fe38f320059182db75bd2d888a52ddde419 Mon Sep 17 00:00:00 2001 From: cfalcon Date: Fri, 21 Dec 2018 09:43:10 +0100 Subject: [PATCH 200/252] Add new slot signature in selectGraphicItem PyQt5 support requires to add a new slot signature. --- lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py index f87082fb7..37bd7402a 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py @@ -165,6 +165,7 @@ def get_item_colors(self, emit=False): self.warning('Unable to emitColors: %s' % traceback.format_exc()) return item_colors + @Qt.pyqtSlot(object) @Qt.pyqtSlot('QString') def selectGraphicItem(self, item_name): self.scene().selectGraphicItem(item_name) From 70dfe70abc533570b8268c9102e953080134ba02 Mon Sep 17 00:00:00 2001 From: cfalcon Date: Fri, 21 Dec 2018 14:26:09 +0100 Subject: [PATCH 201/252] Apply workaround to get QToolButton text The shortcut character '&' is added automatically by clicked signal connect when using pyqt5. This causes troubles in GraphicalChoiceWidget. --- lib/taurus/qt/qtgui/input/choicedlg.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/taurus/qt/qtgui/input/choicedlg.py b/lib/taurus/qt/qtgui/input/choicedlg.py index 28da00623..a72c5f398 100644 --- a/lib/taurus/qt/qtgui/input/choicedlg.py +++ b/lib/taurus/qt/qtgui/input/choicedlg.py @@ -25,8 +25,7 @@ """This package provides a dialog for graphically choosing a Taurus class""" from __future__ import print_function - -from builtins import str +from future.builtins import str from taurus.external.qt import Qt @@ -199,7 +198,9 @@ def setChoice(self, row, col, text, pixmap=None, tooltip=None): def onClick(self): '''slot called when a button is clicked''' - self._chosen = str(self.sender().text()) + # TODO: Workaround for removing the shortcut character (&) + # added automatically by clicked signal connect when using pyqt5 + self._chosen = str(self.sender().text().replace('&', '')) self.choiceMade.emit(self._chosen) def getChosen(self): From 1cb2193b4c2d8c8e0c25bc14a07d29a033cd2351 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 2 Jan 2019 20:14:04 +0100 Subject: [PATCH 202/252] Fix encoding issues in getModelMimeData (used for drag&drop) The encoding to bytes in getModelMimeData implementations is still problematic due to a bug in future.builtins.str (https://github.com/PythonCharmers/python-future/issues/171) Avoid it by using the encode method of str instead in the getModelMimeData implementations of: - TaurusBaseComponent - TaurusJDrawSynopticsView - TaurusValue --- lib/taurus/qt/qtgui/base/taurusbase.py | 4 ++-- lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py | 7 +------ lib/taurus/qt/qtgui/panel/taurusvalue.py | 11 +++++++---- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/lib/taurus/qt/qtgui/base/taurusbase.py b/lib/taurus/qt/qtgui/base/taurusbase.py index 3fb0a447c..931b6d609 100644 --- a/lib/taurus/qt/qtgui/base/taurusbase.py +++ b/lib/taurus/qt/qtgui/base/taurusbase.py @@ -30,7 +30,7 @@ import sys import threading from types import MethodType -from future.builtins import str, bytes +from future.builtins import str from future.utils import string_types from taurus.external.qt import Qt @@ -1748,7 +1748,7 @@ def getModelMimeData(self): :return: (QMimeData) ''' mimeData = Qt.QMimeData() - modelname = bytes(self.getModelName(), encoding='utf8') + modelname = str(self.getModelName()).encode(encoding='utf8') mimeData.setData(TAURUS_MODEL_MIME_TYPE, modelname) try: modelclass = self.getModelClass() diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py index 37bd7402a..d93363359 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py @@ -325,17 +325,12 @@ def getModelMimeData(self): mimeData = Qt.QMimeData() if model: taurusType = taurushelper.getValidTypesForName(model, False) + model = str(model).encode('utf8') if TaurusElementType.Device in taurusType: - self.debug('getMimeData(): DeviceModel at %s: %s', - self.mousePos, model) mimeData.setData(TAURUS_DEV_MIME_TYPE, model) if TaurusElementType.Attribute in taurusType: - self.debug('getMimeData(): AttributeModel at %s: %s', - self.mousePos, model) mimeData.setData(TAURUS_ATTR_MIME_TYPE, model) else: - self.debug('getMimeData(): UnknownModel at %s: %s', - self.mousePos, model) mimeData.setData(TAURUS_MODEL_MIME_TYPE, model) except: self.debug( diff --git a/lib/taurus/qt/qtgui/panel/taurusvalue.py b/lib/taurus/qt/qtgui/panel/taurusvalue.py index 0b2b8de75..815328288 100644 --- a/lib/taurus/qt/qtgui/panel/taurusvalue.py +++ b/lib/taurus/qt/qtgui/panel/taurusvalue.py @@ -36,10 +36,10 @@ __docformat__ = 'restructuredtext' from future.utils import string_types +from future.builtins import str import weakref import re -from builtins import bytes from taurus.external.qt import Qt import taurus.core from taurus.core import DataType, DataFormat, TaurusEventType @@ -158,10 +158,13 @@ def contextMenuEvent(self, event): event.accept() def getModelMimeData(self): - '''reimplemented to use the taurusValueBuddy model instead of its own model''' + """ + reimplemented to use the taurusValueBuddy model instead of its own + model + """ mimeData = TaurusLabel.getModelMimeData(self) - modelname = bytes(self.taurusValueBuddy().getModelName(), - encoding='utf8') + _modelname = str(self.taurusValueBuddy().getModelName()) + modelname = _modelname.encode(encoding='utf8') mimeData.setData(TAURUS_MODEL_MIME_TYPE, modelname) if self.taurusValueBuddy().getModelType() == TaurusElementType.Device: mimeData.setData(TAURUS_DEV_MIME_TYPE, modelname) From 85e187e15d73f294951e02c7cedc7c86aa8b54fd Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 3 Jan 2019 11:57:58 +0100 Subject: [PATCH 203/252] (m) (doc) Fix typo --- lib/taurus/tauruscustomsettings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/tauruscustomsettings.py b/lib/taurus/tauruscustomsettings.py index 3f7967990..d716f0446 100755 --- a/lib/taurus/tauruscustomsettings.py +++ b/lib/taurus/tauruscustomsettings.py @@ -108,7 +108,7 @@ # Qt configuration # ---------------------------------------------------------------------------- -#: Set preffered API if not is already loaded +#: Set preferred API if not is already loaded DEFAULT_QT_API = 'pyqt5' #: Auto initialize Qt logging to python logging From 4b93966ce46a2c9ae0795145735813b82768bf1d Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 3 Jan 2019 11:59:57 +0100 Subject: [PATCH 204/252] (doc) update documentation: pyqt5 is the fallback API --- lib/taurus/external/qt/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/external/qt/__init__.py b/lib/taurus/external/qt/__init__.py index e91448519..a25971b22 100644 --- a/lib/taurus/external/qt/__init__.py +++ b/lib/taurus/external/qt/__init__.py @@ -72,7 +72,7 @@ class PythonQtError(RuntimeError): # if no binding is already loaded, use (in this order): # - QT_API environment variable # - tauruscustomsettings.DEFAULT_QT_API - # - 'pyqt' + # - 'pyqt5' API = os.environ.get(QT_API, getattr(__config, 'DEFAULT_QT_API', 'pyqt5')) API = API.lower() From da858c155607d26cf2ad114ab57829f8370d9272 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 3 Jan 2019 12:02:12 +0100 Subject: [PATCH 205/252] Adapt tests to new external.qt submodule The unit tests for taurus.external.qt need to be adapted to the changes introduced in the module. Also do some PEP8 cleaning. --- lib/taurus/external/test/test_qt.py | 63 +++++++++++++++-------------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/lib/taurus/external/test/test_qt.py b/lib/taurus/external/test/test_qt.py index 979e05aa1..b2f99843d 100644 --- a/lib/taurus/external/test/test_qt.py +++ b/lib/taurus/external/test/test_qt.py @@ -26,11 +26,8 @@ import sys import taurus -from taurus import tauruscustomsettings import unittest -_QtAPIs = ["PyQt4", "PySide", "PyQt5"] - def _import(name): __import__(name) @@ -39,18 +36,11 @@ def _import(name): class QtTestCase(unittest.TestCase): - QtAPI = None + _api_name = None def setUp(self): taurus.setLogLevel(taurus.Critical) - for qt in _QtAPIs: - if qt in sys.modules: - self.QtAPI = qt - break - else: - self.QtAPI = "PyQt4" - self.opt_mods = ("QtDesigner", "QtNetwork", "Qt", "QtSvg", "QtUiTools", "QtWebKit", "Qwt5", "uic") @@ -58,53 +48,64 @@ def setUp(self): self._orig_mods = set(sys.modules.keys()) # this import initializes Qt in case it is not loaded - from taurus.external.qt import Qt + from taurus.external.qt import Qt, API_NAME + + self._api_name = API_NAME self.__qt = Qt def test_qt_base_import(self): mods = set(sys.modules.keys()) - other_apis = set(_QtAPIs) - other_apis.remove(self.QtAPI) - - from taurus.external.qt import API_NAME + other_apis = set(('PyQt5', 'PySide2', 'PyQt4', 'PySide')) + other_apis.remove(self._api_name) - self.assertEquals(API_NAME, self.QtAPI) + # the selected API and the QtCore should be loaded + self.assertTrue(self._api_name in mods, self._api_name + " not loaded") + self.assertTrue(self._api_name + ".QtCore" in mods, + "QtCore not loaded") + # the other APIs should *not* be loaded for other_api in other_apis: - self.assertFalse(other_api in mods, other_api + " loaded in " + self.QtAPI + " test") - - self.assertTrue(self.QtAPI in mods, self.QtAPI + " not loaded") - self.assertTrue(self.QtAPI + ".QtCore" in mods, "QtCore not loaded") + self.assertFalse( + other_api in mods, + other_api + " loaded in " + self._api_name + " test") + # the other Qt submodules should *not* be loaded for opt_mod in self.opt_mods: - mod = "{0}.{1}".format(self.QtAPI, opt_mod) - self.assertFalse(mod in mods-self._orig_mods, mod + " is loaded") + mod = "{0}.{1}".format(self._api_name, opt_mod) + self.assertFalse(mod in mods - self._orig_mods, mod + " is loaded") def __test_qt_module(self, qt_mod_name): + """Checks that the given shim is complete""" taurus_qt_mod_name = "taurus.external.qt.{0}".format(qt_mod_name) - orig_qt_mod_name = "{0}.{1}".format(self.QtAPI, qt_mod_name) + orig_qt_mod_name = "{0}.{1}".format(self._api_name, qt_mod_name) TaurusQtMod = _import(taurus_qt_mod_name) OrigQtMod = _import(orig_qt_mod_name) - taurus_qt_mod_members = [ m for m in dir(TaurusQtMod) if not m.startswith("_") ] - orig_qt_mod_members = [ m for m in dir(OrigQtMod) if not m.startswith("_") ] + taurus_qt_mod_members = [m for m in dir(TaurusQtMod) + if not m.startswith("_")] + orig_qt_mod_members = [m for m in dir(OrigQtMod) + if not m.startswith("_")] for orig_member_name in orig_qt_mod_members: - self.assertTrue(orig_member_name in taurus_qt_mod_members, - "Taurus {0} does not contain {1}".format(qt_mod_name, orig_member_name)) + self.assertTrue( + orig_member_name in taurus_qt_mod_members, + "Taurus {0} does not contain {1}".format(qt_mod_name, + orig_member_name) + ) def test_qt_core(self): + """Check the QtCore shim""" return self.__test_qt_module("QtCore") def test_qt_gui(self): + """Check the QtGui shim""" return self.__test_qt_module("QtGui") def test_icons(self): - '''check that theme icons work''' + """check that theme icons work""" from taurus.external.qt import Qt icon = Qt.QIcon.fromTheme("folder-open") - msg = ('Theme icons not available ' + - '(if PyQt<4.6, make sure to build resources first!)') + msg = ('Theme icons not available') self.assertFalse(icon.isNull(), msg) From 87f047f54cc107aae0d39ce490bf45198be3a381 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 3 Jan 2019 13:01:24 +0100 Subject: [PATCH 206/252] Remove theme icons test This test only works with Qt4 (with Qt5 it fails unless a QApplication is already initialized) and for X11 (windows or Mac do not have default theme Icons). Remove it from the test suite. --- lib/taurus/external/test/test_qt.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/lib/taurus/external/test/test_qt.py b/lib/taurus/external/test/test_qt.py index b2f99843d..caabe7c6f 100644 --- a/lib/taurus/external/test/test_qt.py +++ b/lib/taurus/external/test/test_qt.py @@ -101,13 +101,6 @@ def test_qt_gui(self): """Check the QtGui shim""" return self.__test_qt_module("QtGui") - def test_icons(self): - """check that theme icons work""" - from taurus.external.qt import Qt - icon = Qt.QIcon.fromTheme("folder-open") - msg = ('Theme icons not available') - self.assertFalse(icon.isNull(), msg) - def main(): unittest.main(verbosity=2) From 228bdcd701dc69606c10f54c25ca9f58b155b077 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 3 Jan 2019 15:06:33 +0100 Subject: [PATCH 207/252] Adapt exclude rule to renaming plot -> qwt5 The sphinx build is failing with Qt5 because the configuration is not yet adapted to the renaming of taurus.qt.qtgui.plot to taurus.qt.qtgui.qwt5. Adapt it. --- doc/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index 63055ef5a..f307ed238 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -67,7 +67,7 @@ def _build_doc_api(): ] if sys.version_info.major > 2: excl += [ - 'taurus\.qt\.qtgui\.plot', # for now plot fails to import in PY3 + 'taurus\.qt\.qtgui\.qwt5', # qwt5 not available in PY3 '.*\.(object|zip|str)', # avoid warnings from builtins ] From 8baca99023826f7260a2b1b2035c7dde7ad66e85 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 3 Jan 2019 15:06:51 +0100 Subject: [PATCH 208/252] (m) PEP8 --- lib/taurus/external/test/test_qt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/external/test/test_qt.py b/lib/taurus/external/test/test_qt.py index caabe7c6f..20024a10f 100644 --- a/lib/taurus/external/test/test_qt.py +++ b/lib/taurus/external/test/test_qt.py @@ -102,7 +102,7 @@ def test_qt_gui(self): return self.__test_qt_module("QtGui") -def main(): +def main(): unittest.main(verbosity=2) From 9f9fec8afcf9b35f751e1437eb24340ef57098dd Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 4 Jan 2019 12:51:06 +0100 Subject: [PATCH 209/252] Revert "Workaround import error in h5py when building docs" This reverts commit c7f484bea18ea27c962dcd134db598bffd47f142. The workaround is no longer needed here since we now set LANG=C.UTF-8 in the docker images --- .travis.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1fbab951b..702969d85 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,10 +35,7 @@ script: - set -e - docker exec -t taurus-test /bin/bash -c "cd /taurus ; python setup.py install" - docker exec -t taurus-test /bin/bash -c "TAURUS_STARTER_WAIT=5 taurustestsuite -e 'taurus\.core\.util\.test\.test_timer'" - # build docs. The use of LANG=C.UTF-8 is a workaround to avoid an - # import error related to https://github.com/h5py/h5py/issues/803 - # note: the problem is fixed in h5py 2.8 (but debian9 uses 2.7) - - docker exec -t taurus-test /bin/bash -c "cd /taurus ; LANG=C.UTF-8 sphinx-build -qW doc/source/ build/sphinx/html" + - docker exec -t taurus-test /bin/bash -c "cd /taurus ; sphinx-build -qW doc/source/ build/sphinx/html" # deploy sphinx-built docs to taurus-doc repo - if [[ "$DOCKER_IMG" == "cpascual/taurus-test:debian-stretch" && "$TRAVIS_REPO_SLUG" == "taurus-org/taurus" ]]; then pip install doctr ; From 8d125f439fdd4e17b43258518ed5d4da621cfa64 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 8 Jan 2019 16:20:17 +0100 Subject: [PATCH 210/252] Add taurus.external.qt.compat module This first implementation just provides substitutes for QFileDialog's getSaveFileName, getOpenFileName and getOpenFileNames that return the selected filter regardless of Qt API. --- lib/taurus/external/qt/compat.py | 44 ++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100755 lib/taurus/external/qt/compat.py diff --git a/lib/taurus/external/qt/compat.py b/lib/taurus/external/qt/compat.py new file mode 100755 index 000000000..735c207f6 --- /dev/null +++ b/lib/taurus/external/qt/compat.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +############################################################################## +## +## This file is part of Taurus +## +## http://taurus-scada.org +## +## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain +## +## Taurus is free software: you can redistribute it and/or modify +## it under the terms of the GNU Lesser General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## Taurus is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public License +## along with Taurus. If not, see . +## +############################################################################## + +""" +This module provides utilities to smooth differences between different +Qt APIs +""" + +# provide substitutes for QFileDialog's getSaveFileName, getOpenFileName +# and getOpenFileNames that return the selected filter regardless of Qt API +from taurus.external.qt.Qt import QFileDialog + +getSaveFileName = getattr(QFileDialog, 'getSaveFileNameAndFilter', + QFileDialog.getSaveFileName) + +getOpenFileName = getattr(QFileDialog, 'getOpenFileNameAndFilter', + QFileDialog.getOpenFileName) + +getOpenFileNames = getattr(QFileDialog, 'getOpenFileNamesAndFilter', + QFileDialog.getOpenFileNames) + +del QFileDialog \ No newline at end of file From f3a03bb305e34ed5e048c62227994e36bd3c62c8 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 9 Jan 2019 11:08:43 +0100 Subject: [PATCH 211/252] Use file dialogs from compat module Change all occurrences of QFileDialog.get{Open,Save}FileName{,s} by their equivalents from the taurus.external.qt.compat module in order to be py2+py3 compatible --- .../qt/qtcore/configuration/configuration.py | 15 ++++++++------ .../qt/qtgui/container/taurusmainwindow.py | 10 +++++----- .../qt/qtgui/extra_nexus/taurusnexuswidget.py | 5 ++--- .../qt/qtgui/graphic/jdraw/jdraw_view.py | 6 +++--- .../qt/qtgui/panel/qdataexportdialog.py | 6 +++--- .../qt/qtgui/panel/taurusconfigeditor.py | 4 ++-- lib/taurus/qt/qtgui/qwt5/taurusarrayedit.py | 4 ++-- lib/taurus/qt/qtgui/qwt5/taurusplot.py | 18 ++++++++++------- .../qt/qtgui/taurusgui/appsettingswizard.py | 20 ++++++++++++------- lib/taurus/qt/qtgui/taurusgui/taurusgui.py | 8 +++++--- 10 files changed, 55 insertions(+), 41 deletions(-) diff --git a/lib/taurus/qt/qtcore/configuration/configuration.py b/lib/taurus/qt/qtcore/configuration/configuration.py index 683790669..cee021bca 100644 --- a/lib/taurus/qt/qtcore/configuration/configuration.py +++ b/lib/taurus/qt/qtcore/configuration/configuration.py @@ -436,9 +436,12 @@ def saveConfigFile(self, ofile=None): """ import pickle if ofile is None: - from taurus.external.qt import Qt - ofile = str(Qt.QFileDialog.getSaveFileName( - self, 'Save Configuration', '%s.pck' % self.__class__.__name__, 'Configuration File (*.pck)')) + from taurus.external.qt import compat + ofile, _ = compat.getSaveFileName( + self, 'Save Configuration', + '%s.pck' % self.__class__.__name__, + 'Configuration File (*.pck)' + ) if not ofile: return if not isinstance(ofile, file): @@ -457,9 +460,9 @@ def loadConfigFile(self, ifile=None): """ import pickle if ifile is None: - from taurus.external.qt import Qt - ifile = str(Qt.QFileDialog.getOpenFileName( - self, 'Load Configuration', '', 'Configuration File (*.pck)')) + from taurus.external.qt import compat + ifile, _ = compat.getOpenFileName( + self, 'Load Configuration', '', 'Configuration File (*.pck)') if not ifile: return if not isinstance(ifile, file): diff --git a/lib/taurus/qt/qtgui/container/taurusmainwindow.py b/lib/taurus/qt/qtgui/container/taurusmainwindow.py index 7f3524ab7..8bab9854c 100644 --- a/lib/taurus/qt/qtgui/container/taurusmainwindow.py +++ b/lib/taurus/qt/qtgui/container/taurusmainwindow.py @@ -40,7 +40,7 @@ from taurus import tauruscustomsettings from taurus.core.util import deprecation_decorator -from taurus.external.qt import Qt +from taurus.external.qt import Qt, compat from .taurusbasecontainer import TaurusBaseContainer from taurus.qt.qtcore.configuration import BaseConfigurableClass @@ -779,9 +779,9 @@ def exportSettingsFile(self, fname=None): :param fname: (str) name of output file. If None given, a file dialog will be shown. ''' if fname is None: - fname = str(Qt.QFileDialog.getSaveFileName( + fname, _ = compat.getSaveFileName( self, 'Choose file where the current settings should be saved', - '', "Ini files (*.ini);;All files (*)") + '', "Ini files (*.ini);;All files (*)" ) if not fname: return @@ -803,9 +803,9 @@ def importSettingsFile(self, fname=None): :param fname: (str) name of ini file. If None given, a file dialog will be shown. ''' if fname is None: - fname = str(Qt.QFileDialog.getOpenFileName( + fname, _ = compat.getOpenFileName( self, 'Select a ini-format settings file', - '', "Ini files (*.ini);;All files (*)") + '', "Ini files (*.ini);;All files (*)" ) if not fname: return diff --git a/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py b/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py index f01c9ec3a..c5715f193 100644 --- a/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py +++ b/lib/taurus/qt/qtgui/extra_nexus/taurusnexuswidget.py @@ -33,7 +33,7 @@ import posixpath from functools import partial -from taurus.external.qt import Qt +from taurus.external.qt import Qt, compat from PyMca5.PyMcaGui.io.hdf5 import HDF5Widget, HDF5Info, HDF5DatasetTable from taurus.qt.qtgui.container import TaurusWidget @@ -117,8 +117,7 @@ def __init__(self, *args, **kwargs): @Qt.pyqtSlot('QString') def openFile(self, fname=None): if fname is None: - fname = str(Qt.QFileDialog.getOpenFileName( - self, "Choose NeXus File", "/home/cpascual/local/tmp/scantest.h5")) # @TODO!! + fname, _ = compat.getOpenFileName(self, 'Choose NeXus File', '') if fname: self.__nexusFile = self.__fileModel.openFile(fname) diff --git a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py index d93363359..f8dcd4c88 100644 --- a/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py +++ b/lib/taurus/qt/qtgui/graphic/jdraw/jdraw_view.py @@ -34,7 +34,7 @@ from future.utils import string_types import taurus -from taurus.external.qt import Qt +from taurus.external.qt import Qt, compat from taurus.core.taurusbasetypes import TaurusElementType from taurus.core import taurushelper from taurus.qt.qtgui.graphic.taurusgraphic import parseTangoUri, TaurusGraphicsItem, SynopticSelectionStyle @@ -127,8 +127,8 @@ def update(self): self.emitColors() def openJDraw(self): - ifile = str(Qt.QFileDialog.getOpenFileName( - self, 'Load JDraw File', '', 'JDraw File (*.jdw)')) + ifile, _ = compat.getOpenFileName( + self, 'Load JDraw File', '', 'JDraw File (*.jdw)') if not ifile: return fileName = ifile.split("/") diff --git a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py index 486edfd6d..bdd5db549 100755 --- a/lib/taurus/qt/qtgui/panel/qdataexportdialog.py +++ b/lib/taurus/qt/qtgui/panel/qdataexportdialog.py @@ -31,7 +31,7 @@ import os.path from datetime import datetime -from taurus.external.qt import Qt +from taurus.external.qt import Qt, compat from taurus.qt.qtgui.util.ui import UILoadable @@ -107,8 +107,8 @@ def exportCurrentData(self, set=None, ofile=None, verbose=True, AllowCloseAfter= #**lazy** sanitising of the set to *suggest* it as a filename name = set.replace('*', '').replace('/', '_').replace('\\', '_') name += ".dat" - ofile = Qt.QFileDialog.getSaveFileName( self, 'Export File Name', - name, 'All Files (*)') + ofile, _ = compat.getSaveFileName(self, 'Export File Name', name, + 'All Files (*)') if not ofile: return False try: diff --git a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py index 15c956147..1f6b66607 100644 --- a/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py +++ b/lib/taurus/qt/qtgui/panel/taurusconfigeditor.py @@ -30,7 +30,7 @@ from future import standard_library standard_library.install_aliases() -from taurus.external.qt import Qt +from taurus.external.qt import Qt, compat import pickle import os import tempfile @@ -470,7 +470,7 @@ def loadFile(self, iniFileName=None): path = Qt.QDir.homePath() else: path = self.tree.originalFile - iniFileName = Qt.QFileDialog.getOpenFileName( + iniFileName, _ = compat.getOpenFileName( self, 'Select a settings file', path, 'Ini Files (*.ini)') if not iniFileName: return diff --git a/lib/taurus/qt/qtgui/qwt5/taurusarrayedit.py b/lib/taurus/qt/qtgui/qwt5/taurusarrayedit.py index 51ab70b4b..41b4eb9a8 100644 --- a/lib/taurus/qt/qtgui/qwt5/taurusarrayedit.py +++ b/lib/taurus/qt/qtgui/qwt5/taurusarrayedit.py @@ -25,7 +25,7 @@ from __future__ import absolute_import -from taurus.external.qt import Qt +from taurus.external.qt import Qt, compat import taurus import numpy @@ -107,7 +107,7 @@ def onFromFile(self, filename=None, **kwargs): skiprows=0, usecols=None, unpack=False} see help from numpy.loadtxt for more info on the kwargs''' if filename is None: - filename = Qt.QFileDialog.getOpenFileName( + filename, _ = compat.getOpenFileName( self, 'Choose input file', '', 'Ascii file (*)') if not filename: return False diff --git a/lib/taurus/qt/qtgui/qwt5/taurusplot.py b/lib/taurus/qt/qtgui/qwt5/taurusplot.py index ba11ef0e1..7680c93fa 100644 --- a/lib/taurus/qt/qtgui/qwt5/taurusplot.py +++ b/lib/taurus/qt/qtgui/qwt5/taurusplot.py @@ -43,7 +43,7 @@ import numpy from future.utils import string_types from functools import partial -from taurus.external.qt import Qt, Qwt5 +from taurus.external.qt import Qt, Qwt5, compat import taurus import taurus.core @@ -2506,8 +2506,11 @@ def saveConfig(self, ofile=None, curvenames=None): """ import pickle if ofile is None: - ofile = str(Qt.QFileDialog.getSaveFileName(self, 'Save Taurusplot Configuration', - 'TaurusplotConfig.pck', 'TaurusPlot Curve Properties File (*.pck)')) + ofile, _ = compat.getSaveFileName( + self, 'Save Taurusplot Configuration', + 'TaurusplotConfig.pck', + 'TaurusPlot Curve Properties File (*.pck)' + ) if not ofile: return if not isinstance(ofile, file): @@ -2526,8 +2529,9 @@ def loadConfig(self, ifile=None): """ import pickle if ifile is None: - ifile = str(Qt.QFileDialog.getOpenFileName( - self, 'Load Taurusplot Configuration', '', 'TaurusPlot Curve Properties File (*.pck)')) + ifile, _ = compat.getOpenFileName( + self, 'Load Taurusplot Configuration', '', + 'TaurusPlot Curve Properties File (*.pck)') if not ifile: return if not isinstance(ifile, file): @@ -2702,7 +2706,7 @@ def exportPdf(self, fileName=None): a file name. """ if fileName is None: - fileName = Qt.QFileDialog.getSaveFileName( + fileName, _ = compat.getSaveFileName( self, 'Export File Name', 'plot.pdf', 'PDF Documents (*.pdf)') fileName = str(fileName) if fileName: @@ -2798,7 +2802,7 @@ def importAscii(self, filenames=None, xcol=None, **kwargs): .. seealso:: :meth:`numpy.loadtxt` ''' if filenames is None: - filenames = Qt.QFileDialog.getOpenFileNames( + filenames, _ = compat.getOpenFileNames( self, 'Choose input files', '', 'Ascii file (*)') if not filenames: return False diff --git a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py index 8d6935e04..066b6899f 100644 --- a/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py +++ b/lib/taurus/qt/qtgui/taurusgui/appsettingswizard.py @@ -46,7 +46,7 @@ from lxml import etree from taurus import tauruscustomsettings -from taurus.external.qt import Qt +from taurus.external.qt import Qt, compat import taurus.qt.qtgui.panel import taurus.qt.qtgui.taurusgui.paneldescriptionwizard import taurus.qt.qtgui.input @@ -471,8 +471,10 @@ def _getCustomLogo(self): return None def _selectImage(self): - fileName = Qt.QFileDialog.getOpenFileName(self, self.tr( - "Open File"), Qt.QDir.homePath(), self.tr("Images (*.png *.xpm *.jpg *.jpeg *.svg)")) + fileName, _ = compat.getOpenFileName( + self, self.tr("Open File"), Qt.QDir.homePath(), + self.tr("Images (*.png *.xpm *.jpg *.jpeg *.svg)") + ) self._customLogoLineEdit.setText(fileName) self._changeImage() @@ -580,8 +582,10 @@ def _setupUI(self): def _addSynoptic(self): pdir = self.wizard().__getitem__('projectDir') - fileNames = Qt.QFileDialog.getOpenFileNames(self, self.tr( - "Open File"), pdir, self.tr("JDW (*.jdw );; All files (*)")) + fileNames, _ = compat.getOpenFileNames( + self, self.tr("Open File"), pdir, + self.tr("JDW (*.jdw );; All files (*)") + ) for fileName in fileNames: fileName = str(fileName) if fileName not in self._synoptics: @@ -1004,8 +1008,10 @@ def _setDefaultText(self): self.checkData() def _selectExecFile(self): - filePath = Qt.QFileDialog.getOpenFileName(self, self.tr( - "Open File"), Qt.QDir.homePath(), self.tr("All files (*)")) + filePath, _ = compat.getOpenFileName( + self, self.tr("Open File"), + Qt.QDir.homePath(), self.tr("All files (*)") + ) if len(filePath): self._execFileLineEdit.setText(filePath) self._setDefaultText() diff --git a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py index c130236aa..94cc5bd49 100644 --- a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py +++ b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py @@ -37,7 +37,7 @@ import taurus from taurus import tauruscustomsettings -from taurus.external.qt import Qt +from taurus.external.qt import Qt, compat from taurus.qt.qtcore.configuration import BaseConfigurableClass from taurus.qt.qtcore.communication import SharedDataManager from taurus.qt.qtgui.util import TaurusWidgetFactory @@ -1552,8 +1552,10 @@ def onExportCurrentPanelConfiguration(self, fname=None): # write to file while True: if fname is None: - fname = Qt.QFileDialog.getSaveFileName( - self, "Open File", fname or self._confDirectory, self.tr("XML files (*.xml)")) + fname, _ = compat.getSaveFileName( + self, "Open File", self._confDirectory, + self.tr("XML files (*.xml)") + ) if not fname: return fname = str(fname) From 795502ae045f968e4c52d1a3524b608c87dd65fa Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 9 Jan 2019 20:35:14 +0100 Subject: [PATCH 212/252] Workaround for KDE bug 345023 KDE is auto-adding shortcuts to buttons and actions. This causes issues when QAction.text() is used as a key for a perspective Avoid relying on text() (use a monkey-patched variable instead as a workaround). Also refactor the previous workaround to this same bug to use a similar technique. --- lib/taurus/qt/qtgui/container/taurusmainwindow.py | 14 ++++++++++++-- lib/taurus/qt/qtgui/input/choicedlg.py | 14 +++++++++++--- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/lib/taurus/qt/qtgui/container/taurusmainwindow.py b/lib/taurus/qt/qtgui/container/taurusmainwindow.py index 8bab9854c..8464dcd81 100644 --- a/lib/taurus/qt/qtgui/container/taurusmainwindow.py +++ b/lib/taurus/qt/qtgui/container/taurusmainwindow.py @@ -357,13 +357,23 @@ def updatePerspectivesMenu(self): return None self.perspectivesMenu.clear() for pname in self.getPerspectivesList(): - self.perspectivesMenu.addAction( + a = self.perspectivesMenu.addAction( pname, self.__onPerspectiveSelected) + # ------------------------------------------------------- + # Work around for https://bugs.kde.org/show_bug.cgi?id=345023 + # TODO: make better solution for this + a.perspective_name = pname # <-- ugly monkey-patch! + # ------------------------------------------------------- return self.perspectivesMenu def __onPerspectiveSelected(self): '''slot to be called by the actions in the perspectivesMenu''' - pname = self.sender().text() + # ------------------------------------------------------- + # Work around for https://bugs.kde.org/show_bug.cgi?id=345023 + # TODO: make better solution for this + # pname = self.sender().text() # <-- this fails because of added "&" + pname = self.sender().perspective_name # <-- this was monkey-patched + # ------------------------------------------------------- self.loadPerspective(name=pname) def splashScreen(self): diff --git a/lib/taurus/qt/qtgui/input/choicedlg.py b/lib/taurus/qt/qtgui/input/choicedlg.py index a72c5f398..b8f2cdfa0 100644 --- a/lib/taurus/qt/qtgui/input/choicedlg.py +++ b/lib/taurus/qt/qtgui/input/choicedlg.py @@ -195,12 +195,20 @@ def setChoice(self, row, col, text, pixmap=None, tooltip=None): button.setToolTip(tooltip) button.clicked.connect(self.onClick) self.gridLayout.addWidget(button, row, col, Qt.Qt.AlignCenter) + # ------------------------------------------------------- + # Work around for https://bugs.kde.org/show_bug.cgi?id=345023 + # TODO: make better solution for this + button._id = text # <-- ugly monkey-patch! + # ------------------------------------------------------- def onClick(self): '''slot called when a button is clicked''' - # TODO: Workaround for removing the shortcut character (&) - # added automatically by clicked signal connect when using pyqt5 - self._chosen = str(self.sender().text().replace('&', '')) + # ------------------------------------------------------- + # Work around for https://bugs.kde.org/show_bug.cgi?id=345023 + # TODO: make better solution for this + # self._chosen = str(self.sender().text()) # <-- fails due to added "&" + self._chosen = self.sender()._id # <-- this was monkey-patched + # ------------------------------------------------------- self.choiceMade.emit(self._chosen) def getChosen(self): From a3b6ffd18e5c34bfb2543b3dd9543f4d3d0fdce7 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 11 Jan 2019 09:43:32 +0100 Subject: [PATCH 213/252] (doc) Add more tips for Qt-agnostic code --- doc/source/tep/TEP18.md | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index 9382ab431..b2a80f497 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -352,10 +352,19 @@ following tips were found useful when porting applications to taurus 4.5 This needs to be addressed. - Also note that we had to convert some positional args into keyword args in our mixin classes (TaurusBaseComponent,...) to make them work with Qt5 - -- QLayout margin, setMargin were deprecated in Qt 4.8 , Use Use setContentsMargins() and getContentsMargins() instead. - http://doc.qt.io/archives/qt-4.8/qlayout-obsolete.html - + +- The `taurus.qt.qtgui.plot` module depends on the Qwt5 module to provide its + full API, but Qwt5 is only available in the PyQt4 binding and therefore the + `taurus.qt.qtgui.plot` module has been deprecated. For the other bindings, + this module attempts to provide a very limited backwards compatibility API + if the `taurus_pyqtgraph` module is installed. If an application is intended + to support PyQt4 only, then it can avoid the deprecation warnings by replacing + `taurus.qt.qtgui.plot` by `taurus.qt.qtgui.qwt5`. Otherwise, using + `taurus.qt.qtgui.tpg` (provided by the `taurus_pyqtgraph` plugin) is recommended. + +- `QLayout.margin` and `.setMargin` were [deprecated in Qt 4.8](http://doc.qt.io/archives/qt-4.8/qlayout-obsolete.html) + Use `.getContentsMargins()` and `setContentsMargins()` instead. + - be careful with qInstallMsgHandler (Qt4) vs qInstallMessageHandler (Qt5). The following code can be used as a reference: @@ -376,6 +385,7 @@ following tips were found useful when porting applications to taurus 4.5 QtCore.qInstallMsgHandler(taurusMsgHandler) ``` + - Be aware of the [renamed methods in QHeaderView](http://doc.qt.io/qt-5/sourcebreaks.html#changes-to-qheaderview) (from Qt4 to Qt5) and the fact that in Qt5, setSectionResizeMode may **crash the GUI** if called on an empty header. The following code snippet takes care of both @@ -388,7 +398,20 @@ following tips were found useful when porting applications to taurus 4.5 except AttributeError: # PyQt4 headerView.setResizeMode(headerView.Stretch) ``` - + +- Note that the `getOpenFileName`, `getOpenFileNames` and `getSaveFileName` + static methods from `QFileDialog` only return the name (or names) in PyQt4 + but they return a (name/s, filter) tuple in the other bindings. + In order to facilitate writing binding-agnostic code, we provide the + `getOpenFileName`, `getOpenFileNames` and `getSaveFileName` functions in + the `taurus.external.qt.compat` module which return the tuple regardless + of the binding. + +- Beware of [a bug in KDE](https://bugs.kde.org/show_bug.cgi?id=345023) which + modifies the `text` property of buttons and actions by auto-inserting and + "&" character in unpredictable positions when running under KDE and using + Qt5. In practice the best is to avoid relying on the return value of the + `text` property of buttons or actions in the program logic. TODO: complete this section From a01ed95efeebe079965601b8ae42afbf97160fed Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 11 Jan 2019 11:32:37 +0100 Subject: [PATCH 214/252] Make external.qt update os.environ[QT_API] If QT_API is not declared in the environment, the choice of binding done by taurus.external.qt may sometimes differ from that of some of the modules used as dependencies (e.g. guidata or spyder) causing conflicts of imported bindings. Work this around by defining QT_API in the os.environ (this is a temporary change affecting only the current process). --- lib/taurus/external/qt/__init__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/taurus/external/qt/__init__.py b/lib/taurus/external/qt/__init__.py index a25971b22..9614e2fbf 100644 --- a/lib/taurus/external/qt/__init__.py +++ b/lib/taurus/external/qt/__init__.py @@ -165,6 +165,10 @@ class PythonQtError(RuntimeError): API_NAME = {'pyqt5': 'PyQt5', 'pyqt': 'PyQt4', 'pyqt4': 'PyQt4', 'pyside': 'PySide', 'pyside2': 'PySide2'}[API] +# Update the environment so that other libraries that also use the same +# convention (such as guidata or spyder) do a consistent choice +os.environ[QT_API] = API + def __initializeQtLogging(): from importlib import import_module From 29663e4ad2519ca92bf11685e53a13424fed1bc8 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 11 Jan 2019 11:47:53 +0100 Subject: [PATCH 215/252] Revert "Set pyqt5 as the default qt binding" Go back to setting PyQt4 as the default binding if one is not already loaded or selected via QT_API environment variable. The reason is that the plot (qwt5) functionality is not yet fully supplied by the taurus_pyqtgraph plugin and therefore it is safer not to do this change yet to unaware users. This reverts commit 08d61e2cb4. --- lib/taurus/tauruscustomsettings.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/taurus/tauruscustomsettings.py b/lib/taurus/tauruscustomsettings.py index d716f0446..95882a206 100755 --- a/lib/taurus/tauruscustomsettings.py +++ b/lib/taurus/tauruscustomsettings.py @@ -108,8 +108,8 @@ # Qt configuration # ---------------------------------------------------------------------------- -#: Set preferred API if not is already loaded -DEFAULT_QT_API = 'pyqt5' +#: Set preferred API (if one is not already loaded) +DEFAULT_QT_API = 'pyqt' #: Auto initialize Qt logging to python logging QT_AUTO_INIT_LOG = True From dc291b7776857dd9221bed4cbe3c70255a7a5965 Mon Sep 17 00:00:00 2001 From: cfalcon Date: Fri, 11 Jan 2019 14:40:03 +0100 Subject: [PATCH 216/252] Add missing workaround for KDE bug 345023 KDE is auto-adding shortcuts to buttons and actions. This causes issues when call QAction.text() Avoid relying on text() (use a monkey-patched variable instead as a workaround). --- lib/taurus/qt/qtgui/icon/catalog.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/taurus/qt/qtgui/icon/catalog.py b/lib/taurus/qt/qtgui/icon/catalog.py index 71c066e23..58cb72934 100644 --- a/lib/taurus/qt/qtgui/icon/catalog.py +++ b/lib/taurus/qt/qtgui/icon/catalog.py @@ -112,7 +112,14 @@ def onClick(self): """Reimplemented :class:`GraphicalChoiceWidget` """ # From all alternatives, extract the one with the shortest name - chosen = self.sender().text() + # ------------------------------------------------------- + # Work around for https://bugs.kde.org/show_bug.cgi?id=345023 + # TODO: make better solution for this + # self._chosen = str(self.sender().text()) + # it fails due to added "&" + chosen = self.sender()._id # <-- this was monkey-patched + # ------------------------------------------------------- + alts = chosen.splitlines() alts = sorted(alts, key=lambda s: len(s.split()[0])) name, absname = alts[0].split() From e5da563f9bd764dd1097d771d90570b79513256f Mon Sep 17 00:00:00 2001 From: cfalcon Date: Fri, 11 Jan 2019 14:42:04 +0100 Subject: [PATCH 217/252] Apply workaround for KDE bug 345023 in TaurusGrid KDE is auto-adding shortcuts to buttons and actions. This causes issues when read button text using QAction.text() method. Avoid relying on text() (use a monkey-patched variable instead as a workaround). --- lib/taurus/qt/qtgui/table/taurusgrid.py | 48 ++++++++++++++++++++----- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/lib/taurus/qt/qtgui/table/taurusgrid.py b/lib/taurus/qt/qtgui/table/taurusgrid.py index 8ccd71b0e..0d9257c6d 100644 --- a/lib/taurus/qt/qtgui/table/taurusgrid.py +++ b/lib/taurus/qt/qtgui/table/taurusgrid.py @@ -786,7 +786,13 @@ def create_widgets_table(self, models): for i in range(len(self.rows)): section = self.rows[i] checkbox = QtGui.QCheckBox(section) - if checkbox.text() == 'Others': + + # ------------------------------------------------------- + # Work around for https://bugs.kde.org/show_bug.cgi?id=345023 + # TODO: make better solution for this + checkbox._id = section # <-- ugly monkey-patch! + + if section == 'Others': checkbox.setChecked(False) if not self._show_others: checkbox.hide() @@ -807,7 +813,13 @@ def create_widgets_table(self, models): for i in range(len(self.columns)): column = self.columns[i] checkbox = QtGui.QCheckBox(column) - if checkbox.text() == 'Others': + + # ------------------------------------------------------- + # Work around for https://bugs.kde.org/show_bug.cgi?id=345023 + # TODO: make better solution for this + checkbox._id = column # <-- ugly monkey-patch! + + if column == 'Others': checkbox.setChecked(False) if not self._show_others: checkbox.hide() @@ -831,7 +843,12 @@ def show_hide_rows(self): """ for checkbox in self.rows_frame.children(): if isinstance(checkbox, QtGui.QCheckBox): - table_row = self.rows.index(checkbox.text()) + # ------------------------------------------------------- + # Work around for https://bugs.kde.org/show_bug.cgi?id=345023 + # TODO: make better solution for this + # checkbox.text() <-- fails due to added "& + table_row = self.rows.index(checkbox._id) + # ------------------------------------------------------- if checkbox.isChecked(): self.table.showRow(table_row) else: @@ -843,7 +860,12 @@ def show_hide_columns(self): """ for checkbox in self.columns_frame.children(): if isinstance(checkbox, QtGui.QCheckBox): - table_col = self.columns.index(checkbox.text()) + # ------------------------------------------------------- + # Work around for https://bugs.kde.org/show_bug.cgi?id=345023 + # TODO: make better solution for this + # checkbox.text() <-- fails due to added "& + table_col = self.columns.index(checkbox._id) + # ------------------------------------------------------- if checkbox.isChecked(): self.table.showColumn(table_col) else: @@ -853,16 +875,26 @@ def showOthers(self, boolean): self._show_others = boolean if hasattr(self, 'rows_frame'): for checkbox in self.rows_frame.children(): - if isinstance(checkbox, - QtGui.QCheckBox) and checkbox.text() == 'Others': + if (isinstance(checkbox, QtGui.QCheckBox) + # ------------------------------------------------------- + # Work around for https://bugs.kde.org/show_bug.cgi?id=345023 + # TODO: make better solution for this + # checkbox.text() <-- fails due to added "& + and checkbox._id == 'Others'): + # ------------------------------------------------------- if self._show_others: checkbox.show() else: checkbox.hide() if hasattr(self, 'columns_frame'): for checkbox in self.columns_frame.children(): - if isinstance(checkbox, - QtGui.QCheckBox) and checkbox.text() == 'Others': + if (isinstance(checkbox, QtGui.QCheckBox) + # ------------------------------------------------------- + # Work around for https://bugs.kde.org/show_bug.cgi?id=345023 + # TODO: make better solution for this + # checkbox.text() <-- fails due to added "& + and checkbox._id == 'Others'): + # ------------------------------------------------------- if self._show_others: checkbox.show() else: From 63f5000cbdab04b60a6aa2a4db1a042361dd55b2 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Fri, 11 Jan 2019 14:22:32 +0100 Subject: [PATCH 218/252] Adapt launchers to plot->qwt5 rename The taurusplot and taurustrend launchers need to be adapted to the renaming of plot -> qwt5 --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 4a9935a22..4d98b55b7 100644 --- a/setup.py +++ b/setup.py @@ -94,8 +94,8 @@ def get_release_info(): console_scripts = [ 'taurustestsuite = taurus.test.testsuite:main', 'taurusconfigbrowser = taurus.qt.qtgui.panel.taurusconfigeditor:main', - 'taurusplot = taurus.qt.qtgui.plot.taurusplot:main', - 'taurustrend = taurus.qt.qtgui.plot.taurustrend:main', + 'taurusplot = taurus.qt.qtgui.qwt5.taurusplot:main', + 'taurustrend = taurus.qt.qtgui.qwt5.taurustrend:main', 'taurusform = taurus.qt.qtgui.panel.taurusform:taurusFormMain', 'tauruspanel = taurus.qt.qtgui.panel.taurusdevicepanel:TaurusPanelMain', 'taurusdevicepanel = taurus.qt.qtgui.panel.taurusdevicepanel:TaurusDevicePanelMain', From 5961abdc161cbfab6dc9ebc72d3375af1a60e045 Mon Sep 17 00:00:00 2001 From: cfalcon Date: Fri, 11 Jan 2019 16:06:44 +0100 Subject: [PATCH 219/252] Remove QStringList checking QStringList class does not exist in API 2. Avoid to use isinstance with QStringList class. --- lib/taurus/qt/qtgui/table/taurusgrid.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/taurus/qt/qtgui/table/taurusgrid.py b/lib/taurus/qt/qtgui/table/taurusgrid.py index 0d9257c6d..56cb9da16 100644 --- a/lib/taurus/qt/qtgui/table/taurusgrid.py +++ b/lib/taurus/qt/qtgui/table/taurusgrid.py @@ -84,8 +84,7 @@ def get_all_models(expressions, limit=1000): ##self.debug( 'expressions as string separated by commas ...') expressions = expressions.split(',') - elif any(isinstance(expressions, klass) for klass in - (QtCore.QStringList, list, tuple, dict)): + elif any(isinstance(expressions, klass) for klass in (list, tuple, dict)): # self.debug( 'expressions converted from list ...') expressions = list(str(e) for e in expressions) @@ -159,8 +158,7 @@ def get_readwrite_models(expressions, limit=1000): # self.trace( 'expressions as string separated by commas ...') expressions = expressions.split(',') - elif any(isinstance(expressions, klass) for klass in - (QtCore.QStringList, list, tuple, dict)): + elif any(isinstance(expressions, klass) for klass in (list, tuple, dict)): expressions = list(str(e) for e in expressions) taurus_db = taurus.Authority() @@ -791,6 +789,7 @@ def create_widgets_table(self, models): # Work around for https://bugs.kde.org/show_bug.cgi?id=345023 # TODO: make better solution for this checkbox._id = section # <-- ugly monkey-patch! + # ------------------------------------------------------- if section == 'Others': checkbox.setChecked(False) @@ -818,6 +817,7 @@ def create_widgets_table(self, models): # Work around for https://bugs.kde.org/show_bug.cgi?id=345023 # TODO: make better solution for this checkbox._id = column # <-- ugly monkey-patch! + # ------------------------------------------------------- if column == 'Others': checkbox.setChecked(False) From 2e873ade6762076c9946cb2b65c1080751688c9e Mon Sep 17 00:00:00 2001 From: cfalcon Date: Fri, 11 Jan 2019 16:10:55 +0100 Subject: [PATCH 220/252] Change signal signature `taurus.qt.qtcore.util.emmiter.QEmitter.doSomething` signal signature changes from `collections.Iterable` to `list` --- lib/taurus/qt/qtcore/util/emitter.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/taurus/qt/qtcore/util/emitter.py b/lib/taurus/qt/qtcore/util/emitter.py index 6e46687ec..2105a53a9 100644 --- a/lib/taurus/qt/qtcore/util/emitter.py +++ b/lib/taurus/qt/qtcore/util/emitter.py @@ -34,7 +34,6 @@ from builtins import object from queue import Queue, Empty import traceback -from collections import Iterable from future.utils import string_types @@ -82,7 +81,7 @@ def setModel(self, value): class QEmitter(Qt.QObject): """Emitter class providing two signals.""" - doSomething = Qt.pyqtSignal(Iterable) + doSomething = Qt.pyqtSignal(list) somethingDone = Qt.pyqtSignal() newQueue = Qt.pyqtSignal() From 8f99ae8be2cfa121406787224438ef4091013565 Mon Sep 17 00:00:00 2001 From: cfalcon Date: Fri, 11 Jan 2019 16:12:26 +0100 Subject: [PATCH 221/252] Update changelog --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6cf775470..05df2f55f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,9 @@ develop branch) won't be reflected in this file. ### Changed - `taurus.qt.qtgui.plot` is now deprecated, but the same Qwt5-based - API is now available in `taurus.qt.qtgui.qwt5` + API is now available in `taurus.qt.qtgui.qwt5` +- `taurus.qt.qtcore.util.emmiter.QEmitter.doSomething` signal signature + changes from `collections.Iterable` to `list` ### Deprecated - `taurus.qt.qtgui.plot` From 611da3f4c3fcc6dc137530589ab93dd0ecef1d69 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 15 Jan 2019 09:11:41 +0100 Subject: [PATCH 222/252] (m) Refactor python<2.2 code Simplify expression that was done in python<=2.1 style --- lib/taurus/qt/qtgui/table/taurusgrid.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/taurus/qt/qtgui/table/taurusgrid.py b/lib/taurus/qt/qtgui/table/taurusgrid.py index 56cb9da16..a061968da 100644 --- a/lib/taurus/qt/qtgui/table/taurusgrid.py +++ b/lib/taurus/qt/qtgui/table/taurusgrid.py @@ -84,7 +84,7 @@ def get_all_models(expressions, limit=1000): ##self.debug( 'expressions as string separated by commas ...') expressions = expressions.split(',') - elif any(isinstance(expressions, klass) for klass in (list, tuple, dict)): + elif isinstance(expressions, (list, tuple, dict)): # self.debug( 'expressions converted from list ...') expressions = list(str(e) for e in expressions) @@ -158,7 +158,7 @@ def get_readwrite_models(expressions, limit=1000): # self.trace( 'expressions as string separated by commas ...') expressions = expressions.split(',') - elif any(isinstance(expressions, klass) for klass in (list, tuple, dict)): + elif isinstance(expressions, (list, tuple, dict)): expressions = list(str(e) for e in expressions) taurus_db = taurus.Authority() From 72434fb7842af60e0f0667e5673f265f0883e494 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 15 Jan 2019 09:46:19 +0100 Subject: [PATCH 223/252] Fix exception in Qt5-only environments The DEFAULT_QT_API value in taurus custom settings was reset to pyqt4 in a recent commit. This introduces a bug in PyQt5-only environments (unless QT_API is defined explicitly) because the search order of bindings in taurus.external.qt assumes PyQt5 to be the default. Adapt the search order accordingly. Also related: change the fallback in case DEFAULT_QT_API is not set to pyqt too. --- lib/taurus/external/qt/__init__.py | 50 +++++++++++++++--------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/lib/taurus/external/qt/__init__.py b/lib/taurus/external/qt/__init__.py index 9614e2fbf..d0a584fe7 100644 --- a/lib/taurus/external/qt/__init__.py +++ b/lib/taurus/external/qt/__init__.py @@ -73,11 +73,33 @@ class PythonQtError(RuntimeError): # - QT_API environment variable # - tauruscustomsettings.DEFAULT_QT_API # - 'pyqt5' - API = os.environ.get(QT_API, getattr(__config, 'DEFAULT_QT_API', 'pyqt5')) + API = os.environ.get(QT_API, getattr(__config, 'DEFAULT_QT_API', 'pyqt')) API = API.lower() assert API in (PYQT5_API + PYQT4_API + PYSIDE_API + PYSIDE2_API) +if API in PYQT4_API: + try: + import sip + + sip.setapi('QString', 2) + sip.setapi('QVariant', 2) + sip.setapi('QDate', 2) + sip.setapi('QDateTime', 2) + sip.setapi('QTextStream', 2) + sip.setapi('QTime', 2) + sip.setapi('QUrl', 2) + from PyQt4.QtCore import PYQT_VERSION_STR as PYQT_VERSION # analysis:ignore + from PyQt4.QtCore import QT_VERSION_STR as QT_VERSION # analysis:ignore + + PYSIDE_VERSION = None + PYQT5 = False + PYQT4 = True + API = os.environ['QT_API'] = 'pyqt' # in case the original was "pyqt4" + except ImportError: + __log.debug('Cannot import PyQt4. Trying with PyQt5') + API = os.environ['QT_API'] = 'pyqt5' + if API in PYQT5_API: try: from PyQt5.QtCore import PYQT_VERSION_STR as PYQT_VERSION @@ -125,29 +147,7 @@ class PythonQtError(RuntimeError): del macos_version except ImportError: - __log.debug('Cannot import PyQt5. Trying with PySide2') - API = os.environ['QT_API'] = 'pyqt' - -if API in PYQT4_API: - try: - import sip - - sip.setapi('QString', 2) - sip.setapi('QVariant', 2) - sip.setapi('QDate', 2) - sip.setapi('QDateTime', 2) - sip.setapi('QTextStream', 2) - sip.setapi('QTime', 2) - sip.setapi('QUrl', 2) - from PyQt4.QtCore import PYQT_VERSION_STR as PYQT_VERSION # analysis:ignore - from PyQt4.QtCore import QT_VERSION_STR as QT_VERSION # analysis:ignore - - PYSIDE_VERSION = None - PYQT5 = False - PYQT4 = True - API = os.environ['QT_API'] = 'pyqt' # in case the original was "pyqt4" - except ImportError: - __log.debug('Cannot import PyQt4. Trying with PySide') + __log.debug('Cannot import PyQt5. Trying with PySide') API = os.environ['QT_API'] = 'pyside' if API in PYSIDE_API: @@ -167,7 +167,7 @@ class PythonQtError(RuntimeError): # Update the environment so that other libraries that also use the same # convention (such as guidata or spyder) do a consistent choice -os.environ[QT_API] = API +os.environ['QT_API'] = API def __initializeQtLogging(): From 0c6f0fb28eb7363bea567d757cf0a14ceaf96b8d Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 15 Jan 2019 11:01:15 +0100 Subject: [PATCH 224/252] (doc) Warn against using QVariant in binding-agnostic code --- doc/source/tep/TEP18.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index b2a80f497..b9ce55f67 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -340,7 +340,12 @@ following tips were found useful when porting applications to taurus 4.5 sip.setapi('QUrl', 2) ``` -- The code should not use deprecated features. See the following for a +- [QVariant should not be used at all](http://pyqt.sourceforge.net/Docs/PyQt5/pyqt_qvariant.html): + replace `QVariant(foo)`, `from_qvariant(foo)` and `to_qvariant(foo)` + by `foo`. Also replace any occurrence of `QVariant()` (i.e. null `QVariant`) + by `None`. + +- The code should not use Qt deprecated features. See the following for a list of things to keep in mind: - https://pyqt.readthedocs.io/en/latest/incompatibilities.html - https://pyqt.readthedocs.io/en/latest/pyqt4_differences.html From 422306cbfd18c9872e20a9a4acaf294d807e3a02 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 15 Jan 2019 13:57:11 +0100 Subject: [PATCH 225/252] (m) Remove duplicate header --- lib/taurus/external/qt/QtUiTools.py | 29 ++--------------------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/lib/taurus/external/qt/QtUiTools.py b/lib/taurus/external/qt/QtUiTools.py index dbfd99a5f..e3e1362ec 100644 --- a/lib/taurus/external/qt/QtUiTools.py +++ b/lib/taurus/external/qt/QtUiTools.py @@ -23,34 +23,9 @@ ## ############################################################################## -# -*- coding: utf-8 -*- - -############################################################################## -## -## This file is part of Taurus -## -## http://taurus-scada.org -## -## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain -## -## Taurus is free software: you can redistribute it and/or modify -## it under the terms of the GNU Lesser General Public License as published by -## the Free Software Foundation, either version 3 of the License, or -## (at your option) any later version. -## -## Taurus is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU Lesser General Public License for more details. -## -## You should have received a copy of the GNU Lesser General Public License -## along with Taurus. If not, see . -## -############################################################################## - """This module exposes the QtUiTools module (deprecated in taurus). -Only makes sense when using PySide(2) (which were not supported before -taurus 4.5 +It only makes sense when using PySide(2) (which were not supported before +taurus 4.5) """ From ced30a8d08392b3b4c7833c8af6d79f0f7963518 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 16 Jan 2019 11:14:47 +0100 Subject: [PATCH 226/252] Fix bug in taurusMessageHandler A typo in a format string is causing exceptions when logging Qt messages. Fix it. --- lib/taurus/external/qt/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/external/qt/__init__.py b/lib/taurus/external/qt/__init__.py index d0a584fe7..ee38d171b 100644 --- a/lib/taurus/external/qt/__init__.py +++ b/lib/taurus/external/qt/__init__.py @@ -186,7 +186,7 @@ def __initializeQtLogging(): # Qt5 def taurusMessageHandler(msg_type, log_ctx, msg): f = QT_LEVEL_MATCHER.get(msg_type) - return f("Qt%s %s.%s[%s]: %a", log_ctx.category, log_ctx.file, + return f("Qt%s %s.%s[%s]: %s", log_ctx.category, log_ctx.file, log_ctx.function, log_ctx.line, msg) QtCore.qInstallMessageHandler(taurusMessageHandler) From 2d3a373b172dac93ddaa52283a34249a8fa056bf Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 16 Jan 2019 11:52:47 +0100 Subject: [PATCH 227/252] Fix exception QtWidgets shim for PyQt4 and PySide bindings The implementation of taurus.external.qt.QtWidgets for the cases of using the PyQt4 or PySide bindings uses an undefined "self" symbol. Fix it. --- lib/taurus/external/qt/QtWidgets.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/taurus/external/qt/QtWidgets.py b/lib/taurus/external/qt/QtWidgets.py index 25d18b3b7..6a90af5f0 100644 --- a/lib/taurus/external/qt/QtWidgets.py +++ b/lib/taurus/external/qt/QtWidgets.py @@ -78,12 +78,12 @@ # patch_qcombobox(QComboBox) # We don't do it to avoid changing behaviour # QHeaderView: renamed methods - QHeaderView.sectionsClickable = self.isClickable - QHeaderView.sectionsMovable = self.isMovable - QHeaderView.sectionResizeMode = self.resizeMode - QHeaderView.setSectionsClickable = self.setClickable - QHeaderView.setSectionsMovable = self.setMovable - QHeaderView.setSectionResizeMode = self.setResizeMode + QHeaderView.sectionsClickable = QHeaderView.isClickable + QHeaderView.sectionsMovable = QHeaderView.isMovable + QHeaderView.sectionResizeMode = QHeaderView.resizeMode + QHeaderView.setSectionsClickable = QHeaderView.setClickable + QHeaderView.setSectionsMovable = QHeaderView.setMovable + QHeaderView.setSectionResizeMode = QHeaderView.setResizeMode elif PYSIDE: from PySide.QtGui import * @@ -132,12 +132,12 @@ # patch_qcombobox(QComboBox) # We don't do it to avoid changing behaviour # QHeaderView: renamed methods - QHeaderView.sectionsClickable = self.isClickable - QHeaderView.sectionsMovable = self.isMovable - QHeaderView.sectionResizeMode = self.resizeMode - QHeaderView.setSectionsClickable = self.setClickable - QHeaderView.setSectionsMovable = self.setMovable - QHeaderView.setSectionResizeMode = self.setResizeMode + QHeaderView.sectionsClickable = QHeaderView.isClickable + QHeaderView.sectionsMovable = QHeaderView.isMovable + QHeaderView.sectionResizeMode = QHeaderView.resizeMode + QHeaderView.setSectionsClickable = QHeaderView.setClickable + QHeaderView.setSectionsMovable = QHeaderView.setMovable + QHeaderView.setSectionResizeMode = QHeaderView.setResizeMode else: raise PythonQtError('No Qt bindings could be found') From dfda9821c4edbe7c7736942e2f63624676a7e89e Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 16 Jan 2019 15:51:11 +0100 Subject: [PATCH 228/252] Add warning when QtWidgets is used with a Qt4 binding taurus.external.qt does some limited effort at supporting Qt5 style code also with PyQt4 and PySide bindings, but the user should be warned that this is not fully supported. Add a warning in the QtWidgets module to this effect. --- lib/taurus/external/qt/QtWidgets.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/taurus/external/qt/QtWidgets.py b/lib/taurus/external/qt/QtWidgets.py index 6a90af5f0..c4346ec4c 100644 --- a/lib/taurus/external/qt/QtWidgets.py +++ b/lib/taurus/external/qt/QtWidgets.py @@ -14,8 +14,6 @@ """ from . import PYQT5, PYSIDE2, PYQT4, PYSIDE, PythonQtError - - from taurus.core.util import log as __log if PYQT5: @@ -23,6 +21,9 @@ elif PYSIDE2: from PySide2.QtWidgets import * elif PYQT4: + __log.warning('Using QtWidgets with PyQt4 is not supported and may fail ' + + 'in many cases. Use at your own risk ' + + '(or use a Qt5 binding)') from PyQt4.QtGui import * QStyleOptionViewItem = QStyleOptionViewItemV4 del QStyleOptionViewItemV4 @@ -86,6 +87,9 @@ QHeaderView.setSectionResizeMode = QHeaderView.setResizeMode elif PYSIDE: + __log.warning('Using QtWidgets with PySide is not supported and may fail ' + + 'in many cases. Use at your own risk + + '(or use a Qt5 binding)') from PySide.QtGui import * QStyleOptionViewItem = QStyleOptionViewItemV4 del QStyleOptionViewItemV4 From ab2b8f2b752b6ff0a28a81f103d8395cd383905f Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 16 Jan 2019 15:53:20 +0100 Subject: [PATCH 229/252] (doc) Update TEP18 according to implementation --- doc/source/tep/TEP18.md | 92 ++++++++++++++++++++++++----------------- 1 file changed, 53 insertions(+), 39 deletions(-) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index b9ce55f67..bcd1f4edd 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -43,7 +43,7 @@ all compatible with each other: 3. Keep backwards-compat (do not impose code changes on apps that use`taurus.external.qt`) 4. Avoid patching the loaded binding (or at most make only "inoquous" patches) 5. Use existing solution. Avoid reinventing / maintaining our own solution. -6. Modernice the code style in taurus (use Qt5 code style throughout taurus) +6. Modernize the code style in taurus (use Qt5 code style throughout taurus) 7. Minimize the amount of changes needed in the taurus code 8. Avoid introducing heavy dependencies in the `taurus.qt` submodule @@ -91,7 +91,7 @@ accept patching an existing binding, but only if the result never introduces a side-efect in an application that uses valid code (similar to the compromise taken in [qtpy_issue121]). -### Plugin support +### Bindings support The priority is on adding PyQt5 (v>=5.6) binding support while maintaining the PyQt4 binding (v>=4.6) support. @@ -103,7 +103,7 @@ not complete. ### Support for multiple Qt styles within taurus.external.qt A related but not identical decision to the previous one. Independently of which plugins -are supported as backends, we need to decide on which programming style(s) will be supported. +are supported as backends, we need to decide which programming style(s) will be supported. For example, qtpy supports all 4 plugins but only one programming style (that of PySide2). In our case, the Goal 3 immediately dictates that we must support at least the PyQt4 style. @@ -122,37 +122,40 @@ PySide2 style support. ### Reusing existim shims -Another implementation decission revolves around whether importing some of the existing shims -*within our own shim* to simplify the implementation and maintenance of our own shim -(i.e., to partially comply with Goal 5). +The Goal 5 suggests that, even if we end up building our own shim, we should +try to do so based on an existing shim (i.e., importing one of the existing +implementations from our own shim). -In this case, importing `silx.gui.qt` or `pyqtgraph.Qt` would go against Goal 8 -(even if both silx and pyqtgraph are dependencies for some submodules of `taurus.qt.qtgui`, -we would like to avoid making them mandatory at the `taurus.qt` level -since they are relatively heavy). +Unfortunately, we see that importing `silx.gui.qt` or `pyqtgraph.Qt` would go +against Goal 8 (even if both silx and pyqtgraph are dependencies for some submodules +of `taurus.qt.qtgui`, we would like to avoid making them mandatory at the `taurus.qt` +level since they are relatively heavy). -On the other hand, qtpy and Qt.py are probably light enough to consider using them but -the fact that Qt.py is not yet packaged for debian and that the version of qtpy packaged -in debian9 introduces disruptive patching of the PyQt4 binding ([qtpy_issue119]) should -also be weighted in the decision. The final decision on this aspect can be left to -the implementation phase itself where the various options can be tested in practice. +On the other hand, `qtpy` and `Qt.py` are probably light enough to consider using them but +the fact that `Qt.py` is not yet packaged for debian and that the version of `qtpy` packaged +in debian9 introduces disruptive patching of the PyQt4 binding ([qtpy_issue119]) weights +against it. + +In the proposed implementation we opted for writing our own shim based heavily +on the qtpy implementation, but with enough changes that Goal 5 cannot be considered +as being fulfilled. ## Importing from taurus.external.qt VS importing directly from a binding -Should I import from `taurus.external.qt` or directly from PyQt5 / PyQt4 / ... ? +Should one import from `taurus.external.qt` or directly from PyQt5 / PyQt4 / ... ? Until now, we recommended our users to always import the QtCore, QtGui, etc -from `taurus.external.qt`. But with the improved support to multiple bindings +from `taurus.external.qt`. But with the improved support of multiple bindings in this TEP, this recommendation can be revised as follows: - For code that is going to be part of Taurus (and consequently potentially used as library by other other people), Qt, QtGui, QtCore, etc. should be imported from `taurus.external.qt`. The same applies to plugins to taurus that intend to be used as a library (otherwise, the plugins should be capable - failing gracefully in case of incompatible bindings). + of failing gracefully in case of incompatible bindings). - For an end-user application based on taurus it is probably better to import - directly from the binding (PyQt5 is the best supported) and let taurus to + directly from a specific binding (PyQt5 is the best supported) and let taurus to adapt to that choice. In this way, one can write idiomatic code that matches better the binding that has been chosen. Using the `taurus.external.qt` shim is also possible if one wants to make the code binding-agnostic, but in that @@ -164,7 +167,7 @@ in this TEP, this recommendation can be revised as follows: ## Some examples of code that should work -### code that currently works: +### code that already works in v4.4: The following snippets work on taurus 4.4. They should also work after refactoring. @@ -172,6 +175,7 @@ Most common use of `taurus.external.qt` (with implicit selection of PyQt4 bindin ```python # emulate an application that has previously imported PyQt4 (with API 2) +import sys import sip API_NAMES = ["QDate", "QDateTime", "QString", "QTextStream", "QTime", "QUrl", "QVariant"] @@ -183,7 +187,7 @@ import PyQt4.QtGui from taurus.external.qt import Qt, QtGui, QtCore from taurus.qt.qtgui.display import TaurusLabel -a = Qt.QApplication([]) +a = Qt.QApplication(sys.argv) o = QtCore.QObject() w = QtGui.QLabel() l = TaurusLabel() @@ -192,14 +196,14 @@ l = TaurusLabel() Most common use of `taurus.external.qt` (with explicit selection of PyQt4 binding) : ```python - +import sys from taurus import tauruscustomsettings tauruscustomsettings.DEFAULT_QT_API = 'pyqt' from taurus.external.qt import Qt, QtGui, QtCore from taurus.qt.qtgui.display import TaurusLabel -a = Qt.QApplication([]) +a = Qt.QApplication(sys.argv) o = QtCore.QObject() w = QtGui.QLabel() l = TaurusLabel() @@ -209,6 +213,7 @@ Exotic (but allowed) use of `taurus.external.qt` (with implicit selection of PyQ ```python # emulate an application that has previously imported PyQt4 (with API 2) +import sys import sip API_NAMES = ["QDate", "QDateTime", "QString", "QTextStream", "QTime", "QUrl", "QVariant"] @@ -222,23 +227,24 @@ import taurus.external.qt.QtCore import taurus.external.qt.QtGui from taurus.qt.qtgui.display import TaurusLabel -a = taurus.external.qt.Qt.QApplication([]) +a = taurus.external.qt.Qt.QApplication(sys.argv) o = taurus.external.qt.QtCore.QObject() w = taurus.external.qt.QtGui.QLabel() l = TaurusLabel() ``` -### code that should work after the refactoring: +### code that works with the proposed implementation of this TEP: Most common use of `taurus.external.qt` (with implicit selection of PyQt5 binding) : ```python +import sys import PyQt5.QtWidgets # force using PyQt5 from taurus.external.qt import Qt, QtGui, QtCore from taurus.qt.qtgui.display import TaurusLabel -a = Qt.QApplication([]) +a = Qt.QApplication(sys.argv) o = QtCore.QObject() w = QtGui.QLabel() l = TaurusLabel() @@ -249,14 +255,14 @@ assert(QtGui.QLabel is PyQt5.QtWidgets.QLabel) Most common use of `taurus.external.qt` (with explicit selection of PyQt5 binding) : ```python - +import sys from taurus import tauruscustomsettings tauruscustomsettings.DEFAULT_QT_API = 'pyqt5' from taurus.external.qt import Qt, QtGui, QtCore from taurus.qt.qtgui.display import TaurusLabel -a = Qt.QApplication([]) +a = Qt.QApplication(sys.argv) o = QtCore.QObject() w = QtGui.QLabel() l = TaurusLabel() @@ -269,6 +275,7 @@ assert(QtGui.QLabel is PyQt5.QtWidgets.QLabel) Exotic (but allowed) use of `taurus.external.qt`: ```python +import sys import PyQt5.QtWidgets # force using PyQt5 import taurus.external.qt.Qt @@ -276,43 +283,50 @@ import taurus.external.qt.QtCore import taurus.external.qt.QtGui from taurus.qt.qtgui.display import TaurusLabel -a = taurus.external.qt.Qt.QApplication([]) +a = taurus.external.qt.Qt.QApplication(sys.argv) o = taurus.external.qt.QtCore.QObject() w = taurus.external.qt.QtGui.QLabel() l = TaurusLabel() ``` -## Code that would be nice if it worked, but which is optional - Using `taurus.external.qt` with PyQt5 style and Pyqt5 binding: ```python +import sys from taurus import tauruscustomsettings tauruscustomsettings.DEFAULT_QT_API = 'pyqt5' from taurus.external.qt import Qt, QtGui, QtCore, QtWidgets from taurus.qt.qtgui.display import TaurusLabel -g = QtGui.QGuiApplication([]) -a = Qt.QApplication([]) +g = QtGui.QGuiApplication(sys.argv) +a = Qt.QApplication(sys.argv) o = QtCore.QObject() w = QtWidgets.QLabel() l = TaurusLabel() ``` -Using `taurus.external.qt` with PyQt5 style and Pyqt4 binding: +## Cases not fully covered in the proposed implementation. + +The possibility of using `taurus.external.qt` with Qt5 style but a PyQt4 +binding would be desirable because it would smooth the transition of +taurus and taurus-based applications towards the newer style (Goal 6) but +out of the scope of the current implementation. +The following snippet shows an example of some APIs that work in this +scenario while some other APIs are not yet supported. ```python +import sys from taurus import tauruscustomsettings tauruscustomsettings.DEFAULT_QT_API = 'pyqt' from taurus.external.qt import Qt, QtGui, QtCore, QtWidgets from taurus.qt.qtgui.display import TaurusLabel -g = QtGui.QGuiApplication([]) -a = Qt.QApplication([]) +g = QtGui.QGuiApplication(sys.argv) # <-- this is Qt5 style and not supported +a = Qt.QApplication(sys.argv) o = QtCore.QObject() -w = QtWidgets.QLabel() +w = QtWidgets.QLabel() # <-- this is Qt5 style but is supported l = TaurusLabel() ``` @@ -417,8 +431,7 @@ following tips were found useful when porting applications to taurus 4.5 "&" character in unpredictable positions when running under KDE and using Qt5. In practice the best is to avoid relying on the return value of the `text` property of buttons or actions in the program logic. - -TODO: complete this section + ## Links to more details and discussions @@ -460,6 +473,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - 2018-10-04 [cpascual][]. Initial version - 2018-11-27 [cpascual][]. Moving to CANDIDATE. Prototype implementation underway +- 2019-01-16 [cpascual][]. Update text according to finished proposed implementation. From 3ade343c2adb64cb3b55954db5a210958eaedf7c Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 16 Jan 2019 16:23:47 +0100 Subject: [PATCH 230/252] Avoid using positional args in model classes The taurus model classes may be used as mixin with Qt classes in some applications. The fact that they require some mandatory positional args causes problems in this case if using PyQt5. Transform all positional args in these classes into keyword args. --- lib/taurus/core/epics/epicsattribute.py | 2 +- lib/taurus/core/evaluation/evalattribute.py | 2 +- lib/taurus/core/evaluation/evaldevice.py | 2 +- lib/taurus/core/tango/tangoattribute.py | 2 +- lib/taurus/core/tango/tangodevice.py | 2 +- lib/taurus/core/taurusattribute.py | 2 +- lib/taurus/core/taurusauthority.py | 2 +- lib/taurus/core/taurusdevice.py | 2 +- lib/taurus/core/taurusmodel.py | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/taurus/core/epics/epicsattribute.py b/lib/taurus/core/epics/epicsattribute.py index d545d69bc..bba58f843 100644 --- a/lib/taurus/core/epics/epicsattribute.py +++ b/lib/taurus/core/epics/epicsattribute.py @@ -85,7 +85,7 @@ class EpicsAttribute(TaurusAttribute): """ # TODO: support non-numerical PVs - def __init__(self, name, parent, storeCallback=None): + def __init__(self, name='', parent=None, storeCallback=None): self.call__init__(TaurusAttribute, name, parent, storeCallback=storeCallback) diff --git a/lib/taurus/core/evaluation/evalattribute.py b/lib/taurus/core/evaluation/evalattribute.py index fa4772821..25f883249 100644 --- a/lib/taurus/core/evaluation/evalattribute.py +++ b/lib/taurus/core/evaluation/evalattribute.py @@ -167,7 +167,7 @@ class EvaluationAttribute(TaurusAttribute): _factory = None _scheme = 'eval' - def __init__(self, name, parent, **kwargs): + def __init__(self, name='', parent=None, **kwargs): self.call__init__(TaurusAttribute, name, parent, **kwargs) self._value = EvaluationAttrValue(attr=self) diff --git a/lib/taurus/core/evaluation/evaldevice.py b/lib/taurus/core/evaluation/evaldevice.py index 74eac3fae..5efe2c042 100644 --- a/lib/taurus/core/evaluation/evaldevice.py +++ b/lib/taurus/core/evaluation/evaldevice.py @@ -47,7 +47,7 @@ class EvaluationDevice(TaurusDevice, SafeEvaluator): _factory = None _scheme = 'eval' - def __init__(self, name, **kw): + def __init__(self, name='', **kw): """Object initialization.""" self.call__init__(TaurusDevice, name, **kw) safedict = {} diff --git a/lib/taurus/core/tango/tangoattribute.py b/lib/taurus/core/tango/tangoattribute.py index 08543db00..35392cfe4 100755 --- a/lib/taurus/core/tango/tangoattribute.py +++ b/lib/taurus/core/tango/tangoattribute.py @@ -272,7 +272,7 @@ class TangoAttribute(TaurusAttribute): _scheme = 'tango' _description = 'A Tango Attribute' - def __init__(self, name, parent, **kwargs): + def __init__(self, name='', parent=None, **kwargs): # the last attribute value self.__attr_value = None diff --git a/lib/taurus/core/tango/tangodevice.py b/lib/taurus/core/tango/tangodevice.py index a1b7b71a3..562faa662 100755 --- a/lib/taurus/core/tango/tangodevice.py +++ b/lib/taurus/core/tango/tangodevice.py @@ -62,7 +62,7 @@ class TangoDevice(TaurusDevice): _scheme = 'tango' _description = "A Tango Device" - def __init__(self, name, **kw): + def __init__(self, name='', **kw): """Object initialization.""" self.call__init__(TaurusDevice, name, **kw) self._deviceObj = self._createHWObject() diff --git a/lib/taurus/core/taurusattribute.py b/lib/taurus/core/taurusattribute.py index 73e485568..9f61d5e10 100644 --- a/lib/taurus/core/taurusattribute.py +++ b/lib/taurus/core/taurusattribute.py @@ -43,7 +43,7 @@ class TaurusAttribute(TaurusModel): _description = "A Taurus Attribute" defaultFragmentName = "rvalue" # fragment to be used if none is specified - def __init__(self, name, parent, **kwargs): + def __init__(self, name='', parent=None, **kwargs): self.call__init__(TaurusModel, name, parent) # User enabled/disabled polling diff --git a/lib/taurus/core/taurusauthority.py b/lib/taurus/core/taurusauthority.py index 4f700ff1e..c5ffdb7c8 100644 --- a/lib/taurus/core/taurusauthority.py +++ b/lib/taurus/core/taurusauthority.py @@ -39,7 +39,7 @@ class TaurusAuthority(TaurusModel): _description = "A Taurus Authority" - def __init__(self, complete_name, parent=None): + def __init__(self, complete_name='', parent=None): self.call__init__(TaurusModel, complete_name, parent) #-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- diff --git a/lib/taurus/core/taurusdevice.py b/lib/taurus/core/taurusdevice.py index af4e909e7..ae605e1f6 100755 --- a/lib/taurus/core/taurusdevice.py +++ b/lib/taurus/core/taurusdevice.py @@ -41,7 +41,7 @@ class TaurusDevice(TaurusModel): _description = "A Taurus Device" - def __init__(self, name, **kw): + def __init__(self, name='', **kw): """Object initialization.""" parent = kw.pop('parent', None) storeCallback = kw.pop('storeCallback', None) diff --git a/lib/taurus/core/taurusmodel.py b/lib/taurus/core/taurusmodel.py index 5fe9cc649..01662257f 100644 --- a/lib/taurus/core/taurusmodel.py +++ b/lib/taurus/core/taurusmodel.py @@ -48,7 +48,7 @@ class TaurusModel(Logger): RegularEvent = (TaurusEventType.Change, TaurusEventType.Config, TaurusEventType.Periodic) - def __init__(self, full_name, parent, serializationMode=None): + def __init__(self, full_name='', parent=None, serializationMode=None): v = self.getNameValidator() self._full_name, self._norm_name, self._simp_name = v.getNames( full_name, self.factory()) From 1883390d5b43d0169c559dc2546acb250566338e Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 16 Jan 2019 20:59:37 +0100 Subject: [PATCH 231/252] (doc) Update TEP18 text Reorder some sections and rephrase some paragraphs to better reflect the state of the candidate implementation. --- doc/source/tep/TEP18.md | 357 ++++++++++++++++++++-------------------- 1 file changed, 178 insertions(+), 179 deletions(-) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index bcd1f4edd..b1d99ef33 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -20,11 +20,12 @@ A release critical bug on taurus is already pending (see [taurus_bug]) ### Current situation -Taurus currently provides a shim module (`taurus.external.qt`) which is -used throughout the taurus and which is recommended for apps using taurus. +The current Taurus stable release (4.4) provides a shim module +(`taurus.external.qt`) which is used throughout the taurus and which is +recommended for apps using taurus. The current implementation of `taurus.external.qt` was adapted -from an early version in spyder and heavily modified by +from an early version in `spyder` and heavily modified by us, but it is definitely buggy for bindings other than PyQt4. It is also "dirty" due to legacy code related to sip API 1 (which is no longer supported in Taurus 4). @@ -48,9 +49,13 @@ all compatible with each other: 8. Avoid introducing heavy dependencies in the `taurus.qt` submodule -## Considerations about implementation +## Proposed implementation -We studied shims implemented by other projects: +This section descibes and justifies the key decisions behind the proposed implementation. + +### Existing shims used as references + +We studied Qt shims implemented by other projects: - spyder: [qtpy] : Emulates PyQt5 PySide2 binding for the other bindings. It may patch the existing binding in incompatible ways (side-effects). It provides some wrappers. @@ -65,12 +70,10 @@ We studied shims implemented by other projects: adding members (e.g. if using the PyQt5 module, it monkey-patches all QtWidgets into QtGui). It is more of a custom solution, not designed to be used by other projects. -### Consequences of Goals 1, 2 and 3 on the implementation decisions (and on Goal 5) +### Necessity of writing our own shim (but not from scratch!) After studying all the mentioned implementations, we conclude that all of them fulfill -Goals 1 and 2 but none of them , if used directly as it is fulfills Goal 3. - -Some custom wrapping is necessary in all cases. For example: qtpy +Goals 1 and 2 but none of them, if used directly *as-is* fulfills Goal 3: qtpy and Qt.py impose using PySide2 style (e.g. they do not expose pyqtSignal). In the case of silx.qt, the layout of the consolidated `silx.qt` does not provide, e.g. `QtGui` or `QtCore`, which is expected by apps that use `taurus.external.qt.QtGui`. In the case of `pyqtgraph.Qt`, @@ -79,13 +82,28 @@ since it does not separate the submodules into subpackages, something like Therefore we are forced to do some custom shimming if we want to keep backwards compatibility for apps using `taurus.external.qt`. While this necessarily implies renouncing to fulfill -Goal 5, we can still borrow most of the solutions implemented in the above projects. +Goal 5, we still considered importing one of the existing shims in order to "outsource" +some of the maintenance effort. + +Unfortunately, importing `silx.gui.qt` or `pyqtgraph.Qt` would go +against Goal 8 (even if both silx and pyqtgraph are dependencies for some submodules +of `taurus.qt.qtgui`, we would like to avoid making them mandatory at the `taurus.qt` +level since they are relatively heavy). + +On the other hand, `qtpy` and `Qt.py` are probably light enough to consider using them but +the fact that `Qt.py` is not yet packaged for debian and that the version of `qtpy` packaged +in debian9 introduces disruptive patching of the PyQt4 binding ([qtpy_issue119]) weighted +against it. + +In conclusion, for the proposed implementation we opted for writing our own shim based heavily +on the qtpy implementation, but with enough changes that Goal 5 cannot be considered +as being fulfilled. -### Patching vs wrapping +### Patching instead of wrapping Regarding the way of smoothing binding incompatibilities, we should avoid patching existing bindings (Goal 4). In this regard, the approaches of Qt.py and silx.gui.qt should be our -reference. The preferred solutions are to use adapters (`taurus.external.qt.Qt*`) +reference. The preferred solution is to use adapters (`taurus.external.qt.Qt*`) and provide compatibility wrappers whenever this cannot be done. In the worst case, we could accept patching an existing binding, but only if the result never introduces a side-efect in an application that uses valid code (similar to the compromise taken in @@ -93,81 +111,178 @@ a side-efect in an application that uses valid code (similar to the compromise t ### Bindings support -The priority is on adding PyQt5 (v>=5.6) binding support while maintaining the PyQt4 binding (v>=4.6) -support. -PySide and PySide2 support is also desirable (and probably easy since we already have the -examples of the existing implementations that do so), but it is not the main goal of this -propossal and therefore the TEP may get accepted even if the support for PySide/PySide2 is -not complete. +Our priority is on adding PyQt5 (v>=5.6) binding support while maintaining the PyQt4 binding +(v>=4.6) support. +The proposed implementation also attempts to provide PySide and PySide2 support, but the +development and testing is done on PyQt4 and PyQt5 and therefore this first proposed +implementation is likely not expected to be fully functional under PySide/Pyside2. +Nevertheless, this situation is subject to change if there is enough interest in the +community to dedicate more efforts to test and support taurus with PySide and/or PySide2. ### Support for multiple Qt styles within taurus.external.qt -A related but not identical decision to the previous one. Independently of which plugins -are supported as backends, we need to decide which programming style(s) will be supported. -For example, qtpy supports all 4 plugins but only one programming style (that of PySide2). +Independently of which plugins are supported as backends, we had to decide which programming +style(s) are be supported. For example, qtpy supports all 4 plugins but only one programming +style (that of PySide2). In our case, the Goal 3 immediately dictates that we must support at least the PyQt4 style. Also, by guaranteeing backwards compatibility for the apps using `taurus.external.qt`, we are also allowing `taurus.qt` itself to keep using the old style (fulfilling Goal 7). On the other hand, Goal 6 demands that we also support PyQt5 or PySide2 style but -for simplicity, we propose to focus this TEP in providing good support for the currently -supported style (PyQt4) regardless of the binding, and just keep the design flexible enough to -possibilitate the support of a more modern style in the future. In other words, fulfilling -Goal 6 would be optional for this TEP but the chosen design should not block its -implementation in the future. - -Similarly, the same conclusion from the previous paragraph is valid for the PySide and -PySide2 style support. - -### Reusing existim shims +for simplicity, we focused the proposed implementation in providing good support for the currently +supported style (PyQt4) regardless of the binding. In other words, the proposed +implementation does not fulfill Goal 6 (but it still is flexible enough to allow the support of +a more modern style in the future) -The Goal 5 suggests that, even if we end up building our own shim, we should -try to do so based on an existing shim (i.e., importing one of the existing -implementations from our own shim). +## How to import Qt modules when writing taurus code. -Unfortunately, we see that importing `silx.gui.qt` or `pyqtgraph.Qt` would go -against Goal 8 (even if both silx and pyqtgraph are dependencies for some submodules -of `taurus.qt.qtgui`, we would like to avoid making them mandatory at the `taurus.qt` -level since they are relatively heavy). - -On the other hand, `qtpy` and `Qt.py` are probably light enough to consider using them but -the fact that `Qt.py` is not yet packaged for debian and that the version of `qtpy` packaged -in debian9 introduces disruptive patching of the PyQt4 binding ([qtpy_issue119]) weights -against it. - -In the proposed implementation we opted for writing our own shim based heavily -on the qtpy implementation, but with enough changes that Goal 5 cannot be considered -as being fulfilled. - -## Importing from taurus.external.qt VS importing directly from a binding - -Should one import from `taurus.external.qt` or directly from PyQt5 / PyQt4 / ... ? - -Until now, we recommended our users to always import the QtCore, QtGui, etc +Until v 4.4, we have recommended taurus users to always import QtCore, QtGui, etc from `taurus.external.qt`. But with the improved support of multiple bindings -in this TEP, this recommendation can be revised as follows: +provided by this TEP, this recommendation can be revised as follows: -- For code that is going to be part of Taurus (and consequently potentially - used as library by other other people), Qt, QtGui, QtCore, etc. should be +- *For code that is going to be part of Taurus* (and consequently potentially + used as library by other other people), Qt, QtGui, QtCore, etc. should still be imported from `taurus.external.qt`. The same applies to plugins to taurus that intend to be used as a library (otherwise, the plugins should be capable of failing gracefully in case of incompatible bindings). -- For an end-user application based on taurus it is probably better to import +- *For an end-user application based on taurus* it is probably better to import directly from a specific binding (PyQt5 is the best supported) and let taurus to - adapt to that choice. In this way, one can write idiomatic code that matches - better the binding that has been chosen. Using the `taurus.external.qt` shim + adapt to that choice. In this way, one can write idiomatic code that better + matches the chosen binding. Using the `taurus.external.qt` shim is also possible if one wants to make the code binding-agnostic, but in that case one must keep in mind that the resulting code will be less idiomatic and that the shim's API may be eventually altered to better fit with taurus - own requirements. + own requirements (and that those changes may not be aligned with the + application needs). + +Notes: +- See the APPENDIX I for tips for writing code that is Qt binding agnostic +- See the APPENDIX II for code snippets that exemplify different ways of using + the `taurus.external.qt` shim from the proposed implementation. + + +## Links to more details and discussions + +Discussions for this TEP (and the proposed implementation) are conducted in its +associated Pull Request: + +https://github.com/taurus-org/taurus/pull/814 + +Related issues are: + +https://github.com/taurus-org/taurus/issues/203 +https://github.com/taurus-org/taurus/issues/148 + + +## APPENDIX I: Tips for writing code that is Qt binding agnostic: + +Apart from using taurus.external.qt for importing the Qt submodules, the +following tips were found useful when porting applications to taurus 4.5 + +- all signal usage must be ["new-style signals"](http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html) + - and keep in mind that signals with default arguments are not + supported in exposed as various signals in PyQt>=5.3 + +- Use only APIv2 (e.g. QString should *not* be used,...). One way to ensure that + your code uses APIv2 (in case that you use PyQt4) is to + [explicitly set it](http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html) + **before importing PyQt4**: + ```python + import sip + sip.setapi('QString', 2) + sip.setapi('QVariant', 2) + sip.setapi('QDate', 2) + sip.setapi('QDateTime', 2) + sip.setapi('QTextStream', 2) + sip.setapi('QTime', 2) + sip.setapi('QUrl', 2) + ``` + +- [QVariant should not be used at all](http://pyqt.sourceforge.net/Docs/PyQt5/pyqt_qvariant.html): + replace `QVariant(foo)`, `from_qvariant(foo)` and `to_qvariant(foo)` + by `foo`. Also replace any occurrence of `QVariant()` (i.e. null `QVariant`) + by `None`. + +- The code should not use Qt deprecated features. See the following for a + list of things to keep in mind: + - https://pyqt.readthedocs.io/en/latest/incompatibilities.html + - https://pyqt.readthedocs.io/en/latest/pyqt4_differences.html + +- Multiple inheritance. See + http://pyqt.sf.net/Docs/PyQt5/pyqt4_differences.html#cooperative-multi-inheritance + - Note that in Taurus we use explicit calls to __init__ methods which + in some cases it can lead to double-calls to initialization code in pyqt5. + This needs to be addressed. + - Also note that we had to convert some positional args into keyword args in + our mixin classes (TaurusBaseComponent,...) to make them work with Qt5 + +- The `taurus.qt.qtgui.plot` module depends on the Qwt5 module to provide its + full API, but Qwt5 is only available in the PyQt4 binding and therefore the + `taurus.qt.qtgui.plot` module has been deprecated. For the other bindings, + this module attempts to provide a very limited backwards compatibility API + if the `taurus_pyqtgraph` module is installed. If an application is intended + to support PyQt4 only, then it can avoid the deprecation warnings by replacing + `taurus.qt.qtgui.plot` by `taurus.qt.qtgui.qwt5`. Otherwise, using + `taurus.qt.qtgui.tpg` (provided by the `taurus_pyqtgraph` plugin) is recommended. + +- `QLayout.margin` and `.setMargin` were [deprecated in Qt 4.8](http://doc.qt.io/archives/qt-4.8/qlayout-obsolete.html) + Use `.getContentsMargins()` and `setContentsMargins()` instead. + +- be careful with qInstallMsgHandler (Qt4) vs qInstallMessageHandler (Qt5). + The following code can be used as a reference: + + ```python + if hasattr(QtCore, "qInstallMessageHandler"): + # Qt5 + def taurusMessageHandler(msg_type, log_ctx, msg): + f = QT_LEVEL_MATCHER.get(msg_type) + return f("Qt%s %s.%s[%s]: %a", log_ctx.category, log_ctx.file, + log_ctx.function, log_ctx.line, msg) + + QtCore.qInstallMessageHandler(taurusMessageHandler) + elif hasattr(QtCore, "qInstallMsgHandler"): + # Qt4 + def taurusMsgHandler(msg_type, msg): + f = QT_LEVEL_MATCHER.get(msg_type) + return f("Qt: " + msg) + + QtCore.qInstallMsgHandler(taurusMsgHandler) + ``` + +- Be aware of the [renamed methods in QHeaderView](http://doc.qt.io/qt-5/sourcebreaks.html#changes-to-qheaderview) (from Qt4 to Qt5) + and the fact that in Qt5, setSectionResizeMode may **crash the GUI** if + called on an empty header. The following code snippet takes care of both + issues: + ```python + headerView = ... # <-- QHeaderView + if headerView.length() > 0: + try: + headerView.setSectionResizeMode(headerView.Stretch) + except AttributeError: # PyQt4 + headerView.setResizeMode(headerView.Stretch) + ``` + +- Note that the `getOpenFileName`, `getOpenFileNames` and `getSaveFileName` + static methods from `QFileDialog` only return the name (or names) in PyQt4 + but they return a (name/s, filter) tuple in the other bindings. + In order to facilitate writing binding-agnostic code, we provide the + `getOpenFileName`, `getOpenFileNames` and `getSaveFileName` functions in + the `taurus.external.qt.compat` module which return the tuple regardless + of the binding. +- Beware of [a bug in KDE](https://bugs.kde.org/show_bug.cgi?id=345023) which + modifies the `text` property of buttons and actions by auto-inserting and + "&" character in unpredictable positions when running under KDE and using + Qt5. In practice the best is to avoid relying on the return value of the + `text` property of buttons or actions in the program logic. + -## Some examples of code that should work +## APPENDIX II: Some examples of code -### code that already works in v4.4: +### Code that already works in v4.4: The following snippets work on taurus 4.4. They should also work after refactoring. @@ -330,122 +445,6 @@ w = QtWidgets.QLabel() # <-- this is Qt5 style but is supported l = TaurusLabel() ``` -## Tips for writing code that is Qt binding agnostic: - -Apart from using taurus.external.qt for importing the Qt submodules, the -following tips were found useful when porting applications to taurus 4.5 - -- all signal usage must be ["new-style signals"](http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html) - - and keep in mind that signals with default arguments are not - supported in exposed as various signals in PyQt>=5.3 - -- Use only APIv2 (e.g. QString should *not* be used,...). One way to ensure that - your code uses APIv2 (in case that you use PyQt4) is to - [explicitly set it](http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html) - **before importing PyQt4**: - ```python - import sip - sip.setapi('QString', 2) - sip.setapi('QVariant', 2) - sip.setapi('QDate', 2) - sip.setapi('QDateTime', 2) - sip.setapi('QTextStream', 2) - sip.setapi('QTime', 2) - sip.setapi('QUrl', 2) - ``` - -- [QVariant should not be used at all](http://pyqt.sourceforge.net/Docs/PyQt5/pyqt_qvariant.html): - replace `QVariant(foo)`, `from_qvariant(foo)` and `to_qvariant(foo)` - by `foo`. Also replace any occurrence of `QVariant()` (i.e. null `QVariant`) - by `None`. - -- The code should not use Qt deprecated features. See the following for a - list of things to keep in mind: - - https://pyqt.readthedocs.io/en/latest/incompatibilities.html - - https://pyqt.readthedocs.io/en/latest/pyqt4_differences.html - -- Multiple inheritance. See - http://pyqt.sf.net/Docs/PyQt5/pyqt4_differences.html#cooperative-multi-inheritance - - Note that in Taurus we use explicit calls to __init__ methods which - in some cases it can lead to double-calls to initialization code in pyqt5. - This needs to be addressed. - - Also note that we had to convert some positional args into keyword args in - our mixin classes (TaurusBaseComponent,...) to make them work with Qt5 - -- The `taurus.qt.qtgui.plot` module depends on the Qwt5 module to provide its - full API, but Qwt5 is only available in the PyQt4 binding and therefore the - `taurus.qt.qtgui.plot` module has been deprecated. For the other bindings, - this module attempts to provide a very limited backwards compatibility API - if the `taurus_pyqtgraph` module is installed. If an application is intended - to support PyQt4 only, then it can avoid the deprecation warnings by replacing - `taurus.qt.qtgui.plot` by `taurus.qt.qtgui.qwt5`. Otherwise, using - `taurus.qt.qtgui.tpg` (provided by the `taurus_pyqtgraph` plugin) is recommended. - -- `QLayout.margin` and `.setMargin` were [deprecated in Qt 4.8](http://doc.qt.io/archives/qt-4.8/qlayout-obsolete.html) - Use `.getContentsMargins()` and `setContentsMargins()` instead. - -- be careful with qInstallMsgHandler (Qt4) vs qInstallMessageHandler (Qt5). - The following code can be used as a reference: - - ```python - if hasattr(QtCore, "qInstallMessageHandler"): - # Qt5 - def taurusMessageHandler(msg_type, log_ctx, msg): - f = QT_LEVEL_MATCHER.get(msg_type) - return f("Qt%s %s.%s[%s]: %a", log_ctx.category, log_ctx.file, - log_ctx.function, log_ctx.line, msg) - - QtCore.qInstallMessageHandler(taurusMessageHandler) - elif hasattr(QtCore, "qInstallMsgHandler"): - # Qt4 - def taurusMsgHandler(msg_type, msg): - f = QT_LEVEL_MATCHER.get(msg_type) - return f("Qt: " + msg) - - QtCore.qInstallMsgHandler(taurusMsgHandler) - ``` - -- Be aware of the [renamed methods in QHeaderView](http://doc.qt.io/qt-5/sourcebreaks.html#changes-to-qheaderview) (from Qt4 to Qt5) - and the fact that in Qt5, setSectionResizeMode may **crash the GUI** if - called on an empty header. The following code snippet takes care of both - issues: - ```python - headerView = ... # <-- QHeaderView - if headerView.length() > 0: - try: - headerView.setSectionResizeMode(headerView.Stretch) - except AttributeError: # PyQt4 - headerView.setResizeMode(headerView.Stretch) - ``` - -- Note that the `getOpenFileName`, `getOpenFileNames` and `getSaveFileName` - static methods from `QFileDialog` only return the name (or names) in PyQt4 - but they return a (name/s, filter) tuple in the other bindings. - In order to facilitate writing binding-agnostic code, we provide the - `getOpenFileName`, `getOpenFileNames` and `getSaveFileName` functions in - the `taurus.external.qt.compat` module which return the tuple regardless - of the binding. - -- Beware of [a bug in KDE](https://bugs.kde.org/show_bug.cgi?id=345023) which - modifies the `text` property of buttons and actions by auto-inserting and - "&" character in unpredictable positions when running under KDE and using - Qt5. In practice the best is to avoid relying on the return value of the - `text` property of buttons or actions in the program logic. - - -## Links to more details and discussions - -Discussions for this TEP (and eventually the candidate implementation) -are conducted in its associated Pull Request: - -https://github.com/taurus-org/taurus/pull/814 - -Related issues are: - -https://github.com/taurus-org/taurus/issues/203 -https://github.com/taurus-org/taurus/issues/148 - - ## License Copyright (c) 2018 Carlos Pascual-Izarra @@ -473,7 +472,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - 2018-10-04 [cpascual][]. Initial version - 2018-11-27 [cpascual][]. Moving to CANDIDATE. Prototype implementation underway -- 2019-01-16 [cpascual][]. Update text according to finished proposed implementation. +- 2019-01-16 [cpascual][]. Update text to reflect the finished proposed implementation. From d3f861c27a3b674bd7b4622ab7820f278474c7c5 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Thu, 17 Jan 2019 11:05:57 +0100 Subject: [PATCH 232/252] (doc) Update docs to reflect changes in TEP18 --- CONTRIBUTING.md | 2 +- doc/source/conf.py | 1 - doc/source/devel/coding_guide.rst | 27 ++++++++++++++------------- doc/source/users/getting_started.rst | 21 +++++++++++++++------ 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2dd3fd017..97288fcce 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -39,7 +39,7 @@ In general, the contributions to taurus should consider following: - The licensing terms for the contributed code must be compatible with (and preferably the same as) the license chosen for the Taurus - project (at the time of writing this TEP, it is the [LGPL][], + project (at the time of writing this, it is the [LGPL][], version 3 *or later*). diff --git a/doc/source/conf.py b/doc/source/conf.py index f307ed238..63d63c0e5 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -302,5 +302,4 @@ def _build_doc_api(): 'sardana': ('https://sardana-controls.org', None), 'pint': ('http://pint.readthedocs.io/en/stable/', None), 'PyTango': ('http://pytango.readthedocs.io/en/stable/', None), - 'PyQt4': ('http://pyqt.sourceforge.net/Docs/PyQt4/', None), } diff --git a/doc/source/devel/coding_guide.rst b/doc/source/devel/coding_guide.rst index 48fd1667d..a6b477d38 100644 --- a/doc/source/devel/coding_guide.rst +++ b/doc/source/devel/coding_guide.rst @@ -50,9 +50,8 @@ Coding conventions - use ``lower_case`` for method names, except in the context of taurus.qt where the prevailing convention is ``mixedCase`` due to influence from PyQt -- Code must be python 2.7 compatible, and, if possible, new contributions - should also consider being compatible with python3.5 (to prepare for - python3 support) +- Code must be simultaneously compatible with python 2.7 and >=3.5. If required, + the future_ module can be used for helping in writing python 2+3 compatible code. - Every python module file should contain license information (see template below). The preferred license is the LGPL_. If you need/want to use a different one, it should be compatible with the LGPL v3+. @@ -131,9 +130,8 @@ PyQt4, PyQt5 and PySide versions. from taurus.external.qt import QtWebKit from taurus.external.qt import Qwt5 -2. Since Taurus v>=4.0, Qt-based code in Taurus may assume - that `PyQt API v2`_ is used. PyQt API 1 code, which was supported by Taurus 3, - is no longer guaranteed to work. +2. Since Taurus v>=4.0, Qt-based code in Taurus assumes + that `PyQt API v2`_ is used. PyQt API 1 code is not accepted in taurus. - Use standard python strings (e.g., use :class:`str` for Qt strings instead of :class:`QString`). Code like:: @@ -147,8 +145,7 @@ PyQt4, PyQt5 and PySide versions. my_string2 = my_string.strip() - - Do not use :class:`QVariant`. QVariant objects don't exist in - PySide or in the new PyQt4 API 2. Code like:: + - Do not use :class:`QVariant`. Code like:: def setData(self, index, qvalue, role=Qt.Qt.EditRole): value = qvalue.toString() # this assumes qvalue to be a :class:`QVariant` @@ -175,9 +172,9 @@ PyQt4, PyQt5 and PySide versions. else: return None - For compatibility reasons, :func:`~taurus.external.qt.Qt` defines `QVariant` and - `from_qvariant` which is internally used used to write code that supports both - API v1 and v2 for QVariant. But new code in Taurus v>=4 may assume v2 only. + For backwards-compatibility reasons, `taurus.external.qt.QtCore` defines `QVariant`, + `from_qvariant()` and `to_qvariant()`, but they are deprecated and should not be used + anymore. 3. Use `new-style signals`_. Old-style code like the following:: @@ -198,7 +195,10 @@ PyQt4, PyQt5 and PySide versions. self.mySignal.connect(self.bar) self.mySignal.emit(123) -4. Use of :class:`taurus.qt.qtgui.application.TaurusApplication` instead of +4. The `taurus.external.qt.compat` module defines some convenience utilities + that help in writing Qt-binding agnostic code + +5. Use of :class:`taurus.qt.qtgui.application.TaurusApplication` instead of :class:`QApplication` is recommended (it takes care of various initialization and exit tasks that are convenient). @@ -207,4 +207,5 @@ PyQt4, PyQt5 and PySide versions. .. _PEP8: http://www.python.org/peps/pep-0008.html .. _LGPL: http://www.gnu.org/licenses/lgpl.html .. _`PyQt API v2`: http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html -.. _`new-style signals`: http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html \ No newline at end of file +.. _`new-style signals`: http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html +.. _future: https://python-future.org/ \ No newline at end of file diff --git a/doc/source/users/getting_started.rst b/doc/source/users/getting_started.rst index 8724bb39a..5570282a5 100644 --- a/doc/source/users/getting_started.rst +++ b/doc/source/users/getting_started.rst @@ -91,18 +91,23 @@ Then, to work in develop mode, just do:: Dependencies ------------ -Strictly speaking, Taurus only depends on numpy, but that will leave -out most of the features normally expected of Taurus (which are -considered "extras"). For example: +Strictly speaking, Taurus only depends on numpy_, pint_ and future_ +but that will leave out most of the features normally +expected of Taurus (which are considered "extras"). For example: - Interacting with a Tango controls system requires PyTango_. - Interacting with an Epics controls system requires pyepics_. -- Using the taurus Qt widgets, requires PyQt_ 4.x (4.8 <= v < 5). - (PyQt5 support coming soon). +- Using the taurus Qt_ widgets, requires either PyQt_ (v4 or v5) + or PySide_ (v1 or v2). Note that most development and testing of + is done with PyQt4 and PyQt5, so many features may not be + regularly tested with PySide and PySide2. -- The :mod:`taurus.qt.qtgui.plot` module requires PyQwt_. +- The :mod:`taurus.qt.qtgui.plot` module requires PyQwt_, which is + only available when using PyQt4 and python2. As an alternative + that supports both python2 and python3 and all the Qt bindings, + refer to the taurus_pyqtgraph_ plugin. - The image widgets require the guiqwt_ library. @@ -151,13 +156,17 @@ installation method: .. _numpy: http://numpy.org/ +.. _pint: http://pint.readthedocs.org/ +.. _future: https://python-future.org/ .. _PLY: http://www.dabeaz.com/ply/ .. _Python(x,y): http://python-xy.github.io/ .. _Tango: http://www.tango-controls.org/ .. _PyTango: http://pytango.readthedocs.io .. _Qt: http://qt.nokia.com/products/ .. _PyQt: http://www.riverbankcomputing.co.uk/software/pyqt/ +.. _PySide: https://wiki.qt.io/Qt_for_Python .. _PyQwt: http://pyqwt.sourceforge.net/ +.. _taurus_pyqtgraph: https://github.com/taurus-org/taurus_pyqtgraph .. _guiqwt: https://pypi.python.org/pypi/guiqtw .. _IPython: http://ipython.org .. _PyMca5: http://pymca.sourceforge.net/ From 77c1377c1097d9ee93d6b7a99f6963a708cbcf91 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 21 Jan 2019 09:50:36 +0100 Subject: [PATCH 233/252] Move macrolistener submodule to sardana Move taurus.qt.qtgui.taurusgui.macrolistener to sardana.taurus.qt.qtgui.macrolistener --- lib/taurus/qt/qtgui/taurusgui/__init__.py | 5 +- .../qt/qtgui/taurusgui/macrolistener.py | 605 ------------------ lib/taurus/qt/qtgui/taurusgui/taurusgui.py | 2 +- 3 files changed, 5 insertions(+), 607 deletions(-) delete mode 100644 lib/taurus/qt/qtgui/taurusgui/macrolistener.py diff --git a/lib/taurus/qt/qtgui/taurusgui/__init__.py b/lib/taurus/qt/qtgui/taurusgui/__init__.py index 4e4dddf02..021658dd6 100644 --- a/lib/taurus/qt/qtgui/taurusgui/__init__.py +++ b/lib/taurus/qt/qtgui/taurusgui/__init__.py @@ -56,7 +56,10 @@ from .taurusgui import * from .appsettingswizard import * try: - from .macrolistener import * + # this import is left here for bck-compat, but will be removed + # TODO: remove this + from sardana.taurus.qt.qtgui.macrolistener import (MacroBroker, + DynamicPlotManager) except ImportError: pass diff --git a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py b/lib/taurus/qt/qtgui/taurusgui/macrolistener.py deleted file mode 100644 index 84f02dec1..000000000 --- a/lib/taurus/qt/qtgui/taurusgui/macrolistener.py +++ /dev/null @@ -1,605 +0,0 @@ -#!/usr/bin/env python - -############################################################################# -## -# This file is part of Taurus -## -# http://taurus-scada.org -## -# Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain -## -# Taurus is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -## -# Taurus is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -## -# You should have received a copy of the GNU Lesser General Public License -# along with Taurus. If not, see . -## -########################################################################### - -""" -This module provides objects to manage macro-related tasks. Its primary use is -to be used within a TaurusGui for managing panels for: -- setting preferences in the sardana control system for data I/O -- displaying results of macro executions, including creating/removing panels for - plotting results of scans -- editing macros - -.. note:: This module will be moved to sardana.taurus at some point. -""" - - # TODO: move to sardana.taurus - -from __future__ import print_function - -from builtins import object - -import datetime - -from taurus.core.util.containers import CaselessList -from taurus.external.qt import Qt -from taurus.qt.qtgui.base import TaurusBaseComponent - - -__all__ = ['MacroBroker', 'DynamicPlotManager'] -__docformat__ = 'restructuredtext' - - -class ChannelFilter(object): - - def __init__(self, chlist): - self.chlist = tuple(chlist) - - def __call__(self, x): - return x in self.chlist - - -class DynamicPlotManager(Qt.QObject, TaurusBaseComponent): - '''This is a manager of plots related to the execution of macros. - It dynamically creates/removes plots according to the configuration made by - an ExperimentConfiguration widget. - - Currently it supports only 1D scan trends (2D scans are only half-baked) - - To use it simply instantiate it and pass it a door name as a model. You may - want to call :meth:`onExpConfChanged` to update the configuration being - used. - ''' - - newShortMessage = Qt.pyqtSignal('QString') - - def __init__(self, parent=None): - Qt.QObject.__init__(self, parent) - TaurusBaseComponent.__init__(self, self.__class__.__name__) - - self.__panels = {} - - self._trends1d = {} - self._trends2d = {} - - def setModel(self, doorname): - '''reimplemented from :meth:`TaurusBaseComponent` - - :param doorname: (str) device name corresponding to a Door device. - ''' - TaurusBaseComponent.setModel(self, doorname) - # self._onDoorChanged(doorname) - if not doorname: - return - door = self.getModelObj() - if not isinstance(door, Qt.QObject): - msg = "Unexpected type (%s) for %s" % (repr(type(door)), doorname) - Qt.QMessageBox.critical( - self.parent(), 'Door connection error', msg) - return - - self._checkJsonRecorder() - - # read the expconf - expconf = door.getExperimentConfiguration() - self.onExpConfChanged(expconf) - - def _checkJsonRecorder(self): - '''Checks if JsonRecorder env var is set and offers to set it''' - door = self.getModelObj() - if 'JsonRecorder' not in door.getEnvironment(): - msg = ('JsonRecorder environment variable is not set, but it ' + - 'is needed for displaying trend plots.\n' + - 'Enable it globally for %s?') % door.fullname - result = Qt.QMessageBox.question(self.parent(), - 'JsonRecorder not set', msg, - Qt.QMessageBox.Yes | Qt.QMessageBox.No) - if result == Qt.QMessageBox.Yes: - door.putEnvironment('JsonRecorder', True) - self.info('JsonRecorder Enabled for %s' % door.fullname) - - def onExpConfChanged(self, expconf): - ''' - Slot to be called when experimental configuration changes. It should - remove the temporary panels and create the new ones needed. - - :param expconf: (dict) An Experiment Description dictionary. See - :meth:`sardana.taurus.qt.qtcore.tango.sardana. - QDoor.getExperimentDescription` - for more details - ''' - - from sardana.taurus.core.tango.sardana import PlotType - from sardana.taurus.core.tango.sardana.pool import getChannelConfigs - activeMntGrp = expconf['ActiveMntGrp'] - if activeMntGrp is None: - return - if activeMntGrp not in expconf['MntGrpConfigs']: - self.warning( - "ActiveMntGrp '%s' is not defined" % - activeMntGrp) - return - mgconfig = expconf['MntGrpConfigs'][activeMntGrp] - channels = dict(getChannelConfigs(mgconfig, sort=False)) - - # classify by type of plot: - trends1d = {} - trends2d = {} - plots1d = {} - images = {} - - for chname, chdata in channels.items(): - ptype = chdata['plot_type'] - if ptype == PlotType.No: - continue - elif ptype == PlotType.Spectrum: - axes = tuple(chdata['plot_axes']) - # TODO: get default value from the channel. - ndim = chdata.get('ndim', 0) or 0 - if ndim == 0: # this is a trend - if axes in trends1d: - trends1d[axes].append(chname) - else: - trends1d[axes] = CaselessList([chname]) - elif ndim == 1: # a 1D plot (e.g. a spectrum) - pass # TODO: implement - else: - self.warning('Cannot create plot for %s', chname) - - elif ptype == PlotType.Image: - axes = tuple(chdata['plot_axes']) - # TODO: get default value from the channel. - ndim = chdata.get('ndim', 1) - if ndim == 0: # a mesh-like plot? - pass # TODO implement - elif ndim == 1: # a 2D trend - if axes in trends2d: - trends2d[axes].append(chname) - else: - trends2d[axes] = CaselessList([chname]) - elif ndim == 2: # a 2D plot (e.g. an image) - pass # TODO: implement - else: - self.warning('Cannot create plot for %s', chname) - - new1d, removed1d = self._updateTemporaryTrends1D(trends1d) - self.newShortMessage.emit("Changed panels (%i new, %i removed)" % (len(new1d), - len(removed1d))) -# self._updateTemporaryTrends2D(trends2d) - - def _updateTemporaryTrends1D(self, trends1d): - '''adds necessary trend1D panels and removes no longer needed ones - - :param trends1d: (dict) A dict whose keys are tuples of axes and - whose values are list of model names to plot - - :returns: (tuple) two lists new,rm:new contains the names of the new - panels and rm contains the names of the removed panels - ''' - from taurus.qt.qtgui.plot import TaurusTrend # TODO: use tpg instead! - newpanels = [] - for axes, plotables in trends1d.items(): - if not axes: - continue - if axes not in self._trends1d: - w = TaurusTrend() - w.setXIsTime(False) - w.setScanDoor(self.getModelObj().fullname) - # TODO: use a standard key for and - w.setScansXDataKey(axes[0]) - pname = u'Trend1D - %s' % ":".join(axes) - panel = self.createPanel(w, pname, registerconfig=False, - permanent=False) - try: # if the panel is a dockwidget, raise it - panel.raise_() - except: - pass - self._trends1d[axes] = pname - newpanels.append(pname) - - widget = self.getPanelWidget(self._trends1d[axes]) - flt = ChannelFilter(plotables) - widget.onScanPlotablesFilterChanged(flt) - - # remove trends that are no longer configured - removedpanels = [] - olditems = list(self._trends1d.items()) - for axes, name in olditems: - if axes not in trends1d: - removedpanels.append(name) - self.removePanel(name) - self._trends1d.pop(axes) - - return newpanels, removedpanels - - def _updateTemporaryTrends2D(self, trends2d): - '''adds necessary trend2D panels and removes no longer needed ones - - :param trends2d: (dict) A dict whose keys are tuples of axes and - whose values are list of model names to plot - - :returns: (tuple) two lists new,rm:new contains the names of the new - panels and rm contains the names of the removed panels - - ..note:: Not fully implemented yet - ''' - try: - from taurus.qt.qtgui.extra_guiqwt.taurustrend2d import \ - TaurusTrend2DDialog - from taurus.qt.qtgui.extra_guiqwt.image import TaurusTrend2DScanItem - except: - self.info('guiqwt extension cannot be loaded. ' + - '2D Trends will not be created') - raise - return - - for axes, plotables in trends2d.items(): - for chname in plotables: - pname = u'Trend2D - %s' % chname - if pname in self._trends2d: - self._trends2d[pname].widget().trendItem.clearTrend() - else: - axis = axes[0] - w = TaurusTrend2DDialog(stackMode='event') - plot = w.get_plot() - t2d = TaurusTrend2DScanItem(chname, axis, - self.getModelObj().fullname) - plot.add_item(t2d) - self.createPanel(w, pname, registerconfig=False, - permanent=False) - self._trends2d[(axes, chname)] = pname - - def createPanel(self, widget, name, **kwargs): - '''Creates a "panel" from a widget. In this basic implementation this - means that the widgets is shown as a non-modal top window - - :param widget: (QWidget) widget to be used for the panel - :param name: (str) name of the panel. Must be unique. - - Note: for backawards compatibility, this implementation accepts - arbitrary keyword arguments which are just ignored - ''' - widget.setWindowTitle(name) - widget.show() - self.__panels[name] = widget - - def getPanelWidget(self, name): - '''Returns the widget associated to a panel name - - :param name: (str) name of the panel. KeyError is raised if not found - - :return: (QWidget) - ''' - return self.__panels[name] - - def removePanel(self, name): - '''stop managing the given panel - - :param name: (str) name of the panel''' - widget = self.__panels.pop(name) - if hasattr(widget, 'setModel'): - widget.setModel(None) - widget.setParent(None) - widget.close() - - def removePanels(self, names=None): - '''removes panels. - - :param names: (seq) names of the panels to be removed. If None is - given (default), all the panels are removed. - ''' - if names is None: - names = list(self._trends1d.values()) + list(self._trends2d.values()) - # TODO: do the same for other temporary panels - for pname in names: - self.removePanel(pname) - - -class MacroBroker(DynamicPlotManager): - '''A manager of all macro-related panels of a TaurusGui. - - It creates, destroys and manages connections for the following objects: - - - Macro Configuration dialog - - Experiment Configuration panel - - Macro Executor panel - - Sequencer panel - - Macro description viewer - - Door output, result and debug panels - - Macro editor - - Macro "panic" button (to abort macros) - - Dynamic plots (see :class:`DynamicPlotManager`) - ''' - - def __init__(self, parent): - '''Passing the parent object (the main window) is mandatory''' - DynamicPlotManager.__init__(self, parent) - - self._createPermanentPanels() - - # connect the broker to shared data - Qt.qApp.SDM.connectReader("doorName", self.setModel) - Qt.qApp.SDM.connectReader("expConfChanged", self.onExpConfChanged) - Qt.qApp.SDM.connectWriter("shortMessage", self, 'newShortMessage') - - def setModel(self, doorname): - ''' Reimplemented from :class:`DynamicPlotManager`.''' - # disconnect the previous door - door = self.getModelObj() - if door is not None: # disconnect it from *all* shared data providing - SDM = Qt.qApp.SDM - try: - SDM.disconnectWriter("macroStatus", door, "macroStatusUpdated") - except: - self.info("Could not disconnect macroStatusUpdated") - try: - SDM.disconnectWriter("doorOutputChanged", door, "outputUpdated") - except: - self.info("Could not disconnect outputUpdated") - try: - SDM.disconnectWriter("doorInfoChanged", door, "infoUpdated") - except: - self.info("Could not disconnect infoUpdated") - try: - SDM.disconnectWriter("doorWarningChanged", door, - "warningUpdated") - except: - self.info("Could not disconnect warningUpdated") - try: - SDM.disconnectWriter("doorErrorChanged", door, "errorUpdated") - except: - self.info("Could not disconnect errorUpdated") - try: - SDM.disconnectWriter("doorDebugChanged", door, "debugUpdated") - except: - self.info("Could not disconnect debugUpdated") - try: - SDM.disconnectWriter("doorResultChanged", door, "resultUpdated") - except: - self.info("Could not disconnect resultUpdated") - try: - SDM.disconnectWriter("expConfChanged", door, - "experimentConfigurationChanged") - except: - self.info("Could not disconnect experimentConfigurationChanged") - # set the model - DynamicPlotManager.setModel(self, doorname) - - # connect the new door - door = self.getModelObj() - if door is not None: - SDM = Qt.qApp.SDM - SDM.connectWriter("macroStatus", door, "macroStatusUpdated") - SDM.connectWriter("doorOutputChanged", door, "outputUpdated") - SDM.connectWriter("doorInfoChanged", door, "infoUpdated") - SDM.connectWriter("doorWarningChanged", door, "warningUpdated") - SDM.connectWriter("doorErrorChanged", door, "errorUpdated") - SDM.connectWriter("doorDebugChanged", door, "debugUpdated") - SDM.connectWriter("doorResultChanged", door, "resultUpdated") - SDM.connectWriter("expConfChanged", door, - "experimentConfigurationChanged") - - def _createPermanentPanels(self): - '''creates panels on the main window''' - from sardana.taurus.qt.qtgui.extra_macroexecutor import \ - TaurusMacroExecutorWidget, TaurusSequencerWidget, \ - TaurusMacroConfigurationDialog, TaurusMacroDescriptionViewer, \ - DoorOutput, DoorDebug, DoorResult - - from sardana.taurus.qt.qtgui.extra_sardana import \ - ExpDescriptionEditor, SardanaEditor - - mainwindow = self.parent() - - # Create macroconfiguration dialog & action - self.__macroConfigurationDialog = \ - TaurusMacroConfigurationDialog(mainwindow) - self.macroConfigurationAction = mainwindow.taurusMenu.addAction( - Qt.QIcon.fromTheme("preferences-system-session"), - "Macro execution configuration...", - self.__macroConfigurationDialog.show) - - SDM = Qt.qApp.SDM - SDM.connectReader("macroserverName", - self.__macroConfigurationDialog.selectMacroServer) - SDM.connectReader("doorName", - self.__macroConfigurationDialog.selectDoor) - SDM.connectWriter("macroserverName", self.__macroConfigurationDialog, - 'macroserverNameChanged') - SDM.connectWriter("doorName", self.__macroConfigurationDialog, - 'doorNameChanged') - - # Create ExpDescriptionEditor dialog - self.__expDescriptionEditor = ExpDescriptionEditor(plotsButton=False) - SDM.connectReader("doorName", self.__expDescriptionEditor.setModel) - mainwindow.createPanel(self.__expDescriptionEditor, - 'Experiment Config', - registerconfig=True, - icon=Qt.QIcon.fromTheme('preferences-system'), - permanent=True) - ############################### - # TODO: These lines can be removed once the door does emit - # "experimentConfigurationChanged" signals - SDM.connectWriter("expConfChanged", self.__expDescriptionEditor, - "experimentConfigurationChanged") - ################################ - - # put a Macro Executor - self.__macroExecutor = TaurusMacroExecutorWidget() - SDM.connectReader("macroserverName", self.__macroExecutor.setModel) - SDM.connectReader("doorName", self.__macroExecutor.onDoorChanged) - SDM.connectReader("macroStatus", - self.__macroExecutor.onMacroStatusUpdated) - SDM.connectWriter("macroName", self.__macroExecutor, - "macroNameChanged") - SDM.connectWriter("executionStarted", self.__macroExecutor, - "macroStarted") - SDM.connectWriter("plotablesFilter", self.__macroExecutor, - "plotablesFilterChanged") - SDM.connectWriter("shortMessage", self.__macroExecutor, - "shortMessageEmitted") - mainwindow.createPanel(self.__macroExecutor, 'Macros', - registerconfig=True, permanent=True) - - # put a Sequencer - self.__sequencer = TaurusSequencerWidget() - SDM.connectReader("macroserverName", self.__sequencer.setModel) - SDM.connectReader("doorName", self.__sequencer.onDoorChanged) - SDM.connectReader("macroStatus", self.__sequencer.onMacroStatusUpdated) - SDM.connectWriter("macroName", self.__sequencer.tree, - "macroNameChanged") - SDM.connectWriter("macroName", self.__sequencer, - "macroNameChanged") - SDM.connectWriter("executionStarted", self.__sequencer, - "macroStarted") - SDM.connectWriter("plotablesFilter", self.__sequencer, - "plotablesFilterChanged") - SDM.connectWriter("shortMessage", self.__sequencer, - "shortMessageEmitted") - mainwindow.createPanel(self.__sequencer, 'Sequences', - registerconfig=True, permanent=True) - - # puts a macrodescriptionviewer - self.__macroDescriptionViewer = TaurusMacroDescriptionViewer() - SDM.connectReader("macroserverName", - self.__macroDescriptionViewer.setModel) - SDM.connectReader("macroName", - self.__macroDescriptionViewer.onMacroNameChanged) - mainwindow.createPanel(self.__macroDescriptionViewer, - 'MacroDescription', registerconfig=True, - permanent=True) - - # puts a doorOutput - self.__doorOutput = DoorOutput() - SDM.connectReader("doorOutputChanged", - self.__doorOutput.onDoorOutputChanged) - SDM.connectReader("doorInfoChanged", - self.__doorOutput.onDoorInfoChanged) - SDM.connectReader("doorWarningChanged", - self.__doorOutput.onDoorWarningChanged) - SDM.connectReader("doorErrorChanged", - self.__doorOutput.onDoorErrorChanged) - mainwindow.createPanel(self.__doorOutput, 'DoorOutput', - registerconfig=False, permanent=True) - - # puts doorDebug - self.__doorDebug = DoorDebug() - SDM.connectReader("doorDebugChanged", - self.__doorDebug.onDoorDebugChanged) - mainwindow.createPanel(self.__doorDebug, 'DoorDebug', - registerconfig=False, permanent=True) - - # puts doorResult - self.__doorResult = DoorResult(mainwindow) - SDM.connectReader("doorResultChanged", - self.__doorResult.onDoorResultChanged) - mainwindow.createPanel(self.__doorResult, 'DoorResult', - registerconfig=False, permanent=True) - - # puts sardanaEditor - # self.__sardanaEditor = SardanaEditor() - # SDM.connectReader("macroserverName", self.__sardanaEditor.setModel) - # mainwindow.createPanel(self.__sardanaEditor, 'SardanaEditor', - # registerconfig=False, permanent=True) - - # add panic button for aborting the door - text = "Panic Button: stops the pool (double-click for abort)" - self.doorAbortAction = mainwindow.jorgsBar.addAction( - Qt.QIcon("actions:process-stop.svg"), - text, self.__onDoorAbort) - - # store beginning of times as a datetime - self.__lastAbortTime = datetime.datetime(1, 1, 1) - - # store doubleclick interval as a timedelta - td = datetime.timedelta(0, 0, 1000 * Qt.qApp.doubleClickInterval()) - self.__doubleclickInterval = td - - def __onDoorAbort(self): - '''slot to be called when the abort action is triggered. - It sends stop command to the pools (or abort if the action - has been triggered twice in less than self.__doubleclickInterval - - .. note:: An abort command is always preceded by an stop command - ''' - # decide whether to send stop or abort - now = datetime.datetime.now() - if now - self.__lastAbortTime < self.__doubleclickInterval: - cmd = 'abort' - else: - cmd = 'stop' - - door = self.getModelObj() - - # abort the door - door.command_inout('abort') - # send stop/abort to all pools - pools = door.macro_server.getElementsOfType('Pool') - for pool in pools.values(): - self.info('Sending %s command to %s' % (cmd, pool.getFullName())) - try: - pool.getObj().command_inout(cmd) - except: - self.info('%s command failed on %s', cmd, pool.getFullName(), - exc_info=1) - self.newShortMessage.emit("%s command sent to all pools" % - cmd) - self.__lastAbortTime = now - - def createPanel(self, widget, name, **kwargs): - ''' Reimplemented from :class:`DynamicPlotManager` to delegate panel - management to the parent widget (a TaurusGui)''' - mainwindow = self.parent() - return mainwindow.createPanel(widget, name, **kwargs) - - def getPanelWidget(self, name): - ''' Reimplemented from :class:`DynamicPlotManager` to delegate panel - management to the parent widget (a TaurusGui)''' - mainwindow = self.parent() - return mainwindow.getPanel(name).widget() - - def removePanel(self, name): - ''' Reimplemented from :class:`DynamicPlotManager` to delegate panel - management to the parent widget (a TaurusGui)''' - mainwindow = self.parent() - mainwindow.removePanel(name) - - def removeTemporaryPanels(self, names=None): - '''Remove temporary panels managed by this widget''' - # for now, the only temporary panels are the plots - DynamicPlotManager.removePanels(self, names=names) - - -if __name__ == "__main__": - import sys - from taurus.qt.qtgui.application import TaurusApplication - - app = TaurusApplication() - - b = DynamicPlotManager(None) - - b.setModel('door/cp1/1') - - print('...') - sys.exit(app.exec_()) diff --git a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py index 94cc5bd49..7228bc607 100644 --- a/lib/taurus/qt/qtgui/taurusgui/taurusgui.py +++ b/lib/taurus/qt/qtgui/taurusgui/taurusgui.py @@ -1102,7 +1102,7 @@ def loadConfiguration(self, confname): xmlroot, "MACRO_PANELS", True)) # macro infrastructure will only be created if MACROSERVER_NAME is set if MACRO_PANELS and MACROSERVER_NAME is not None: - from taurus.qt.qtgui.taurusgui import MacroBroker + from sardana.taurus.qt.qtgui.macrolistener import MacroBroker self.__macroBroker = MacroBroker(self) if MACROSERVER_NAME: self.macroserverNameChanged.emit(MACROSERVER_NAME) From 61500f1957a039cb1718846c3731d57f260c5ee5 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 21 Jan 2019 10:56:32 +0100 Subject: [PATCH 234/252] (doc) Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05df2f55f..5a93dd819 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ develop branch) won't be reflected in this file. ### Removed - taurus.qt.qtgui.tree.taurusdevicetree submodule (obsolete, unused) - Trend dockwidget in TaurusDevPanel +- `taurus.qt.qtgui.taurusgui.macrolistener` (now provided by + `sardana.taurus.qt.qtgui.macrolistener`) ### Changed - `taurus.qt.qtgui.plot` is now deprecated, but the same Qwt5-based From a6776a89e129384ab214f56364e9d45bbec4e778 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Wed, 23 Jan 2019 13:41:52 +0100 Subject: [PATCH 235/252] Update pypi's trove classifiers Set status to stable, update the license classifier and announce python 3.5 support --- setup.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 1bd112af9..3675676fb 100644 --- a/setup.py +++ b/setup.py @@ -115,13 +115,14 @@ def get_release_info(): } classifiers = [ - 'Development Status :: 3 - Alpha', + 'Development Status :: 5 - Production/Stable', 'Environment :: Console', 'Environment :: X11 Applications :: Qt', 'Environment :: Win32 (MS Windows)', 'Intended Audience :: Developers', 'Intended Audience :: Science/Research', - 'License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)', + 'License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)', + 'Natural Language :: English', 'Operating System :: Microsoft :: Windows', 'Operating System :: POSIX', 'Operating System :: POSIX :: Linux', @@ -129,6 +130,7 @@ def get_release_info(): 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3.5', 'Topic :: Scientific/Engineering', 'Topic :: Software Development :: Libraries', 'Topic :: Software Development :: User Interfaces', From e9284329c1d4fede213aa199032414078f937b8c Mon Sep 17 00:00:00 2001 From: zreszela Date: Thu, 24 Jan 2019 18:51:28 +0100 Subject: [PATCH 236/252] Add tests for TangoFactory garbage collection --- .../core/tango/test/test_tangofactory.py | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100755 lib/taurus/core/tango/test/test_tangofactory.py diff --git a/lib/taurus/core/tango/test/test_tangofactory.py b/lib/taurus/core/tango/test/test_tangofactory.py new file mode 100755 index 000000000..cf746e21d --- /dev/null +++ b/lib/taurus/core/tango/test/test_tangofactory.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python + +############################################################################# +## +# This file is part of Taurus +## +# http://taurus-scada.org +## +# Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain +## +# Taurus is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +## +# Taurus is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +## +# You should have received a copy of the GNU Lesser General Public License +# along with Taurus. If not, see . +## +############################################################################# + +"""Tests for taurus.core.tango.tangofactory""" + + +import taurus + +from taurus.external.unittest import TestCase + + +class TestFactoryGarbageCollection(TestCase): + + def test_authority(self): + def create(): + taurus.Authority() + create() + msg = "factory is polluted with authority " + # TODO: uncomment this line whenever TangoFactory starts recycling + # authorities + # self.assertEqual(len(taurus.Factory().tango_auths), 0, msg) + + def test_device(self): + def create(): + taurus.Device("sys/tg_test/1") + create() + msg = "factory is polluted with device" + self.assertEqual(len(taurus.Factory().tango_devs), 0, msg) + + def test_attribute(self): + def create(): + taurus.Attribute("sys/tg_test/1/state") + create() + msg = "factory is polluted with attribute" + self.assertEqual(len(taurus.Factory().tango_attrs), 0, msg) From d3c3763bd6ff655bf9e28cc6db9b40ee5ed5f610 Mon Sep 17 00:00:00 2001 From: zreszela Date: Fri, 25 Jan 2019 17:52:34 +0100 Subject: [PATCH 237/252] Use weakref when enquing TangoAttribute.fireEvent jobs Enquing hard reference to the TangoAttribute method as a job of the thread pool may cause a life harder to the garbage collector when TaurusSerializationMode.Serial serialization mode is in use. Tests introduced in #847 demonstrates that. In this case the TangoAttribute object creation enques its fireEvent jobs on the thread pool, what implies a hard reference to this object. Until the thread pool does not handle all the jobs, the object persist in the factory, even if there are no external referrers - see #847. Furthermore, real events from the Tango may arrive and add more jobs (more references) complicating the things even more... Use weakref (_BoundMethodWeakrefWithCall) so whenever there are no external referrers the object can be destroyed by the garbage collector, even if there are its jobs on the queue - no one is interested in handling them. It was tested that a call to a dead reference by a worker thread does not cause any exceptions. --- lib/taurus/core/tango/tangoattribute.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/taurus/core/tango/tangoattribute.py b/lib/taurus/core/tango/tangoattribute.py index 08543db00..5cf499c1d 100755 --- a/lib/taurus/core/tango/tangoattribute.py +++ b/lib/taurus/core/tango/tangoattribute.py @@ -47,11 +47,7 @@ SubscriptionState, TaurusAttrValue, DataFormat, DataType) from taurus.core.taurusoperation import WriteAttrOperation -from taurus.core.util.event import EventListener -# ------------------------------------------------------------------------- -# TODO: remove this when PyTango's bug 185 is fixed -from taurus.core.util.event import _BoundMethodWeakrefWithCall -# ------------------------------------------------------------------------- +from taurus.core.util.event import EventListener, _BoundMethodWeakrefWithCall from taurus.core.util.log import (debug, taurus4_deprecation, deprecation_decorator) @@ -618,7 +614,8 @@ def addListener(self, listener): rel='4.3.2') self.__fireRegisterEvent((listener,)) else: - Manager().enqueueJob(self.__fireRegisterEvent, + job = _BoundMethodWeakrefWithCall(self.__fireRegisterEvent) + Manager().enqueueJob(job, job_args=((listener,),), serialization_mode=sm) return ret @@ -825,7 +822,8 @@ def push_event(self, event): rel='4.3.2') self.fireEvent(etype, evalue, listeners=listeners) else: - manager.enqueueJob(self.fireEvent, job_args=(etype, evalue), + job = _BoundMethodWeakrefWithCall(self.fireEvent) + manager.enqueueJob(job, job_args=(etype, evalue), job_kwargs={'listeners': listeners}, serialization_mode=sm) From 4a20c28a4bf6fda4aca5b2d66a83f25efbf3331e Mon Sep 17 00:00:00 2001 From: Alexander Senchenko Date: Mon, 28 Jan 2019 00:21:29 +0700 Subject: [PATCH 238/252] Fixes issue #848. --- lib/taurus/core/evaluation/evalattribute.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/taurus/core/evaluation/evalattribute.py b/lib/taurus/core/evaluation/evalattribute.py index fa4772821..9dfed41dc 100644 --- a/lib/taurus/core/evaluation/evalattribute.py +++ b/lib/taurus/core/evaluation/evalattribute.py @@ -60,7 +60,11 @@ def __init__(self, attr=None, config=None): self.config = self._attrRef def __getattr__(self, name): + if name in ('config', '_attrRef'): + raise AttributeError('%s has no attribute %s' + % (self.__class__.__name__, name)) try: + ret = getattr(self._attrRef, name) except AttributeError: raise AttributeError('%s has no attribute %s' From d5d088769e87fcfd3fd92bbd3439cf67437a3003 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 28 Jan 2019 09:39:49 +0100 Subject: [PATCH 239/252] Limit the delegation in `__getattr__` to non-special methods. The previous commit fixes a copyability by treating `_attrRef` in a special way. Instead, imit the delegation in `__getattr__` to all non-special methods, just as we did for TangoAttrValue --- lib/taurus/core/evaluation/evalattribute.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/taurus/core/evaluation/evalattribute.py b/lib/taurus/core/evaluation/evalattribute.py index 9dfed41dc..5deeeea6b 100644 --- a/lib/taurus/core/evaluation/evalattribute.py +++ b/lib/taurus/core/evaluation/evalattribute.py @@ -60,11 +60,11 @@ def __init__(self, attr=None, config=None): self.config = self._attrRef def __getattr__(self, name): - if name in ('config', '_attrRef'): - raise AttributeError('%s has no attribute %s' - % (self.__class__.__name__, name)) + # Do not try to delegate special methods + if name.startswith('__') and name.endswith('__'): + raise AttributeError("'%s' object has no attribute %s" + % (self.__class__.__name__, name)) try: - ret = getattr(self._attrRef, name) except AttributeError: raise AttributeError('%s has no attribute %s' From 8ccaf4c1094b8bc9abae0df6056b3797c4904ea4 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 28 Jan 2019 12:45:06 +0100 Subject: [PATCH 240/252] Add paragraph about QT_API to TEP18 Add paragraph to TEP18 explaining how to select the QT binding --- doc/source/tep/TEP18.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index b1d99ef33..791a4e513 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -119,6 +119,20 @@ implementation is likely not expected to be fully functional under PySide/Pyside Nevertheless, this situation is subject to change if there is enough interest in the community to dedicate more efforts to test and support taurus with PySide and/or PySide2. +The proposed implementation allows the user to select the QT binding by declaring +the `QT_API` environment variable with one of the currently accepted values: + +- `pyqt` (or `pyqt4`) for PyQt4 +- `pyqt5` for PyQt5 +- `pyside2` for PySide2 +- `pyside` for PySide + +If the `QT_API` environment variable is not declared, Taurus will fall back to the value set in +`taurus.tauruscustomsettings.DEFAULT_QT_API`. + +If the selected binding is not available in the system, Taurus will try the next +ones from the list above. + ### Support for multiple Qt styles within taurus.external.qt Independently of which plugins are supported as backends, we had to decide which programming From 8e31f8771d4730ea56cfb3b1f1b6b9bba977ded3 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Mon, 28 Jan 2019 12:49:17 +0100 Subject: [PATCH 241/252] (doc) Update TEP index and TEP18 to reflect ACCEPTED state Update the URLs and metadata for TEP18 after the merge of #814. --- doc/source/tep/TEP18.md | 9 +++++---- doc/source/tep/index.md | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/doc/source/tep/TEP18.md b/doc/source/tep/TEP18.md index 791a4e513..c7f1783ab 100644 --- a/doc/source/tep/TEP18.md +++ b/doc/source/tep/TEP18.md @@ -1,9 +1,9 @@ Title: Implement support for Qt5 in taurus TEP: 18 - State: CANDIDATE - Date: 2018-10-04 + State: ACCEPTED + Date: 2019-01-28 Drivers: Carlos Pascual-Izarra cpascual@cells.es - URL: https://github.com/cpascual/taurus/blob/tep18/doc/source/tep/TEP18.md (provisional) + URL: http://www.taurus-scada.org/tep/?TEP18.md License: http://www.jclark.com/xml/copying.txt Abstract: Implement support for Qt5 in taurus. Also define the @@ -51,7 +51,7 @@ all compatible with each other: ## Proposed implementation -This section descibes and justifies the key decisions behind the proposed implementation. +This section describes and justifies the key decisions behind the proposed implementation. ### Existing shims used as references @@ -487,6 +487,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - 2018-10-04 [cpascual][]. Initial version - 2018-11-27 [cpascual][]. Moving to CANDIDATE. Prototype implementation underway - 2019-01-16 [cpascual][]. Update text to reflect the finished proposed implementation. +- 2019-01-28 [cpascual][]. Moving to ACCEPTED (merged https://github.com/taurus-org/taurus/pull/814) diff --git a/doc/source/tep/index.md b/doc/source/tep/index.md index 3c3fdbdeb..41480f384 100644 --- a/doc/source/tep/index.md +++ b/doc/source/tep/index.md @@ -24,7 +24,7 @@ Proposals list [TEP15][] | ACCEPTED | fragment-based slicing support in URIs [TEP16][] | ACCEPTED | Moving Taurus to Github [TEP17][] | DRAFT | Implement plots with pyqtgraph - [TEP18][] | CANDIDATE | Implement support for Qt5 in taurus + [TEP18][] | ACCEPTED | Implement support for Qt5 in taurus [TEP0]: http://www.taurus-scada.org/tep/?TEP0.md [TEP3]: http://www.taurus-scada.org/tep/?TEP3.md @@ -40,4 +40,4 @@ Proposals list [TEP15]: http://www.taurus-scada.org/tep/?TEP15.md [TEP16]: http://www.taurus-scada.org/tep/?TEP16.md [TEP17]: https://github.com/cpascual/taurus/blob/tep17/doc/source/tep/TEP17.md -[TEP18]: https://github.com/cpascual/taurus/blob/tep18/doc/source/tep/TEP18.md +[TEP18]: http://www.taurus-scada.org/tep/?TEP18.md From 681d6a21e18790350e281d69cea3fd260b1d7966 Mon Sep 17 00:00:00 2001 From: zreszela Date: Mon, 28 Jan 2019 14:30:40 +0100 Subject: [PATCH 242/252] Use a dedicated TangoSchemeTest instance to isolate tests In order to make this test isolated from the rest of the testsuite use a dedicated device from an ad-hoc started device server. Also change the strategy of assertion, just checking the increment of the factory lengths. --- .../core/tango/test/test_tangofactory.py | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/taurus/core/tango/test/test_tangofactory.py b/lib/taurus/core/tango/test/test_tangofactory.py index cf746e21d..32a7d9f27 100755 --- a/lib/taurus/core/tango/test/test_tangofactory.py +++ b/lib/taurus/core/tango/test/test_tangofactory.py @@ -29,10 +29,17 @@ import taurus from taurus.external.unittest import TestCase +from taurus.core.tango.test.tgtestds import TangoSchemeTestLauncher -class TestFactoryGarbageCollection(TestCase): +class TestFactoryGarbageCollection(TangoSchemeTestLauncher, TestCase): + # in order to not interfere with the following tests this device should + # not be used in another tests + DEV_NAME = 'TangoSchemeTest/unittest/temp-tfgc-1' + + def setUp(self): + self.factory = taurus.Factory() def test_authority(self): def create(): taurus.Authority() @@ -43,15 +50,24 @@ def create(): # self.assertEqual(len(taurus.Factory().tango_auths), 0, msg) def test_device(self): + old_len = len(self.factory.tango_devs) + def create(): - taurus.Device("sys/tg_test/1") + taurus.Device(self.DEV_NAME) + create() msg = "factory is polluted with device" - self.assertEqual(len(taurus.Factory().tango_devs), 0, msg) + self.assertEqual(len(self.factory.tango_devs), old_len, msg) def test_attribute(self): + old_len = len(self.factory.tango_attrs) + def create(): - taurus.Attribute("sys/tg_test/1/state") + taurus.Attribute(self.DEV_NAME + "/state") + create() msg = "factory is polluted with attribute" - self.assertEqual(len(taurus.Factory().tango_attrs), 0, msg) + self.assertEqual(len(self.factory.tango_attrs), old_len, msg) + + def tearDown(self): + self.factory = None From c4a90cbc0560110cc2c9fe6c9f226981e884aa83 Mon Sep 17 00:00:00 2001 From: zreszela Date: Mon, 28 Jan 2019 14:32:45 +0100 Subject: [PATCH 243/252] Uncomment factory check of and mark it as expected failure Tango factory seems to be buggy and keep some references to the database. For the moment mark the test as an expected failure. --- lib/taurus/core/tango/test/test_tangofactory.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/taurus/core/tango/test/test_tangofactory.py b/lib/taurus/core/tango/test/test_tangofactory.py index 32a7d9f27..2dfb0b558 100755 --- a/lib/taurus/core/tango/test/test_tangofactory.py +++ b/lib/taurus/core/tango/test/test_tangofactory.py @@ -40,14 +40,17 @@ class TestFactoryGarbageCollection(TangoSchemeTestLauncher, TestCase): def setUp(self): self.factory = taurus.Factory() + + @expectedFailure def test_authority(self): + old_len = len(self.factory.tango_db) + def create(): taurus.Authority() + create() msg = "factory is polluted with authority " - # TODO: uncomment this line whenever TangoFactory starts recycling - # authorities - # self.assertEqual(len(taurus.Factory().tango_auths), 0, msg) + self.assertEqual(len(self.factory.tango_db), old_len, msg) def test_device(self): old_len = len(self.factory.tango_devs) From 86bd18b832d226db54e4606cb91f023efd4e25d6 Mon Sep 17 00:00:00 2001 From: zreszela Date: Mon, 28 Jan 2019 15:15:48 +0100 Subject: [PATCH 244/252] Add import of expectedFailure --- lib/taurus/core/tango/test/test_tangofactory.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/core/tango/test/test_tangofactory.py b/lib/taurus/core/tango/test/test_tangofactory.py index 2dfb0b558..6f912b1c1 100755 --- a/lib/taurus/core/tango/test/test_tangofactory.py +++ b/lib/taurus/core/tango/test/test_tangofactory.py @@ -28,7 +28,7 @@ import taurus -from taurus.external.unittest import TestCase +from taurus.external.unittest import TestCase, expectedFailure from taurus.core.tango.test.tgtestds import TangoSchemeTestLauncher From e0ff66d05e8732fcd4c1ff247670ce4ecd4ae577 Mon Sep 17 00:00:00 2001 From: zreszela Date: Mon, 28 Jan 2019 15:33:58 +0100 Subject: [PATCH 245/252] Remove authority test The behavior of the authority test is different on python 2 and python 3. For the moment it is better to comment it out. --- lib/taurus/core/tango/test/test_tangofactory.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/taurus/core/tango/test/test_tangofactory.py b/lib/taurus/core/tango/test/test_tangofactory.py index 6f912b1c1..e11a0dd50 100755 --- a/lib/taurus/core/tango/test/test_tangofactory.py +++ b/lib/taurus/core/tango/test/test_tangofactory.py @@ -28,7 +28,7 @@ import taurus -from taurus.external.unittest import TestCase, expectedFailure +from taurus.external.unittest import TestCase from taurus.core.tango.test.tgtestds import TangoSchemeTestLauncher @@ -41,7 +41,6 @@ class TestFactoryGarbageCollection(TangoSchemeTestLauncher, TestCase): def setUp(self): self.factory = taurus.Factory() - @expectedFailure def test_authority(self): old_len = len(self.factory.tango_db) @@ -50,7 +49,8 @@ def create(): create() msg = "factory is polluted with authority " - self.assertEqual(len(self.factory.tango_db), old_len, msg) + # Uncomment this line whenever tango factory recycles authority + # self.assertEqual(len(self.factory.tango_db), old_len, msg) def test_device(self): old_len = len(self.factory.tango_devs) From eade34105b3bc1fdc417fe4a909d9a37cbbf5578 Mon Sep 17 00:00:00 2001 From: cfalcon Date: Mon, 28 Jan 2019 16:32:13 +0100 Subject: [PATCH 246/252] Set TANGO_SERIALIZATION_MODE to TangoSerial Set the default TANGO_SERIALIZATION_MODE to TangoSerial and remove deprecation warnings. With this change the notification keeps the same behavior than the previous Release. --- lib/taurus/core/tango/tangoattribute.py | 6 ------ lib/taurus/core/tango/tangofactory.py | 2 +- lib/taurus/tauruscustomsettings.py | 4 ++-- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/lib/taurus/core/tango/tangoattribute.py b/lib/taurus/core/tango/tangoattribute.py index 35392cfe4..02eebaf54 100755 --- a/lib/taurus/core/tango/tangoattribute.py +++ b/lib/taurus/core/tango/tangoattribute.py @@ -613,9 +613,6 @@ def addListener(self, listener): ): sm = self._serialization_mode if sm == TaurusSerializationMode.TangoSerial: - self.deprecated(dep='TaurusSerializationMode.TangoSerial mode', - alt='TaurusSerializationMode.Serial', - rel='4.3.2') self.__fireRegisterEvent((listener,)) else: Manager().enqueueJob(self.__fireRegisterEvent, @@ -820,9 +817,6 @@ def push_event(self, event): listeners = tuple(self._listeners) sm = self._serialization_mode if sm == TaurusSerializationMode.TangoSerial: - self.deprecated(dep='TaurusSerializationMode.TangoSerial mode', - alt="TaurusSerializationMode.Serial", - rel='4.3.2') self.fireEvent(etype, evalue, listeners=listeners) else: manager.enqueueJob(self.fireEvent, job_args=(etype, evalue), diff --git a/lib/taurus/core/tango/tangofactory.py b/lib/taurus/core/tango/tangofactory.py index 57b2dbbf5..755e915ab 100644 --- a/lib/taurus/core/tango/tangofactory.py +++ b/lib/taurus/core/tango/tangofactory.py @@ -114,7 +114,7 @@ def init(self, *args, **kwargs): self.scheme = 'tango' self._serialization_mode = TaurusSerializationMode.get( getattr(tauruscustomsettings, 'TANGO_SERIALIZATION_MODE', - 'Serial')) + 'TangoSerial')) def reInit(self): """Reinitialize the singleton""" diff --git a/lib/taurus/tauruscustomsettings.py b/lib/taurus/tauruscustomsettings.py index 95882a206..17e9d0932 100755 --- a/lib/taurus/tauruscustomsettings.py +++ b/lib/taurus/tauruscustomsettings.py @@ -93,8 +93,8 @@ pass #: Default serialization mode **for the tango scheme**. Possible values are: -#: 'Serial' (default), 'Concurrent', or 'TangoSerial' (deprecated) -TANGO_SERIALIZATION_MODE = 'Serial' +#: 'Serial', 'Concurrent', or 'TangoSerial' (default) +TANGO_SERIALIZATION_MODE = 'TangoSerial' #: PLY (lex/yacc) optimization: 1=Active (default) , 0=disabled. #: Set PLY_OPTIMIZE = 0 if you are getting yacc exceptions while loading From 615092822f4051b039ab01fcc1fdbed5431fe700 Mon Sep 17 00:00:00 2001 From: cfalcon Date: Mon, 28 Jan 2019 17:16:29 +0100 Subject: [PATCH 247/252] Update changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a93dd819..5e5369113 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,8 +47,8 @@ develop branch) won't be reflected in this file. ### Added - Support fragment-based slicing of attributes ([TEP15]) - New serialization mode in which events are serialized by a Taurus - internal queue (the former "Serial" mode that was tango-centric is - now deprecated and renamed "TangoSerial") (#738) + internal queue (the former "Serial" mode that was tango-centric has + been renamed to "TangoSerial") (#738) ### Changed - Serialization mode now is explicitly set to Serial in the case From e86cd88af0f792eb13985a7790301b2895a27585 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 29 Jan 2019 08:34:55 +0100 Subject: [PATCH 248/252] Comment out disabled test test_authority is effectively disabled but executed anyway without effect. Remove it completely (comment it all out) until it can be properly enabled. --- .../core/tango/test/test_tangofactory.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/taurus/core/tango/test/test_tangofactory.py b/lib/taurus/core/tango/test/test_tangofactory.py index e11a0dd50..7c7c3a8ae 100755 --- a/lib/taurus/core/tango/test/test_tangofactory.py +++ b/lib/taurus/core/tango/test/test_tangofactory.py @@ -41,16 +41,16 @@ class TestFactoryGarbageCollection(TangoSchemeTestLauncher, TestCase): def setUp(self): self.factory = taurus.Factory() - def test_authority(self): - old_len = len(self.factory.tango_db) - - def create(): - taurus.Authority() - - create() - msg = "factory is polluted with authority " - # Uncomment this line whenever tango factory recycles authority - # self.assertEqual(len(self.factory.tango_db), old_len, msg) + # TODO: Uncomment this test when tango factory recycles authority + # def test_authority(self): + # old_len = len(self.factory.tango_db) + # + # def create(): + # taurus.Authority() + # + # create() + # msg = "factory is polluted with authority " + # self.assertEqual(len(self.factory.tango_db), old_len, msg) def test_device(self): old_len = len(self.factory.tango_devs) From 3691116d404ca03ca23ab75d1b1b070db209cd7b Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 29 Jan 2019 12:12:44 +0100 Subject: [PATCH 249/252] Update CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e5369113..2b97b0246 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,9 @@ develop branch) won't be reflected in this file. API is now available in `taurus.qt.qtgui.qwt5` - `taurus.qt.qtcore.util.emmiter.QEmitter.doSomething` signal signature changes from `collections.Iterable` to `list` + +### Fixed +- bug when copying tango or evaluation attribute values (#831, #849) ### Deprecated - `taurus.qt.qtgui.plot` From ef1198497cb1ff6954f7d1ade9d86e02730ee3c2 Mon Sep 17 00:00:00 2001 From: Jan Kotanski Date: Tue, 29 Jan 2019 15:00:39 +0100 Subject: [PATCH 250/252] fix for syntax error --- lib/taurus/external/qt/QtWidgets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/taurus/external/qt/QtWidgets.py b/lib/taurus/external/qt/QtWidgets.py index c4346ec4c..6ec94ada2 100644 --- a/lib/taurus/external/qt/QtWidgets.py +++ b/lib/taurus/external/qt/QtWidgets.py @@ -88,7 +88,7 @@ elif PYSIDE: __log.warning('Using QtWidgets with PySide is not supported and may fail ' - + 'in many cases. Use at your own risk + + 'in many cases. Use at your own risk ' + '(or use a Qt5 binding)') from PySide.QtGui import * QStyleOptionViewItem = QStyleOptionViewItemV4 From b245f24c75a8495aa42392020c1a214117765dee Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 29 Jan 2019 15:39:46 +0100 Subject: [PATCH 251/252] Bump version 4.5.0-alpha to 4.5.0 --- .bumpversion.cfg | 2 +- lib/taurus/core/release.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index b1dc34355..3ebf6dffb 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -3,7 +3,7 @@ commit = True message = Bump version {current_version} to {new_version} tag = False tag_name = {new_version} -current_version = 4.5.0-alpha +current_version = 4.5.0 parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\-(?P[a-z]+))? serialize = {major}.{minor}.{patch}-{release} diff --git a/lib/taurus/core/release.py b/lib/taurus/core/release.py index 3ede55c9d..00dda8f65 100644 --- a/lib/taurus/core/release.py +++ b/lib/taurus/core/release.py @@ -47,7 +47,7 @@ # we use semantic versioning (http://semver.org/) and we update it using the # bumpversion script (https://github.com/peritus/bumpversion) -version = '4.5.0-alpha' +version = '4.5.0' # generate version_info and revision (**deprecated** since version 4.0.2-dev). if '-' in version: From ded6c781f24e8003427f2340e6ca817fb1b99e05 Mon Sep 17 00:00:00 2001 From: Carlos Pascual Date: Tue, 29 Jan 2019 16:17:59 +0100 Subject: [PATCH 252/252] Update CHANGELOG --- CHANGELOG.md | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b97b0246..9c2a2f2c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,12 +7,16 @@ Note: changes in the [support-3.x] branch (which was split from the master branch after [3.7.1] and maintained in parallel to the develop branch) won't be reflected in this file. -## Unreleased +## [4.5.0] - 2019-01-29 + +This is a special release for meeting the deadline of debian buster +freeze (debian 10). ### Added -- Support of Python3 (beta stage, not yet production ready) (#703) +- Support of Python3 (beta stage, not yet production ready) (#703, #829, #835) - Support of other Qt bindings: PyQt4, PyQt5, PySide2, PySide (beta stage, not yet production ready) (TEP18) +- (experimental) Entry point for schemes in TaurusManager (#833) ### Removed - taurus.qt.qtgui.tree.taurusdevicetree submodule (obsolete, unused) @@ -25,9 +29,17 @@ develop branch) won't be reflected in this file. API is now available in `taurus.qt.qtgui.qwt5` - `taurus.qt.qtcore.util.emmiter.QEmitter.doSomething` signal signature changes from `collections.Iterable` to `list` +- Updated Pypy's Trove classifiers (we are now officially stable!) (#844) +- Default serialization mode for Tango reverted to `TangoSerial` (in 4.4.0 + the defaultfor Tango was changed to `Serial`) (#850) ### Fixed - bug when copying tango or evaluation attribute values (#831, #849) +- bug when adding listener to non-ready Tango device (#792) +- Various issues with Taurus Forms (#800, #805) +- problem when displaying TaurusWheelEdit in vertically-limited space (#788) +- bug when managing subscription event in Tango (#809) +- Other (#793, #819) ### Deprecated - `taurus.qt.qtgui.plot` @@ -50,8 +62,8 @@ develop branch) won't be reflected in this file. ### Added - Support fragment-based slicing of attributes ([TEP15]) - New serialization mode in which events are serialized by a Taurus - internal queue (the former "Serial" mode that was tango-centric has - been renamed to "TangoSerial") (#738) + internal queue (the former "Serial" mode that was tango-centric is + now deprecated and renamed "TangoSerial") (#738) ### Changed - Serialization mode now is explicitly set to Serial in the case @@ -390,6 +402,7 @@ and several other places](https://sf.net/p/tauruslib/tickets/milestone/Jul15/) [TEP14]: http://www.taurus-scada.org/tep/?TEP14.md [TEP15]: http://www.taurus-scada.org/tep/?TEP15.md [Unreleased]: https://github.com/taurus-org/taurus/tree/develop +[4.5.0]: https://github.com/taurus-org/taurus/tree/release-4.5.0 [4.4.0]: https://github.com/taurus-org/taurus/tree/4.4.0 [4.3.1]: https://github.com/taurus-org/taurus/tree/4.3.1 [4.3.0]: https://github.com/taurus-org/taurus/tree/4.3.0