From ee87b0dbc9c8d5c9bac8c1496039884eae1da154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A9d=C3=A9ric=20RIBREUX?= Date: Sun, 21 Aug 2016 10:35:32 +0200 Subject: [PATCH] [PyQt] Add a lib2to3 custom fix to handle QFileDialog methods in PyQt5 --- scripts/qgis_fixes/fix_qfiledialog.py | 46 +++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 scripts/qgis_fixes/fix_qfiledialog.py diff --git a/scripts/qgis_fixes/fix_qfiledialog.py b/scripts/qgis_fixes/fix_qfiledialog.py new file mode 100644 index 00000000000..0163f33dab3 --- /dev/null +++ b/scripts/qgis_fixes/fix_qfiledialog.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +""" +Migrate QFileDialog methods from PyQt4 to PyQt5 +""" +# Author: Médéric Ribreux +# Adapted from fix_pyqt +# and http://python3porting.com/fixers.html + +# Local imports +from lib2to3.fixer_base import BaseFix +from lib2to3.fixer_util import Name, Call + +class FixQfiledialog(BaseFix): + + PATTERN = """ + power< 'QFileDialog' trailer< '.' filter=('getOpenFileNameAndFilter'|'getOpenFileNamesAndFilter'|'getSaveFileNameAndFilter') > any > + | + expr_stmt< filename=any '=' power< any trailer< '(' power< 'QFileDialog' trailer< '.' method=('getOpenFileName'|'getOpenFileNames'|'getSaveFileName') > any > ')' > > > + | + expr_stmt< filename=any '=' power< 'QFileDialog' trailer< '.' method=('getOpenFileName'|'getOpenFileNames'|'getSaveFileName') > any > > + """ + + def transform(self, node, results): + # First case: getOpen/SaveFileName + # We need to add __ variable because in PyQt5 + # getOpen/SaveFileName returns a tuple + if 'filename' in results: + node = results['filename'] + + # count number of leaves (result variables) + nbLeaves = sum(1 for i in node.leaves()) + + # If we have less than two args, + # we add __ special variable + if nbLeaves < 3: + fileName = node.value + node.value = u'{}, __'.format(fileName) + node.changed() + + # Rename *AndFilter methods + if 'filter' in results: + method = results['filter'][0] + method.value = method.value.replace(u'AndFilter', u'') + method.changed() + +