Merged with default to track recent development. multi_processing

Sun, 05 Jul 2020 11:11:24 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 05 Jul 2020 11:11:24 +0200
branch
multi_processing
changeset 7646
39e3db2b4936
parent 7627
812ee8c0a91a (current diff)
parent 7645
ed93cf844e1c (diff)
child 7802
eefe954f01e8

Merged with default to track recent development.

eric6.e4p file | annotate | diff | comparison | revisions
eric6/DebugClients/Python/AsyncFile.py file | annotate | diff | comparison | revisions
eric6/DebugClients/Python/DebugBase.py file | annotate | diff | comparison | revisions
eric6/DebugClients/Python/DebugClient.py file | annotate | diff | comparison | revisions
eric6/DebugClients/Python/DebugClientBase.py file | annotate | diff | comparison | revisions
eric6/DebugClients/Python/DebugUtilities.py file | annotate | diff | comparison | revisions
eric6/DebugClients/Python/ModuleLoader.py file | annotate | diff | comparison | revisions
eric6/DebugClients/Python/MultiProcessDebugExtension.py file | annotate | diff | comparison | revisions
eric6/DebugClients/Python/MultiprocessingExtension.py file | annotate | diff | comparison | revisions
eric6/DebugClients/Python/ThreadExtension.py file | annotate | diff | comparison | revisions
eric6/Debugger/DebugServer.py file | annotate | diff | comparison | revisions
eric6/Debugger/DebugUI.py file | annotate | diff | comparison | revisions
eric6/Debugger/DebuggerInterfacePython.py file | annotate | diff | comparison | revisions
eric6/Debugger/VariablesViewer.py file | annotate | diff | comparison | revisions
eric6/Documentation/Help/source.qch file | annotate | diff | comparison | revisions
eric6/Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
eric6/Preferences/__init__.py file | annotate | diff | comparison | revisions
eric6/UI/UserInterface.py file | annotate | diff | comparison | revisions
eric6/Utilities/BackgroundClient.py file | annotate | diff | comparison | revisions
--- a/docs/changelog	Wed Jun 17 17:14:12 2020 +0200
+++ b/docs/changelog	Sun Jul 05 11:11:24 2020 +0200
@@ -2,11 +2,15 @@
 ----------
 Version 20.7:
 - bug fixes
+- General
+  - removed support for Python2
+  - removed support for Qt4 (PyQt4 and pyside)
 - pip Interface
   -- added menu action for pip cache management
 - Code Style Checker
   -- changed the dialog to allow the selection of checker categories
   -- added several security related checks (ported from bandit)
+  -- extended the dialog to show a list of files still to be checked
   -- updated pycodestyle to version 2.6.0
 - Syntax Checker
   -- updated pyflakes to version 2.2.0
--- a/eric6.e4p	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6.e4p	Sun Jul 05 11:11:24 2020 +0200
@@ -711,7 +711,6 @@
     <Source>eric6/Preferences/ConfigurationPages/CooperationPage.py</Source>
     <Source>eric6/Preferences/ConfigurationPages/CorbaPage.py</Source>
     <Source>eric6/Preferences/ConfigurationPages/DebuggerGeneralPage.py</Source>
-    <Source>eric6/Preferences/ConfigurationPages/DebuggerPython2Page.py</Source>
     <Source>eric6/Preferences/ConfigurationPages/DebuggerPython3Page.py</Source>
     <Source>eric6/Preferences/ConfigurationPages/DiffColoursPage.py</Source>
     <Source>eric6/Preferences/ConfigurationPages/EditorAPIsPage.py</Source>
@@ -1878,7 +1877,6 @@
     <Form>eric6/Preferences/ConfigurationPages/CooperationPage.ui</Form>
     <Form>eric6/Preferences/ConfigurationPages/CorbaPage.ui</Form>
     <Form>eric6/Preferences/ConfigurationPages/DebuggerGeneralPage.ui</Form>
-    <Form>eric6/Preferences/ConfigurationPages/DebuggerPython2Page.ui</Form>
     <Form>eric6/Preferences/ConfigurationPages/DebuggerPython3Page.ui</Form>
     <Form>eric6/Preferences/ConfigurationPages/DiffColoursPage.ui</Form>
     <Form>eric6/Preferences/ConfigurationPages/EditorAPIsPage.ui</Form>
@@ -2119,6 +2117,9 @@
     <Other>eric6/APIs/MicroPython/circuitpython.api</Other>
     <Other>eric6/APIs/MicroPython/microbit.api</Other>
     <Other>eric6/APIs/MicroPython/micropython.api</Other>
+    <Other>eric6/APIs/Python/zope-2.10.7.api</Other>
+    <Other>eric6/APIs/Python/zope-2.11.2.api</Other>
+    <Other>eric6/APIs/Python/zope-3.3.1.api</Other>
     <Other>eric6/APIs/Python3/PyQt4.bas</Other>
     <Other>eric6/APIs/Python3/PyQt5.bas</Other>
     <Other>eric6/APIs/Python3/PyQtChart.bas</Other>
@@ -2126,9 +2127,6 @@
     <Other>eric6/APIs/Python3/QScintilla2.bas</Other>
     <Other>eric6/APIs/Python3/eric6.api</Other>
     <Other>eric6/APIs/Python3/eric6.bas</Other>
-    <Other>eric6/APIs/Python/zope-2.10.7.api</Other>
-    <Other>eric6/APIs/Python/zope-2.11.2.api</Other>
-    <Other>eric6/APIs/Python/zope-3.3.1.api</Other>
     <Other>eric6/APIs/QSS/qss.api</Other>
     <Other>eric6/APIs/Ruby/Ruby-1.8.7.api</Other>
     <Other>eric6/APIs/Ruby/Ruby-1.8.7.bas</Other>
@@ -2875,6 +2873,91 @@
               <bool>True</bool>
             </value>
             <key>
+              <string>SecurityChecker</string>
+            </key>
+            <value>
+              <dict>
+                <key>
+                  <string>CheckTypedException</string>
+                </key>
+                <value>
+                  <bool>False</bool>
+                </value>
+                <key>
+                  <string>HardcodedTmpDirectories</string>
+                </key>
+                <value>
+                  <list>
+                    <string>/tmp</string>
+                    <string>/var/tmp</string>
+                    <string>/dev/shm</string>
+                    <string>~/tmp</string>
+                  </list>
+                </value>
+                <key>
+                  <string>InsecureHashes</string>
+                </key>
+                <value>
+                  <list>
+                    <string>md4</string>
+                    <string>md5</string>
+                    <string>sha</string>
+                    <string>sha1</string>
+                  </list>
+                </value>
+                <key>
+                  <string>InsecureSslProtocolVersions</string>
+                </key>
+                <value>
+                  <list>
+                    <string>PROTOCOL_SSLv2</string>
+                    <string>SSLv2_METHOD</string>
+                    <string>SSLv23_METHOD</string>
+                    <string>PROTOCOL_SSLv3</string>
+                    <string>PROTOCOL_TLSv1</string>
+                    <string>SSLv3_METHOD</string>
+                    <string>TLSv1_METHOD</string>
+                  </list>
+                </value>
+                <key>
+                  <string>WeakKeySizeDsaHigh</string>
+                </key>
+                <value>
+                  <string>1024</string>
+                </value>
+                <key>
+                  <string>WeakKeySizeDsaMedium</string>
+                </key>
+                <value>
+                  <string>2048</string>
+                </value>
+                <key>
+                  <string>WeakKeySizeEcHigh</string>
+                </key>
+                <value>
+                  <string>160</string>
+                </value>
+                <key>
+                  <string>WeakKeySizeEcMedium</string>
+                </key>
+                <value>
+                  <string>224</string>
+                </value>
+                <key>
+                  <string>WeakKeySizeRsaHigh</string>
+                </key>
+                <value>
+                  <string>1024</string>
+                </value>
+                <key>
+                  <string>WeakKeySizeRsaMedium</string>
+                </key>
+                <value>
+                  <string>2048</string>
+                </value>
+              </dict>
+            </value>
+            <key>
               <string>ShowIgnored</string>
             </key>
             <value>
--- a/eric6/APIs/Python3/eric6.api	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/APIs/Python3/eric6.api	Sun Jul 05 11:11:24 2020 +0200
@@ -298,10 +298,9 @@
 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.getCoding?4()
 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.getRunning?4()
 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.handleJsonCommand?4(jsonStr)
-eric6.DebugClients.Python.DebugClientBase.DebugClientBase.input?4(prompt)
+eric6.DebugClients.Python.DebugClientBase.DebugClientBase.input?4(prompt, echo=True)
 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.main?4()
 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.progTerminated?4(status, message="")
-eric6.DebugClients.Python.DebugClientBase.DebugClientBase.raw_input?4(prompt, echo)
 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.readReady?4(stream)
 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.run_call?4(scriptname, func, *args)
 eric6.DebugClients.Python.DebugClientBase.DebugClientBase.sendCallTrace?4(event, fromInfo, toInfo)
@@ -321,7 +320,6 @@
 eric6.DebugClients.Python.DebugClientBase.DebugClientFork?4()
 eric6.DebugClients.Python.DebugClientBase.DebugClientInput?4(prompt="")
 eric6.DebugClients.Python.DebugClientBase.DebugClientInstance?7
-eric6.DebugClients.Python.DebugClientBase.DebugClientRawInput?4(prompt="", echo=True)
 eric6.DebugClients.Python.DebugClientBase.DebugClientSetRecursionLimit?4(limit)
 eric6.DebugClients.Python.DebugClientCapabilities.HasAll?7
 eric6.DebugClients.Python.DebugClientCapabilities.HasCompleter?7
@@ -399,7 +397,6 @@
 eric6.DebugClients.Python.ThreadExtension.ThreadExtension.unlockClient?4()
 eric6.DebugClients.Python.ThreadExtension.ThreadExtension.updateThreadList?4()
 eric6.DebugClients.Python.ThreadExtension.ThreadExtension?1()
-eric6.DebugClients.Python.ThreadExtension.ThreadWrapper.timer?7
 eric6.DebugClients.Python.ThreadExtension.ThreadWrapper?1(*args, **kwargs)
 eric6.DebugClients.Python.ThreadExtension.TimerWrapper?1(interval, function, *args, **kwargs)
 eric6.DebugClients.Python.ThreadExtension._qtThreadNumber?8
@@ -718,8 +715,7 @@
 eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.shutdown?4()
 eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.startRemote?4(port, runInConsole, venvName, originalPathString, workingDir=None)
 eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython.startRemoteForProject?4(port, runInConsole, venvName, originalPathString, workingDir=None)
-eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython?1(debugServer, passive, pythonVariant)
-eric6.Debugger.DebuggerInterfacePython.createDebuggerInterfacePython2?4(debugServer, passive)
+eric6.Debugger.DebuggerInterfacePython.DebuggerInterfacePython?1(debugServer, passive)
 eric6.Debugger.DebuggerInterfacePython.createDebuggerInterfacePython3?4(debugServer, passive)
 eric6.Debugger.DebuggerInterfacePython.getRegistryData?4()
 eric6.Debugger.EditBreakpointDialog.EditBreakpointDialog.getAddData?4()
@@ -1843,7 +1839,7 @@
 eric6.Globals.toDict?4(value)
 eric6.Globals.toList?4(value)
 eric6.Globals.translate?4(*args)
-eric6.Globals.versionToTuple?4(version)
+eric6.Globals.versionToTuple?4(version, length=3)
 eric6.Graphics.ApplicationDiagramBuilder.ApplicationDiagramBuilder.buildDiagram?4()
 eric6.Graphics.ApplicationDiagramBuilder.ApplicationDiagramBuilder.getPersistenceData?4()
 eric6.Graphics.ApplicationDiagramBuilder.ApplicationDiagramBuilder.parsePersistenceData?4(version, data)
@@ -2963,6 +2959,7 @@
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_addBuiltinButton_clicked?4()
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_builtinsAssignmentList_itemSelectionChanged?4()
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_buttonBox_clicked?4(button)
+eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_cancelButton_clicked?4()
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_deleteBuiltinButton_clicked?4()
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_excludeMessagesSelectButton_clicked?4()
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.on_fixButton_clicked?4()
@@ -2981,7 +2978,7 @@
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.positionRole?7
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.prepare?4(fileList, project)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog.start?4(fn, save=False, repeat=None)
-eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog?1(styleCheckService, parent=None)
+eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.CodeStyleCheckerDialog?1(styleCheckService, project=None, parent=None)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCodeSelectionDialog.CodeStyleCodeSelectionDialog.getSelectedCodes?4()
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCodeSelectionDialog.CodeStyleCodeSelectionDialog?1(codes, categories, showFixCodes, parent=None)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleFixer.CodeStyleFixer.finalize?4()
@@ -3009,7 +3006,6 @@
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.ComplexityChecker.LineComplexityVisitor?1()
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.DocStyleChecker.Codes?7
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.DocStyleChecker.run?4()
-eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.DocStyleChecker.unpackArgs?4()
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.DocStyleChecker?1(source, filename, select, ignore, expected, repeat, maxLineLength=79, docType="pep257")
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.DocStyleContext.contextType?4()
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.DocStyleContext.end?4()
@@ -3081,7 +3077,6 @@
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.NamingStyleChecker.NamingStyleChecker.MixedcaseRegexp?7
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.NamingStyleChecker.NamingStyleChecker.UppercaseRegexp?7
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.NamingStyleChecker.NamingStyleChecker.run?4()
-eric6.Plugins.CheckerPlugins.CodeStyleChecker.NamingStyleChecker.NamingStyleChecker.unpackArgs?4()
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.NamingStyleChecker.NamingStyleChecker?1(tree, filename, options)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.Security.Checks.assert.checkAssertUsed?4(reportError, context, config)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.Security.Checks.assert.getChecks?4()
@@ -3109,7 +3104,6 @@
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.Security.Checks.djangoXssVulnerability.DeepAssignation.isAssigned?4(node)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.Security.Checks.djangoXssVulnerability.DeepAssignation.isAssignedIn?4(items)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.Security.Checks.djangoXssVulnerability.DeepAssignation?1(varName, ignoreNodes=None)
-eric6.Plugins.CheckerPlugins.CodeStyleChecker.Security.Checks.djangoXssVulnerability.PY2?7
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.Security.Checks.djangoXssVulnerability.checkDjangoXssVulnerability?4(reportError, context, config)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.Security.Checks.djangoXssVulnerability.checkPotentialRisk?4(reportError, node)
 eric6.Plugins.CheckerPlugins.CodeStyleChecker.Security.Checks.djangoXssVulnerability.evaluateCall?4(call, parent, ignoreNodes=None)
@@ -3431,7 +3425,6 @@
 eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.SyntaxCheckService.removeLanguage?4(lang)
 eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.SyntaxCheckService.serviceErrorJSON?4(fx, lang, fn, msg)
 eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.SyntaxCheckService.serviceErrorJavaScript?4(fx, lang, fn, msg)
-eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.SyntaxCheckService.serviceErrorPy2?4(fx, lang, fn, msg)
 eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.SyntaxCheckService.serviceErrorPy3?4(fx, lang, fn, msg)
 eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.SyntaxCheckService.serviceErrorYAML?4(fx, lang, fn, msg)
 eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.SyntaxCheckService.syntaxBatchCheck?4(argumentsList)
@@ -3554,7 +3547,6 @@
 eric6.Plugins.PluginCodeStyleChecker.CodeStyleCheckerPlugin.cancelStyleBatchCheck?4()
 eric6.Plugins.PluginCodeStyleChecker.CodeStyleCheckerPlugin.deactivate?4()
 eric6.Plugins.PluginCodeStyleChecker.CodeStyleCheckerPlugin.error?7
-eric6.Plugins.PluginCodeStyleChecker.CodeStyleCheckerPlugin.serviceErrorPy2?4(fx, lang, fn, msg)
 eric6.Plugins.PluginCodeStyleChecker.CodeStyleCheckerPlugin.serviceErrorPy3?4(fx, lang, fn, msg)
 eric6.Plugins.PluginCodeStyleChecker.CodeStyleCheckerPlugin.styleBatchCheck?4(argumentsList)
 eric6.Plugins.PluginCodeStyleChecker.CodeStyleCheckerPlugin.styleCheck?4(lang, filename, source, args)
@@ -3624,7 +3616,6 @@
 eric6.Plugins.PluginTabnanny.TabnannyPlugin.indentBatchCheck?4(argumentsList)
 eric6.Plugins.PluginTabnanny.TabnannyPlugin.indentCheck?4(lang, filename, source)
 eric6.Plugins.PluginTabnanny.TabnannyPlugin.indentChecked?7
-eric6.Plugins.PluginTabnanny.TabnannyPlugin.serviceErrorPy2?4(fx, lang, fn, msg)
 eric6.Plugins.PluginTabnanny.TabnannyPlugin.serviceErrorPy3?4(fx, lang, fn, msg)
 eric6.Plugins.PluginTabnanny.TabnannyPlugin?1(ui)
 eric6.Plugins.PluginTabnanny.author?7
@@ -6247,11 +6238,6 @@
 eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel.setColor?4(key, bgcolour)
 eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.PreviewModel?1()
 eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.create?4(dlg)
-eric6.Preferences.ConfigurationPages.DebuggerPython2Page.DebuggerPython2Page.on_refreshButton_clicked?4()
-eric6.Preferences.ConfigurationPages.DebuggerPython2Page.DebuggerPython2Page.on_venvDlgButton_clicked?4()
-eric6.Preferences.ConfigurationPages.DebuggerPython2Page.DebuggerPython2Page.save?4()
-eric6.Preferences.ConfigurationPages.DebuggerPython2Page.DebuggerPython2Page?1()
-eric6.Preferences.ConfigurationPages.DebuggerPython2Page.create?4(dlg)
 eric6.Preferences.ConfigurationPages.DebuggerPython3Page.DebuggerPython3Page.on_refreshButton_clicked?4()
 eric6.Preferences.ConfigurationPages.DebuggerPython3Page.DebuggerPython3Page.on_venvDlgButton_clicked?4()
 eric6.Preferences.ConfigurationPages.DebuggerPython3Page.DebuggerPython3Page.save?4()
@@ -6740,7 +6726,6 @@
 eric6.Preferences.getProjectBrowserFlags?4(key, prefClass=Prefs)
 eric6.Preferences.getProtobuf?4(key, prefClass=Prefs)
 eric6.Preferences.getPython?4(key, prefClass=Prefs)
-eric6.Preferences.getQt4DocDir?4(prefClass=Prefs)
 eric6.Preferences.getQt5DocDir?4(prefClass=Prefs)
 eric6.Preferences.getQt?4(key, prefClass=Prefs)
 eric6.Preferences.getQtTranslationsDir?4(prefClass=Prefs)
@@ -6998,7 +6983,6 @@
 eric6.Project.Project.Project.isProjectProtocol?4(fn)
 eric6.Project.Project.Project.isProjectResource?4(fn)
 eric6.Project.Project.Project.isProjectSource?4(fn)
-eric6.Project.Project.Project.isPy2Project?4()
 eric6.Project.Project.Project.isPy3Project?4()
 eric6.Project.Project.Project.isPythonProject?4()
 eric6.Project.Project.Project.isRubyProject?4()
@@ -8748,7 +8732,6 @@
 eric6.UI.BrowserModel.BrowserFileItem.isPixmapFile?4()
 eric6.UI.BrowserModel.BrowserFileItem.isProjectFile?4()
 eric6.UI.BrowserModel.BrowserFileItem.isProtobufFile?4()
-eric6.UI.BrowserModel.BrowserFileItem.isPython2File?4()
 eric6.UI.BrowserModel.BrowserFileItem.isPython3File?4()
 eric6.UI.BrowserModel.BrowserFileItem.isResourcesFile?4()
 eric6.UI.BrowserModel.BrowserFileItem.isRubyFile?4()
@@ -9821,7 +9804,7 @@
 eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog.on_pythonExecPicker_textChanged?4(txt)
 eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog.on_remoteCheckBox_toggled?4(checked)
 eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog.on_targetDirectoryPicker_textChanged?4(txt)
-eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog?1(manager, venvName="", venvDirectory="", venvInterpreter="", venvVariant=3, isGlobal=False, isConda=False, isRemote=False, execPath="", parent=None)
+eric6.VirtualEnv.VirtualenvAddEditDialog.VirtualenvAddEditDialog?1(manager, venvName="", venvDirectory="", venvInterpreter="", isGlobal=False, isConda=False, isRemote=False, execPath="", parent=None)
 eric6.VirtualEnv.VirtualenvConfigurationDialog.VirtualenvConfigurationDialog.getData?4()
 eric6.VirtualEnv.VirtualenvConfigurationDialog.VirtualenvConfigurationDialog.on_condaButton_toggled?4(checked)
 eric6.VirtualEnv.VirtualenvConfigurationDialog.VirtualenvConfigurationDialog.on_condaCloneButton_clicked?4()
@@ -9844,7 +9827,7 @@
 eric6.VirtualEnv.VirtualenvInterpreterSelectionDialog.VirtualenvInterpreterSelectionDialog.on_pythonExecPicker_textChanged?4(txt)
 eric6.VirtualEnv.VirtualenvInterpreterSelectionDialog.VirtualenvInterpreterSelectionDialog?1(venvName, venvDirectory, parent=None)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.DefaultKey?7
-eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.addVirtualEnv?4(venvName, venvDirectory, venvInterpreter="", venvVariant=3, isGlobal=False, isConda=False, isRemote=False, execPath="")
+eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.addVirtualEnv?4(venvName, venvDirectory, venvInterpreter="", isGlobal=False, isConda=False, isRemote=False, execPath="")
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.createVirtualEnv?4()
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.deleteVirtualEnvs?4(venvNames)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getDefaultEnvironment?4()
@@ -9853,15 +9836,13 @@
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getVirtualenvExecPath?4(venvName)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getVirtualenvInterpreter?4(venvName)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getVirtualenvNames?4(noRemote=False)
-eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getVirtualenvNamesForVariant?4(variant)
-eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.getVirtualenvVariant?4(venvName)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.isCondaEnvironment?4(venvName)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.isGlobalEnvironment?4(venvName)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.isRemoteEnvironment?4(venvName)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.isUnique?4(venvName)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.removeVirtualEnvs?4(venvNames)
-eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.renameVirtualEnv?4(oldVenvName, venvName, venvDirectory, venvInterpreter, venvVariant, isGlobal, isConda, isRemote, execPath)
-eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.setVirtualEnv?4(venvName, venvDirectory, venvInterpreter, venvVariant, isGlobal, isConda, isRemote, execPath)
+eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.renameVirtualEnv?4(oldVenvName, venvName, venvDirectory, venvInterpreter, isGlobal, isConda, isRemote, execPath)
+eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.setVirtualEnv?4(venvName, venvDirectory, venvInterpreter, isGlobal, isConda, isRemote, execPath)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.showVirtualenvManagerDialog?4(modal=False)
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.shutdown?4()
 eric6.VirtualEnv.VirtualenvManager.VirtualenvManager.virtualEnvironmentAdded?7
--- a/eric6/APIs/Python3/eric6.bas	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/APIs/Python3/eric6.bas	Sun Jul 05 11:11:24 2020 +0200
@@ -132,7 +132,6 @@
 DebuggerPropertiesDialog QDialog Ui_DebuggerPropertiesDialog
 DebuggerPropertiesReader XMLStreamReaderBase
 DebuggerPropertiesWriter XMLStreamWriterBase
-DebuggerPython2Page ConfigurationPageBase Ui_DebuggerPython2Page
 DebuggerPython3Page ConfigurationPageBase Ui_DebuggerPython3Page
 DeepLEngine TranslationEngine
 DefaultResolver BaseResolver
--- a/eric6/CodeTemplates/impl_pyqt.py.tmpl	Wed Jun 17 17:14:12 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-Module implementing $CLASSNAME$.
-"""
-
-from PyQt4.QtCore import pyqtSlot
-from PyQt4.QtGui import $SUPERCLASS$
-
-from .Ui_$FORMFILE$ import Ui_$FORMCLASS$
-
-
-class $CLASSNAME$($SUPERCLASS$, Ui_$FORMCLASS$):
-    """
-    Class documentation goes here.
-    """
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent widget
-        @type QWidget
-        """
-        super($CLASSNAME$, self).__init__(parent)
-        self.setupUi(self)
--- a/eric6/CodeTemplates/impl_pyqt.py2.tmpl	Wed Jun 17 17:14:12 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-Module implementing $CLASSNAME$.
-"""
-
-from PyQt4.QtCore import pyqtSignature
-from PyQt4.QtGui import $SUPERCLASS$
-
-from .Ui_$FORMFILE$ import Ui_$FORMCLASS$
-
-
-class $CLASSNAME$($SUPERCLASS$, Ui_$FORMCLASS$):
-    """
-    Class documentation goes here.
-    """
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent widget
-        @type QWidget
-        """
-        $SUPERCLASS$.__init__(self, parent)
-        self.setupUi(self)
--- a/eric6/CodeTemplates/impl_pyqt5.py2.tmpl	Wed Jun 17 17:14:12 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-Module implementing $CLASSNAME$.
-"""
-
-from PyQt5.QtCore import pyqtSlot
-from PyQt5.QtWidgets import $SUPERCLASS$
-
-from .Ui_$FORMFILE$ import Ui_$FORMCLASS$
-
-
-class $CLASSNAME$($SUPERCLASS$, Ui_$FORMCLASS$):
-    """
-    Class documentation goes here.
-    """
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent widget
-        @type QWidget
-        """
-        super($CLASSNAME$, self).__init__(parent)
-        self.setupUi(self)
--- a/eric6/CodeTemplates/impl_pyside.py.tmpl	Wed Jun 17 17:14:12 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-Module implementing $CLASSNAME$.
-"""
-
-from PySide.QtCore import Slot
-from PySide.QtGui import $SUPERCLASS$
-
-from .Ui_$FORMFILE$ import Ui_$FORMCLASS$
-
-
-class $CLASSNAME$($SUPERCLASS$, Ui_$FORMCLASS$):
-    """
-    Class documentation goes here.
-    """
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent widget
-        @type QWidget
-        """
-        $SUPERCLASS$.__init__(self, parent)
-        self.setupUi(self)
--- a/eric6/CodeTemplates/impl_pyside.py2.tmpl	Wed Jun 17 17:14:12 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-Module implementing $CLASSNAME$.
-"""
-
-from PySide.QtCore import Slot
-from PySide.QtGui import $SUPERCLASS$
-
-from .Ui_$FORMFILE$ import Ui_$FORMCLASS$
-
-
-class $CLASSNAME$($SUPERCLASS$, Ui_$FORMCLASS$):
-    """
-    Class documentation goes here.
-    """
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent widget
-        @type QWidget
-        """
-        $SUPERCLASS$.__init__(self, parent)
-        self.setupUi(self)
--- a/eric6/CodeTemplates/impl_pyside2.py2.tmpl	Wed Jun 17 17:14:12 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""
-Module implementing $CLASSNAME$.
-"""
-
-from PySide2.QtCore import Slot
-from PySide2.QtWidgets import $SUPERCLASS$
-
-from .Ui_$FORMFILE$ import Ui_$FORMCLASS$
-
-
-class $CLASSNAME$($SUPERCLASS$, Ui_$FORMCLASS$):
-    """
-    Class documentation goes here.
-    """
-    def __init__(self, parent=None):
-        """
-        Constructor
-        
-        @param parent reference to the parent widget
-        @type QWidget
-        """
-        super($CLASSNAME$, self).__init__(parent)
-        self.setupUi(self)
--- a/eric6/CondaInterface/Conda.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/CondaInterface/Conda.py	Sun Jul 05 11:11:24 2020 +0200
@@ -597,7 +597,7 @@
                 try:
                     packages = json.loads(output)
                     ok = "error" not in packages
-                except Exception:
+                except Exception:       # secok
                     # return values for errors is already set
                     pass
         
--- a/eric6/DataViews/PyProfileDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DataViews/PyProfileDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -9,7 +9,7 @@
 
 
 import os
-import pickle
+import pickle       # secok
 
 from PyQt5.QtCore import Qt
 from PyQt5.QtWidgets import (
@@ -242,7 +242,7 @@
             return
         try:
             f = open(fname, 'rb')
-            self.stats = pickle.load(f)
+            self.stats = pickle.load(f)     # secok
             f.close()
         except (EnvironmentError, pickle.PickleError, EOFError):
             E5MessageBox.critical(
--- a/eric6/DebugClients/Python/AsyncFile.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/AsyncFile.py	Sun Jul 05 11:11:24 2020 +0200
@@ -12,12 +12,6 @@
 
 from DebugUtilities import prepareJsonCommand
 
-try:
-    unicode
-except NameError:
-    unicode = str
-    raw_input = input
-
 
 def AsyncPendingWrite(file):
     """
@@ -180,7 +174,7 @@
         """
         self.__checkMode('r')
 
-        buf = raw_input()
+        buf = input()
         if size >= 0:
             buf = buf[:size]
         return buf
@@ -278,7 +272,7 @@
         """
         self.__checkMode('r')
 
-        line = raw_input() + '\n'
+        line = input() + '\n'
         if sizehint >= 0:
             line = line[:sizehint]
         return line
@@ -370,6 +364,3 @@
         @type list of str
         """
         self.write("".join(lines))
-
-#
-# eflag: noqa = M702
--- a/eric6/DebugClients/Python/BreakpointWatch.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/BreakpointWatch.py	Sun Jul 05 11:11:24 2020 +0200
@@ -162,7 +162,7 @@
             # Ignore count applies only to those bpt hits where the
             # condition evaluates to true.
             try:
-                val = eval(b.cond, frame.f_globals, frame.f_locals)
+                val = eval(b.cond, frame.f_globals, frame.f_locals)     # secok
                 if val:
                     if b.ignore > 0:
                         b.ignore -= 1
@@ -295,6 +295,7 @@
                 continue
             try:
                 val = eval(b.compiledCond, frame.f_globals, frame.f_locals)
+                # secok
                 if b.created:
                     if frame in b.values:
                         continue
@@ -323,10 +324,6 @@
                         continue
                     else:
                         return (b, True)
-            except Exception:
+            except Exception:       # secok
                 continue
         return (None, False)
-
-
-#
-# eflag: noqa = M702
--- a/eric6/DebugClients/Python/DCTestResult.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/DCTestResult.py	Sun Jul 05 11:11:24 2020 +0200
@@ -128,6 +128,3 @@
 
         if self.__dbgClient.readstream in rrdy:
             self.__dbgClient.readReady(self.__dbgClient.readstream)
-
-#
-# eflag: noqa = M702
--- a/eric6/DebugClients/Python/DebugBase.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/DebugBase.py	Sun Jul 05 11:11:24 2020 +0200
@@ -17,14 +17,8 @@
 
 from BreakpointWatch import Breakpoint, Watch
 
-if sys.version_info[0] == 2:
-    import thread as _thread
-    from inspect import getargvalues, formatargvalues
-else:
-    import _thread
-    from DebugUtilities import getargvalues, formatargvalues
-    unicode = str
-    basestring = str
+import _thread
+from DebugUtilities import getargvalues, formatargvalues
 
 gRecursionLimit = 64
 
@@ -169,7 +163,7 @@
                 import __pypy__
                 __pypy__.locals_to_fast(cf)
                 return
-        except Exception:
+        except Exception:       # secok
             pass
         
         ctypes.pythonapi.PyFrame_LocalsToFast(
@@ -383,10 +377,7 @@
         if frame is None:
             frame = sys._getframe().f_back  # Skip set_trace method
         
-        if sys.version_info[0] == 2:
-            stopOnHandleCommand = self._dbgClient.handleJsonCommand.func_code
-        else:
-            stopOnHandleCommand = self._dbgClient.handleJsonCommand.__code__
+        stopOnHandleCommand = self._dbgClient.handleJsonCommand.__code__
         
         frame.f_trace = self.trace_dispatch
         while frame.f_back is not None:
@@ -461,7 +452,7 @@
             sys.settrace(self.trace_dispatch)
         
         try:
-            exec(cmd, globalsDict, localsDict)
+            exec(cmd, globalsDict, localsDict)      # secok
             atexit._run_exitfuncs()
             self._dbgClient.progTerminated(0)
             exitcode = 0
@@ -626,10 +617,7 @@
             lineNo = frame.f_code.co_firstlineno
             lineNumbers = [lineNo]
             
-            if sys.version_info[0] == 2:
-                co_lnotab = map(ord, frame.f_code.co_lnotab[1::2])
-            else:
-                co_lnotab = frame.f_code.co_lnotab[1::2]
+            co_lnotab = frame.f_code.co_lnotab[1::2]
             
             # No need to handle special case if a lot of lines between
             # (e.g. closure), because the additional lines won't cause a bp
@@ -816,7 +804,6 @@
         
         if exctype in [SyntaxError, IndentationError]:
             try:
-                # tuple could only occure on Python 2, but not always!
                 if type(excval) == tuple:
                     message, details = excval
                     filename, lineno, charno, text = details
@@ -877,13 +864,7 @@
         else:
             exctypetxt = str(exctype)
         
-        if sys.version_info[0] == 2:
-            try:
-                excvaltxt = unicode(excval).encode(self._dbgClient.getCoding())
-            except UnicodeError:
-                excvaltxt = str(excval)
-        else:
-            excvaltxt = str(excval)
+        excvaltxt = str(excval)
         
         # Don't step into libraries, which are used by our debugger methods
         if exctb is not None:
@@ -931,14 +912,7 @@
         @param exctype type of the exception
         @return exception name (string)
         """
-        if sys.version_info[0] == 2:
-            if type(exctype) in [types.ClassType,   # Python up to 2.4
-                                 types.TypeType]:   # Python 2.5+
-                return exctype.__name__
-            else:
-                return exctype
-        else:
-            return exctype.__name__
+        return str(exctype).replace("<class '", "").replace("'>", "")
     
     def __extract_stack(self, exctb):
         """
@@ -968,7 +942,7 @@
         if excval is None:
             exitcode = 0
             message = ""
-        elif isinstance(excval, basestring):
+        elif isinstance(excval, str):
             exitcode = 1
             message = excval
         elif isinstance(excval, bytes):
@@ -979,7 +953,7 @@
             message = ""
         elif isinstance(excval, SystemExit):
             code = excval.code
-            if isinstance(code, basestring):
+            if isinstance(code, str):
                 exitcode = 1
                 message = code
             elif isinstance(code, bytes):
@@ -1060,6 +1034,3 @@
         except AttributeError:
             # if frame is None
             return True
-    
-#
-# eflag: noqa = M702
--- a/eric6/DebugClients/Python/DebugClient.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/DebugClient.py	Sun Jul 05 11:11:24 2020 +0200
@@ -34,6 +34,3 @@
 if __name__ == '__main__':
     debugClient = DebugClient()
     debugClient.main()
-
-#
-# eflag: noqa = M702
--- a/eric6/DebugClients/Python/DebugClientBase.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/DebugClientBase.py	Sun Jul 05 11:11:24 2020 +0200
@@ -35,40 +35,16 @@
 from BreakpointWatch import Breakpoint, Watch
 ##from MultiProcessDebugExtension import patchNewProcessFunctions
 
-if sys.version_info[0] == 2:
-    from inspect import getargvalues, formatargvalues
-else:
-    unichr = chr
-    from DebugUtilities import getargvalues, formatargvalues
+from DebugUtilities import getargvalues, formatargvalues
 
 DebugClientInstance = None
 
 ###############################################################################
 
 
-def DebugClientRawInput(prompt="", echo=True):
-    """
-    Replacement for the standard raw_input() builtin (Python 2) and
-    the standard input() builtin (Python 3).
-    
-    This function works with the split debugger.
-    
-    @param prompt prompt to be shown
-    @type str
-    @param echo flag indicating echoing of the input
-    @type bool
-    @return result of the raw_input()/input() call
-    @rtype str
-    """
-    if DebugClientInstance is None or not DebugClientInstance.redirect:
-        return DebugClientOrigRawInput(prompt)
-
-    return DebugClientInstance.raw_input(prompt, echo)
-
-
 def DebugClientInput(prompt=""):
     """
-    Replacement for the standard input() builtin (Python 2).
+    Replacement for the standard input() builtin.
     
     This function works with the split debugger.
     
@@ -82,39 +58,14 @@
 
     return DebugClientInstance.input(prompt)
 
-# Use our own input() and on Python 2 raw_input().
-if sys.version_info[0] == 2:
-    try:
-        DebugClientOrigRawInput = __builtins__.__dict__['raw_input']
-        __builtins__.__dict__['raw_input'] = DebugClientRawInput
-    except (AttributeError, KeyError):
-        try:
-            import __main__
-            DebugClientOrigRawInput = __main__.__builtins__.__dict__[
-                'raw_input'
-            ]
-            __main__.__builtins__.__dict__['raw_input'] = DebugClientRawInput
-        except (AttributeError, KeyError):
-            DebugClientOrigRawInput = lambda x: ''  # __IGNORE_WARNING__
-
-    try:
-        DebugClientOrigInput = __builtins__.__dict__['input']
-        __builtins__.__dict__['input'] = DebugClientInput
-    except (AttributeError, KeyError):
-        try:
-            import __main__
-            DebugClientOrigInput = __main__.__builtins__.__dict__['input']
-            __main__.__builtins__.__dict__['input'] = DebugClientInput
-        except (AttributeError, KeyError):
-            DebugClientOrigInput = lambda x: ''  # __IGNORE_WARNING__
-else:
-    try:
-        DebugClientOrigInput = __builtins__.__dict__['input']
-        __builtins__.__dict__['input'] = DebugClientRawInput
-    except (AttributeError, KeyError):
-        import __main__
-        DebugClientOrigInput = __main__.__builtins__.__dict__['input']
-        __main__.__builtins__.__dict__['input'] = DebugClientRawInput
+# Use our own input().
+try:
+    DebugClientOrigInput = __builtins__.__dict__['input']
+    __builtins__.__dict__['input'] = DebugClientInput
+except (AttributeError, KeyError):
+    import __main__
+    DebugClientOrigInput = __main__.__builtins__.__dict__['input']
+    __main__.__builtins__.__dict__['input'] = DebugClientInput
 
 ###############################################################################
 
@@ -293,9 +244,9 @@
                     return
             self.__coding = default
         
-    def raw_input(self, prompt, echo):
+    def input(self, prompt, echo=True):
         """
-        Public method to implement raw_input() / input() using the event loop.
+        Public method to implement input() using the event loop.
         
         @param prompt the prompt to be shown (string)
         @param echo Flag indicating echoing of the input (boolean)
@@ -308,15 +259,6 @@
         self.eventLoop(True)
         return self.rawLine
 
-    def input(self, prompt):
-        """
-        Public method to implement input() (Python 2) using the event loop.
-        
-        @param prompt the prompt to be shown (string)
-        @return the entered string evaluated as a Python expresion
-        """
-        return eval(self.raw_input(prompt, True))
-        
     def sessionClose(self, terminate=True):
         """
         Public method to close the session with the debugger and optionally
@@ -326,7 +268,7 @@
         """
         try:
             self.set_quit()
-        except Exception:
+        except Exception:       # secok
             pass
 
         self.debugging = False
@@ -355,13 +297,6 @@
         with codecs.open(filename, encoding=self.__coding) as fp:
             statement = fp.read()
         
-        if sys.version_info[0] == 2:
-            lines = statement.splitlines(True)
-            for lineno, line in enumerate(lines[:2]):
-                lines[lineno] = self.coding_re.sub('', line)
-
-            statement = unicode('').join(lines)  # __IGNORE_WARNING__
-        
         try:
             code = compile(statement + '\n', filename, mode)
         except SyntaxError:
@@ -403,9 +338,6 @@
         
         method = commandDict["method"]
         params = commandDict["params"]
-        if "filename" in params and sys.version_info[0] == 2:
-            params["filename"] = params["filename"].encode(
-                sys.getfilesystemencoding())
         
         if method == "RequestVariables":
             self.__dumpVariables(
@@ -441,7 +373,7 @@
                 })
         
         elif method == "RequestCapabilities":
-            clientType = "Python2" if sys.version_info[0] == 2 else "Python3"
+            clientType = "Python3"
             self.sendJsonCommand("ResponseCapabilities", {
                 "capabilities": self.__clientCapabilities(),
                 "clientType": clientType
@@ -616,13 +548,10 @@
             self.debugMod.__dict__['__file__'] = sys.argv[0]
             sys.modules['__main__'] = self.debugMod
             script = ''
-            if sys.version_info[0] == 2:
-                script = 'execfile({0!r})'.format(sys.argv[0])
-            else:
-                with codecs.open(sys.argv[0], encoding=self.__coding) as fp:
-                    script = fp.read()
-                if script and not script.endswith('\n'):
-                    script += '\n'
+            with codecs.open(sys.argv[0], encoding=self.__coding) as fp:
+                script = fp.read()
+            if script and not script.endswith('\n'):
+                script += '\n'
             
             if script:
                 self.running = sys.argv[0]
@@ -666,7 +595,7 @@
 
                     try:
                         if self.running is None:
-                            exec(code, self.debugMod.__dict__)
+                            exec(code, self.debugMod.__dict__)      # secok
                         else:
                             if self.currentThread is None:
                                 # program has terminated
@@ -694,15 +623,15 @@
                             if "sys" in _globals:
                                 __stdout = _globals["sys"].stdout
                                 _globals["sys"].stdout = self.writestream
-                                exec(code, _globals, _locals)
+                                exec(code, _globals, _locals)       # secok
                                 _globals["sys"].stdout = __stdout
                             elif "sys" in _locals:
                                 __stdout = _locals["sys"].stdout
                                 _locals["sys"].stdout = self.writestream
-                                exec(code, _globals, _locals)
+                                exec(code, _globals, _locals)       # secok
                                 _locals["sys"].stdout = __stdout
                             else:
-                                exec(code, _globals, _locals)
+                                exec(code, _globals, _locals)       # secok
                             
                             self.currentThread.storeFrameLocals(self.framenr)
                     except SystemExit as exc:
@@ -1447,9 +1376,6 @@
         @return the converted filename (string)
         """
         if os.path.isabs(fn):
-            if sys.version_info[0] == 2:
-                fn = fn.decode(sys.getfilesystemencoding())
-            
             return fn
 
         # Check the cache.
@@ -1462,9 +1388,6 @@
             nafn = os.path.normcase(afn)
 
             if os.path.exists(nafn):
-                if sys.version_info[0] == 2:
-                    afn = afn.decode(sys.getfilesystemencoding())
-                
                 self._fncache[fn] = afn
                 d = os.path.dirname(afn)
                 if (d not in sys.path) and (d not in self.dircache):
@@ -1671,7 +1594,7 @@
         
     def __formatQtVariable(self, value, qttype):
         """
-        Private method to produce a formatted output of a simple Qt4/Qt5 type.
+        Private method to produce a formatted output of a simple Qt5 type.
         
         @param value variable to be formatted
         @param qttype type of the Qt variable to be formatted (string)
@@ -1682,7 +1605,7 @@
         varlist = []
         if qttype == 'QChar':
             varlist.append(
-                ("", "QChar", "{0}".format(unichr(value.unicode()))))
+                ("", "QChar", "{0}".format(chr(value.unicode()))))
             varlist.append(("", "int", "{0:d}".format(value.unicode())))
         elif qttype == 'QByteArray':
             varlist.append(
@@ -1875,7 +1798,7 @@
             
             # special handling for '__builtins__' (it's way too big)
             if key == '__builtins__':
-                rvalue = '<module __builtin__ (built-in)>'
+                rvalue = '<module builtins (built-in)>'
                 valtype = 'module'
                 if ConfigVarTypeStrings.index(valtype) in filterList:
                     continue
@@ -2415,6 +2338,3 @@
         sysPath.insert(0, firstEntry)
         sysPath.insert(0, '')
         return sysPath
-
-#
-# eflag: noqa = M702
--- a/eric6/DebugClients/Python/DebugClientCapabilities.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/DebugClientCapabilities.py	Sun Jul 05 11:11:24 2020 +0200
@@ -17,6 +17,3 @@
 
 HasAll = (HasDebugger | HasInterpreter | HasProfiler |
           HasCoverage | HasCompleter | HasUnittest | HasShell)
-
-#
-# eflag: noqa = M702
--- a/eric6/DebugClients/Python/DebugConfig.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/DebugConfig.py	Sun Jul 05 11:11:24 2020 +0200
@@ -19,14 +19,11 @@
     'method', 'property', 'generator',
     'function', 'builtin_function_or_method', 'code', 'module',
     'ellipsis', 'traceback', 'frame', 'other', 'frozenset', 'bytes',
-    # Special case for Python 2: don't add 'instancemethod' to
-    # ConfigVarTypeFilters and leave it always at last position
-    'instancemethod'
 ]
 
 BatchSize = 200
 ConfigQtNames = (
-    'PyQt5.', 'PyQt4.', 'PySide2.', 'PySide.', 'Shiboken.EnumType'
+    'PyQt5.', 'PySide2.', 'Shiboken.EnumType'
 )
 ConfigKnownQtTypes = (
     '.QChar', '.QByteArray', '.QString', '.QStringList', '.QPoint', '.QPointF',
@@ -36,6 +33,3 @@
     '.QDomComment', '.QDomDocument', '.QDomElement', '.QDomText',
     '.QHostAddress', '.EnumType'
 )
-
-#
-# eflag: noqa = M702
--- a/eric6/DebugClients/Python/DebugUtilities.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/DebugUtilities.py	Sun Jul 05 11:11:24 2020 +0200
@@ -320,6 +320,3 @@
     modifiedArguments.extend(args)
     
     return modifiedArguments
-
-#
-# eflag: noqa = M702
--- a/eric6/DebugClients/Python/DebugVariables.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/DebugVariables.py	Sun Jul 05 11:11:24 2020 +0200
@@ -7,17 +7,12 @@
 Module implementing classes and functions to dump variable contents.
 """
 
-import sys
-
 from DebugConfig import ConfigQtNames, ConfigKnownQtTypes, BatchSize
 
 #
 # This code was inspired by pydevd.
 #
 
-if sys.version_info[0] > 2:
-    basestring = str
-
 ############################################################
 ## Classes implementing resolvers for various compund types
 ############################################################
@@ -58,7 +53,7 @@
             try:
                 attribute = getattr(var, name)
                 d[name] = attribute
-            except Exception:
+            except Exception:       # secok
                 pass    # if we can't get it, simply ignore it
         
         return d
@@ -91,7 +86,7 @@
             try:
                 attribute = getattr(var, name)
                 d[name] = attribute
-            except Exception:
+            except Exception:       # secok
                 pass    # if we can't get it, simply ignore it
         
         yield -1, d
@@ -141,7 +136,7 @@
         @return string representation of the given key
         @rtype str
         """
-        if isinstance(key, basestring):
+        if isinstance(key, str):
             key = repr(key)
             # Special handling for Python2 unicode strings and bytes object
             # Raw and f-Strings are always converted to (unicode) str
@@ -653,12 +648,12 @@
     
     try:
         _TypeMap.append((long, None))           # __IGNORE_WARNING__
-    except Exception:
+    except Exception:       # secok
         pass    # not available on all Python versions
 
     try:
         _TypeMap.append((unicode, None))        # __IGNORE_WARNING__
-    except Exception:
+    except Exception:       # secok
         pass    # not available on all Python versions
 
     try:
@@ -720,6 +715,3 @@
             resolver = defaultResolver
     
     return typeName, typeStr, resolver
-
-#
-# eflag: noqa = M702
--- a/eric6/DebugClients/Python/FlexCompleter.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/FlexCompleter.py	Sun Jul 05 11:11:24 2020 +0200
@@ -48,11 +48,7 @@
     </ul>
 """
 
-try:
-    import __builtin__ as builtins
-except ImportError:
-    import builtins
-
+import builtins
 import __main__
 
 __all__ = ["Completer"]
@@ -151,7 +147,7 @@
                                   'else'}:
                     word = word + ' '
                 matches.append(word)
-        for nspace in [builtins.__dict__, self.namespace]:
+        for nspace in [self.namespace, builtins.__dict__]:
             for word, val in nspace.items():
                 if word[:n] == text and word not in seen:
                     seen.add(word)
@@ -180,7 +176,7 @@
             return []
         expr, attr = m.group(1, 3)
         try:
-            thisobject = eval(expr, self.namespace)
+            thisobject = eval(expr, self.namespace)     # secok
         except Exception:
             return []
 
@@ -206,7 +202,7 @@
                     match = "{0}.{1}".format(expr, word)
                     try:
                         val = getattr(thisobject, word)
-                    except Exception:
+                    except Exception:       # secok
                         pass  # Include even if attribute not set
                     else:
                         match = self._callable_postfix(val, match)
@@ -235,4 +231,4 @@
     return ret
 
 #
-# eflag: noqa = M702, M111
+# eflag: noqa = M111
--- a/eric6/DebugClients/Python/ModuleLoader.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/ModuleLoader.py	Sun Jul 05 11:11:24 2020 +0200
@@ -40,8 +40,8 @@
             'greenlet',
             'subprocess',
             'multiprocessing',
-            'PyQt4.QtCore', 'PyQt5.QtCore',
-            'PySide.QtCore', 'PySide2.QtCore',
+            'PyQt5.QtCore',
+            'PySide2.QtCore',
         )
         
         sys.meta_path.insert(0, self)
@@ -100,8 +100,7 @@
         
         ## Add hook for *.QThread and *.QProcess
         elif (
-            fullname in ('PyQt4.QtCore', 'PyQt5.QtCore',
-                         'PySide.QtCore', 'PySide2.QtCore') and
+            fullname in ('PyQt5.QtCore', 'PySide2.QtCore') and
             not hasattr(module, 'eric6_patched')
         ):
             module.eric6_patched = True
--- a/eric6/DebugClients/Python/MultiProcessDebugExtension.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/MultiProcessDebugExtension.py	Sun Jul 05 11:11:24 2020 +0200
@@ -61,6 +61,7 @@
         return getattr(os, originalName)(path, *args)
     return newExecl
 
+
 def patchNewProcessFunctions(multiprocessEnabled, debugClient):
     """
     Function to patch the process creation functions to support multiprocess
--- a/eric6/DebugClients/Python/MultiprocessingExtension.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/MultiprocessingExtension.py	Sun Jul 05 11:11:24 2020 +0200
@@ -16,7 +16,6 @@
 _originalBootstrap = None
 
 
-
 def patchMultiprocessing(module, debugClient):
     """
     Function to patch the multiprocessing module.
@@ -66,6 +65,7 @@
                     )
                 except Exception:
                     print("Exception during multiprocessing bootstrap init:")
+                    # __IGNORE_WARNING_M801__
                     traceback.print_exc(file=sys.stdout)
                     sys.stdout.flush()
                     raise
--- a/eric6/DebugClients/Python/PyProfile.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/PyProfile.py	Sun Jul 05 11:11:24 2020 +0200
@@ -11,7 +11,6 @@
 import profile
 import atexit
 import pickle
-import sys
 
 
 class PyProfile(profile.Profile):
@@ -54,10 +53,10 @@
         
         try:
             cache = open(self.timingCache, 'rb')
-            timings = marshal.load(cache)
+            timings = marshal.load(cache)       # secok
             if isinstance(timings, dict):
                 self.timings = timings
-        except Exception:
+        except (EnvironmentError, EOFError, ValueError, TypeError):
             pass
         finally:
             cache.close()
@@ -70,7 +69,7 @@
         try:
             cache = open(self.timingCache, 'wb')
             marshal.dump(self.timings, cache)
-        except Exception:
+        except EnvironmentError:
             pass
         finally:
             cache.close()
@@ -87,7 +86,7 @@
         try:
             f = open(file, 'wb')
             self.create_stats()
-            pickle.dump(self.stats, f, 2)
+            pickle.dump(self.stats, f, 4)
         except (EnvironmentError, pickle.PickleError):
             pass
         finally:
@@ -119,10 +118,7 @@
         @param frame the frame object
         @return fixed up file name (string)
         """
-        if sys.version_info[0] == 2:
-            versionExt = '.py2'
-        else:
-            versionExt = '.py3'
+        versionExt = '.py3'
         
         # get module name from __file__
         if (not isinstance(frame, profile.Profile.fake_frame) and
@@ -154,10 +150,11 @@
             rpt, rit, ret, rfn, rframe, rcur = self.cur
             if not isinstance(rframe, profile.Profile.fake_frame):
                 assert rframe.f_back is frame.f_back, ("Bad call", rfn,
+                # secok
                                                        rframe, rframe.f_back,
                                                        frame, frame.f_back)
                 self.trace_dispatch_return(rframe, 0)
-                assert (self.cur is None or
+                assert (self.cur is None or                            # secok
                         frame.f_back is self.cur[-2]), ("Bad call",
                                                         self.cur[-3])
         fcode = frame.f_code
@@ -181,6 +178,3 @@
         # the C function returned
         "c_return": profile.Profile.trace_dispatch_return,
     }
-
-#
-# eflag: noqa = M702
--- a/eric6/DebugClients/Python/ThreadExtension.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/ThreadExtension.py	Sun Jul 05 11:11:24 2020 +0200
@@ -10,11 +10,7 @@
 import os
 import sys
 
-if sys.version_info[0] == 2:
-    import thread as _thread
-else:
-    import _thread
-
+import _thread
 import threading
 
 from DebugBase import DebugBase
@@ -310,10 +306,7 @@
         module.Thread = ThreadWrapper
         
         # Special handling of threading.(_)Timer
-        if sys.version_info[0] == 2:
-            timer = module._Timer
-        else:
-            timer = module.Timer
+        timer = module.Timer
             
         class TimerWrapper(timer, ThreadWrapper):
             """
@@ -326,10 +319,7 @@
                 super(TimerWrapper, self).__init__(
                     interval, function, *args, **kwargs)
         
-        if sys.version_info[0] == 2:
-            module._Timer = TimerWrapper
-        else:
-            module.Timer = TimerWrapper
+        module.Timer = TimerWrapper
     
         # Special handling of threading._DummyThread
         class DummyThreadWrapper(module._DummyThread, ThreadWrapper):
@@ -422,6 +412,3 @@
         
         module.QThread = QThreadWrapper
         module.QRunnable = QRunnableWrapper
-
-#
-# eflag: noqa = M702
--- a/eric6/DebugClients/Python/eric6dbgstub.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/eric6dbgstub.py	Sun Jul 05 11:11:24 2020 +0200
@@ -85,6 +85,3 @@
     if debugger:
         debugger.startDebugger(enableTrace=enableTrace, exceptions=exceptions,
                                tracePython=tracePython, redirect=redirect)
-
-#
-# eflag: noqa = M702
--- a/eric6/DebugClients/Python/getpass.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DebugClients/Python/getpass.py	Sun Jul 05 11:11:24 2020 +0200
@@ -49,13 +49,10 @@
     @return Password entered by the user
     @rtype str
     """
-    return input(prompt, False)
+    return input(prompt, False)     # secok
     
 
 unix_getpass = getpass
 win_getpass = getpass
 default_getpass = getpass
 fallback_getpass = getpass
-
-#
-# eflag: noqa = M702
--- a/eric6/Debugger/Config.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Debugger/Config.py	Sun Jul 05 11:11:24 2020 +0200
@@ -11,8 +11,6 @@
 from PyQt5.QtCore import QT_TRANSLATE_NOOP
 
 # Variables type definition
-# Special case for Python 2: don't add 'instancemethod'. It's renamed to
-# 'method' in DebugClientBase.py to be identical to Python 3
 ConfigVarTypeDispStrings = {
     '__': QT_TRANSLATE_NOOP('Variable Types', 'Hidden Attributes'),
     'NoneType': QT_TRANSLATE_NOOP('Variable Types', 'None'),
@@ -61,7 +59,7 @@
     'float': 6,
     'complex': 7,
     'str': 8,
-    'unicode': 9,
+    'unicode': 9,  # Not used anymore but keep to avoid reassignment
     'tuple': 10,
     'list': 11,
     'dict': 12,
--- a/eric6/Debugger/DebugClientCapabilities.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Debugger/DebugClientCapabilities.py	Sun Jul 05 11:11:24 2020 +0200
@@ -17,6 +17,3 @@
 
 HasAll = (HasDebugger | HasInterpreter | HasProfiler |
           HasCoverage | HasCompleter | HasUnittest | HasShell)
-
-#
-# eflag: noqa = M702
--- a/eric6/Debugger/DebugServer.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Debugger/DebugServer.py	Sun Jul 05 11:11:24 2020 +0200
@@ -9,7 +9,6 @@
 
 
 import os
-import sys
 
 from PyQt5.QtCore import pyqtSignal, pyqtSlot, QModelIndex
 from PyQt5.QtNetwork import (
@@ -201,7 +200,7 @@
         
         self.networkInterface = Preferences.getDebugger("NetworkInterface")
         if self.networkInterface == "all":
-            hostAddress = QHostAddress("0.0.0.0")  # QHostAddress.Any)
+            hostAddress = QHostAddress("0.0.0.0")  # QHostAddress.Any)  # secok
         elif self.networkInterface == "allv6":
             hostAddress = QHostAddress("::")  # QHostAddress.AnyIPv6)
         else:
@@ -229,14 +228,6 @@
         self.clientType = Preferences.Prefs.settings.value('DebugClient/Type')
         if self.clientType is None:
             self.clientType = 'Python3'
-        # Change clientType if dependent interpreter does not exist anymore
-        # (maybe deinstalled,...)
-        elif self.clientType == 'Python2' and Preferences.getDebugger(
-                "Python2VirtualEnv") == '' and sys.version_info[0] >= 3:
-            self.clientType = 'Python3'
-        elif self.clientType == 'Python3' and Preferences.getDebugger(
-                "Python3VirtualEnv") == '' and sys.version_info[0] == 2:
-            self.clientType = 'Python2'
         
         self.lastClientType = ''
         self.__autoClearShell = False
--- a/eric6/Debugger/DebugUI.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Debugger/DebugUI.py	Sun Jul 05 11:11:24 2020 +0200
@@ -834,9 +834,7 @@
                     cap = self.debugServer.getClientCapabilities(language)
                     break
             else:
-                if editor.isPy2File():
-                    cap = self.debugServer.getClientCapabilities('Python2')
-                elif editor.isPy3File():
+                if editor.isPy3File():
                     cap = self.debugServer.getClientCapabilities('Python3')
                 elif editor.isRubyFile():
                     cap = self.debugServer.getClientCapabilities('Ruby')
--- a/eric6/Debugger/DebuggerInterfacePython.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Debugger/DebuggerInterfacePython.py	Sun Jul 05 11:11:24 2020 +0200
@@ -33,10 +33,10 @@
 
 class DebuggerInterfacePython(QObject):
     """
-    Class implementing the debugger interface for the debug server for Python 2
-    and Python 3.
+    Class implementing the debugger interface for the debug server for
+    Python 3.
     """
-    def __init__(self, debugServer, passive, pythonVariant):
+    def __init__(self, debugServer, passive):
         """
         Constructor
         
@@ -44,8 +44,6 @@
         @type DebugServer
         @param passive flag indicating passive connection mode
         @type bool
-        @param pythonVariant Python variant to instantiate for
-        @type str (one of Python2 or Python3)
         """
         super(DebuggerInterfacePython, self).__init__()
         
@@ -56,7 +54,6 @@
         self.debugServer = debugServer
         self.passive = passive
         self.process = None
-        self.__variant = pythonVariant
         self.__startedVenv = ""
         
         self.queue = []
@@ -180,15 +177,11 @@
         global origPathEnv
         
         if not venvName:
-            if self.__variant == "Python2":
-                venvName = Preferences.getDebugger("Python2VirtualEnv")
-            else:
-                venvName = Preferences.getDebugger("Python3VirtualEnv")
+            venvName = Preferences.getDebugger("Python3VirtualEnv")
         venvManager = e5App().getObject("VirtualEnvManager")
         interpreter = venvManager.getVirtualenvInterpreter(venvName)
         execPath = venvManager.getVirtualenvExecPath(venvName)
-        if (interpreter == "" and
-                int(self.__variant[-1]) == sys.version_info[0]):
+        if interpreter == "":
             # use the interpreter used to run eric for identical variants
             interpreter = sys.executable.replace("w.exe", ".exe")
         if interpreter == "":
@@ -196,36 +189,25 @@
                 None,
                 self.tr("Start Debugger"),
                 self.tr(
-                    """<p>No suitable {0} environment configured.</p>""")
-                .format(self.__variant))
+                    """<p>No suitable Python3 environment configured.</p>""")
+            )
             return None, False, ""
         
-        if self.__variant == "Python2":
-            debugClientType = Preferences.getDebugger("DebugClientType")
-        else:
-            debugClientType = Preferences.getDebugger("DebugClientType3")
+        debugClientType = Preferences.getDebugger("DebugClientType3")
         if debugClientType == "standard":
             debugClient = os.path.join(getConfig('ericDir'),
                                        "DebugClients", "Python",
                                        "DebugClient.py")
         else:
-            if self.__variant == "Python2":
-                debugClient = Preferences.getDebugger("DebugClient")
-            else:
-                debugClient = Preferences.getDebugger("DebugClient3")
+            debugClient = Preferences.getDebugger("DebugClient3")
             if debugClient == "":
                 debugClient = os.path.join(sys.path[0],
                                            "DebugClients", "Python",
                                            "DebugClient.py")
         
-        if self.__variant == "Python2":
-            redirect = str(Preferences.getDebugger("PythonRedirect"))
-            noencoding = (Preferences.getDebugger("PythonNoEncoding") and
-                          '--no-encoding' or '')
-        else:
-            redirect = str(Preferences.getDebugger("Python3Redirect"))
-            noencoding = (Preferences.getDebugger("Python3NoEncoding") and
-                          '--no-encoding' or '')
+        redirect = str(Preferences.getDebugger("Python3Redirect"))
+        noencoding = (Preferences.getDebugger("Python3NoEncoding") and
+                      '--no-encoding' or '')
         multiprocessEnabled = (
             '--multiprocess' if Preferences.getDebugger("MultiProcessEnabled")
             else ''
@@ -378,9 +360,7 @@
         if not venvName:
             venvName = project.getDebugProperty("VIRTUALENV")
         if not venvName:
-            if project.getProjectLanguage() == "Python2":
-                venvName = Preferences.getDebugger("Python2VirtualEnv")
-            elif project.getProjectLanguage() == "Python3":
+            if project.getProjectLanguage() == "Python3":
                 venvName = Preferences.getDebugger("Python3VirtualEnv")
         
         redirect = str(project.getDebugProperty("REDIRECT"))
@@ -395,17 +375,18 @@
         venvManager = e5App().getObject("VirtualEnvManager")
         interpreter = venvManager.getVirtualenvInterpreter(venvName)
         execPath = venvManager.getVirtualenvExecPath(venvName)
-        if (interpreter == "" and
-            project.getProjectLanguage().startswith("Python") and
-                sys.version_info[0] == int(project.getProjectLanguage()[-1])):
+        if (
+            interpreter == "" and
+            project.getProjectLanguage().startswith("Python")
+        ):
             interpreter = sys.executable.replace("w.exe", ".exe")
         if interpreter == "":
             E5MessageBox.critical(
                 None,
                 self.tr("Start Debugger"),
                 self.tr(
-                    """<p>No suitable {0} environment configured.</p>""")
-                .format(self.__variant))
+                    """<p>No suitable Python3 environment configured.</p>""")
+            )
             return None, self.__isNetworked, ""
         
         if project.getDebugProperty("REMOTEDEBUGGER"):
@@ -1624,21 +1605,6 @@
         sock.flush()
 
 
-def createDebuggerInterfacePython2(debugServer, passive):
-    """
-    Module function to create a debugger interface instance.
-    
-        
-    @param debugServer reference to the debug server
-    @type DebugServer
-    @param passive flag indicating passive connection mode
-    @type bool
-    @return instantiated debugger interface
-    @rtype DebuggerInterfacePython
-    """
-    return DebuggerInterfacePython(debugServer, passive, "Python2")
-    
-
 def createDebuggerInterfacePython3(debugServer, passive):
     """
     Module function to create a debugger interface instance.
@@ -1651,7 +1617,7 @@
     @return instantiated debugger interface
     @rtype DebuggerInterfacePython
     """
-    return DebuggerInterfacePython(debugServer, passive, "Python3")
+    return DebuggerInterfacePython(debugServer, passive)
 
 
 def getRegistryData():
@@ -1664,13 +1630,6 @@
         function
     @rtype list of tuple of (str, int, list of str, function)
     """
-    py2Exts = []
-    for ext in Preferences.getDebugger("PythonExtensions").split():
-        if ext.startswith("."):
-            py2Exts.append(ext)
-        else:
-            py2Exts.append(".{0}".format(ext))
-    
     py3Exts = []
     for ext in Preferences.getDebugger("Python3Extensions").split():
         if ext.startswith("."):
@@ -1679,15 +1638,7 @@
             py3Exts.append(".{0}".format(ext))
     
     registryData = []
-    if py2Exts and (Preferences.getDebugger("Python2VirtualEnv") or
-                    sys.version_info[0] == 2):
-        registryData.append(
-            ("Python2", ClientDefaultCapabilities, py2Exts,
-             createDebuggerInterfacePython2)
-        )
-    
-    if py3Exts and (Preferences.getDebugger("Python3VirtualEnv") or
-                    sys.version_info[0] >= 3):
+    if py3Exts:
         registryData.append(
             ("Python3", ClientDefaultCapabilities, py3Exts,
                 createDebuggerInterfacePython3)
--- a/eric6/Debugger/VariablesViewer.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Debugger/VariablesViewer.py	Sun Jul 05 11:11:24 2020 +0200
@@ -197,12 +197,9 @@
             if VariableItem.rx_nonprintable.indexIn(dvalue) == -1:
                 try:
                     dvalue = ast.literal_eval(dvalue)
-                except Exception:
+                except Exception:       # secok
                     pass
-            try:
-                dvalue = str(dvalue)
-            except UnicodeDecodeError:  # Never reached under Python 3
-                dvalue = unicode(dvalue, 'utf-8')  # __IGNORE_WARNING__
+            dvalue = str(dvalue)
         
         self.value = dvalue
         
Binary file eric6/Documentation/Help/source.qch has changed
--- a/eric6/Documentation/Help/source.qhp	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Help/source.qhp	Sun Jul 05 11:11:24 2020 +0200
@@ -735,7 +735,6 @@
               <section title="eric6.Preferences.ConfigurationPages.CooperationPage" ref="eric6.Preferences.ConfigurationPages.CooperationPage.html" />
               <section title="eric6.Preferences.ConfigurationPages.CorbaPage" ref="eric6.Preferences.ConfigurationPages.CorbaPage.html" />
               <section title="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html" />
-              <section title="eric6.Preferences.ConfigurationPages.DebuggerPython2Page" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html" />
               <section title="eric6.Preferences.ConfigurationPages.DebuggerPython3Page" ref="eric6.Preferences.ConfigurationPages.DebuggerPython3Page.html" />
               <section title="eric6.Preferences.ConfigurationPages.DiffColoursPage" ref="eric6.Preferences.ConfigurationPages.DiffColoursPage.html" />
               <section title="eric6.Preferences.ConfigurationPages.EditorAPIsPage" ref="eric6.Preferences.ConfigurationPages.EditorAPIsPage.html" />
@@ -2183,7 +2182,6 @@
       <keyword name="BrowserFileItem.isPixmapFile" id="BrowserFileItem.isPixmapFile" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isPixmapFile" />
       <keyword name="BrowserFileItem.isProjectFile" id="BrowserFileItem.isProjectFile" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isProjectFile" />
       <keyword name="BrowserFileItem.isProtobufFile" id="BrowserFileItem.isProtobufFile" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isProtobufFile" />
-      <keyword name="BrowserFileItem.isPython2File" id="BrowserFileItem.isPython2File" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isPython2File" />
       <keyword name="BrowserFileItem.isPython3File" id="BrowserFileItem.isPython3File" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isPython3File" />
       <keyword name="BrowserFileItem.isResourcesFile" id="BrowserFileItem.isResourcesFile" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isResourcesFile" />
       <keyword name="BrowserFileItem.isRubyFile" id="BrowserFileItem.isRubyFile" ref="eric6.UI.BrowserModel.html#BrowserFileItem.isRubyFile" />
@@ -2550,18 +2548,21 @@
       <keyword name="CodeStyleCheckerDialog.__itemFixable" id="CodeStyleCheckerDialog.__itemFixable" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.__itemFixable" />
       <keyword name="CodeStyleCheckerDialog.__modifyFixedResultItem" id="CodeStyleCheckerDialog.__modifyFixedResultItem" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.__modifyFixedResultItem" />
       <keyword name="CodeStyleCheckerDialog.__modifyOptions" id="CodeStyleCheckerDialog.__modifyOptions" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.__modifyOptions" />
+      <keyword name="CodeStyleCheckerDialog.__prepareProgress" id="CodeStyleCheckerDialog.__prepareProgress" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.__prepareProgress" />
       <keyword name="CodeStyleCheckerDialog.__processError" id="CodeStyleCheckerDialog.__processError" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.__processError" />
       <keyword name="CodeStyleCheckerDialog.__processResult" id="CodeStyleCheckerDialog.__processResult" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.__processResult" />
       <keyword name="CodeStyleCheckerDialog.__resetStatistics" id="CodeStyleCheckerDialog.__resetStatistics" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.__resetStatistics" />
       <keyword name="CodeStyleCheckerDialog.__resort" id="CodeStyleCheckerDialog.__resort" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.__resort" />
       <keyword name="CodeStyleCheckerDialog.__selectCodes" id="CodeStyleCheckerDialog.__selectCodes" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.__selectCodes" />
       <keyword name="CodeStyleCheckerDialog.__updateFixerStatistics" id="CodeStyleCheckerDialog.__updateFixerStatistics" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.__updateFixerStatistics" />
+      <keyword name="CodeStyleCheckerDialog.__updateProgress" id="CodeStyleCheckerDialog.__updateProgress" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.__updateProgress" />
       <keyword name="CodeStyleCheckerDialog.__updateStatistics" id="CodeStyleCheckerDialog.__updateStatistics" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.__updateStatistics" />
       <keyword name="CodeStyleCheckerDialog.check" id="CodeStyleCheckerDialog.check" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.check" />
       <keyword name="CodeStyleCheckerDialog.checkBatch" id="CodeStyleCheckerDialog.checkBatch" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.checkBatch" />
       <keyword name="CodeStyleCheckerDialog.on_addBuiltinButton_clicked" id="CodeStyleCheckerDialog.on_addBuiltinButton_clicked" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.on_addBuiltinButton_clicked" />
       <keyword name="CodeStyleCheckerDialog.on_builtinsAssignmentList_itemSelectionChanged" id="CodeStyleCheckerDialog.on_builtinsAssignmentList_itemSelectionChanged" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.on_builtinsAssignmentList_itemSelectionChanged" />
       <keyword name="CodeStyleCheckerDialog.on_buttonBox_clicked" id="CodeStyleCheckerDialog.on_buttonBox_clicked" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.on_buttonBox_clicked" />
+      <keyword name="CodeStyleCheckerDialog.on_cancelButton_clicked" id="CodeStyleCheckerDialog.on_cancelButton_clicked" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.on_cancelButton_clicked" />
       <keyword name="CodeStyleCheckerDialog.on_deleteBuiltinButton_clicked" id="CodeStyleCheckerDialog.on_deleteBuiltinButton_clicked" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.on_deleteBuiltinButton_clicked" />
       <keyword name="CodeStyleCheckerDialog.on_excludeMessagesSelectButton_clicked" id="CodeStyleCheckerDialog.on_excludeMessagesSelectButton_clicked" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.on_excludeMessagesSelectButton_clicked" />
       <keyword name="CodeStyleCheckerDialog.on_fixButton_clicked" id="CodeStyleCheckerDialog.on_fixButton_clicked" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html#CodeStyleCheckerDialog.on_fixButton_clicked" />
@@ -2596,7 +2597,6 @@
       <keyword name="CodeStyleCheckerPlugin.batchJobDone" id="CodeStyleCheckerPlugin.batchJobDone" ref="eric6.Plugins.PluginCodeStyleChecker.html#CodeStyleCheckerPlugin.batchJobDone" />
       <keyword name="CodeStyleCheckerPlugin.cancelStyleBatchCheck" id="CodeStyleCheckerPlugin.cancelStyleBatchCheck" ref="eric6.Plugins.PluginCodeStyleChecker.html#CodeStyleCheckerPlugin.cancelStyleBatchCheck" />
       <keyword name="CodeStyleCheckerPlugin.deactivate" id="CodeStyleCheckerPlugin.deactivate" ref="eric6.Plugins.PluginCodeStyleChecker.html#CodeStyleCheckerPlugin.deactivate" />
-      <keyword name="CodeStyleCheckerPlugin.serviceErrorPy2" id="CodeStyleCheckerPlugin.serviceErrorPy2" ref="eric6.Plugins.PluginCodeStyleChecker.html#CodeStyleCheckerPlugin.serviceErrorPy2" />
       <keyword name="CodeStyleCheckerPlugin.serviceErrorPy3" id="CodeStyleCheckerPlugin.serviceErrorPy3" ref="eric6.Plugins.PluginCodeStyleChecker.html#CodeStyleCheckerPlugin.serviceErrorPy3" />
       <keyword name="CodeStyleCheckerPlugin.styleBatchCheck" id="CodeStyleCheckerPlugin.styleBatchCheck" ref="eric6.Plugins.PluginCodeStyleChecker.html#CodeStyleCheckerPlugin.styleBatchCheck" />
       <keyword name="CodeStyleCheckerPlugin.styleCheck" id="CodeStyleCheckerPlugin.styleCheck" ref="eric6.Plugins.PluginCodeStyleChecker.html#CodeStyleCheckerPlugin.styleCheck" />
@@ -3184,7 +3184,6 @@
       <keyword name="DebugClientBase.input" id="DebugClientBase.input" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientBase.input" />
       <keyword name="DebugClientBase.main" id="DebugClientBase.main" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientBase.main" />
       <keyword name="DebugClientBase.progTerminated" id="DebugClientBase.progTerminated" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientBase.progTerminated" />
-      <keyword name="DebugClientBase.raw_input" id="DebugClientBase.raw_input" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientBase.raw_input" />
       <keyword name="DebugClientBase.readReady" id="DebugClientBase.readReady" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientBase.readReady" />
       <keyword name="DebugClientBase.run_call" id="DebugClientBase.run_call" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientBase.run_call" />
       <keyword name="DebugClientBase.sendCallTrace" id="DebugClientBase.sendCallTrace" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientBase.sendCallTrace" />
@@ -3204,7 +3203,6 @@
       <keyword name="DebugClientClose" id="DebugClientClose" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientClose" />
       <keyword name="DebugClientFork" id="DebugClientFork" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientFork" />
       <keyword name="DebugClientInput" id="DebugClientInput" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientInput" />
-      <keyword name="DebugClientRawInput" id="DebugClientRawInput" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientRawInput" />
       <keyword name="DebugClientSetRecursionLimit" id="DebugClientSetRecursionLimit" ref="eric6.DebugClients.Python.DebugClientBase.html#DebugClientSetRecursionLimit" />
       <keyword name="DebugClients (Package)" id="DebugClients (Package)" ref="index-eric6.DebugClients.html" />
       <keyword name="DebugConfig (Module)" id="DebugConfig (Module)" ref="eric6.DebugClients.Python.DebugConfig.html" />
@@ -3538,13 +3536,6 @@
       <keyword name="DebuggerPropertiesWriter (Constructor)" id="DebuggerPropertiesWriter (Constructor)" ref="eric6.E5XML.DebuggerPropertiesWriter.html#DebuggerPropertiesWriter.__init__" />
       <keyword name="DebuggerPropertiesWriter (Module)" id="DebuggerPropertiesWriter (Module)" ref="eric6.E5XML.DebuggerPropertiesWriter.html" />
       <keyword name="DebuggerPropertiesWriter.writeXML" id="DebuggerPropertiesWriter.writeXML" ref="eric6.E5XML.DebuggerPropertiesWriter.html#DebuggerPropertiesWriter.writeXML" />
-      <keyword name="DebuggerPython2Page" id="DebuggerPython2Page" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html#DebuggerPython2Page" />
-      <keyword name="DebuggerPython2Page (Constructor)" id="DebuggerPython2Page (Constructor)" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html#DebuggerPython2Page.__init__" />
-      <keyword name="DebuggerPython2Page (Module)" id="DebuggerPython2Page (Module)" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html" />
-      <keyword name="DebuggerPython2Page.__populateAndSetVenvComboBox" id="DebuggerPython2Page.__populateAndSetVenvComboBox" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html#DebuggerPython2Page.__populateAndSetVenvComboBox" />
-      <keyword name="DebuggerPython2Page.on_refreshButton_clicked" id="DebuggerPython2Page.on_refreshButton_clicked" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html#DebuggerPython2Page.on_refreshButton_clicked" />
-      <keyword name="DebuggerPython2Page.on_venvDlgButton_clicked" id="DebuggerPython2Page.on_venvDlgButton_clicked" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html#DebuggerPython2Page.on_venvDlgButton_clicked" />
-      <keyword name="DebuggerPython2Page.save" id="DebuggerPython2Page.save" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html#DebuggerPython2Page.save" />
       <keyword name="DebuggerPython3Page" id="DebuggerPython3Page" ref="eric6.Preferences.ConfigurationPages.DebuggerPython3Page.html#DebuggerPython3Page" />
       <keyword name="DebuggerPython3Page (Constructor)" id="DebuggerPython3Page (Constructor)" ref="eric6.Preferences.ConfigurationPages.DebuggerPython3Page.html#DebuggerPython3Page.__init__" />
       <keyword name="DebuggerPython3Page (Module)" id="DebuggerPython3Page (Module)" ref="eric6.Preferences.ConfigurationPages.DebuggerPython3Page.html" />
@@ -3660,7 +3651,6 @@
       <keyword name="DocStyleChecker.__checkReturnType" id="DocStyleChecker.__checkReturnType" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleChecker.__checkReturnType" />
       <keyword name="DocStyleChecker.__checkSummary" id="DocStyleChecker.__checkSummary" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleChecker.__checkSummary" />
       <keyword name="DocStyleChecker.__checkTripleDoubleQuotes" id="DocStyleChecker.__checkTripleDoubleQuotes" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleChecker.__checkTripleDoubleQuotes" />
-      <keyword name="DocStyleChecker.__checkUnicode" id="DocStyleChecker.__checkUnicode" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleChecker.__checkUnicode" />
       <keyword name="DocStyleChecker.__error" id="DocStyleChecker.__error" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleChecker.__error" />
       <keyword name="DocStyleChecker.__getArgNames" id="DocStyleChecker.__getArgNames" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleChecker.__getArgNames" />
       <keyword name="DocStyleChecker.__getSummaryLine" id="DocStyleChecker.__getSummaryLine" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleChecker.__getSummaryLine" />
@@ -3678,7 +3668,6 @@
       <keyword name="DocStyleChecker.__resetReadline" id="DocStyleChecker.__resetReadline" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleChecker.__resetReadline" />
       <keyword name="DocStyleChecker.__skipIndentedBlock" id="DocStyleChecker.__skipIndentedBlock" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleChecker.__skipIndentedBlock" />
       <keyword name="DocStyleChecker.run" id="DocStyleChecker.run" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleChecker.run" />
-      <keyword name="DocStyleChecker.unpackArgs" id="DocStyleChecker.unpackArgs" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleChecker.unpackArgs" />
       <keyword name="DocStyleContext" id="DocStyleContext" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleContext" />
       <keyword name="DocStyleContext (Constructor)" id="DocStyleContext (Constructor)" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleContext.__init__" />
       <keyword name="DocStyleContext.contextType" id="DocStyleContext.contextType" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html#DocStyleContext.contextType" />
@@ -9879,7 +9868,6 @@
       <keyword name="MiniEditor.__getWord" id="MiniEditor.__getWord" ref="eric6.QScintilla.MiniEditor.html#MiniEditor.__getWord" />
       <keyword name="MiniEditor.__initContextMenu" id="MiniEditor.__initContextMenu" ref="eric6.QScintilla.MiniEditor.html#MiniEditor.__initContextMenu" />
       <keyword name="MiniEditor.__initContextMenuLanguages" id="MiniEditor.__initContextMenuLanguages" ref="eric6.QScintilla.MiniEditor.html#MiniEditor.__initContextMenuLanguages" />
-      <keyword name="MiniEditor.__isPy2File" id="MiniEditor.__isPy2File" ref="eric6.QScintilla.MiniEditor.html#MiniEditor.__isPy2File" />
       <keyword name="MiniEditor.__languageMenuTriggered" id="MiniEditor.__languageMenuTriggered" ref="eric6.QScintilla.MiniEditor.html#MiniEditor.__languageMenuTriggered" />
       <keyword name="MiniEditor.__loadEditorConfig" id="MiniEditor.__loadEditorConfig" ref="eric6.QScintilla.MiniEditor.html#MiniEditor.__loadEditorConfig" />
       <keyword name="MiniEditor.__loadEditorConfigObject" id="MiniEditor.__loadEditorConfigObject" ref="eric6.QScintilla.MiniEditor.html#MiniEditor.__loadEditorConfigObject" />
@@ -10166,7 +10154,6 @@
       <keyword name="NamingStyleChecker.__visitNode" id="NamingStyleChecker.__visitNode" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.NamingStyleChecker.html#NamingStyleChecker.__visitNode" />
       <keyword name="NamingStyleChecker.__visitTree" id="NamingStyleChecker.__visitTree" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.NamingStyleChecker.html#NamingStyleChecker.__visitTree" />
       <keyword name="NamingStyleChecker.run" id="NamingStyleChecker.run" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.NamingStyleChecker.html#NamingStyleChecker.run" />
-      <keyword name="NamingStyleChecker.unpackArgs" id="NamingStyleChecker.unpackArgs" ref="eric6.Plugins.CheckerPlugins.CodeStyleChecker.NamingStyleChecker.html#NamingStyleChecker.unpackArgs" />
       <keyword name="NannyNag" id="NannyNag" ref="eric6.Plugins.CheckerPlugins.Tabnanny.Tabnanny.html#NannyNag" />
       <keyword name="NannyNag (Constructor)" id="NannyNag (Constructor)" ref="eric6.Plugins.CheckerPlugins.Tabnanny.Tabnanny.html#NannyNag.__init__" />
       <keyword name="NannyNag.get_line" id="NannyNag.get_line" ref="eric6.Plugins.CheckerPlugins.Tabnanny.Tabnanny.html#NannyNag.get_line" />
@@ -10685,6 +10672,7 @@
       <keyword name="PipPackagesWidget (Module)" id="PipPackagesWidget (Module)" ref="eric6.PipInterface.PipPackagesWidget.html" />
       <keyword name="PipPackagesWidget.__aboutToShowPipMenu" id="PipPackagesWidget.__aboutToShowPipMenu" ref="eric6.PipInterface.PipPackagesWidget.html#PipPackagesWidget.__aboutToShowPipMenu" />
       <keyword name="PipPackagesWidget.__allUpdateableItems" id="PipPackagesWidget.__allUpdateableItems" ref="eric6.PipInterface.PipPackagesWidget.html#PipPackagesWidget.__allUpdateableItems" />
+      <keyword name="PipPackagesWidget.__availablePipVersion" id="PipPackagesWidget.__availablePipVersion" ref="eric6.PipInterface.PipPackagesWidget.html#PipPackagesWidget.__availablePipVersion" />
       <keyword name="PipPackagesWidget.__editConfiguration" id="PipPackagesWidget.__editConfiguration" ref="eric6.PipInterface.PipPackagesWidget.html#PipPackagesWidget.__editConfiguration" />
       <keyword name="PipPackagesWidget.__editUserConfiguration" id="PipPackagesWidget.__editUserConfiguration" ref="eric6.PipInterface.PipPackagesWidget.html#PipPackagesWidget.__editUserConfiguration" />
       <keyword name="PipPackagesWidget.__editVirtualenvConfiguration" id="PipPackagesWidget.__editVirtualenvConfiguration" ref="eric6.PipInterface.PipPackagesWidget.html#PipPackagesWidget.__editVirtualenvConfiguration" />
@@ -11298,7 +11286,6 @@
       <keyword name="Project.isProjectProtocol" id="Project.isProjectProtocol" ref="eric6.Project.Project.html#Project.isProjectProtocol" />
       <keyword name="Project.isProjectResource" id="Project.isProjectResource" ref="eric6.Project.Project.html#Project.isProjectResource" />
       <keyword name="Project.isProjectSource" id="Project.isProjectSource" ref="eric6.Project.Project.html#Project.isProjectSource" />
-      <keyword name="Project.isPy2Project" id="Project.isPy2Project" ref="eric6.Project.Project.html#Project.isPy2Project" />
       <keyword name="Project.isPy3Project" id="Project.isPy3Project" ref="eric6.Project.Project.html#Project.isPy3Project" />
       <keyword name="Project.isPythonProject" id="Project.isPythonProject" ref="eric6.Project.Project.html#Project.isPythonProject" />
       <keyword name="Project.isRubyProject" id="Project.isRubyProject" ref="eric6.Project.Project.html#Project.isRubyProject" />
@@ -14455,7 +14442,6 @@
       <keyword name="SyntaxCheckService.removeLanguage" id="SyntaxCheckService.removeLanguage" ref="eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html#SyntaxCheckService.removeLanguage" />
       <keyword name="SyntaxCheckService.serviceErrorJSON" id="SyntaxCheckService.serviceErrorJSON" ref="eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html#SyntaxCheckService.serviceErrorJSON" />
       <keyword name="SyntaxCheckService.serviceErrorJavaScript" id="SyntaxCheckService.serviceErrorJavaScript" ref="eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html#SyntaxCheckService.serviceErrorJavaScript" />
-      <keyword name="SyntaxCheckService.serviceErrorPy2" id="SyntaxCheckService.serviceErrorPy2" ref="eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html#SyntaxCheckService.serviceErrorPy2" />
       <keyword name="SyntaxCheckService.serviceErrorPy3" id="SyntaxCheckService.serviceErrorPy3" ref="eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html#SyntaxCheckService.serviceErrorPy3" />
       <keyword name="SyntaxCheckService.serviceErrorYAML" id="SyntaxCheckService.serviceErrorYAML" ref="eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html#SyntaxCheckService.serviceErrorYAML" />
       <keyword name="SyntaxCheckService.syntaxBatchCheck" id="SyntaxCheckService.syntaxBatchCheck" ref="eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html#SyntaxCheckService.syntaxBatchCheck" />
@@ -14632,7 +14618,6 @@
       <keyword name="TabnannyPlugin.deactivate" id="TabnannyPlugin.deactivate" ref="eric6.Plugins.PluginTabnanny.html#TabnannyPlugin.deactivate" />
       <keyword name="TabnannyPlugin.indentBatchCheck" id="TabnannyPlugin.indentBatchCheck" ref="eric6.Plugins.PluginTabnanny.html#TabnannyPlugin.indentBatchCheck" />
       <keyword name="TabnannyPlugin.indentCheck" id="TabnannyPlugin.indentCheck" ref="eric6.Plugins.PluginTabnanny.html#TabnannyPlugin.indentCheck" />
-      <keyword name="TabnannyPlugin.serviceErrorPy2" id="TabnannyPlugin.serviceErrorPy2" ref="eric6.Plugins.PluginTabnanny.html#TabnannyPlugin.serviceErrorPy2" />
       <keyword name="TabnannyPlugin.serviceErrorPy3" id="TabnannyPlugin.serviceErrorPy3" ref="eric6.Plugins.PluginTabnanny.html#TabnannyPlugin.serviceErrorPy3" />
       <keyword name="Tabview" id="Tabview" ref="eric6.Plugins.ViewManagerPlugins.Tabview.Tabview.html#Tabview" />
       <keyword name="Tabview (Constructor)" id="Tabview (Constructor)" ref="eric6.Plugins.ViewManagerPlugins.Tabview.Tabview.html#Tabview.__init__" />
@@ -15426,12 +15411,9 @@
       <keyword name="UserInterface.__showPluginInfo" id="UserInterface.__showPluginInfo" ref="eric6.UI.UserInterface.html#UserInterface.__showPluginInfo" />
       <keyword name="UserInterface.__showPluginToolsMenu" id="UserInterface.__showPluginToolsMenu" ref="eric6.UI.UserInterface.html#UserInterface.__showPluginToolsMenu" />
       <keyword name="UserInterface.__showPrevious" id="UserInterface.__showPrevious" ref="eric6.UI.UserInterface.html#UserInterface.__showPrevious" />
-      <keyword name="UserInterface.__showPyQt4Doc" id="UserInterface.__showPyQt4Doc" ref="eric6.UI.UserInterface.html#UserInterface.__showPyQt4Doc" />
       <keyword name="UserInterface.__showPyQt5Doc" id="UserInterface.__showPyQt5Doc" ref="eric6.UI.UserInterface.html#UserInterface.__showPyQt5Doc" />
       <keyword name="UserInterface.__showPySideDoc" id="UserInterface.__showPySideDoc" ref="eric6.UI.UserInterface.html#UserInterface.__showPySideDoc" />
-      <keyword name="UserInterface.__showPython2Doc" id="UserInterface.__showPython2Doc" ref="eric6.UI.UserInterface.html#UserInterface.__showPython2Doc" />
       <keyword name="UserInterface.__showPythonDoc" id="UserInterface.__showPythonDoc" ref="eric6.UI.UserInterface.html#UserInterface.__showPythonDoc" />
-      <keyword name="UserInterface.__showQt4Doc" id="UserInterface.__showQt4Doc" ref="eric6.UI.UserInterface.html#UserInterface.__showQt4Doc" />
       <keyword name="UserInterface.__showQt5Doc" id="UserInterface.__showQt5Doc" ref="eric6.UI.UserInterface.html#UserInterface.__showQt5Doc" />
       <keyword name="UserInterface.__showQtDoc" id="UserInterface.__showQtDoc" ref="eric6.UI.UserInterface.html#UserInterface.__showQtDoc" />
       <keyword name="UserInterface.__showSettingsMenu" id="UserInterface.__showSettingsMenu" ref="eric6.UI.UserInterface.html#UserInterface.__showSettingsMenu" />
@@ -16136,8 +16118,6 @@
       <keyword name="VirtualenvManager.getVirtualenvExecPath" id="VirtualenvManager.getVirtualenvExecPath" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.getVirtualenvExecPath" />
       <keyword name="VirtualenvManager.getVirtualenvInterpreter" id="VirtualenvManager.getVirtualenvInterpreter" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.getVirtualenvInterpreter" />
       <keyword name="VirtualenvManager.getVirtualenvNames" id="VirtualenvManager.getVirtualenvNames" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.getVirtualenvNames" />
-      <keyword name="VirtualenvManager.getVirtualenvNamesForVariant" id="VirtualenvManager.getVirtualenvNamesForVariant" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.getVirtualenvNamesForVariant" />
-      <keyword name="VirtualenvManager.getVirtualenvVariant" id="VirtualenvManager.getVirtualenvVariant" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.getVirtualenvVariant" />
       <keyword name="VirtualenvManager.isCondaEnvironment" id="VirtualenvManager.isCondaEnvironment" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.isCondaEnvironment" />
       <keyword name="VirtualenvManager.isGlobalEnvironment" id="VirtualenvManager.isGlobalEnvironment" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.isGlobalEnvironment" />
       <keyword name="VirtualenvManager.isRemoteEnvironment" id="VirtualenvManager.isRemoteEnvironment" ref="eric6.VirtualEnv.VirtualenvManager.html#VirtualenvManager.isRemoteEnvironment" />
@@ -17168,7 +17148,6 @@
       <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.CooperationPage.html#create" />
       <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.CorbaPage.html#create" />
       <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html#create" />
-      <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html#create" />
       <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.DebuggerPython3Page.html#create" />
       <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.DiffColoursPage.html#create" />
       <keyword name="create" id="create" ref="eric6.Preferences.ConfigurationPages.EditorAPIsPage.html#create" />
@@ -17232,7 +17211,6 @@
       <keyword name="createConfigurationPage" id="createConfigurationPage" ref="eric6.Plugins.PluginVcsPySvn.html#createConfigurationPage" />
       <keyword name="createConfigurationPage" id="createConfigurationPage" ref="eric6.Plugins.PluginVcsSubversion.html#createConfigurationPage" />
       <keyword name="createDebuggerInterfaceNone" id="createDebuggerInterfaceNone" ref="eric6.Debugger.DebuggerInterfaceNone.html#createDebuggerInterfaceNone" />
-      <keyword name="createDebuggerInterfacePython2" id="createDebuggerInterfacePython2" ref="eric6.Debugger.DebuggerInterfacePython.html#createDebuggerInterfacePython2" />
       <keyword name="createDebuggerInterfacePython3" id="createDebuggerInterfacePython3" ref="eric6.Debugger.DebuggerInterfacePython.html#createDebuggerInterfacePython3" />
       <keyword name="createDefaultConfig" id="createDefaultConfig" ref="eric6.Plugins.VcsPlugins.vcsPySvn.SvnUtilities.html#createDefaultConfig" />
       <keyword name="createDefaultConfig" id="createDefaultConfig" ref="eric6.Plugins.VcsPlugins.vcsSubversion.SvnUtilities.html#createDefaultConfig" />
@@ -17524,7 +17502,6 @@
       <keyword name="getPythonModulesDirectory" id="getPythonModulesDirectory" ref="eric6.Globals.__init__.html#getPythonModulesDirectory" />
       <keyword name="getPythonVersion" id="getPythonVersion" ref="eric6.Utilities.__init__.html#getPythonVersion" />
       <keyword name="getQt" id="getQt" ref="eric6.Preferences.__init__.html#getQt" />
-      <keyword name="getQt4DocDir" id="getQt4DocDir" ref="eric6.Preferences.__init__.html#getQt4DocDir" />
       <keyword name="getQt5DocDir" id="getQt5DocDir" ref="eric6.Preferences.__init__.html#getQt5DocDir" />
       <keyword name="getQtBinariesPath" id="getQtBinariesPath" ref="eric6.Globals.__init__.html#getQtBinariesPath" />
       <keyword name="getQtMacBundle" id="getQtMacBundle" ref="eric6.Utilities.__init__.html#getQtMacBundle" />
@@ -18634,7 +18611,6 @@
       <file>eric6.Preferences.ConfigurationPages.CooperationPage.html</file>
       <file>eric6.Preferences.ConfigurationPages.CorbaPage.html</file>
       <file>eric6.Preferences.ConfigurationPages.DebuggerGeneralPage.html</file>
-      <file>eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html</file>
       <file>eric6.Preferences.ConfigurationPages.DebuggerPython3Page.html</file>
       <file>eric6.Preferences.ConfigurationPages.DiffColoursPage.html</file>
       <file>eric6.Preferences.ConfigurationPages.EditorAPIsPage.html</file>
--- a/eric6/Documentation/Source/eric6.DebugClients.Python.DebugClientBase.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.DebugClients.Python.DebugClientBase.html	Sun Jul 05 11:11:24 2020 +0200
@@ -53,11 +53,7 @@
 </tr>
 <tr>
 <td><a href="#DebugClientInput">DebugClientInput</a></td>
-<td>Replacement for the standard input() builtin (Python 2).</td>
-</tr>
-<tr>
-<td><a href="#DebugClientRawInput">DebugClientRawInput</a></td>
-<td>Replacement for the standard raw_input() builtin (Python 2) and the standard input() builtin (Python 3).</td>
+<td>Replacement for the standard input() builtin.</td>
 </tr>
 <tr>
 <td><a href="#DebugClientSetRecursionLimit">DebugClientSetRecursionLimit</a></td>
@@ -140,7 +136,7 @@
 </tr>
 <tr>
 <td><a href="#DebugClientBase.__formatQtVariable">__formatQtVariable</a></td>
-<td>Private method to produce a formatted output of a simple Qt4/Qt5 type.</td>
+<td>Private method to produce a formatted output of a simple Qt5 type.</td>
 </tr>
 <tr>
 <td><a href="#DebugClientBase.__formatVariablesList">__formatVariablesList</a></td>
@@ -220,7 +216,7 @@
 </tr>
 <tr>
 <td><a href="#DebugClientBase.input">input</a></td>
-<td>Public method to implement input() (Python 2) using the event loop.</td>
+<td>Public method to implement input() using the event loop.</td>
 </tr>
 <tr>
 <td><a href="#DebugClientBase.main">main</a></td>
@@ -231,10 +227,6 @@
 <td>Public method to tell the debugger that the program has terminated.</td>
 </tr>
 <tr>
-<td><a href="#DebugClientBase.raw_input">raw_input</a></td>
-<td>Public method to implement raw_input() / input() using the event loop.</td>
-</tr>
-<tr>
 <td><a href="#DebugClientBase.readReady">readReady</a></td>
 <td>Public method called when there is data ready to be read.</td>
 </tr>
@@ -467,7 +459,7 @@
 <b>__formatQtVariable</b>(<i>value, qttype</i>)
 
 <p>
-        Private method to produce a formatted output of a simple Qt4/Qt5 type.
+        Private method to produce a formatted output of a simple Qt5 type.
 </p>
 <dl>
 
@@ -835,10 +827,10 @@
 </dl>
 <a NAME="DebugClientBase.input" ID="DebugClientBase.input"></a>
 <h4>DebugClientBase.input</h4>
-<b>input</b>(<i>prompt</i>)
+<b>input</b>(<i>prompt, echo=True</i>)
 
 <p>
-        Public method to implement input() (Python 2) using the event loop.
+        Public method to implement input() using the event loop.
 </p>
 <dl>
 
@@ -846,11 +838,15 @@
 <dd>
 the prompt to be shown (string)
 </dd>
+<dt><i>echo</i></dt>
+<dd>
+Flag indicating echoing of the input (boolean)
+</dd>
 </dl>
 <dl>
 <dt>Returns:</dt>
 <dd>
-the entered string evaluated as a Python expresion
+the entered string
 </dd>
 </dl>
 <a NAME="DebugClientBase.main" ID="DebugClientBase.main"></a>
@@ -878,30 +874,6 @@
 status message
 </dd>
 </dl>
-<a NAME="DebugClientBase.raw_input" ID="DebugClientBase.raw_input"></a>
-<h4>DebugClientBase.raw_input</h4>
-<b>raw_input</b>(<i>prompt, echo</i>)
-
-<p>
-        Public method to implement raw_input() / input() using the event loop.
-</p>
-<dl>
-
-<dt><i>prompt</i></dt>
-<dd>
-the prompt to be shown (string)
-</dd>
-<dt><i>echo</i></dt>
-<dd>
-Flag indicating echoing of the input (boolean)
-</dd>
-</dl>
-<dl>
-<dt>Returns:</dt>
-<dd>
-the entered string
-</dd>
-</dl>
 <a NAME="DebugClientBase.readReady" ID="DebugClientBase.readReady"></a>
 <h4>DebugClientBase.readReady</h4>
 <b>readReady</b>(<i>stream</i>)
@@ -1264,7 +1236,7 @@
 <b>DebugClientInput</b>(<i>prompt=""</i>)
 
 <p>
-    Replacement for the standard input() builtin (Python 2).
+    Replacement for the standard input() builtin.
 </p>
 <p>
     This function works with the split debugger.
@@ -1291,43 +1263,6 @@
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 <hr />
-<a NAME="DebugClientRawInput" ID="DebugClientRawInput"></a>
-<h2>DebugClientRawInput</h2>
-<b>DebugClientRawInput</b>(<i>prompt="", echo=True</i>)
-
-<p>
-    Replacement for the standard raw_input() builtin (Python 2) and
-    the standard input() builtin (Python 3).
-</p>
-<p>
-    This function works with the split debugger.
-</p>
-<dl>
-
-<dt><i>prompt</i> (str)</dt>
-<dd>
-prompt to be shown
-</dd>
-<dt><i>echo</i> (bool)</dt>
-<dd>
-flag indicating echoing of the input
-</dd>
-</dl>
-<dl>
-<dt>Returns:</dt>
-<dd>
-result of the raw_input()/input() call
-</dd>
-</dl>
-<dl>
-<dt>Return Type:</dt>
-<dd>
-str
-</dd>
-</dl>
-<div align="right"><a href="#top">Up</a></div>
-<hr />
-<hr />
 <a NAME="DebugClientSetRecursionLimit" ID="DebugClientSetRecursionLimit"></a>
 <h2>DebugClientSetRecursionLimit</h2>
 <b>DebugClientSetRecursionLimit</b>(<i>limit</i>)
--- a/eric6/Documentation/Source/eric6.DebugClients.Python.ThreadExtension.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.DebugClients.Python.ThreadExtension.html	Sun Jul 05 11:11:24 2020 +0200
@@ -524,7 +524,7 @@
 <h3>Class Attributes</h3>
 
 <table>
-<tr><td>timer</td></tr>
+<tr><td>None</td></tr>
 </table>
 <h3>Class Methods</h3>
 
--- a/eric6/Documentation/Source/eric6.Debugger.DebuggerInterfacePython.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Debugger.DebuggerInterfacePython.html	Sun Jul 05 11:11:24 2020 +0200
@@ -36,7 +36,7 @@
 
 <tr>
 <td><a href="#DebuggerInterfacePython">DebuggerInterfacePython</a></td>
-<td>Class implementing the debugger interface for the debug server for Python 2 and Python 3.</td>
+<td>Class implementing the debugger interface for the debug server for Python 3.</td>
 </tr>
 </table>
 <h3>Functions</h3>
@@ -44,10 +44,6 @@
 <table>
 
 <tr>
-<td><a href="#createDebuggerInterfacePython2">createDebuggerInterfacePython2</a></td>
-<td>Module function to create a debugger interface instance.</td>
-</tr>
-<tr>
 <td><a href="#createDebuggerInterfacePython3">createDebuggerInterfacePython3</a></td>
 <td>Module function to create a debugger interface instance.</td>
 </tr>
@@ -62,8 +58,8 @@
 <h2>DebuggerInterfacePython</h2>
 
 <p>
-    Class implementing the debugger interface for the debug server for Python 2
-    and Python 3.
+    Class implementing the debugger interface for the debug server for
+    Python 3.
 </p>
 <h3>Derived from</h3>
 QObject
@@ -282,7 +278,7 @@
 
 <a NAME="DebuggerInterfacePython.__init__" ID="DebuggerInterfacePython.__init__"></a>
 <h4>DebuggerInterfacePython (Constructor)</h4>
-<b>DebuggerInterfacePython</b>(<i>debugServer, passive, pythonVariant</i>)
+<b>DebuggerInterfacePython</b>(<i>debugServer, passive</i>)
 
 <p>
         Constructor
@@ -297,10 +293,6 @@
 <dd>
 flag indicating passive connection mode
 </dd>
-<dt><i>pythonVariant</i> (str (one of Python2 or Python3))</dt>
-<dd>
-Python variant to instantiate for
-</dd>
 </dl>
 <a NAME="DebuggerInterfacePython.__askForkTo" ID="DebuggerInterfacePython.__askForkTo"></a>
 <h4>DebuggerInterfacePython.__askForkTo</h4>
@@ -1224,42 +1216,6 @@
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 <hr />
-<a NAME="createDebuggerInterfacePython2" ID="createDebuggerInterfacePython2"></a>
-<h2>createDebuggerInterfacePython2</h2>
-<b>createDebuggerInterfacePython2</b>(<i>debugServer, passive</i>)
-
-<p>
-    Module function to create a debugger interface instance.
-</p>
-<p>
-
-</p>
-<dl>
-
-<dt><i>debugServer</i> (DebugServer)</dt>
-<dd>
-reference to the debug server
-</dd>
-<dt><i>passive</i> (bool)</dt>
-<dd>
-flag indicating passive connection mode
-</dd>
-</dl>
-<dl>
-<dt>Returns:</dt>
-<dd>
-instantiated debugger interface
-</dd>
-</dl>
-<dl>
-<dt>Return Type:</dt>
-<dd>
-DebuggerInterfacePython
-</dd>
-</dl>
-<div align="right"><a href="#top">Up</a></div>
-<hr />
-<hr />
 <a NAME="createDebuggerInterfacePython3" ID="createDebuggerInterfacePython3"></a>
 <h2>createDebuggerInterfacePython3</h2>
 <b>createDebuggerInterfacePython3</b>(<i>debugServer, passive</i>)
--- a/eric6/Documentation/Source/eric6.E5Gui.E5LineEdit.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.E5Gui.E5LineEdit.html	Sun Jul 05 11:11:24 2020 +0200
@@ -115,6 +115,13 @@
             (E5LineEdit.RightSide, E5LineEdit.LeftSide)
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate a bad parameter value
+</dd>
+</dl>
 <a NAME="E5ClearableLineEdit.__textChanged" ID="E5ClearableLineEdit.__textChanged"></a>
 <h4>E5ClearableLineEdit.__textChanged</h4>
 <b>__textChanged</b>(<i>txt</i>)
--- a/eric6/Documentation/Source/eric6.E5Gui.E5MessageBox.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.E5Gui.E5MessageBox.html	Sun Jul 05 11:11:24 2020 +0200
@@ -397,6 +397,13 @@
 flag indicating the selection of the Retry button (boolean)
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate a bad parameter value
+</dd>
+</dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 <hr />
@@ -483,6 +490,13 @@
 flag indicating the selection of the Yes button (boolean)
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate a bad parameter value
+</dd>
+</dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 </body></html>
\ No newline at end of file
--- a/eric6/Documentation/Source/eric6.E5Gui.E5ModelToolBar.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.E5Gui.E5ModelToolBar.html	Sun Jul 05 11:11:24 2020 +0200
@@ -209,6 +209,13 @@
 reference to the event (QDropEvent)
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>RuntimeError</b>:</dt>
+<dd>
+raised to indicate an invalid model index
+</dd>
+</dl>
 <a NAME="E5ModelToolBar.eventFilter" ID="E5ModelToolBar.eventFilter"></a>
 <h4>E5ModelToolBar.eventFilter</h4>
 <b>eventFilter</b>(<i>obj, evt</i>)
@@ -294,6 +301,13 @@
 reference to the event (QMouseEvent)
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>RuntimeError</b>:</dt>
+<dd>
+raised to indicate an invalid model index
+</dd>
+</dl>
 <a NAME="E5ModelToolBar.resetFlags" ID="E5ModelToolBar.resetFlags"></a>
 <h4>E5ModelToolBar.resetFlags</h4>
 <b>resetFlags</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.E5Gui.E5PathPicker.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.E5Gui.E5PathPicker.html	Sun Jul 05 11:11:24 2020 +0200
@@ -940,6 +940,13 @@
 picker mode
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate a bad parameter value
+</dd>
+</dl>
 <a NAME="E5PathPickerBase.setNameFilters" ID="E5PathPickerBase.setNameFilters"></a>
 <h4>E5PathPickerBase.setNameFilters</h4>
 <b>setNameFilters</b>(<i>filters</i>)
--- a/eric6/Documentation/Source/eric6.E5Gui.E5TextEditSearchWidget.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.E5Gui.E5TextEditSearchWidget.html	Sun Jul 05 11:11:24 2020 +0200
@@ -312,6 +312,13 @@
 type of the attached edit widget
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate a bad parameter value
+</dd>
+</dl>
 <a NAME="E5TextEditSearchWidget.keyPressEvent" ID="E5TextEditSearchWidget.keyPressEvent"></a>
 <h4>E5TextEditSearchWidget.keyPressEvent</h4>
 <b>keyPressEvent</b>(<i>event</i>)
--- a/eric6/Documentation/Source/eric6.E5Gui.E5TreeWidget.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.E5Gui.E5TreeWidget.html	Sun Jul 05 11:11:24 2020 +0200
@@ -410,6 +410,13 @@
 default mode (ItemsCollapsed, ItemsExpanded)
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate a bad parameter value
+</dd>
+</dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 </body></html>
\ No newline at end of file
--- a/eric6/Documentation/Source/eric6.E5Network.E5Ftp.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.E5Network.E5Ftp.html	Sun Jul 05 11:11:24 2020 +0200
@@ -88,7 +88,7 @@
 </tr>
 <tr>
 <td><a href="#E5Ftp.login">login</a></td>
-<td>Public method to login to the FTP server.</td>
+<td></td>
 </tr>
 <tr>
 <td><a href="#E5Ftp.setProxy">setProxy</a></td>
@@ -203,119 +203,6 @@
 <h4>E5Ftp.login</h4>
 <b>login</b>(<i>user="", password="", acct=""</i>)
 
-<p>
-        Public method to login to the FTP server.
-</p>
-<p>
-        This extended method respects the FTP proxy configuration. There are
-        many different FTP proxy products available. But unfortunately there
-        is no standard for how o traverse a FTP proxy. The lis below shows
-        the sequence of commands used.
-</p>
-<p>
-        <table>
-          <tr><td>user</td><td>Username for remote host</td></tr>
-          <tr><td>pass</td><td>Password for remote host</td></tr>
-          <tr><td>pruser</td><td>Username for FTP proxy</td></tr>
-          <tr><td>prpass</td><td>Password for FTP proxy</td></tr>
-          <tr><td>remote.host</td><td>Hostname of the remote FTP server</td>
-          </tr>
-        </table>
-</p>
-<p>
-        <dl>
-          <dt>E5FtpProxyType.NoProxy:</dt>
-          <dd>
-            USER user<br/>
-            PASS pass
-          </dd>
-          <dt>E5FtpProxyType.NonAuthorizing:</dt>
-          <dd>
-            USER user@remote.host<br/>
-            PASS pass
-          </dd>
-          <dt>E5FtpProxyType.UserAtServer:</dt>
-          <dd>
-            USER pruser<br/>
-            PASS prpass<br/>
-            USER user@remote.host<br/>
-            PASS pass
-          </dd>
-          <dt>E5FtpProxyType.Site:</dt>
-          <dd>
-            USER pruser<br/>
-            PASS prpass<br/>
-            SITE remote.site<br/>
-            USER user<br/>
-            PASS pass
-          </dd>
-          <dt>E5FtpProxyType.Open:</dt>
-          <dd>
-            USER pruser<br/>
-            PASS prpass<br/>
-            OPEN remote.site<br/>
-            USER user<br/>
-            PASS pass
-          </dd>
-          <dt>E5FtpProxyType.UserAtProxyuserAtServer:</dt>
-          <dd>
-            USER user@pruser@remote.host<br/>
-            PASS pass@prpass
-          </dd>
-          <dt>E5FtpProxyType.ProxyuserAtServer:</dt>
-          <dd>
-            USER pruser@remote.host<br/>
-            PASS prpass<br/>
-            USER user<br/>
-            PASS pass
-          </dd>
-          <dt>E5FtpProxyType.AuthResp:</dt>
-          <dd>
-            USER user@remote.host<br/>
-            PASS pass<br/>
-            AUTH pruser<br/>
-            RESP prpass
-          </dd>
-          <dt>E5FtpProxyType.Bluecoat:</dt>
-          <dd>
-            USER user@remote.host pruser<br/>
-            PASS pass<br/>
-            ACCT prpass
-          </dd>
-        </dl>
-</p>
-<dl>
-
-<dt><i>user</i></dt>
-<dd>
-username for the remote host (string)
-</dd>
-<dt><i>password</i></dt>
-<dd>
-password for the remote host (string)
-</dd>
-<dt><i>acct</i></dt>
-<dd>
-accounting information for the remote host (string)
-</dd>
-</dl>
-<dl>
-<dt>Returns:</dt>
-<dd>
-response sent by the remote host (string)
-</dd>
-</dl>
-<dl>
-
-<dt>Raises <b>E5FtpProxyError</b>:</dt>
-<dd>
-raised to indicate a proxy related issue
-</dd>
-<dt>Raises <b>ftplib.error_reply</b>:</dt>
-<dd>
-raised to indicate an FTP error reply
-</dd>
-</dl>
 <a NAME="E5Ftp.setProxy" ID="E5Ftp.setProxy"></a>
 <h4>E5Ftp.setProxy</h4>
 <b>setProxy</b>(<i>proxyType=E5FtpProxyType.NoProxy, proxyHost="", proxyPort=ftplib.FTP_PORT, proxyUser="", proxyPassword="", proxyAccount=""</i>)
--- a/eric6/Documentation/Source/eric6.E5Network.E5XmlRpcClient.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.E5Network.E5XmlRpcClient.html	Sun Jul 05 11:11:24 2020 +0200
@@ -184,6 +184,14 @@
             with error code and error string (function)
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>TypeError</b>:</dt>
+<dd>
+raised to indicate an illegal 'args' parameter
+            type
+</dd>
+</dl>
 <a NAME="E5XmlRpcClient.setUrl" ID="E5XmlRpcClient.setUrl"></a>
 <h4>E5XmlRpcClient.setUrl</h4>
 <b>setUrl</b>(<i>url</i>)
--- a/eric6/Documentation/Source/eric6.E5Utilities.E5Cache.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.E5Utilities.E5Cache.html	Sun Jul 05 11:11:24 2020 +0200
@@ -154,6 +154,13 @@
 maximum number of entries that may be stored in the cache
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate an illegal 'size' parameter
+</dd>
+</dl>
 <a NAME="E5Cache.__adjustToSize" ID="E5Cache.__adjustToSize"></a>
 <h4>E5Cache.__adjustToSize</h4>
 <b>__adjustToSize</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.Globals.__init__.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Globals.__init__.html	Sun Jul 05 11:11:24 2020 +0200
@@ -532,7 +532,7 @@
 </p>
 <dl>
 
-<dt><i>txt</i> (str, bytes, bytearray, unicode)</dt>
+<dt><i>txt</i> (str, bytes, bytearray)</dt>
 <dd>
 Python string to be converted
 </dd>
@@ -670,7 +670,7 @@
 <hr />
 <a NAME="versionToTuple" ID="versionToTuple"></a>
 <h2>versionToTuple</h2>
-<b>versionToTuple</b>(<i>version</i>)
+<b>versionToTuple</b>(<i>version, length=3</i>)
 
 <p>
     Module function to convert a version string into a tuple.
@@ -686,6 +686,10 @@
 <dd>
 version string
 </dd>
+<dt><i>length</i> (int)</dt>
+<dd>
+desired length of the version tuple
+</dd>
 </dl>
 <dl>
 <dt>Returns:</dt>
--- a/eric6/Documentation/Source/eric6.HexEdit.HexEditSearchReplaceWidget.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.HexEdit.HexEditSearchReplaceWidget.html	Sun Jul 05 11:11:24 2020 +0200
@@ -257,6 +257,14 @@
 str
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate an invalid dataFormat
+            parameter
+</dd>
+</dl>
 <a NAME="HexEditSearchReplaceWidget.__convertText" ID="HexEditSearchReplaceWidget.__convertText"></a>
 <h4>HexEditSearchReplaceWidget.__convertText</h4>
 <b>__convertText</b>(<i>txt, oldFormat, newFormat</i>)
@@ -423,6 +431,14 @@
 bytearray
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate an invalid dataFormat
+            parameter
+</dd>
+</dl>
 <a NAME="HexEditSearchReplaceWidget.findPrevNext" ID="HexEditSearchReplaceWidget.findPrevNext"></a>
 <h4>HexEditSearchReplaceWidget.findPrevNext</h4>
 <b>findPrevNext</b>(<i>prev=False</i>)
--- a/eric6/Documentation/Source/eric6.PipInterface.PipPackagesWidget.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.PipInterface.PipPackagesWidget.html	Sun Jul 05 11:11:24 2020 +0200
@@ -81,6 +81,10 @@
 <td>Private method to get a list of all items that can be updated.</td>
 </tr>
 <tr>
+<td><a href="#PipPackagesWidget.__availablePipVersion">__availablePipVersion</a></td>
+<td>Private method to get the pip version of the selected environment.</td>
+</tr>
+<tr>
 <td><a href="#PipPackagesWidget.__editConfiguration">__editConfiguration</a></td>
 <td>Private method to edit a configuration.</td>
 </tr>
@@ -363,6 +367,26 @@
 list of QTreeWidgetItem
 </dd>
 </dl>
+<a NAME="PipPackagesWidget.__availablePipVersion" ID="PipPackagesWidget.__availablePipVersion"></a>
+<h4>PipPackagesWidget.__availablePipVersion</h4>
+<b>__availablePipVersion</b>(<i></i>)
+
+<p>
+        Private method to get the pip version of the selected environment.
+</p>
+<dl>
+<dt>Returns:</dt>
+<dd>
+tuple containing the version number or tuple with all zeros
+            in case pip is not available
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of int
+</dd>
+</dl>
 <a NAME="PipPackagesWidget.__editConfiguration" ID="PipPackagesWidget.__editConfiguration"></a>
 <h4>PipPackagesWidget.__editConfiguration</h4>
 <b>__editConfiguration</b>(<i>venvName=""</i>)
--- a/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleCheckerDialog.html	Sun Jul 05 11:11:24 2020 +0200
@@ -149,6 +149,10 @@
 <td>Private method to modify the options based on eflag: entries.</td>
 </tr>
 <tr>
+<td><a href="#CodeStyleCheckerDialog.__prepareProgress">__prepareProgress</a></td>
+<td>Private method to prepare the progress tab for the next run.</td>
+</tr>
+<tr>
 <td><a href="#CodeStyleCheckerDialog.__processError">__processError</a></td>
 <td>Private slot to process an error indication from the service.</td>
 </tr>
@@ -173,6 +177,10 @@
 <td>Private method to update the collected fixer related statistics.</td>
 </tr>
 <tr>
+<td><a href="#CodeStyleCheckerDialog.__updateProgress">__updateProgress</a></td>
+<td>Private method to update the progress tab.</td>
+</tr>
+<tr>
 <td><a href="#CodeStyleCheckerDialog.__updateStatistics">__updateStatistics</a></td>
 <td>Private method to update the collected statistics.</td>
 </tr>
@@ -197,6 +205,10 @@
 <td>Private slot called by a button of the button box clicked.</td>
 </tr>
 <tr>
+<td><a href="#CodeStyleCheckerDialog.on_cancelButton_clicked">on_cancelButton_clicked</a></td>
+<td>Private slot to handle the "Cancel" button press.</td>
+</tr>
+<tr>
 <td><a href="#CodeStyleCheckerDialog.on_deleteBuiltinButton_clicked">on_deleteBuiltinButton_clicked</a></td>
 <td>Private slot to delete the selected items from the list.</td>
 </tr>
@@ -273,7 +285,7 @@
 
 <a NAME="CodeStyleCheckerDialog.__init__" ID="CodeStyleCheckerDialog.__init__"></a>
 <h4>CodeStyleCheckerDialog (Constructor)</h4>
-<b>CodeStyleCheckerDialog</b>(<i>styleCheckService, parent=None</i>)
+<b>CodeStyleCheckerDialog</b>(<i>styleCheckService, project=None, parent=None</i>)
 
 <p>
         Constructor
@@ -284,6 +296,11 @@
 <dd>
 reference to the service
 </dd>
+<dt><i>project</i> (Project)</dt>
+<dd>
+reference to the project if called on project or project
+            browser level
+</dd>
 <dt><i>parent</i> (QWidget)</dt>
 <dd>
 reference to the parent widget
@@ -646,6 +663,13 @@
 list
 </dd>
 </dl>
+<a NAME="CodeStyleCheckerDialog.__prepareProgress" ID="CodeStyleCheckerDialog.__prepareProgress"></a>
+<h4>CodeStyleCheckerDialog.__prepareProgress</h4>
+<b>__prepareProgress</b>(<i></i>)
+
+<p>
+        Private method to prepare the progress tab for the next run.
+</p>
 <a NAME="CodeStyleCheckerDialog.__processError" ID="CodeStyleCheckerDialog.__processError"></a>
 <h4>CodeStyleCheckerDialog.__processError</h4>
 <b>__processError</b>(<i>fn, msg</i>)
@@ -741,6 +765,20 @@
 reference to the code style fixer
 </dd>
 </dl>
+<a NAME="CodeStyleCheckerDialog.__updateProgress" ID="CodeStyleCheckerDialog.__updateProgress"></a>
+<h4>CodeStyleCheckerDialog.__updateProgress</h4>
+<b>__updateProgress</b>(<i>fn</i>)
+
+<p>
+        Private method to update the progress tab.
+</p>
+<dl>
+
+<dt><i>fn</i> (str)</dt>
+<dd>
+filename of the just checked file
+</dd>
+</dl>
 <a NAME="CodeStyleCheckerDialog.__updateStatistics" ID="CodeStyleCheckerDialog.__updateStatistics"></a>
 <h4>CodeStyleCheckerDialog.__updateStatistics</h4>
 <b>__updateStatistics</b>(<i>statistics, fixer, ignoredErrors, securityOk</i>)
@@ -823,6 +861,13 @@
 button that was clicked
 </dd>
 </dl>
+<a NAME="CodeStyleCheckerDialog.on_cancelButton_clicked" ID="CodeStyleCheckerDialog.on_cancelButton_clicked"></a>
+<h4>CodeStyleCheckerDialog.on_cancelButton_clicked</h4>
+<b>on_cancelButton_clicked</b>(<i></i>)
+
+<p>
+        Private slot to handle the "Cancel" button press.
+</p>
 <a NAME="CodeStyleCheckerDialog.on_deleteBuiltinButton_clicked" ID="CodeStyleCheckerDialog.on_deleteBuiltinButton_clicked"></a>
 <h4>CodeStyleCheckerDialog.on_deleteBuiltinButton_clicked</h4>
 <b>on_deleteBuiltinButton_clicked</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleFixer.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.CodeStyleFixer.html	Sun Jul 05 11:11:24 2020 +0200
@@ -102,7 +102,7 @@
 </tr>
 <tr>
 <td><a href="#CodeStyleFixer.__fixD112">__fixD112</a></td>
-<td>Private method to fix docstring 'r' or 'u' in leading quotes.</td>
+<td>Private method to fix docstring 'r' in leading quotes.</td>
 </tr>
 <tr>
 <td><a href="#CodeStyleFixer.__fixD121">__fixD121</a></td>
@@ -477,10 +477,10 @@
 <b>__fixD112</b>(<i>code, line, pos</i>)
 
 <p>
-        Private method to fix docstring 'r' or 'u' in leading quotes.
+        Private method to fix docstring 'r' in leading quotes.
 </p>
 <p>
-        Codes: D112, D113
+        Codes: D112
 </p>
 <dl>
 
@@ -1938,6 +1938,13 @@
 flag indicating a change was done (boolean)
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate a bad 'logical' parameter
+</dd>
+</dl>
 <a NAME="CodeStyleFixer.__fixW291" ID="CodeStyleFixer.__fixW291"></a>
 <h4>CodeStyleFixer.__fixW291</h4>
 <b>__fixW291</b>(<i>code, line, pos</i>)
--- a/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.DocStyleChecker.html	Sun Jul 05 11:11:24 2020 +0200
@@ -181,16 +181,12 @@
 <td>Private method to check, that all docstrings are surrounded by triple double quotes.</td>
 </tr>
 <tr>
-<td><a href="#DocStyleChecker.__checkUnicode">__checkUnicode</a></td>
-<td>Private method to check, that all docstrings containing unicode characters are surrounded by unicode triple double quotes.</td>
-</tr>
-<tr>
 <td><a href="#DocStyleChecker.__error">__error</a></td>
 <td>Private method to record an issue.</td>
 </tr>
 <tr>
 <td><a href="#DocStyleChecker.__getArgNames">__getArgNames</a></td>
-<td></td>
+<td>Private method to get the argument names of a function node.</td>
 </tr>
 <tr>
 <td><a href="#DocStyleChecker.__getSummaryLine">__getSummaryLine</a></td>
@@ -252,10 +248,6 @@
 <td><a href="#DocStyleChecker.run">run</a></td>
 <td>Public method to check the given source for violations of doc string conventions.</td>
 </tr>
-<tr>
-<td><a href="#DocStyleChecker.unpackArgs">unpackArgs</a></td>
-<td>Local helper function to unpack function argument names.</td>
-</tr>
 </table>
 <h3>Static Methods</h3>
 
@@ -805,25 +797,6 @@
 context of the docstring (DocStyleContext)
 </dd>
 </dl>
-<a NAME="DocStyleChecker.__checkUnicode" ID="DocStyleChecker.__checkUnicode"></a>
-<h4>DocStyleChecker.__checkUnicode</h4>
-<b>__checkUnicode</b>(<i>docstringContext, context</i>)
-
-<p>
-        Private method to check, that all docstrings containing unicode
-        characters are surrounded by unicode triple double quotes.
-</p>
-<dl>
-
-<dt><i>docstringContext</i></dt>
-<dd>
-docstring context (DocStyleContext)
-</dd>
-<dt><i>context</i></dt>
-<dd>
-context of the docstring (DocStyleContext)
-</dd>
-</dl>
 <a NAME="DocStyleChecker.__error" ID="DocStyleChecker.__error"></a>
 <h4>DocStyleChecker.__error</h4>
 <b>__error</b>(<i>lineNumber, offset, code, *args</i>)
@@ -854,6 +827,23 @@
 <h4>DocStyleChecker.__getArgNames</h4>
 <b>__getArgNames</b>(<i>node</i>)
 
+<p>
+        Private method to get the argument names of a function node.
+</p>
+<dl>
+
+<dt><i>node</i></dt>
+<dd>
+AST node to extract arguments names from
+</dd>
+</dl>
+<dl>
+<dt>Returns:</dt>
+<dd>
+tuple of two list of argument names, one for arguments
+            and one for keyword arguments (tuple of list of string)
+</dd>
+</dl>
 <a NAME="DocStyleChecker.__getSummaryLine" ID="DocStyleChecker.__getSummaryLine"></a>
 <h4>DocStyleChecker.__getSummaryLine</h4>
 <b>__getSummaryLine</b>(<i>docstringContext</i>)
@@ -1093,26 +1083,6 @@
         Public method to check the given source for violations of doc string
         conventions.
 </p>
-<a NAME="DocStyleChecker.unpackArgs" ID="DocStyleChecker.unpackArgs"></a>
-<h4>DocStyleChecker.unpackArgs</h4>
-<b>unpackArgs</b>(<i></i>)
-
-<p>
-                Local helper function to unpack function argument names.
-</p>
-<dl>
-
-<dt><i>args</i></dt>
-<dd>
-list of AST node arguments
-</dd>
-</dl>
-<dl>
-<dt>Returns:</dt>
-<dd>
-list of argument names (list of string)
-</dd>
-</dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 <hr />
--- a/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.NamingStyleChecker.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.NamingStyleChecker.html	Sun Jul 05 11:11:24 2020 +0200
@@ -132,10 +132,6 @@
 <td><a href="#NamingStyleChecker.run">run</a></td>
 <td>Public method run by the pycodestyle.py checker.</td>
 </tr>
-<tr>
-<td><a href="#NamingStyleChecker.unpackArgs">unpackArgs</a></td>
-<td>Local helper function to unpack function argument names.</td>
-</tr>
 </table>
 <h3>Static Methods</h3>
 
@@ -516,26 +512,6 @@
             checker function
 </dd>
 </dl>
-<a NAME="NamingStyleChecker.unpackArgs" ID="NamingStyleChecker.unpackArgs"></a>
-<h4>NamingStyleChecker.unpackArgs</h4>
-<b>unpackArgs</b>(<i></i>)
-
-<p>
-                Local helper function to unpack function argument names.
-</p>
-<dl>
-
-<dt><i>args</i></dt>
-<dd>
-list of AST node arguments
-</dd>
-</dl>
-<dl>
-<dt>Returns:</dt>
-<dd>
-list of argument names (list of string)
-</dd>
-</dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 </body></html>
\ No newline at end of file
--- a/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.Security.Checks.djangoXssVulnerability.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.CodeStyleChecker.Security.Checks.djangoXssVulnerability.html	Sun Jul 05 11:11:24 2020 +0200
@@ -28,7 +28,7 @@
 <h3>Global Attributes</h3>
 
 <table>
-<tr><td>PY2</td></tr>
+<tr><td>None</td></tr>
 </table>
 <h3>Classes</h3>
 
--- a/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheck.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheck.html	Sun Jul 05 11:11:24 2020 +0200
@@ -23,7 +23,7 @@
 <h1>eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheck</h1>
 
 <p>
-Module implementing the syntax check for Python 2/3.
+Module implementing the syntax check for Python 3.
 </p>
 <h3>Global Attributes</h3>
 
--- a/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html	Sun Jul 05 11:11:24 2020 +0200
@@ -136,12 +136,8 @@
 <td>Public method handling service errors for JavaScript.</td>
 </tr>
 <tr>
-<td><a href="#SyntaxCheckService.serviceErrorPy2">serviceErrorPy2</a></td>
-<td>Public method handling service errors for Python 2.</td>
-</tr>
-<tr>
 <td><a href="#SyntaxCheckService.serviceErrorPy3">serviceErrorPy3</a></td>
-<td>Public method handling service errors for Python 2.</td>
+<td>Public method handling service errors for Python 3.</td>
 </tr>
 <tr>
 <td><a href="#SyntaxCheckService.serviceErrorYAML">serviceErrorYAML</a></td>
@@ -374,38 +370,12 @@
 message text (string)
 </dd>
 </dl>
-<a NAME="SyntaxCheckService.serviceErrorPy2" ID="SyntaxCheckService.serviceErrorPy2"></a>
-<h4>SyntaxCheckService.serviceErrorPy2</h4>
-<b>serviceErrorPy2</b>(<i>fx, lang, fn, msg</i>)
-
-<p>
-        Public method handling service errors for Python 2.
-</p>
-<dl>
-
-<dt><i>fx</i></dt>
-<dd>
-service name (string)
-</dd>
-<dt><i>lang</i></dt>
-<dd>
-language (string)
-</dd>
-<dt><i>fn</i></dt>
-<dd>
-file name (string)
-</dd>
-<dt><i>msg</i></dt>
-<dd>
-message text (string)
-</dd>
-</dl>
 <a NAME="SyntaxCheckService.serviceErrorPy3" ID="SyntaxCheckService.serviceErrorPy3"></a>
 <h4>SyntaxCheckService.serviceErrorPy3</h4>
 <b>serviceErrorPy3</b>(<i>fx, lang, fn, msg</i>)
 
 <p>
-        Public method handling service errors for Python 2.
+        Public method handling service errors for Python 3.
 </p>
 <dl>
 
--- a/eric6/Documentation/Source/eric6.Plugins.PluginCodeStyleChecker.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.PluginCodeStyleChecker.html	Sun Jul 05 11:11:24 2020 +0200
@@ -150,12 +150,8 @@
 <td>Public method to deactivate this plugin.</td>
 </tr>
 <tr>
-<td><a href="#CodeStyleCheckerPlugin.serviceErrorPy2">serviceErrorPy2</a></td>
-<td>Public slot handling service errors for Python 2.</td>
-</tr>
-<tr>
 <td><a href="#CodeStyleCheckerPlugin.serviceErrorPy3">serviceErrorPy3</a></td>
-<td>Public slot handling service errors for Python 2.</td>
+<td>Public slot handling service errors for Python 3.</td>
 </tr>
 <tr>
 <td><a href="#CodeStyleCheckerPlugin.styleBatchCheck">styleBatchCheck</a></td>
@@ -391,38 +387,12 @@
 <p>
         Public method to deactivate this plugin.
 </p>
-<a NAME="CodeStyleCheckerPlugin.serviceErrorPy2" ID="CodeStyleCheckerPlugin.serviceErrorPy2"></a>
-<h4>CodeStyleCheckerPlugin.serviceErrorPy2</h4>
-<b>serviceErrorPy2</b>(<i>fx, lang, fn, msg</i>)
-
-<p>
-        Public slot handling service errors for Python 2.
-</p>
-<dl>
-
-<dt><i>fx</i></dt>
-<dd>
-service name (string)
-</dd>
-<dt><i>lang</i></dt>
-<dd>
-language (string)
-</dd>
-<dt><i>fn</i></dt>
-<dd>
-file name (string)
-</dd>
-<dt><i>msg</i></dt>
-<dd>
-message text (string)
-</dd>
-</dl>
 <a NAME="CodeStyleCheckerPlugin.serviceErrorPy3" ID="CodeStyleCheckerPlugin.serviceErrorPy3"></a>
 <h4>CodeStyleCheckerPlugin.serviceErrorPy3</h4>
 <b>serviceErrorPy3</b>(<i>fx, lang, fn, msg</i>)
 
 <p>
-        Public slot handling service errors for Python 2.
+        Public slot handling service errors for Python 3.
 </p>
 <dl>
 
--- a/eric6/Documentation/Source/eric6.Plugins.PluginTabnanny.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.PluginTabnanny.html	Sun Jul 05 11:11:24 2020 +0200
@@ -154,12 +154,8 @@
 <td>Public method to prepare an indentation check on one Python source file.</td>
 </tr>
 <tr>
-<td><a href="#TabnannyPlugin.serviceErrorPy2">serviceErrorPy2</a></td>
-<td>Public slot handling service errors for Python 2.</td>
-</tr>
-<tr>
 <td><a href="#TabnannyPlugin.serviceErrorPy3">serviceErrorPy3</a></td>
-<td>Public slot handling service errors for Python 2.</td>
+<td>Public slot handling service errors for Python 3.</td>
 </tr>
 </table>
 <h3>Static Methods</h3>
@@ -403,38 +399,12 @@
 string containing the code to check (string)
 </dd>
 </dl>
-<a NAME="TabnannyPlugin.serviceErrorPy2" ID="TabnannyPlugin.serviceErrorPy2"></a>
-<h4>TabnannyPlugin.serviceErrorPy2</h4>
-<b>serviceErrorPy2</b>(<i>fx, lang, fn, msg</i>)
-
-<p>
-        Public slot handling service errors for Python 2.
-</p>
-<dl>
-
-<dt><i>fx</i></dt>
-<dd>
-service name (string)
-</dd>
-<dt><i>lang</i></dt>
-<dd>
-language (string)
-</dd>
-<dt><i>fn</i></dt>
-<dd>
-file name (string)
-</dd>
-<dt><i>msg</i></dt>
-<dd>
-message text (string)
-</dd>
-</dl>
 <a NAME="TabnannyPlugin.serviceErrorPy3" ID="TabnannyPlugin.serviceErrorPy3"></a>
 <h4>TabnannyPlugin.serviceErrorPy3</h4>
 <b>serviceErrorPy3</b>(<i>fx, lang, fn, msg</i>)
 
 <p>
-        Public slot handling service errors for Python 2.
+        Public slot handling service errors for Python 3.
 </p>
 <dl>
 
--- a/eric6/Documentation/Source/eric6.Plugins.PluginWizardQFileDialog.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.PluginWizardQFileDialog.html	Sun Jul 05 11:11:24 2020 +0200
@@ -141,7 +141,7 @@
 <dt><i>variant</i> (int)</dt>
 <dd>
 variant of code to be generated
-            (-1 = E5FileDialog, 0 = unknown, 4 = PyQt4, 5 = PyQt5)
+            (-1 = E5FileDialog, 0 = unknown, 5 = PyQt5)
 </dd>
 </dl>
 <dl>
--- a/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsGit.GitDiffDialog.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsGit.GitDiffDialog.html	Sun Jul 05 11:11:24 2020 +0200
@@ -255,6 +255,14 @@
 flag indicating a refreshable diff (boolean)
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate a bad value for the 'diffMode'
+            parameter.
+</dd>
+</dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 </body></html>
\ No newline at end of file
--- a/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsGit.GitDiffGenerator.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsGit.GitDiffGenerator.html	Sun Jul 05 11:11:24 2020 +0200
@@ -285,6 +285,14 @@
 flag indicating the start status (boolean)
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate a bad value for the 'diffMode'
+            parameter.
+</dd>
+</dl>
 <a NAME="GitDiffGenerator.stopProcesses" ID="GitDiffGenerator.stopProcesses"></a>
 <h4>GitDiffGenerator.stopProcesses</h4>
 <b>stopProcesses</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.LargefilesExtension.ProjectHelper.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.LargefilesExtension.ProjectHelper.html	Sun Jul 05 11:11:24 2020 +0200
@@ -146,6 +146,14 @@
 verify mode (string; one of 'large', 'lfa' or 'lfc')
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate a bad value for the
+            'mode' parameter.
+</dd>
+</dl>
 <a NAME="LargefilesProjectHelper.__hgLfconvert" ID="LargefilesProjectHelper.__hgLfconvert"></a>
 <h4>LargefilesProjectHelper.__hgLfconvert</h4>
 <b>__hgLfconvert</b>(<i>direction</i>)
@@ -161,6 +169,14 @@
             'largefiles' or 'normal')
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate a bad value for the
+            'direction' parameter.
+</dd>
+</dl>
 <a NAME="LargefilesProjectHelper.initActions" ID="LargefilesProjectHelper.initActions"></a>
 <h4>LargefilesProjectHelper.initActions</h4>
 <b>initActions</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.LargefilesExtension.largefiles.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.VcsPlugins.vcsMercurial.LargefilesExtension.largefiles.html	Sun Jul 05 11:11:24 2020 +0200
@@ -182,6 +182,14 @@
 file name of the current project file (string)
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate a bad value for the
+            'direction' parameter.
+</dd>
+</dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 </body></html>
\ No newline at end of file
--- a/eric6/Documentation/Source/eric6.Plugins.WizardPlugins.FileDialogWizard.FileDialogWizardDialog.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Plugins.WizardPlugins.FileDialogWizard.FileDialogWizardDialog.html	Sun Jul 05 11:11:24 2020 +0200
@@ -98,7 +98,7 @@
 </tr>
 <tr>
 <td><a href="#FileDialogWizardDialog.getCode">getCode</a></td>
-<td>Public method to get the source code for Qt4 and Qt5.</td>
+<td>Public method to get the source code for Qt5.</td>
 </tr>
 <tr>
 <td><a href="#FileDialogWizardDialog.on_bTest_clicked">on_bTest_clicked</a></td>
@@ -131,7 +131,7 @@
 <dt><i>dialogVariant</i> (int)</dt>
 <dd>
 variant of the file dialog to be generated
-            (-1 = E5FileDialog, 0 = unknown, 4 = PyQt4, 5 = PyQt5)
+            (-1 = E5FileDialog, 0 = unknown, 5 = PyQt5)
 </dd>
 <dt><i>parent</i> (QWidget)</dt>
 <dd>
@@ -211,7 +211,7 @@
 <b>getCode</b>(<i>indLevel, indString</i>)
 
 <p>
-        Public method to get the source code for Qt4 and Qt5.
+        Public method to get the source code for Qt5.
 </p>
 <dl>
 
--- a/eric6/Documentation/Source/eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html	Wed Jun 17 17:14:12 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,162 +0,0 @@
-<!DOCTYPE html>
-<html><head>
-<title>eric6.Preferences.ConfigurationPages.DebuggerPython2Page</title>
-<meta charset="UTF-8">
-<style>
-body {
-    background: #EDECE6;
-    margin: 0em 1em 10em 1em;
-    color: black;
-}
-
-h1 { color: white; background: #85774A; }
-h2 { color: white; background: #85774A; }
-h3 { color: white; background: #9D936E; }
-h4 { color: white; background: #9D936E; }
-    
-a { color: #BA6D36; }
-
-</style>
-</head>
-<body>
-<a NAME="top" ID="top"></a>
-<h1>eric6.Preferences.ConfigurationPages.DebuggerPython2Page</h1>
-
-<p>
-Module implementing the Debugger Python2 configuration page.
-</p>
-<h3>Global Attributes</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Classes</h3>
-
-<table>
-
-<tr>
-<td><a href="#DebuggerPython2Page">DebuggerPython2Page</a></td>
-<td>Class implementing the Debugger Python2 configuration page.</td>
-</tr>
-</table>
-<h3>Functions</h3>
-
-<table>
-
-<tr>
-<td><a href="#create">create</a></td>
-<td>Module function to create the configuration page.</td>
-</tr>
-</table>
-<hr />
-<hr />
-<a NAME="DebuggerPython2Page" ID="DebuggerPython2Page"></a>
-<h2>DebuggerPython2Page</h2>
-
-<p>
-    Class implementing the Debugger Python2 configuration page.
-</p>
-<h3>Derived from</h3>
-ConfigurationPageBase, Ui_DebuggerPython2Page
-<h3>Class Attributes</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Class Methods</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-<h3>Methods</h3>
-
-<table>
-
-<tr>
-<td><a href="#DebuggerPython2Page.__init__">DebuggerPython2Page</a></td>
-<td>Constructor</td>
-</tr>
-<tr>
-<td><a href="#DebuggerPython2Page.__populateAndSetVenvComboBox">__populateAndSetVenvComboBox</a></td>
-<td>Private method to populate and set the virtual environment combo box.</td>
-</tr>
-<tr>
-<td><a href="#DebuggerPython2Page.on_refreshButton_clicked">on_refreshButton_clicked</a></td>
-<td>Private slot handling a click of the refresh button.</td>
-</tr>
-<tr>
-<td><a href="#DebuggerPython2Page.on_venvDlgButton_clicked">on_venvDlgButton_clicked</a></td>
-<td>Private slot to show the virtual environment manager dialog.</td>
-</tr>
-<tr>
-<td><a href="#DebuggerPython2Page.save">save</a></td>
-<td>Public slot to save the Debugger Python configuration.</td>
-</tr>
-</table>
-<h3>Static Methods</h3>
-
-<table>
-<tr><td>None</td></tr>
-</table>
-
-<a NAME="DebuggerPython2Page.__init__" ID="DebuggerPython2Page.__init__"></a>
-<h4>DebuggerPython2Page (Constructor)</h4>
-<b>DebuggerPython2Page</b>(<i></i>)
-
-<p>
-        Constructor
-</p>
-<a NAME="DebuggerPython2Page.__populateAndSetVenvComboBox" ID="DebuggerPython2Page.__populateAndSetVenvComboBox"></a>
-<h4>DebuggerPython2Page.__populateAndSetVenvComboBox</h4>
-<b>__populateAndSetVenvComboBox</b>(<i></i>)
-
-<p>
-        Private method to populate and set the virtual environment combo box.
-</p>
-<a NAME="DebuggerPython2Page.on_refreshButton_clicked" ID="DebuggerPython2Page.on_refreshButton_clicked"></a>
-<h4>DebuggerPython2Page.on_refreshButton_clicked</h4>
-<b>on_refreshButton_clicked</b>(<i></i>)
-
-<p>
-        Private slot handling a click of the refresh button.
-</p>
-<a NAME="DebuggerPython2Page.on_venvDlgButton_clicked" ID="DebuggerPython2Page.on_venvDlgButton_clicked"></a>
-<h4>DebuggerPython2Page.on_venvDlgButton_clicked</h4>
-<b>on_venvDlgButton_clicked</b>(<i></i>)
-
-<p>
-        Private slot to show the virtual environment manager dialog.
-</p>
-<a NAME="DebuggerPython2Page.save" ID="DebuggerPython2Page.save"></a>
-<h4>DebuggerPython2Page.save</h4>
-<b>save</b>(<i></i>)
-
-<p>
-        Public slot to save the Debugger Python configuration.
-</p>
-<div align="right"><a href="#top">Up</a></div>
-<hr />
-<hr />
-<a NAME="create" ID="create"></a>
-<h2>create</h2>
-<b>create</b>(<i>dlg</i>)
-
-<p>
-    Module function to create the configuration page.
-</p>
-<dl>
-
-<dt><i>dlg</i></dt>
-<dd>
-reference to the configuration dialog
-</dd>
-</dl>
-<dl>
-<dt>Returns:</dt>
-<dd>
-reference to the instantiated page (ConfigurationPageBase)
-</dd>
-</dl>
-<div align="right"><a href="#top">Up</a></div>
-<hr />
-</body></html>
\ No newline at end of file
--- a/eric6/Documentation/Source/eric6.Preferences.__init__.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Preferences.__init__.html	Sun Jul 05 11:11:24 2020 +0200
@@ -198,10 +198,6 @@
 <td>Module function to retrieve the various Qt settings.</td>
 </tr>
 <tr>
-<td><a href="#getQt4DocDir">getQt4DocDir</a></td>
-<td>Module function to retrieve the Qt4DocDir setting.</td>
-</tr>
-<tr>
 <td><a href="#getQt5DocDir">getQt5DocDir</a></td>
 <td>Module function to retrieve the Qt5DocDir setting.</td>
 </tr>
@@ -1522,29 +1518,6 @@
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 <hr />
-<a NAME="getQt4DocDir" ID="getQt4DocDir"></a>
-<h2>getQt4DocDir</h2>
-<b>getQt4DocDir</b>(<i>prefClass=Prefs</i>)
-
-<p>
-    Module function to retrieve the Qt4DocDir setting.
-</p>
-<dl>
-
-<dt><i>prefClass</i></dt>
-<dd>
-preferences class used as the storage area
-</dd>
-</dl>
-<dl>
-<dt>Returns:</dt>
-<dd>
-the requested Qt4DocDir setting (string)
-</dd>
-</dl>
-<div align="right"><a href="#top">Up</a></div>
-<hr />
-<hr />
 <a NAME="getQt5DocDir" ID="getQt5DocDir"></a>
 <h2>getQt5DocDir</h2>
 <b>getQt5DocDir</b>(<i>prefClass=Prefs</i>)
--- a/eric6/Documentation/Source/eric6.Project.Project.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Project.Project.html	Sun Jul 05 11:11:24 2020 +0200
@@ -905,16 +905,12 @@
 <td>Public method used to check, if the passed in filename belongs to the project sources.</td>
 </tr>
 <tr>
-<td><a href="#Project.isPy2Project">isPy2Project</a></td>
-<td>Public method to check, if this project is a Python2 project.</td>
-</tr>
-<tr>
 <td><a href="#Project.isPy3Project">isPy3Project</a></td>
 <td>Public method to check, if this project is a Python3 project.</td>
 </tr>
 <tr>
 <td><a href="#Project.isPythonProject">isPythonProject</a></td>
-<td>Public method to check, if this project is a Python2 or Python3 project.</td>
+<td>Public method to check, if this project is a Python3 or MicroPython project.</td>
 </tr>
 <tr>
 <td><a href="#Project.isRubyProject">isRubyProject</a></td>
@@ -3397,19 +3393,6 @@
 flag indicating membership (boolean)
 </dd>
 </dl>
-<a NAME="Project.isPy2Project" ID="Project.isPy2Project"></a>
-<h4>Project.isPy2Project</h4>
-<b>isPy2Project</b>(<i></i>)
-
-<p>
-        Public method to check, if this project is a Python2 project.
-</p>
-<dl>
-<dt>Returns:</dt>
-<dd>
-flag indicating a Python2 project (boolean)
-</dd>
-</dl>
 <a NAME="Project.isPy3Project" ID="Project.isPy3Project"></a>
 <h4>Project.isPy3Project</h4>
 <b>isPy3Project</b>(<i></i>)
@@ -3428,7 +3411,7 @@
 <b>isPythonProject</b>(<i></i>)
 
 <p>
-        Public method to check, if this project is a Python2 or Python3
+        Public method to check, if this project is a Python3 or MicroPython
         project.
 </p>
 <dl>
--- a/eric6/Documentation/Source/eric6.Project.ProjectFormsBrowser.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Project.ProjectFormsBrowser.html	Sun Jul 05 11:11:24 2020 +0200
@@ -145,7 +145,7 @@
 </tr>
 <tr>
 <td><a href="#ProjectFormsBrowser.__generateDialogCode">__generateDialogCode</a></td>
-<td>Private method to generate dialog code for the form (Qt4 only).</td>
+<td>Private method to generate dialog code for the form (Qt only).</td>
 </tr>
 <tr>
 <td><a href="#ProjectFormsBrowser.__newForm">__newForm</a></td>
@@ -165,11 +165,11 @@
 </tr>
 <tr>
 <td><a href="#ProjectFormsBrowser.__readStderr">__readStderr</a></td>
-<td>Private slot to handle the readyReadStandardError signal of the pyuic4/pyuic5/pyside-uic/pyside2-uic/rbuic4 process.</td>
+<td>Private slot to handle the readyReadStandardError signal of the pyuic5/pyside2-uic process.</td>
 </tr>
 <tr>
 <td><a href="#ProjectFormsBrowser.__readStdout">__readStdout</a></td>
-<td>Private slot to handle the readyReadStandardOutput signal of the pyuic4/pyuic5/pyside-uic/pyside2-uic/rbuic4 process.</td>
+<td>Private slot to handle the readyReadStandardOutput signal of the pyuic5/pyside2-uic process.</td>
 </tr>
 <tr>
 <td><a href="#ProjectFormsBrowser.__resetUiCompiler">__resetUiCompiler</a></td>
@@ -369,7 +369,7 @@
 <b>__generateDialogCode</b>(<i></i>)
 
 <p>
-        Private method to generate dialog code for the form (Qt4 only).
+        Private method to generate dialog code for the form (Qt only).
 </p>
 <a NAME="ProjectFormsBrowser.__newForm" ID="ProjectFormsBrowser.__newForm"></a>
 <h4>ProjectFormsBrowser.__newForm</h4>
@@ -413,7 +413,7 @@
 
 <p>
         Private slot to handle the readyReadStandardError signal of the
-        pyuic4/pyuic5/pyside-uic/pyside2-uic/rbuic4 process.
+        pyuic5/pyside2-uic process.
 </p>
 <a NAME="ProjectFormsBrowser.__readStdout" ID="ProjectFormsBrowser.__readStdout"></a>
 <h4>ProjectFormsBrowser.__readStdout</h4>
@@ -421,7 +421,7 @@
 
 <p>
         Private slot to handle the readyReadStandardOutput signal of the
-        pyuic4/pyuic5/pyside-uic/pyside2-uic/rbuic4 process.
+        pyuic5/pyside2-uic process.
 </p>
 <a NAME="ProjectFormsBrowser.__resetUiCompiler" ID="ProjectFormsBrowser.__resetUiCompiler"></a>
 <h4>ProjectFormsBrowser.__resetUiCompiler</h4>
--- a/eric6/Documentation/Source/eric6.Project.ProjectResourcesBrowser.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Project.ProjectResourcesBrowser.html	Sun Jul 05 11:11:24 2020 +0200
@@ -136,11 +136,11 @@
 </tr>
 <tr>
 <td><a href="#ProjectResourcesBrowser.__readStderr">__readStderr</a></td>
-<td>Private slot to handle the readyReadStandardError signal of the pyrcc4/pyrcc5/pyside-rcc/pyside2-rcc/rbrcc process.</td>
+<td>Private slot to handle the readyReadStandardError signal of the pyrcc5/pyside2-rcc/ process.</td>
 </tr>
 <tr>
 <td><a href="#ProjectResourcesBrowser.__readStdout">__readStdout</a></td>
-<td>Private slot to handle the readyReadStandardOutput signal of the pyrcc4/pyrcc5/pyside-rcc/pyside2-rcc/rbrcc process.</td>
+<td>Private slot to handle the readyReadStandardOutput signal of the pyrcc5/pyside2-rcc process.</td>
 </tr>
 <tr>
 <td><a href="#ProjectResourcesBrowser.__showContextMenu">__showContextMenu</a></td>
@@ -351,7 +351,7 @@
 
 <p>
         Private slot to handle the readyReadStandardError signal of the
-        pyrcc4/pyrcc5/pyside-rcc/pyside2-rcc/rbrcc process.
+        pyrcc5/pyside2-rcc/ process.
 </p>
 <a NAME="ProjectResourcesBrowser.__readStdout" ID="ProjectResourcesBrowser.__readStdout"></a>
 <h4>ProjectResourcesBrowser.__readStdout</h4>
@@ -359,7 +359,7 @@
 
 <p>
         Private slot to handle the readyReadStandardOutput signal of the
-        pyrcc4/pyrcc5/pyside-rcc/pyside2-rcc/rbrcc process.
+        pyrcc5/pyside2-rcc process.
 </p>
 <a NAME="ProjectResourcesBrowser.__showContextMenu" ID="ProjectResourcesBrowser.__showContextMenu"></a>
 <h4>ProjectResourcesBrowser.__showContextMenu</h4>
--- a/eric6/Documentation/Source/eric6.Project.ProjectTranslationsBrowser.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Project.ProjectTranslationsBrowser.html	Sun Jul 05 11:11:24 2020 +0200
@@ -130,7 +130,7 @@
 </tr>
 <tr>
 <td><a href="#ProjectTranslationsBrowser.__generateTSFile">__generateTSFile</a></td>
-<td>Private method used to run pylupdate4/pylupdate5/pyside-lupdate to generate the .ts files.</td>
+<td>Private method used to run pylupdate5/pyside2-lupdate to generate the .ts files.</td>
 </tr>
 <tr>
 <td><a href="#ProjectTranslationsBrowser.__generateTSFileDone">__generateTSFileDone</a></td>
@@ -150,7 +150,7 @@
 </tr>
 <tr>
 <td><a href="#ProjectTranslationsBrowser.__readStderrLupdate">__readStderrLupdate</a></td>
-<td>Private slot to handle the readyReadStandardError signal of the pylupdate4/pylupdate5/pyside-lupdate/pyside2-lupdate process.</td>
+<td>Private slot to handle the readyReadStandardError signal of the pylupdate5/pyside2-lupdate process.</td>
 </tr>
 <tr>
 <td><a href="#ProjectTranslationsBrowser.__readStdout">__readStdout</a></td>
@@ -335,7 +335,7 @@
 <b>__generateTSFile</b>(<i>noobsolete=False, generateAll=True</i>)
 
 <p>
-        Private method used to run pylupdate4/pylupdate5/pyside-lupdate to
+        Private method used to run pylupdate5/pyside2-lupdate to
         generate the .ts files.
 </p>
 <dl>
@@ -419,7 +419,7 @@
 
 <p>
         Private slot to handle the readyReadStandardError signal of the
-        pylupdate4/pylupdate5/pyside-lupdate/pyside2-lupdate process.
+        pylupdate5/pyside2-lupdate process.
 </p>
 <dl>
 
--- a/eric6/Documentation/Source/eric6.QScintilla.Editor.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.QScintilla.Editor.html	Sun Jul 05 11:11:24 2020 +0200
@@ -434,7 +434,7 @@
 </tr>
 <tr>
 <td><a href="#Editor.__getPyVersion">__getPyVersion</a></td>
-<td>Private method to return the Python main version (2 or 3) or 0 if it's not a Python file at all.</td>
+<td>Private method to return the Python main version or 0 if it's not a Python file at all.</td>
 </tr>
 <tr>
 <td><a href="#Editor.__getSaveFileName">__getSaveFileName</a></td>
@@ -2549,13 +2549,13 @@
 <b>__getPyVersion</b>(<i></i>)
 
 <p>
-        Private method to return the Python main version (2 or 3) or 0 if it's
+        Private method to return the Python main version or 0 if it's
         not a Python file at all.
 </p>
 <dl>
 <dt>Returns:</dt>
 <dd>
-Python version (2 or 3) or 0 if it's not a Python file (int)
+Python version or 0 if it's not a Python file (int)
 </dd>
 </dl>
 <a NAME="Editor.__getSaveFileName" ID="Editor.__getSaveFileName"></a>
@@ -5569,7 +5569,13 @@
 <dl>
 <dt>Returns:</dt>
 <dd>
-flag indicating a Python2 file (boolean)
+flag reporting always False
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
 </dd>
 </dl>
 <a NAME="Editor.isPy3File" ID="Editor.isPy3File"></a>
@@ -5595,7 +5601,7 @@
 <dl>
 <dt>Returns:</dt>
 <dd>
-flag indicating a Python (2 or 3) file (boolean)
+flag indicating a Python3 file (boolean)
 </dd>
 </dl>
 <a NAME="Editor.isRubyFile" ID="Editor.isRubyFile"></a>
--- a/eric6/Documentation/Source/eric6.QScintilla.MiniEditor.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.QScintilla.MiniEditor.html	Sun Jul 05 11:11:24 2020 +0200
@@ -185,10 +185,6 @@
 <td>Private method used to setup the Languages context sub menu.</td>
 </tr>
 <tr>
-<td><a href="#MiniEditor.__isPy2File">__isPy2File</a></td>
-<td>Private method to return a flag indicating a Python 2 file.</td>
-</tr>
-<tr>
 <td><a href="#MiniEditor.__languageMenuTriggered">__languageMenuTriggered</a></td>
 <td>Private method to handle the selection of a lexer language.</td>
 </tr>
@@ -749,19 +745,6 @@
 reference to the generated menu (QMenu)
 </dd>
 </dl>
-<a NAME="MiniEditor.__isPy2File" ID="MiniEditor.__isPy2File"></a>
-<h4>MiniEditor.__isPy2File</h4>
-<b>__isPy2File</b>(<i></i>)
-
-<p>
-        Private method to return a flag indicating a Python 2 file.
-</p>
-<dl>
-<dt>Returns:</dt>
-<dd>
-flag indicating a Python 2 file (boolean)
-</dd>
-</dl>
 <a NAME="MiniEditor.__languageMenuTriggered" ID="MiniEditor.__languageMenuTriggered"></a>
 <h4>MiniEditor.__languageMenuTriggered</h4>
 <b>__languageMenuTriggered</b>(<i>act</i>)
--- a/eric6/Documentation/Source/eric6.Snapshot.SnapshotRegionGrabber.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Snapshot.SnapshotRegionGrabber.html	Sun Jul 05 11:11:24 2020 +0200
@@ -158,6 +158,14 @@
             SnapshotRegionGrabber.Ellipse)
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate a bad value for the 'mode'
+            parameter
+</dd>
+</dl>
 <a NAME="SnapshotRegionGrabber.__grabRect" ID="SnapshotRegionGrabber.__grabRect"></a>
 <h4>SnapshotRegionGrabber.__grabRect</h4>
 <b>__grabRect</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.UI.BrowserModel.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.UI.BrowserModel.html	Sun Jul 05 11:11:24 2020 +0200
@@ -913,10 +913,6 @@
 <td>Public method to check, if this file is a Google Protocol Buffer file.</td>
 </tr>
 <tr>
-<td><a href="#BrowserFileItem.isPython2File">isPython2File</a></td>
-<td>Public method to check, if this file is a Python script.</td>
-</tr>
-<tr>
 <td><a href="#BrowserFileItem.isPython3File">isPython3File</a></td>
 <td>Public method to check, if this file is a Python3 script.</td>
 </tr>
@@ -1143,19 +1139,6 @@
 bool
 </dd>
 </dl>
-<a NAME="BrowserFileItem.isPython2File" ID="BrowserFileItem.isPython2File"></a>
-<h4>BrowserFileItem.isPython2File</h4>
-<b>isPython2File</b>(<i></i>)
-
-<p>
-        Public method to check, if this file is a Python script.
-</p>
-<dl>
-<dt>Returns:</dt>
-<dd>
-flag indicating a Python file (boolean)
-</dd>
-</dl>
 <a NAME="BrowserFileItem.isPython3File" ID="BrowserFileItem.isPython3File"></a>
 <h4>BrowserFileItem.isPython3File</h4>
 <b>isPython3File</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.UI.UserInterface.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.UI.UserInterface.html	Sun Jul 05 11:11:24 2020 +0200
@@ -671,30 +671,18 @@
 <td>Private slot used to show the previous tab or file.</td>
 </tr>
 <tr>
-<td><a href="#UserInterface.__showPyQt4Doc">__showPyQt4Doc</a></td>
-<td>Private slot to show the PyQt4 documentation.</td>
-</tr>
-<tr>
 <td><a href="#UserInterface.__showPyQt5Doc">__showPyQt5Doc</a></td>
 <td>Private slot to show the PyQt5 documentation.</td>
 </tr>
 <tr>
 <td><a href="#UserInterface.__showPySideDoc">__showPySideDoc</a></td>
-<td>Private slot to show the PySide/PySide2 documentation.</td>
-</tr>
-<tr>
-<td><a href="#UserInterface.__showPython2Doc">__showPython2Doc</a></td>
-<td>Private slot to show the Python 2 documentation.</td>
+<td>Private slot to show the PySide2 documentation.</td>
 </tr>
 <tr>
 <td><a href="#UserInterface.__showPythonDoc">__showPythonDoc</a></td>
 <td>Private slot to show the Python 3 documentation.</td>
 </tr>
 <tr>
-<td><a href="#UserInterface.__showQt4Doc">__showQt4Doc</a></td>
-<td>Private slot to show the Qt4 documentation.</td>
-</tr>
-<tr>
 <td><a href="#UserInterface.__showQt5Doc">__showQt5Doc</a></td>
 <td>Private slot to show the Qt5 documentation.</td>
 </tr>
@@ -2302,13 +2290,6 @@
 <p>
         Private slot used to show the previous tab or file.
 </p>
-<a NAME="UserInterface.__showPyQt4Doc" ID="UserInterface.__showPyQt4Doc"></a>
-<h4>UserInterface.__showPyQt4Doc</h4>
-<b>__showPyQt4Doc</b>(<i></i>)
-
-<p>
-        Private slot to show the PyQt4 documentation.
-</p>
 <a NAME="UserInterface.__showPyQt5Doc" ID="UserInterface.__showPyQt5Doc"></a>
 <h4>UserInterface.__showPyQt5Doc</h4>
 <b>__showPyQt5Doc</b>(<i></i>)
@@ -2318,25 +2299,18 @@
 </p>
 <a NAME="UserInterface.__showPySideDoc" ID="UserInterface.__showPySideDoc"></a>
 <h4>UserInterface.__showPySideDoc</h4>
-<b>__showPySideDoc</b>(<i>variant</i>)
+<b>__showPySideDoc</b>(<i>variant="2"</i>)
 
 <p>
-        Private slot to show the PySide/PySide2 documentation.
+        Private slot to show the PySide2 documentation.
 </p>
 <dl>
 
 <dt><i>variant</i> (str)</dt>
 <dd>
-PySide variant (1 or 2)
+PySide variant (2)
 </dd>
 </dl>
-<a NAME="UserInterface.__showPython2Doc" ID="UserInterface.__showPython2Doc"></a>
-<h4>UserInterface.__showPython2Doc</h4>
-<b>__showPython2Doc</b>(<i></i>)
-
-<p>
-        Private slot to show the Python 2 documentation.
-</p>
 <a NAME="UserInterface.__showPythonDoc" ID="UserInterface.__showPythonDoc"></a>
 <h4>UserInterface.__showPythonDoc</h4>
 <b>__showPythonDoc</b>(<i></i>)
@@ -2344,13 +2318,6 @@
 <p>
         Private slot to show the Python 3 documentation.
 </p>
-<a NAME="UserInterface.__showQt4Doc" ID="UserInterface.__showQt4Doc"></a>
-<h4>UserInterface.__showQt4Doc</h4>
-<b>__showQt4Doc</b>(<i></i>)
-
-<p>
-        Private slot to show the Qt4 documentation.
-</p>
 <a NAME="UserInterface.__showQt5Doc" ID="UserInterface.__showQt5Doc"></a>
 <h4>UserInterface.__showQt5Doc</h4>
 <b>__showQt5Doc</b>(<i></i>)
--- a/eric6/Documentation/Source/eric6.Utilities.BackgroundClient.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Utilities.BackgroundClient.html	Sun Jul 05 11:11:24 2020 +0200
@@ -237,6 +237,13 @@
 <p>
         Public method implementing the main loop of the client.
 </p>
+<dl>
+
+<dt>Raises <b>RuntimeError</b>:</dt>
+<dd>
+raised if hashes don't match
+</dd>
+</dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 </body></html>
\ No newline at end of file
--- a/eric6/Documentation/Source/eric6.Utilities.BackgroundService.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Utilities.BackgroundService.html	Sun Jul 05 11:11:24 2020 +0200
@@ -175,6 +175,13 @@
 language of the incomming connection (str)
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>RuntimeError</b>:</dt>
+<dd>
+raised if hashes don't match
+</dd>
+</dl>
 <a NAME="BackgroundService.__send" ID="BackgroundService.__send"></a>
 <h4>BackgroundService.__send</h4>
 <b>__send</b>(<i>fx, lang, fn, data</i>)
--- a/eric6/Documentation/Source/eric6.Utilities.ClassBrowsers.__init__.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Utilities.ClassBrowsers.__init__.html	Sun Jul 05 11:11:24 2020 +0200
@@ -34,7 +34,6 @@
 <li>CORBA IDL</li>
 <li>JavaScript</li>
 <li>ProtoBuf</li>
-<li>Python 2</li>
 <li>Python 3</li>
 <li>Ruby</li>
 </ul>
--- a/eric6/Documentation/Source/eric6.Utilities.ClassBrowsers.pyclbr.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Utilities.ClassBrowsers.pyclbr.html	Sun Jul 05 11:11:24 2020 +0200
@@ -29,9 +29,6 @@
 Parse enough of a Python file to recognize class and method definitions and
 to find out the superclasses of a class as well as its attributes.
 </p>
-<p>
-This is module is based on pyclbr found in the Python 2.2.2 distribution.
-</p>
 <h3>Global Attributes</h3>
 
 <table>
--- a/eric6/Documentation/Source/eric6.Utilities.ModuleParser.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Utilities.ModuleParser.html	Sun Jul 05 11:11:24 2020 +0200
@@ -26,9 +26,6 @@
 Parse a Python module file.
 </p>
 <p>
-This module is based on pyclbr.py as of Python 2.2.2
-</p>
-<p>
 <b>BUGS</b> (from pyclbr.py)
 <ul>
 <li>Code that doesn't pass tabnanny or python -t will confuse it, unless
--- a/eric6/Documentation/Source/eric6.Utilities.PySideImporter.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Utilities.PySideImporter.html	Sun Jul 05 11:11:24 2020 +0200
@@ -23,7 +23,7 @@
 <h1>eric6.Utilities.PySideImporter</h1>
 
 <p>
-Module to check for the presence of PySide/PySide2 by importing it.
+Module to check for the presence of PySide2 by importing it.
 </p>
 <h3>Global Attributes</h3>
 
--- a/eric6/Documentation/Source/eric6.Utilities.__init__.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Utilities.__init__.html	Sun Jul 05 11:11:24 2020 +0200
@@ -61,7 +61,7 @@
 </tr>
 <tr>
 <td><a href="#checkPyside">checkPyside</a></td>
-<td>Module function to check the presence of PySide/PySide2.</td>
+<td>Module function to check the presence of PySide2.</td>
 </tr>
 <tr>
 <td><a href="#compactPath">compactPath</a></td>
@@ -141,7 +141,7 @@
 </tr>
 <tr>
 <td><a href="#generatePySideToolPath">generatePySideToolPath</a></td>
-<td>Module function to generate the executable path for a PySide/PySide2 tool.</td>
+<td>Module function to generate the executable path for a PySide2 tool.</td>
 </tr>
 <tr>
 <td><a href="#generateQtToolName">generateQtToolName</a></td>
@@ -583,26 +583,25 @@
 <b>checkPyside</b>(<i>variant="2"</i>)
 
 <p>
-    Module function to check the presence of PySide/PySide2.
+    Module function to check the presence of PySide2.
 </p>
 <dl>
 
 <dt><i>variant</i> (str)</dt>
 <dd>
-indicator for the PySide variant
+indicator for the PySide variant (not used)
 </dd>
 </dl>
 <dl>
 <dt>Returns:</dt>
 <dd>
-list of two flags indicating the presence of PySide/PySide2 for
-        Python2 and PySide/PySide2 for Python3
+flags indicating the presence of PySide2
 </dd>
 </dl>
 <dl>
 <dt>Return Type:</dt>
 <dd>
-tuple of (bool, bool)
+bool
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
@@ -762,7 +761,7 @@
 <dl>
 <dt>Returns:</dt>
 <dd>
-Python version if file is Python2 or Python3 (int)
+Python version if file is Python3 (int)
 </dd>
 </dl>
 <div align="right"><a href="#top">Up</a></div>
@@ -1160,7 +1159,7 @@
 <b>generatePySideToolPath</b>(<i>toolname, variant="2"</i>)
 
 <p>
-    Module function to generate the executable path for a PySide/PySide2 tool.
+    Module function to generate the executable path for a PySide2 tool.
 </p>
 <dl>
 
@@ -1170,13 +1169,13 @@
 </dd>
 <dt><i>variant</i> (str)</dt>
 <dd>
-indicator for the PySide variant
+indicator for the PySide variant (not used)
 </dd>
 </dl>
 <dl>
 <dt>Returns:</dt>
 <dd>
-the PySide/PySide2 tool path with extension
+the PySide2 tool path with extension
 </dd>
 </dl>
 <dl>
--- a/eric6/Documentation/Source/eric6.Utilities.crypto.py3AES.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.Utilities.crypto.py3AES.html	Sun Jul 05 11:11:24 2020 +0200
@@ -930,6 +930,13 @@
 decrypted data (bytes)
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate an invalid key size
+</dd>
+</dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 <hr />
@@ -961,6 +968,13 @@
 encrypted data prepended with the initialization vector (bytes)
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate an invalid key size
+</dd>
+</dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 <hr />
--- a/eric6/Documentation/Source/eric6.VirtualEnv.VirtualenvAddEditDialog.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.VirtualEnv.VirtualenvAddEditDialog.html	Sun Jul 05 11:11:24 2020 +0200
@@ -113,7 +113,7 @@
 
 <a NAME="VirtualenvAddEditDialog.__init__" ID="VirtualenvAddEditDialog.__init__"></a>
 <h4>VirtualenvAddEditDialog (Constructor)</h4>
-<b>VirtualenvAddEditDialog</b>(<i>manager, venvName="", venvDirectory="", venvInterpreter="", venvVariant=3, isGlobal=False, isConda=False, isRemote=False, execPath="", parent=None</i>)
+<b>VirtualenvAddEditDialog</b>(<i>manager, venvName="", venvDirectory="", venvInterpreter="", isGlobal=False, isConda=False, isRemote=False, execPath="", parent=None</i>)
 
 <p>
         Constructor
@@ -136,10 +136,6 @@
 <dd>
 Python interpreter of the virtual environment
 </dd>
-<dt><i>venvVariant</i> (int)</dt>
-<dd>
-Python variant of the virtual environment
-</dd>
 <dt><i>isGlobal</i> (bool)</dt>
 <dd>
 flag indicating a global environment
@@ -180,17 +176,16 @@
 <dt>Returns:</dt>
 <dd>
 tuple containing the logical name, the directory, the
-            interpreter of the virtual environment, the Python variant,
-            a flag indicating a global environment, a flag indicating an
-            Anaconda environment, aflag indicating a remotely accessed
-            environment and a string to be prepended to the PATH environment
-            variable
+            interpreter of the virtual environment, a flag indicating a
+            global environment, a flag indicating an Anaconda environment,
+            a flag indicating a remotely accessed environment and a string
+            to be prepended to the PATH environment variable
 </dd>
 </dl>
 <dl>
 <dt>Return Type:</dt>
 <dd>
-tuple of (str, str, str, int, bool, bool, bool, str)
+tuple of (str, str, str, bool, bool, bool, str)
 </dd>
 </dl>
 <a NAME="VirtualenvAddEditDialog.on_anacondaCheckBox_clicked" ID="VirtualenvAddEditDialog.on_anacondaCheckBox_clicked"></a>
--- a/eric6/Documentation/Source/eric6.VirtualEnv.VirtualenvInterpreterSelectionDialog.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.VirtualEnv.VirtualenvInterpreterSelectionDialog.html	Sun Jul 05 11:11:24 2020 +0200
@@ -132,14 +132,13 @@
 <dl>
 <dt>Returns:</dt>
 <dd>
-tuple containing the path of the selected Python interpreter
-            and the Python variant
+path of the selected Python interpreter
 </dd>
 </dl>
 <dl>
 <dt>Return Type:</dt>
 <dd>
-tuple of (str, int)
+str
 </dd>
 </dl>
 <a NAME="VirtualenvInterpreterSelectionDialog.on_pythonExecPicker_textChanged" ID="VirtualenvInterpreterSelectionDialog.on_pythonExecPicker_textChanged"></a>
--- a/eric6/Documentation/Source/eric6.VirtualEnv.VirtualenvManager.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.VirtualEnv.VirtualenvManager.html	Sun Jul 05 11:11:24 2020 +0200
@@ -140,14 +140,6 @@
 <td>Public method to get a list of defined virtual environments.</td>
 </tr>
 <tr>
-<td><a href="#VirtualenvManager.getVirtualenvNamesForVariant">getVirtualenvNamesForVariant</a></td>
-<td>Public method to get a list of virtual environments for a given Python variant.</td>
-</tr>
-<tr>
-<td><a href="#VirtualenvManager.getVirtualenvVariant">getVirtualenvVariant</a></td>
-<td>Public method to get the variant of a virtual environment.</td>
-</tr>
-<tr>
 <td><a href="#VirtualenvManager.isCondaEnvironment">isCondaEnvironment</a></td>
 <td>Public method to test, if a given environment is an Anaconda environment.</td>
 </tr>
@@ -247,7 +239,7 @@
 </p>
 <a NAME="VirtualenvManager.addVirtualEnv" ID="VirtualenvManager.addVirtualEnv"></a>
 <h4>VirtualenvManager.addVirtualEnv</h4>
-<b>addVirtualEnv</b>(<i>venvName, venvDirectory, venvInterpreter="", venvVariant=3, isGlobal=False, isConda=False, isRemote=False, execPath=""</i>)
+<b>addVirtualEnv</b>(<i>venvName, venvDirectory, venvInterpreter="", isGlobal=False, isConda=False, isRemote=False, execPath=""</i>)
 
 <p>
         Public method to add a virtual environment.
@@ -266,10 +258,6 @@
 <dd>
 interpreter of the virtual environment
 </dd>
-<dt><i>venvVariant</i> (int)</dt>
-<dd>
-Python variant of the virtual environment
-</dd>
 <dt><i>isGlobal</i> (bool)</dt>
 <dd>
 flag indicating a global environment
@@ -460,59 +448,6 @@
 list of str
 </dd>
 </dl>
-<a NAME="VirtualenvManager.getVirtualenvNamesForVariant" ID="VirtualenvManager.getVirtualenvNamesForVariant"></a>
-<h4>VirtualenvManager.getVirtualenvNamesForVariant</h4>
-<b>getVirtualenvNamesForVariant</b>(<i>variant</i>)
-
-<p>
-        Public method to get a list of virtual environments for a given
-        Python variant.
-</p>
-<dl>
-
-<dt><i>variant</i> (int)</dt>
-<dd>
-Python variant (2 or 3)
-</dd>
-</dl>
-<dl>
-<dt>Returns:</dt>
-<dd>
-list of defined virtual environments
-</dd>
-</dl>
-<dl>
-<dt>Return Type:</dt>
-<dd>
-list of str
-</dd>
-</dl>
-<a NAME="VirtualenvManager.getVirtualenvVariant" ID="VirtualenvManager.getVirtualenvVariant"></a>
-<h4>VirtualenvManager.getVirtualenvVariant</h4>
-<b>getVirtualenvVariant</b>(<i>venvName</i>)
-
-<p>
-        Public method to get the variant of a virtual environment.
-</p>
-<dl>
-
-<dt><i>venvName</i> (str)</dt>
-<dd>
-logical name for the virtual environment
-</dd>
-</dl>
-<dl>
-<dt>Returns:</dt>
-<dd>
-Python variant of the environment
-</dd>
-</dl>
-<dl>
-<dt>Return Type:</dt>
-<dd>
-str
-</dd>
-</dl>
 <a NAME="VirtualenvManager.isCondaEnvironment" ID="VirtualenvManager.isCondaEnvironment"></a>
 <h4>VirtualenvManager.isCondaEnvironment</h4>
 <b>isCondaEnvironment</b>(<i>venvName</i>)
@@ -635,7 +570,7 @@
 </dl>
 <a NAME="VirtualenvManager.renameVirtualEnv" ID="VirtualenvManager.renameVirtualEnv"></a>
 <h4>VirtualenvManager.renameVirtualEnv</h4>
-<b>renameVirtualEnv</b>(<i>oldVenvName, venvName, venvDirectory, venvInterpreter, venvVariant, isGlobal, isConda, isRemote, execPath</i>)
+<b>renameVirtualEnv</b>(<i>oldVenvName, venvName, venvDirectory, venvInterpreter, isGlobal, isConda, isRemote, execPath</i>)
 
 <p>
         Public method to substitute a virtual environment entry with a new
@@ -659,10 +594,6 @@
 <dd>
 interpreter of the virtual environment
 </dd>
-<dt><i>venvVariant</i> (int)</dt>
-<dd>
-Python variant of the virtual environment
-</dd>
 <dt><i>isGlobal</i> (bool)</dt>
 <dd>
 flag indicating a global environment
@@ -683,7 +614,7 @@
 </dl>
 <a NAME="VirtualenvManager.setVirtualEnv" ID="VirtualenvManager.setVirtualEnv"></a>
 <h4>VirtualenvManager.setVirtualEnv</h4>
-<b>setVirtualEnv</b>(<i>venvName, venvDirectory, venvInterpreter, venvVariant, isGlobal, isConda, isRemote, execPath</i>)
+<b>setVirtualEnv</b>(<i>venvName, venvDirectory, venvInterpreter, isGlobal, isConda, isRemote, execPath</i>)
 
 <p>
         Public method to change a virtual environment.
@@ -702,10 +633,6 @@
 <dd>
 interpreter of the virtual environment
 </dd>
-<dt><i>venvVariant</i> (int)</dt>
-<dd>
-Python variant of the virtual environment
-</dd>
 <dt><i>isGlobal</i> (bool)</dt>
 <dd>
 flag indicating a global environment
--- a/eric6/Documentation/Source/eric6.WebBrowser.QtHelp.QtHelpDocumentationSelectionDialog.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.WebBrowser.QtHelp.QtHelpDocumentationSelectionDialog.html	Sun Jul 05 11:11:24 2020 +0200
@@ -158,7 +158,7 @@
 <dl>
 <dt>Return Type:</dt>
 <dd>
-list of str
+set of str
 </dd>
 </dl>
 <a NAME="QtHelpDocumentationSelectionDialog.on_deleteAllButton_clicked" ID="QtHelpDocumentationSelectionDialog.on_deleteAllButton_clicked"></a>
--- a/eric6/Documentation/Source/eric6.WebBrowser.SafeBrowsing.SafeBrowsingAPIClient.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/eric6.WebBrowser.SafeBrowsing.SafeBrowsingAPIClient.html	Sun Jul 05 11:11:24 2020 +0200
@@ -459,7 +459,7 @@
 </p>
 <dl>
 
-<dt><i>prefixes</i> (list of str (Python 2) or list of bytes (Python 3))</dt>
+<dt><i>prefixes</i> (list of bytes)</dt>
 <dd>
 list of hash prefixes to find
 </dd>
--- a/eric6/Documentation/Source/index-eric6.Plugins.CheckerPlugins.SyntaxChecker.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/index-eric6.Plugins.CheckerPlugins.SyntaxChecker.html	Sun Jul 05 11:11:24 2020 +0200
@@ -31,7 +31,7 @@
 
 <tr>
 <td><a href="eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheck.html">SyntaxCheck</a></td>
-<td>Module implementing the syntax check for Python 2/3.</td>
+<td>Module implementing the syntax check for Python 3.</td>
 </tr>
 <tr>
 <td><a href="eric6.Plugins.CheckerPlugins.SyntaxChecker.SyntaxCheckService.html">SyntaxCheckService</a></td>
--- a/eric6/Documentation/Source/index-eric6.Preferences.ConfigurationPages.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/index-eric6.Preferences.ConfigurationPages.html	Sun Jul 05 11:11:24 2020 +0200
@@ -54,10 +54,6 @@
 <td>Module implementing the Debugger General configuration page.</td>
 </tr>
 <tr>
-<td><a href="eric6.Preferences.ConfigurationPages.DebuggerPython2Page.html">DebuggerPython2Page</a></td>
-<td>Module implementing the Debugger Python2 configuration page.</td>
-</tr>
-<tr>
 <td><a href="eric6.Preferences.ConfigurationPages.DebuggerPython3Page.html">DebuggerPython3Page</a></td>
 <td>Module implementing the Debugger Python3 configuration page.</td>
 </tr>
--- a/eric6/Documentation/Source/index-eric6.Utilities.ClassBrowsers.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/index-eric6.Utilities.ClassBrowsers.html	Sun Jul 05 11:11:24 2020 +0200
@@ -33,7 +33,6 @@
 <li>CORBA IDL</li>
 <li>JavaScript</li>
 <li>ProtoBuf</li>
-<li>Python 2</li>
 <li>Python 3</li>
 <li>Ruby</li>
 </ul>
--- a/eric6/Documentation/Source/index-eric6.Utilities.html	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Documentation/Source/index-eric6.Utilities.html	Sun Jul 05 11:11:24 2020 +0200
@@ -79,7 +79,7 @@
 </tr>
 <tr>
 <td><a href="eric6.Utilities.PySideImporter.html">PySideImporter</a></td>
-<td>Module to check for the presence of PySide/PySide2 by importing it.</td>
+<td>Module to check for the presence of PySide2 by importing it.</td>
 </tr>
 <tr>
 <td><a href="eric6.Utilities.__init__.html">Utilities</a></td>
--- a/eric6/DocumentationTools/Config.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DocumentationTools/Config.py	Sun Jul 05 11:11:24 2020 +0200
@@ -32,6 +32,3 @@
     'LinkColor': 'link-color',
 
 }
-
-#
-# eflag: noqa = M702
--- a/eric6/DocumentationTools/QtHelpGenerator.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DocumentationTools/QtHelpGenerator.py	Sun Jul 05 11:11:24 2020 +0200
@@ -12,7 +12,7 @@
 import sys
 import os
 import shutil
-import subprocess
+import subprocess           # secok
 
 from Utilities import (
     joinext, relpath, html_encode, getQtBinariesPath, generateQtToolName,
@@ -280,7 +280,7 @@
         shutil.copy(
             os.path.join(self.outputDir, HelpProjectFile), self.htmlDir)
         os.chdir(self.htmlDir)
-        subprocess.call([
+        subprocess.call([           # secok
             qhelpgeneratorExe,
             HelpProjectFile, "-o", os.path.join(self.outputDir, HelpHelpFile)])
         os.remove(HelpProjectFile)
@@ -296,7 +296,7 @@
             sys.stdout.flush()
             sys.stderr.flush()
             os.chdir(self.outputDir)
-            subprocess.call([
+            subprocess.call([       # secok
                 qcollectiongeneratorExe,
                 HelpCollectionProjectFile, "-o", HelpCollectionFile])
         
--- a/eric6/DocumentationTools/__init__.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/DocumentationTools/__init__.py	Sun Jul 05 11:11:24 2020 +0200
@@ -8,10 +8,6 @@
 """
 
 supportedExtensionsDictForApis = {
-    "Python2": [".py2", ".pyw2", ".ptl"],
     "Python3": [".py", ".pyw", ".py3", ".pyw3"],
     "Ruby": [".rb"]
 }
-
-#
-# eflag: noqa = M702
--- a/eric6/E5Gui/E5LineEdit.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/E5Gui/E5LineEdit.py	Sun Jul 05 11:11:24 2020 +0200
@@ -253,8 +253,10 @@
         @keyparam inactiveText text to be shown on inactivity (string)
         @keyparam side side the clear button should be shown at
             (E5LineEdit.RightSide, E5LineEdit.LeftSide)
+        @exception ValueError raised to indicate a bad parameter value
         """
-        assert side in [E5LineEdit.RightSide, E5LineEdit.LeftSide]
+        if side not in [E5LineEdit.RightSide, E5LineEdit.LeftSide]:
+            raise ValueError("Bad value for 'side' parameter.")
         
         super(E5ClearableLineEdit, self).__init__(parent, inactiveText)
         
--- a/eric6/E5Gui/E5MessageBox.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/E5Gui/E5MessageBox.py	Sun Jul 05 11:11:24 2020 +0200
@@ -235,8 +235,10 @@
         default button (boolean)
     @param textFormat format of the text (Qt.TextFormat)
     @return flag indicating the selection of the Yes button (boolean)
+    @exception ValueError raised to indicate a bad parameter value
     """
-    assert icon in [Critical, Information, Question, Warning]
+    if icon not in [Critical, Information, Question, Warning]:
+        raise ValueError("Bad value for 'icon' parameter.")
     
     res = __messageBox(
         parent, title, text, icon,
@@ -257,8 +259,10 @@
         Warning)
     @param textFormat format of the text (Qt.TextFormat)
     @return flag indicating the selection of the Retry button (boolean)
+    @exception ValueError raised to indicate a bad parameter value
     """
-    assert icon in [Critical, Information, Question, Warning]
+    if icon not in [Critical, Information, Question, Warning]:
+        raise ValueError("Bad value for 'icon' parameter.")
     
     res = __messageBox(
         parent, title, text, icon,
--- a/eric6/E5Gui/E5ModelToolBar.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/E5Gui/E5ModelToolBar.py	Sun Jul 05 11:11:24 2020 +0200
@@ -102,7 +102,8 @@
         """
         Protected slot to build the tool bar.
         """
-        assert self.__model is not None
+        if self.__model is None:
+            return
         
         self.clear()
         
@@ -197,6 +198,7 @@
         Protected method to handle drop events.
         
         @param evt reference to the event (QDropEvent)
+        @exception RuntimeError raised to indicate an invalid model index
         """
         if self.__model is not None:
             act = self.actionAt(evt.pos())
@@ -205,7 +207,8 @@
                 row = self.__model.rowCount(self.__root)
             else:
                 idx = self.index(act)
-                assert idx.isValid()
+                if not idx.isValid():
+                    raise RuntimeError("invalid index")
                 row = idx.row()
                 if self.__model.hasChildren(idx):
                     parentIndex = idx
@@ -224,6 +227,7 @@
         Protected method to handle mouse move events.
         
         @param evt reference to the event (QMouseEvent)
+        @exception RuntimeError raised to indicate an invalid model index
         """
         if self.__model is None:
             super(E5ModelToolBar, self).mouseMoveEvent(evt)
@@ -245,7 +249,8 @@
             return
         
         idx = self.index(act)
-        assert idx.isValid()
+        if not idx.isValid():
+            raise RuntimeError("invalid index")
         
         drag = QDrag(self)
         drag.setMimeData(self.__model.mimeData([idx]))
--- a/eric6/E5Gui/E5PathPicker.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/E5Gui/E5PathPicker.py	Sun Jul 05 11:11:24 2020 +0200
@@ -135,8 +135,10 @@
         
         @param mode picker mode
         @type E5PathPickerModes
+        @exception ValueError raised to indicate a bad parameter value
         """
-        assert mode in E5PathPickerModes
+        if mode not in E5PathPickerModes:
+            raise ValueError("Bad value for 'mode' parameter.")
         
         oldMode = self.__mode
         self.__mode = mode
--- a/eric6/E5Gui/E5TextEditSearchWidget.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/E5Gui/E5TextEditSearchWidget.py	Sun Jul 05 11:11:24 2020 +0200
@@ -185,8 +185,10 @@
         @type QTextEdit, QWebEngineView or QWebView
         @param editType type of the attached edit widget
         @type str (one of "QTextEdit", "QWebEngineView" or "QWebView")
+        @exception ValueError raised to indicate a bad parameter value
         """
-        assert editType in ["QTextEdit", "QWebEngineView", "QWebView"]
+        if editType not in ["QTextEdit", "QWebEngineView", "QWebView"]:
+            raise ValueError("Bad value for 'editType' parameter.")
         
         self.__textedit = textedit
         self.__texteditType = editType
--- a/eric6/E5Gui/E5ToolButton.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/E5Gui/E5ToolButton.py	Sun Jul 05 11:11:24 2020 +0200
@@ -90,13 +90,12 @@
         @param menu reference to the tool button menu
         @type QMenu
         """
-        assert menu is not None
-        
-        if self.__menu:
-            self.__menu.aboutToHide.disconnect(self.__menuAboutToHide)
-        
-        self.__menu = menu
-        self.__menu.aboutToHide.connect(self.__menuAboutToHide)
+        if menu is not None:
+            if self.__menu:
+                self.__menu.aboutToHide.disconnect(self.__menuAboutToHide)
+            
+            self.__menu = menu
+            self.__menu.aboutToHide.connect(self.__menuAboutToHide)
     
     def showMenuInside(self):
         """
--- a/eric6/E5Gui/E5TreeWidget.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/E5Gui/E5TreeWidget.py	Sun Jul 05 11:11:24 2020 +0200
@@ -48,9 +48,11 @@
         Public method to set the default item show mode.
         
         @param mode default mode (ItemsCollapsed, ItemsExpanded)
+        @exception ValueError raised to indicate a bad parameter value
         """
-        assert mode in [E5TreeWidget.ItemsCollapsed,
-                        E5TreeWidget.ItemsExpanded]
+        if mode not in [E5TreeWidget.ItemsCollapsed,
+                        E5TreeWidget.ItemsExpanded]:
+            raise ValueError("Bad value for 'mode' parameter.")
         
         self.__showMode = mode
     
--- a/eric6/E5Network/E5Ftp.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/E5Network/E5Ftp.py	Sun Jul 05 11:11:24 2020 +0200
@@ -9,7 +9,7 @@
 """
 
 
-import ftplib
+import ftplib           # secok
 from socket import _GLOBAL_DEFAULT_TIMEOUT
 
 
@@ -61,7 +61,7 @@
     Class implementing an extension to the Python FTP class to support FTP
     proxies.
     """
-    def __init__(self, host="", user="", password="", acct="",
+    def __init__(self, host="", user="", password="", acct="",          # secok
                  proxyType=E5FtpProxyType.NoProxy, proxyHost="",
                  proxyPort=ftplib.FTP_PORT, proxyUser="", proxyPassword="",
                  proxyAccount="", timeout=_GLOBAL_DEFAULT_TIMEOUT):
@@ -167,7 +167,7 @@
             return super(E5Ftp, self).connect(
                 self.__host, self.__port, self.__timeout)
     
-    def login(self, user="", password="", acct=""):
+    def login(self, user="", password="", acct=""):         # secok
         """
         Public method to login to the FTP server.
         
@@ -257,7 +257,7 @@
             user = "anonymous"
         if not password:
             # make sure it is a string
-            password = ""
+            password = ""           # secok
         if not acct:
             # make sure it is a string
             acct = ""
@@ -326,7 +326,7 @@
         if resp[0] == "3":
             resp = self.sendcmd("ACCT " + acct)
         if resp[0] != "2":
-            raise ftplib.error_reply(resp)
+            raise ftplib.error_reply(resp)          # secok
         
         if self.__proxyType == E5FtpProxyType.AuthResp:
             # authorize to the FTP proxy
--- a/eric6/E5Network/E5GoogleMailHelpers.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/E5Network/E5GoogleMailHelpers.py	Sun Jul 05 11:11:24 2020 +0200
@@ -13,8 +13,8 @@
 import Globals
 
 SCOPES = 'https://www.googleapis.com/auth/gmail.send'
-CLIENT_SECRET_FILE = 'eric_client_secret.json'
-TOKEN_FILE = 'eric_python_email_send_token.json'
+CLIENT_SECRET_FILE = 'eric_client_secret.json'          # secok
+TOKEN_FILE = 'eric_python_email_send_token.json'        # secok
 APPLICATION_NAME = 'Eric Python Send Email'
 
 RequiredPackages = (
--- a/eric6/E5Network/E5RFC6266.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/E5Network/E5RFC6266.py	Sun Jul 05 11:11:24 2020 +0200
@@ -225,10 +225,10 @@
                 self.assocs = dict(assocs)  # So we can change values
                 if 'filename*' in self.assocs:
                     param = self.assocs['filename*']
-                    assert isinstance(param, ExtDispositionParm)
-                    self.assocs['filename*'] = (
-                        parse_ext_value(param.value).string
-                    )
+                    if isinstance(param, ExtDispositionParm):
+                        self.assocs['filename*'] = (
+                            parse_ext_value(param.value).string
+                        )
 
         def filename(self):
             """
--- a/eric6/E5Network/E5XmlRpcClient.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/E5Network/E5XmlRpcClient.py	Sun Jul 05 11:11:24 2020 +0200
@@ -71,9 +71,11 @@
             result as a tuple (function)
         @param errorCallback method to be called in case of an error
             with error code and error string (function)
+        @exception TypeError raised to indicate an illegal 'args' parameter
+            type
         """
-        assert isinstance(args, tuple), \
-            "argument must be tuple or Fault instance"
+        if not isinstance(args, tuple):
+            raise TypeError("argument 'args' must be tuple")
         
         data = xmlrpc.dumps(args, method).encode("utf-8")
         reply = self.__networkManager.post(
--- a/eric6/E5Utilities/E5Cache.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/E5Utilities/E5Cache.py	Sun Jul 05 11:11:24 2020 +0200
@@ -25,8 +25,10 @@
         
         @param size maximum number of entries that may be stored in the cache
         @type int
+        @exception ValueError raised to indicate an illegal 'size' parameter
         """
-        assert size >= 0
+        if size < 0:
+            raise ValueError("'size' parameter must be positive.")
         
         self.__size = size
         
@@ -83,10 +85,9 @@
             cache
         @type int
         """
-        assert newSize >= 0
-        
-        self.__size = newSize
-        self.__adjustToSize()
+        if newSize >= 0:
+            self.__size = newSize
+            self.__adjustToSize()
     
     def getMaximumCacheTime(self):
         """
--- a/eric6/E5XML/Config.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/E5XML/Config.py	Sun Jul 05 11:11:24 2020 +0200
@@ -44,6 +44,3 @@
 
 # version number of the web browser spell check dictionaries list file
 dictionariesListFileFormatVersion = "1.0"
-
-#
-# eflag: noqa = M702
--- a/eric6/E5XML/ProjectReader.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/E5XML/ProjectReader.py	Sun Jul 05 11:11:24 2020 +0200
@@ -68,8 +68,8 @@
                     )
                     self.project.pdata["PROGLANGUAGE"] = self.readElementText()
                     if self.project.pdata["PROGLANGUAGE"] == "Python":
-                        # convert Python to the more specific Python2
-                        self.project.pdata["PROGLANGUAGE"] = "Python2"
+                        # convert Python to the more specific Python3
+                        self.project.pdata["PROGLANGUAGE"] = "Python3"
                 elif self.name() == "ProjectType":
                     self.project.pdata["PROJECTTYPE"] = self.readElementText()
                 elif self.name() == "Description":
--- a/eric6/E5XML/XMLStreamReaderBase.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/E5XML/XMLStreamReaderBase.py	Sun Jul 05 11:11:24 2020 +0200
@@ -8,7 +8,7 @@
 """
 
 
-import pickle
+import pickle           # secok
 import base64
 
 from PyQt5.QtCore import QXmlStreamReader, QCoreApplication
@@ -162,9 +162,6 @@
                         val = float(real) + float(imag) * 1j
                     elif self.name() == "string":
                         val = self.readElementText()
-                    elif self.name() == "unicode":
-                        # backward compatibility to 4.6
-                        val = self.readElementText()
                     elif self.name() == "bytes":
                         by = bytes([int(b) for b in
                                     self.readElementText().split(",")])
@@ -198,7 +195,7 @@
                             continue
                         b64 = self.readElementText()
                         pic = base64.b64decode(b64.encode("ASCII"))
-                        val = pickle.loads(pic)
+                        val = pickle.loads(pic)         # secok
                     else:
                         self._skipUnknownElement()
                 except ValueError as err:
--- a/eric6/E5XML/XMLStreamWriterBase.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/E5XML/XMLStreamWriterBase.py	Sun Jul 05 11:11:24 2020 +0200
@@ -8,7 +8,7 @@
 """
 
 
-import pickle
+import pickle           # secok
 import base64
 
 from PyQt5.QtCore import QXmlStreamWriter
--- a/eric6/Globals/__init__.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Globals/__init__.py	Sun Jul 05 11:11:24 2020 +0200
@@ -351,7 +351,7 @@
 ###############################################################################
 
 
-def versionToTuple(version):
+def versionToTuple(version, length=3):
     """
     Module function to convert a version string into a tuple.
     
@@ -361,6 +361,8 @@
     
     @param version version string
     @type str
+    @param length desired length of the version tuple
+    @type int
     @return version tuple without the suffix
     @rtype tuple of int
     """
@@ -370,8 +372,9 @@
     version = re.split(r"[^\d.]", version)[0]
     for part in version.split("."):
         versionParts.append(int(part))
+    versionParts.extend([0] * length)
     
-    return tuple(versionParts)
+    return tuple(versionParts[:length])
 
 
 def qVersionTuple():
@@ -422,7 +425,7 @@
     Module function to convert a Python string into a QByteArray.
     
     @param txt Python string to be converted
-    @type str, bytes, bytearray, unicode
+    @type str, bytes, bytearray
     @return converted QByteArray
     @rtype QByteArray
     """
--- a/eric6/Graphics/ApplicationDiagramBuilder.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Graphics/ApplicationDiagramBuilder.py	Sun Jul 05 11:11:24 2020 +0200
@@ -54,7 +54,6 @@
         """
         import Utilities.ModuleParser
         extensions = (
-            Preferences.getPython("PythonExtensions") +
             Preferences.getPython("Python3Extensions") +
             ['.rb']
         )
--- a/eric6/Graphics/ImportsDiagramBuilder.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Graphics/ImportsDiagramBuilder.py	Sun Jul 05 11:11:24 2020 +0200
@@ -79,13 +79,11 @@
         """
         import Utilities.ModuleParser
         extensions = (
-            Preferences.getPython("PythonExtensions") +
             Preferences.getPython("Python3Extensions")
         )
         moduleDict = {}
         modules = []
         for ext in (
-            Preferences.getPython("PythonExtensions") +
             Preferences.getPython("Python3Extensions")
         ):
             modules.extend(glob.glob(Utilities.normjoinpath(
--- a/eric6/Graphics/PackageDiagramBuilder.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Graphics/PackageDiagramBuilder.py	Sun Jul 05 11:11:24 2020 +0200
@@ -75,13 +75,10 @@
         
         supportedExt = (
             ['*{0}'.format(ext) for ext in
-             Preferences.getPython("PythonExtensions")] +
-            ['*{0}'.format(ext) for ext in
              Preferences.getPython("Python3Extensions")] +
             ['*.rb']
         )
         extensions = (
-            Preferences.getPython("PythonExtensions") +
             Preferences.getPython("Python3Extensions") +
             ['.rb']
         )
@@ -131,13 +128,10 @@
         
         supportedExt = (
             ['*{0}'.format(ext) for ext in
-             Preferences.getPython("PythonExtensions")] +
-            ['*{0}'.format(ext) for ext in
              Preferences.getPython("Python3Extensions")] +
             ['*.rb']
         )
         extensions = (
-            Preferences.getPython("PythonExtensions") +
             Preferences.getPython("Python3Extensions") +
             ['.rb']
         )
--- a/eric6/Graphics/UMLClassDiagramBuilder.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Graphics/UMLClassDiagramBuilder.py	Sun Jul 05 11:11:24 2020 +0200
@@ -73,7 +73,6 @@
         
         try:
             extensions = (
-                Preferences.getPython("PythonExtensions") +
                 Preferences.getPython("Python3Extensions") +
                 ['.rb']
             )
--- a/eric6/HexEdit/HexEditMainWindow.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/HexEdit/HexEditMainWindow.py	Sun Jul 05 11:11:24 2020 +0200
@@ -1392,9 +1392,10 @@
         @return the requested history list
         @rtype list of tuples of (int, str)
         """
-        assert key in ['search', 'replace']
+        if key in ['search', 'replace']:
+            return self.__srHistory[key]
         
-        return self.__srHistory[key]
+        return []
     
     @pyqtSlot()
     def __showFileMenu(self):
--- a/eric6/HexEdit/HexEditSearchReplaceWidget.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/HexEdit/HexEditSearchReplaceWidget.py	Sun Jul 05 11:11:24 2020 +0200
@@ -542,8 +542,11 @@
         @type str
         @return converted text
         @rtype bytearray
+        @exception ValueError raised to indicate an invalid dataFormat
+            parameter
         """
-        assert dataFormat in self.__formatAndValidators.keys()
+        if dataFormat not in self.__formatAndValidators.keys():
+            raise ValueError("Bad value for 'dataFormat' parameter.")
         
         if dataFormat == "hex":             # hex format
             ba = bytearray(QByteArray.fromHex(
@@ -571,8 +574,11 @@
         @type str
         @return formatted text
         @rtype str
+        @exception ValueError raised to indicate an invalid dataFormat
+            parameter
         """
-        assert dataFormat in self.__formatAndValidators.keys()
+        if dataFormat not in self.__formatAndValidators.keys():
+            raise ValueError("Bad value for 'dataFormat' parameter.")
         
         if dataFormat == "hex":             # hex format
             txt = "{0:x}".format(self.__bytearray2int(array))
--- a/eric6/HexEdit/HexEditWidget.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/HexEdit/HexEditWidget.py	Sun Jul 05 11:11:24 2020 +0200
@@ -662,10 +662,9 @@
         @param ch byte to insert
         @type int in the range 0x00 to 0xff
         """
-        assert ch in range(0, 256)
-        
-        self.__undoStack.insert(pos, ch)
-        self.__refresh()
+        if ch in range(0, 256):
+            self.__undoStack.insert(pos, ch)
+            self.__refresh()
     
     def remove(self, pos, length=1):
         """
@@ -688,10 +687,9 @@
         @param ch byte to replace with
         @type int in the range 0x00 to 0xff
         """
-        assert ch in range(0, 256)
-        
-        self.__undoStack.overwrite(pos, ch)
-        self.__refresh()
+        if ch in range(0, 256):
+            self.__undoStack.overwrite(pos, ch)
+            self.__refresh()
     
     def insertByteArray(self, pos, byteArray):
         """
--- a/eric6/MicroPython/MicroPythonCommandsInterface.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/MicroPython/MicroPythonCommandsInterface.py	Sun Jul 05 11:11:24 2020 +0200
@@ -402,16 +402,15 @@
         @type str
         @exception IOError raised to indicate an issue with the device
         """
-        assert dirname
-        
-        commands = [
-            "import os as __os_",
-            "__os_.chdir('{0}')".format(dirname),
-            "del __os_",
-        ]
-        out, err = self.execute(commands)
-        if err:
-            raise IOError(self.__shortError(err))
+        if dirname:
+            commands = [
+                "import os as __os_",
+                "__os_.chdir('{0}')".format(dirname),
+                "del __os_",
+            ]
+            out, err = self.execute(commands)
+            if err:
+                raise IOError(self.__shortError(err))
     
     def pwd(self):
         """
@@ -443,16 +442,15 @@
         @type str
         @exception IOError raised to indicate an issue with the device
         """
-        assert filename
-        
-        commands = [
-            "import os as __os_",
-            "__os_.remove('{0}')".format(filename),
-            "del __os_",
-        ]
-        out, err = self.execute(commands)
-        if err:
-            raise IOError(self.__shortError(err))
+        if filename:
+            commands = [
+                "import os as __os_",
+                "__os_.remove('{0}')".format(filename),
+                "del __os_",
+            ]
+            out, err = self.execute(commands)
+            if err:
+                raise IOError(self.__shortError(err))
     
     def rmrf(self, name, recursive=False, force=False):
         """
@@ -468,40 +466,41 @@
         @rtype bool
         @exception IOError raised to indicate an issue with the device
         """
-        assert name
+        if name:
+            commands = [
+                "import os as __os_",
+                "\n".join([
+                    "def remove_file(name, recursive=False, force=False):",
+                    "    try:",
+                    "        mode = __os_.stat(name)[0]",
+                    "        if mode & 0x4000 != 0:",
+                    "            if recursive:",
+                    "                for file in __os_.listdir(name):",
+                    "                    success = remove_file("
+                    "name + '/' + file, recursive, force)",
+                    "                    if not success and not force:",
+                    "                        return False",
+                    "                __os_.rmdir(name)",
+                    "            else:",
+                    "                if not force:",
+                    "                    return False",
+                    "        else:",
+                    "            __os_.remove(name)",
+                    "    except:",
+                    "        if not force:",
+                    "            return False",
+                    "    return True",
+                ]),
+                "print(remove_file('{0}', {1}, {2}))".format(name, recursive,
+                                                             force),
+                "del __os_, remove_file",
+            ]
+            out, err = self.execute(commands)
+            if err:
+                raise IOError(self.__shortError(err))
+            return ast.literal_eval(out.decode("utf-8"))
         
-        commands = [
-            "import os as __os_",
-            "\n".join([
-                "def remove_file(name, recursive=False, force=False):",
-                "    try:",
-                "        mode = __os_.stat(name)[0]",
-                "        if mode & 0x4000 != 0:",
-                "            if recursive:",
-                "                for file in __os_.listdir(name):",
-                "                    success = remove_file(name + '/' + file,"
-                " recursive, force)",
-                "                    if not success and not force:",
-                "                        return False",
-                "                __os_.rmdir(name)",
-                "            else:",
-                "                if not force:",
-                "                    return False",
-                "        else:",
-                "            __os_.remove(name)",
-                "    except:",
-                "        if not force:",
-                "            return False",
-                "    return True",
-            ]),
-            "print(remove_file('{0}', {1}, {2}))".format(name, recursive,
-                                                         force),
-            "del __os_, remove_file",
-        ]
-        out, err = self.execute(commands)
-        if err:
-            raise IOError(self.__shortError(err))
-        return ast.literal_eval(out.decode("utf-8"))
+        return False
     
     def mkdir(self, dirname):
         """
@@ -511,16 +510,15 @@
         @type str
         @exception IOError raised to indicate an issue with the device
         """
-        assert dirname
-   
-        commands = [
-            "import os as __os_",
-            "__os_.mkdir('{0}')".format(dirname),
-            "del __os_",
-        ]
-        out, err = self.execute(commands)
-        if err:
-            raise IOError(self.__shortError(err))
+        if dirname:
+            commands = [
+                "import os as __os_",
+                "__os_.mkdir('{0}')".format(dirname),
+                "del __os_",
+            ]
+            out, err = self.execute(commands)
+            if err:
+                raise IOError(self.__shortError(err))
     
     def rmdir(self, dirname):
         """
@@ -530,16 +528,15 @@
         @type str
         @exception IOError raised to indicate an issue with the device
         """
-        assert dirname
-   
-        commands = [
-            "import os as __os_",
-            "__os_.rmdir('{0}')".format(dirname),
-            "del __os_",
-        ]
-        out, err = self.execute(commands)
-        if err:
-            raise IOError(self.__shortError(err))
+        if dirname:
+            commands = [
+                "import os as __os_",
+                "__os_.rmdir('{0}')".format(dirname),
+                "del __os_",
+            ]
+            out, err = self.execute(commands)
+            if err:
+                raise IOError(self.__shortError(err))
     
     def put(self, hostFileName, deviceFileName=None):
         """
--- a/eric6/PipInterface/Pip.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/PipInterface/Pip.py	Sun Jul 05 11:11:24 2020 +0200
@@ -655,7 +655,7 @@
                            'replace')
                 try:
                     result = json.loads(data)
-                except Exception:
+                except Exception:           # secok
                     # ignore JSON exceptions
                     pass
         
--- a/eric6/PipInterface/PipPackagesWidget.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/PipInterface/PipPackagesWidget.py	Sun Jul 05 11:11:24 2020 +0200
@@ -26,6 +26,7 @@
 from .Ui_PipPackagesWidget import Ui_PipPackagesWidget
 
 import UI.PixmapCache
+import Globals
 
 
 class PipPackagesWidget(QWidget, Ui_PipPackagesWidget):
@@ -154,6 +155,24 @@
         
         return available
     
+    def __availablePipVersion(self):
+        """
+        Private method to get the pip version of the selected environment.
+        
+        @return tuple containing the version number or tuple with all zeros
+            in case pip is not available
+        @rtype tuple of int
+        """
+        pipVersionTuple = (0, 0, 0)
+        venvName = self.environmentsComboBox.currentText()
+        if venvName:
+            pipList = self.packagesList.findItems(
+                "pip", Qt.MatchExactly | Qt.MatchCaseSensitive)
+            if len(pipList) > 0:
+                pipVersionTuple = Globals.versionToTuple(pipList[0].text(1))
+        
+        return pipVersionTuple
+    
     #######################################################################
     ## Slots handling widget signals below
     #######################################################################
@@ -974,6 +993,7 @@
         """
         enable = bool(self.environmentsComboBox.currentText())
         enablePip = self.__isPipAvailable()
+        enablePipCache = self.__availablePipVersion() >= (20, 1, 0)
         
         self.__installPipAct.setEnabled(not enablePip)
         self.__installPipUserAct.setEnabled(not enablePip)
@@ -986,10 +1006,10 @@
         self.__uninstallRequirementsAct.setEnabled(enablePip)
         self.__generateRequirementsAct.setEnabled(enablePip)
         
-        self.__cacheInfoAct.setEnabled(enablePip)
-        self.__cacheShowListAct.setEnabled(enablePip)
-        self.__cacheRemoveAct.setEnabled(enablePip)
-        self.__cachePurgeAct.setEnabled(enablePip)
+        self.__cacheInfoAct.setEnabled(enablePipCache)
+        self.__cacheShowListAct.setEnabled(enablePipCache)
+        self.__cacheRemoveAct.setEnabled(enablePipCache)
+        self.__cachePurgeAct.setEnabled(enablePipCache)
         
         self.__editVirtualenvConfigAct.setEnabled(enable)
     
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/AnnotationsChecker.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/AnnotationsChecker.py	Sun Jul 05 11:11:24 2020 +0200
@@ -163,13 +163,6 @@
         @rtype ast.Module
         """
         source = "".join(self.__source)
-        # Check type for py2: if not str it's unicode
-        if sys.version_info[0] == 2:
-            try:
-                source = source.encode('utf-8')
-            except UnicodeError:
-                pass
-        
         return compile(source, self.__filename, 'exec', ast.PyCF_ONLY_AST)
     
     def run(self):
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/AstUtilities.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/AstUtilities.py	Sun Jul 05 11:11:24 2020 +0200
@@ -135,10 +135,7 @@
         @return flag indicating a bytes
         @rtype bool
         """
-        return (
-            sys.version_info[0] >= 3 and
-            isinstance(node, ast.Bytes)
-        )
+        return isinstance(node, ast.Bytes)
     
     def isBaseString(node):
         """
@@ -149,10 +146,7 @@
         @return flag indicating a bytes or string
         @rtype bool
         """
-        typ = (ast.Str,)
-        if sys.version_info[0] > 2:
-            typ += (ast.Bytes,)
-        return isinstance(node, typ)
+        return isinstance(node, (ast.Str, ast.Bytes))
     
     def isNameConstant(node):
         """
@@ -181,7 +175,7 @@
         elif isinstance(node, ast.Str):
             return node.s
         
-        elif sys.version_info[0] > 2 and isinstance(node, ast.Bytes):
+        elif isinstance(node, ast.Bytes):
             return node.s
         
         elif isinstance(node, ast.NameConstant):
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleChecker.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleChecker.py	Sun Jul 05 11:11:24 2020 +0200
@@ -7,11 +7,7 @@
 Module implementing the code style checker.
 """
 
-try:  # Only for Py2
-    import Queue as queue
-except ImportError:
-    import queue
-
+import queue
 import ast
 import sys
 import multiprocessing
@@ -286,12 +282,6 @@
     @rtype tuple of (dict, dict) or tuple of (None, None)
     """
     src = "".join(source)
-    # Check type for py2: if not str it's unicode
-    if sys.version_info[0] == 2:
-        try:
-            src = src.encode('utf-8')
-        except UnicodeError:
-            pass
     
     try:
         ast.parse(src, filename, 'exec')
@@ -364,14 +354,6 @@
         fixer = None
     
     if not errors:
-        # avoid 'Encoding declaration in unicode string' exception on Python2
-        if sys.version_info[0] == 2:
-            if encoding == 'utf-8-bom':
-                enc = 'utf-8'
-            else:
-                enc = encoding
-            source = [line.encode(enc) for line in source]
-        
         if includeMessages:
             select = [s.strip() for s in
                       includeMessages.split(',') if s.strip()]
@@ -524,6 +506,3 @@
                 })
 
     return stats, results
-
-#
-# eflag: noqa = M702
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -90,12 +90,15 @@
     noFiles = 1
     hasResults = 2
     
-    def __init__(self, styleCheckService, parent=None):
+    def __init__(self, styleCheckService, project=None, parent=None):
         """
         Constructor
         
         @param styleCheckService reference to the service
         @type CodeStyleCheckService
+        @param project reference to the project if called on project or project
+            browser level
+        @type Project
         @param parent reference to the parent widget
         @type QWidget
         """
@@ -103,6 +106,8 @@
         self.setupUi(self)
         self.setWindowFlags(Qt.Window)
         
+        self.__project = project
+        
         self.optionsTabWidget.setCurrentIndex(0)
         
         self.excludeMessagesSelectButton.setIcon(
@@ -141,18 +146,10 @@
         self.ecMediumRiskCombo.addItems(
             CodeStyleCheckerDialog.cryptoBitSelectionsEc)
         
-        self.statisticsButton = self.buttonBox.addButton(
-            self.tr("Statistics..."), QDialogButtonBox.ActionRole)
-        self.statisticsButton.setToolTip(
-            self.tr("Press to show some statistics for the last run"))
         self.statisticsButton.setEnabled(False)
-        self.showButton = self.buttonBox.addButton(
-            self.tr("Show"), QDialogButtonBox.ActionRole)
-        self.showButton.setToolTip(
-            self.tr("Press to show all files containing an issue"))
         self.showButton.setEnabled(False)
+        self.cancelButton.setEnabled(True)
         self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False)
-        self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True)
         
         self.resultList.headerItem().setText(self.resultList.columnCount(), "")
         self.resultList.header().setSortIndicator(0, Qt.AscendingOrder)
@@ -410,8 +407,8 @@
         self.__forProject = True
         
         self.buttonBox.button(QDialogButtonBox.Close).setEnabled(True)
-        self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(False)
         self.buttonBox.button(QDialogButtonBox.Close).setDefault(True)
+        self.cancelButton.setEnabled(False)
         
         self.__data = self.__project.getData("CHECKERSPARMS", "Pep8Checker")
         if (
@@ -559,6 +556,26 @@
         
         self.__cleanupData()
     
+    def __prepareProgress(self):
+        """
+        Private method to prepare the progress tab for the next run.
+        """
+        self.progressList.clear()
+        if len(self.files) > 0:
+            self.checkProgress.setMaximum(len(self.files))
+            self.checkProgressLabel.setVisible(len(self.files) > 1)
+            self.checkProgress.setVisible(len(self.files) > 1)
+            if len(self.files) > 1:
+                if self.__project:
+                    self.progressList.addItems([
+                        os.path.join("...", self.__project.getRelativePath(f))
+                        for f in self.files
+                    ])
+                else:
+                    self.progressList.addItems(self.files)
+        
+        QApplication.processEvents()
+    
     def start(self, fn, save=False, repeat=None):
         """
         Public slot to start the code style check.
@@ -573,12 +590,12 @@
         if self.__project is None:
             self.__project = e5App().getObject("Project")
         
-        self.mainWidget.setCurrentWidget(self.runTab)
+        self.mainWidget.setCurrentWidget(self.progressTab)
         
         self.cancelled = False
         self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False)
-        self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(True)
-        self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True)
+        self.cancelButton.setEnabled(True)
+        self.cancelButton.setDefault(True)
         self.statisticsButton.setEnabled(False)
         self.showButton.setEnabled(False)
         self.fixButton.setEnabled(False)
@@ -596,14 +613,13 @@
             self.files = fn[:]
         elif os.path.isdir(fn):
             self.files = []
-            extensions = set(Preferences.getPython("PythonExtensions") +
-                             Preferences.getPython("Python3Extensions"))
+            extensions = set(Preferences.getPython("Python3Extensions"))
             for ext in extensions:
                 self.files.extend(Utilities.direntries(
                     fn, True, '*{0}'.format(ext), 0))
         else:
             self.files = [fn]
-
+        
         # filter the list depending on the filter string
         if self.files:
             filterString = self.excludeFilesEdit.text()
@@ -614,19 +630,16 @@
                     f for f in self.files
                     if not fnmatch.fnmatch(f, fileFilter.strip())
                 ]
-
+        
         self.__errorItem = None
         self.__resetStatistics()
         self.__clearErrors(self.files)
         self.__cleanupData()
+        self.__prepareProgress()
         
         if len(self.files) > 0:
             self.securityNoteLabel.setVisible(
                 "S" in self.__getCategories(True, asList=True))
-            self.checkProgress.setMaximum(len(self.files))
-            self.checkProgressLabel.setVisible(len(self.files) > 1)
-            self.checkProgress.setVisible(len(self.files) > 1)
-            QApplication.processEvents()
             
             # extract the configuration values
             excludeMessages = self.__assembleExcludeMessages()
@@ -715,6 +728,7 @@
             self.files.sort()
             if len(self.files) == 1:
                 self.__batch = False
+                self.mainWidget.setCurrentWidget(self.resultsTab)
                 self.check()
             else:
                 self.__batch = True
@@ -953,13 +967,32 @@
         self.resultList.setSortingEnabled(True)
         self.resultList.setUpdatesEnabled(True)
         
-        self.checkProgress.setValue(self.progress)
-        self.checkProgressLabel.setPath(fn)
-        QApplication.processEvents()
+        self.__updateProgress(fn)
         
         if not self.__batch:
             self.check()
     
+    def __updateProgress(self, fn):
+        """
+        Private method to update the progress tab.
+        
+        @param fn filename of the just checked file
+        @type str
+        """
+        if self.__project:
+            fn = os.path.join("...", self.__project.getRelativePath(fn))
+        
+        self.checkProgress.setValue(self.progress)
+        self.checkProgressLabel.setPath(fn)
+        
+        # remove file from the list of jobs to do
+        fileItems = self.progressList.findItems(fn, Qt.MatchExactly)
+        if fileItems:
+            row = self.progressList.row(fileItems[0])
+            self.progressList.takeItem(row)
+        
+        QApplication.processEvents()
+    
     def __finish(self):
         """
         Private slot called when the code style check finished or the user
@@ -970,8 +1003,8 @@
             
             self.cancelled = True
             self.buttonBox.button(QDialogButtonBox.Close).setEnabled(True)
-            self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(False)
             self.buttonBox.button(QDialogButtonBox.Close).setDefault(True)
+            self.cancelButton.setEnabled(False)
             self.statisticsButton.setEnabled(True)
             self.showButton.setEnabled(True)
             self.startButton.setEnabled(True)
@@ -995,6 +1028,8 @@
             
             self.checkProgress.setVisible(False)
             self.checkProgressLabel.setVisible(False)
+            
+            self.mainWidget.setCurrentWidget(self.resultsTab)
     
     def __getEol(self, fn):
         """
@@ -1548,6 +1583,17 @@
         # Update UI with default values
         self.on_loadDefaultButton_clicked()
     
+    @pyqtSlot()
+    def on_cancelButton_clicked(self):
+        """
+        Private slot to handle the "Cancel" button press.
+        """
+        if self.__batch:
+            self.styleCheckService.cancelStyleBatchCheck()
+            QTimer.singleShot(1000, self.__finish)
+        else:
+            self.__finish()
+    
     @pyqtSlot(QAbstractButton)
     def on_buttonBox_clicked(self, button):
         """
@@ -1558,16 +1604,6 @@
         """
         if button == self.buttonBox.button(QDialogButtonBox.Close):
             self.close()
-        elif button == self.buttonBox.button(QDialogButtonBox.Cancel):
-            if self.__batch:
-                self.styleCheckService.cancelStyleBatchCheck()
-                QTimer.singleShot(1000, self.__finish)
-            else:
-                self.__finish()
-        elif button == self.showButton:
-            self.on_showButton_clicked()
-        elif button == self.statisticsButton:
-            self.on_statisticsButton_clicked()
     
     def __clearErrors(self, files):
         """
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.ui	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.ui	Sun Jul 05 11:11:24 2020 +0200
@@ -1141,9 +1141,105 @@
        </item>
       </layout>
      </widget>
-     <widget class="QWidget" name="runTab">
+     <widget class="QWidget" name="progressTab">
       <attribute name="title">
-       <string>Run</string>
+       <string>Progress</string>
+      </attribute>
+      <layout class="QHBoxLayout" name="horizontalLayout_11">
+       <item>
+        <layout class="QVBoxLayout" name="verticalLayout_12">
+         <item>
+          <widget class="QListWidget" name="progressList">
+           <property name="toolTip">
+            <string>Shows the list of files still to be checked</string>
+           </property>
+           <property name="editTriggers">
+            <set>QAbstractItemView::NoEditTriggers</set>
+           </property>
+           <property name="alternatingRowColors">
+            <bool>true</bool>
+           </property>
+           <property name="selectionMode">
+            <enum>QAbstractItemView::NoSelection</enum>
+           </property>
+           <property name="textElideMode">
+            <enum>Qt::ElideMiddle</enum>
+           </property>
+           <property name="sortingEnabled">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="E5SqueezeLabelPath" name="checkProgressLabel">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string/>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QProgressBar" name="checkProgress">
+           <property name="toolTip">
+            <string>Shows the progress of the code style check</string>
+           </property>
+           <property name="value">
+            <number>0</number>
+           </property>
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="format">
+            <string>%v/%m Files</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="Line" name="line_3">
+         <property name="lineWidth">
+          <number>2</number>
+         </property>
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <layout class="QVBoxLayout" name="verticalLayout_11">
+         <item>
+          <widget class="QPushButton" name="cancelButton">
+           <property name="text">
+            <string>Cancel</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="verticalSpacer_5">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>20</width>
+             <height>40</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="resultsTab">
+      <attribute name="title">
+       <string>Results</string>
       </attribute>
       <layout class="QHBoxLayout" name="horizontalLayout_4">
        <item>
@@ -1195,35 +1291,6 @@
            </column>
           </widget>
          </item>
-         <item>
-          <widget class="E5SqueezeLabelPath" name="checkProgressLabel">
-           <property name="sizePolicy">
-            <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-             <horstretch>0</horstretch>
-             <verstretch>0</verstretch>
-            </sizepolicy>
-           </property>
-           <property name="text">
-            <string/>
-           </property>
-          </widget>
-         </item>
-         <item>
-          <widget class="QProgressBar" name="checkProgress">
-           <property name="toolTip">
-            <string>Shows the progress of the code style check</string>
-           </property>
-           <property name="value">
-            <number>0</number>
-           </property>
-           <property name="orientation">
-            <enum>Qt::Horizontal</enum>
-           </property>
-           <property name="format">
-            <string>%v/%m Files</string>
-           </property>
-          </widget>
-         </item>
         </layout>
        </item>
        <item>
@@ -1259,6 +1326,36 @@
           </widget>
          </item>
          <item>
+          <widget class="Line" name="line_4">
+           <property name="lineWidth">
+            <number>2</number>
+           </property>
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="showButton">
+           <property name="toolTip">
+            <string>Press to show all files containing an issue</string>
+           </property>
+           <property name="text">
+            <string>Show</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="statisticsButton">
+           <property name="toolTip">
+            <string>Press to show some statistics for the last run</string>
+           </property>
+           <property name="text">
+            <string>Statistics...</string>
+           </property>
+          </widget>
+         </item>
+         <item>
           <spacer name="verticalSpacer_4">
            <property name="orientation">
             <enum>Qt::Vertical</enum>
@@ -1283,7 +1380,7 @@
       <enum>Qt::Horizontal</enum>
      </property>
      <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Close</set>
+      <set>QDialogButtonBox::Close</set>
      </property>
     </widget>
    </item>
@@ -1348,13 +1445,17 @@
   <tabstop>ecHighRiskCombo</tabstop>
   <tabstop>ecMediumRiskCombo</tabstop>
   <tabstop>typedExceptionsCheckBox</tabstop>
-  <tabstop>resetDefaultButton</tabstop>
+  <tabstop>startButton</tabstop>
   <tabstop>loadDefaultButton</tabstop>
   <tabstop>storeDefaultButton</tabstop>
-  <tabstop>startButton</tabstop>
+  <tabstop>resetDefaultButton</tabstop>
+  <tabstop>progressList</tabstop>
+  <tabstop>cancelButton</tabstop>
   <tabstop>resultList</tabstop>
+  <tabstop>restartButton</tabstop>
   <tabstop>fixButton</tabstop>
-  <tabstop>restartButton</tabstop>
+  <tabstop>showButton</tabstop>
+  <tabstop>statisticsButton</tabstop>
  </tabstops>
  <resources/>
  <connections>
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleFixer.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleFixer.py	Sun Jul 05 11:11:24 2020 +0200
@@ -7,16 +7,10 @@
 Module implementing a class to fix certain code style issues.
 """
 
-from __future__ import unicode_literals
-try:
-    # Python 2
-    from StringIO import StringIO       # __IGNORE_EXCEPTION__
-except ImportError:
-    # Python 3
-    from io import StringIO             # __IGNORE_WARNING__
 import os
 import re
 import tokenize
+from io import StringIO
 
 # CodeStyleCheckerDialog tries to import FixableCodeStyleIssues which fails
 # under Python3. So ignore it.
@@ -26,8 +20,8 @@
     pass
 
 FixableCodeStyleIssues = [
-    "D111", "D112", "D113", "D121", "D131", "D141",
-    "D142", "D143", "D144", "D145",
+    "D111", "D112", "D121", "D131", "D141", "D142",
+    "D143", "D144", "D145",
     "D221", "D222", "D231", "D242", "D243", "D244",
     "D245", "D246", "D247",
     "E101", "E111", "E121", "E122", "E123", "E124",
@@ -108,7 +102,6 @@
         self.__fixes = {
             "D111": self.__fixD111,
             "D112": self.__fixD112,
-            "D113": self.__fixD112,
             "D121": self.__fixD121,
             "D131": self.__fixD131,
             "D141": self.__fixD141,
@@ -471,8 +464,11 @@
         @param pos position inside line (integer)
         @param logical logical line structure
         @return flag indicating a change was done (boolean)
+        @exception ValueError raised to indicate a bad 'logical' parameter
         """
-        assert logical
+        if not logical:
+            raise ValueError("Bad value for 'logical' parameter.")
+        
         ls, _, original = logical
 
         rewrapper = IndentationWrapper(original)
@@ -554,9 +550,9 @@
     
     def __fixD112(self, code, line, pos):
         """
-        Private method to fix docstring 'r' or 'u' in leading quotes.
+        Private method to fix docstring 'r' in leading quotes.
         
-        Codes: D112, D113
+        Codes: D112
         
         @param code code of the issue
         @type str
@@ -572,8 +568,6 @@
         line = line - 1
         if code == "D112":
             insertChar = "r"
-        elif code == "D113":
-            insertChar = "u"
         else:
             return (0, "", 0)
         
@@ -2139,7 +2133,6 @@
                         want = have
                 else:
                     want = 0
-            assert want >= 0
             have2want[have] = want
             diff = want - have
             if diff == 0 or have == 0:
@@ -2302,8 +2295,6 @@
             logical.append(text)
             previous = t
         logical_line = ''.join(logical)
-        assert logical_line.lstrip() == logical_line
-        assert logical_line.rstrip() == logical_line
         return logical_line
 
     def pep8Expected(self):
@@ -2465,7 +2456,6 @@
                         if parens[idx]:
                             parens[idx] -= 1
                             break
-                assert len(indent) == depth + 1
                 if start[1] not in indent_chances:
                     indent_chances[start[1]] = text
 
@@ -2577,7 +2567,6 @@
         
         indent = self.__getIndent(self.__text)
         source = self.__text[len(indent):]
-        assert source.lstrip() == source
         sio = StringIO(source)
         
         # Check for multi line string.
@@ -2809,9 +2798,6 @@
                     indent + first.strip() + self.__eol)
             elif tokenType == tokenize.OP and tokenString != '=':
                 # Don't break on '=' after keyword as this violates PEP 8.
-
-                assert tokenType != tokenize.INDENT
-
                 offset = tkn[2][1] + 1
                 first = source[:offset]
 
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/ComplexityChecker.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/ComplexityChecker.py	Sun Jul 05 11:11:24 2020 +0200
@@ -253,6 +253,3 @@
             return (
                 (sortedList[medianIndex] + sortedList[medianIndex + 1]) / 2.0
             )
-
-#
-# eflag: noqa = M702
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/DocStyleChecker.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/DocStyleChecker.py	Sun Jul 05 11:11:24 2020 +0200
@@ -12,15 +12,10 @@
 # pep257.py (version 0.2.4).
 #
 
-try:
-    # Python 2
-    from StringIO import StringIO       # __IGNORE_EXCEPTION__
-except ImportError:
-    # Python 3
-    from io import StringIO             # __IGNORE_WARNING__
 import tokenize
 import ast
 import sys
+from io import StringIO
 
 try:
     ast.AsyncFunctionDef    # __IGNORE_EXCEPTION__
@@ -40,11 +35,7 @@
         @param startLine line number the context starts in the source (integer)
         @param contextType type of the context object (string)
         """
-        if sys.version_info[0] == 2:
-            stringTypes = (str, unicode)        # __IGNORE_WARNING__
-        else:
-            stringTypes = str
-        if isinstance(source, stringTypes):
+        if isinstance(source, str):
             self.__source = source.splitlines(True)
         else:
             self.__source = source[:]
@@ -132,7 +123,7 @@
     """
     Codes = [
         "D101", "D102", "D103", "D104", "D105",
-        "D111", "D112", "D113",
+        "D111", "D112",
         "D121", "D122",
         "D130", "D131", "D132", "D133", "D134",
         "D141", "D142", "D143", "D144", "D145",
@@ -163,8 +154,6 @@
         @keyparam docType type of the documentation strings
             (string, one of 'eric' or 'pep257')
         """
-        assert docType in ("eric", "pep257")
-        
         self.__select = tuple(select)
         self.__ignore = ('',) if select else tuple(ignore)
         self.__expected = expected[:]
@@ -215,7 +204,6 @@
                 "docstring": [
                     (self.__checkTripleDoubleQuotes, ("D111",)),
                     (self.__checkBackslashes, ("D112",)),
-                    (self.__checkUnicode, ("D113",)),
                     (self.__checkOneLiner, ("D121",)),
                     (self.__checkIndent, ("D122",)),
                     (self.__checkSummary, ("D130",)),
@@ -255,7 +243,6 @@
                 "docstring": [
                     (self.__checkTripleDoubleQuotes, ("D111",)),
                     (self.__checkBackslashes, ("D112",)),
-                    (self.__checkUnicode, ("D113",)),
                     (self.__checkIndent, ("D122",)),
                     (self.__checkSummary, ("D130",)),
                     (self.__checkEricEndsWithPeriod, ("D231",)),
@@ -362,12 +349,6 @@
             return
         
         source = "".join(self.__source)
-        # Check type for py2: if not str it's unicode
-        if sys.version_info[0] == 2:
-            try:
-                source = source.encode('utf-8')
-            except UnicodeError:
-                pass
         try:
             compile(source, self.__filename, 'exec', ast.PyCF_ONLY_AST)
         except (SyntaxError, TypeError):
@@ -447,62 +428,30 @@
             summaries.append(line2)
         return summaries, lineno
     
-    if sys.version_info[0] < 3:
-        def __getArgNames(self, node):
-            """
-            Private method to get the argument names of a function node.
-            
-            @param node AST node to extract arguments names from
-            @return tuple of two list of argument names, one for arguments
-                and one for keyword arguments (tuple of list of string)
-            """
-            def unpackArgs(args):
-                """
-                Local helper function to unpack function argument names.
-                
-                @param args list of AST node arguments
-                @return list of argument names (list of string)
-                """
-                ret = []
-                for arg in args:
-                    if isinstance(arg, ast.Tuple):
-                        ret.extend(unpackArgs(arg.elts))
-                    else:
-                        ret.append(arg.id)
-                return ret
-            
-            arguments = unpackArgs(node.args.args)
-            if node.args.vararg is not None:
+    def __getArgNames(self, node):
+        """
+        Private method to get the argument names of a function node.
+        
+        @param node AST node to extract arguments names from
+        @return tuple of two list of argument names, one for arguments
+            and one for keyword arguments (tuple of list of string)
+        """
+        arguments = []
+        arguments.extend([arg.arg for arg in node.args.args])
+        if node.args.vararg is not None:
+            if sys.version_info < (3, 4, 0):
                 arguments.append(node.args.vararg)
-            kwarguments = []
-            if node.args.kwarg is not None:
+            else:
+                arguments.append(node.args.vararg.arg)
+        
+        kwarguments = []
+        kwarguments.extend([arg.arg for arg in node.args.kwonlyargs])
+        if node.args.kwarg is not None:
+            if sys.version_info < (3, 4, 0):
                 kwarguments.append(node.args.kwarg)
-            return arguments, kwarguments
-    else:
-        def __getArgNames(self, node):          # __IGNORE_WARNING__
-            """
-            Private method to get the argument names of a function node.
-            
-            @param node AST node to extract arguments names from
-            @return tuple of two list of argument names, one for arguments
-                and one for keyword arguments (tuple of list of string)
-            """
-            arguments = []
-            arguments.extend([arg.arg for arg in node.args.args])
-            if node.args.vararg is not None:
-                if sys.version_info < (3, 4, 0):
-                    arguments.append(node.args.vararg)
-                else:
-                    arguments.append(node.args.vararg.arg)
-            
-            kwarguments = []
-            kwarguments.extend([arg.arg for arg in node.args.kwonlyargs])
-            if node.args.kwarg is not None:
-                if sys.version_info < (3, 4, 0):
-                    kwarguments.append(node.args.kwarg)
-                else:
-                    kwarguments.append(node.args.kwarg.arg)
-            return arguments, kwarguments
+            else:
+                kwarguments.append(node.args.kwarg.arg)
+        return arguments, kwarguments
     
     ##################################################################
     ## Parsing functionality below
@@ -822,24 +771,6 @@
         if "\\" in docstring and not docstring.startswith('r"""'):
             self.__error(docstringContext.start(), 0, "D112")
     
-    def __checkUnicode(self, docstringContext, context):
-        """
-        Private method to check, that all docstrings containing unicode
-        characters are surrounded by unicode triple double quotes.
-        
-        @param docstringContext docstring context (DocStyleContext)
-        @param context context of the docstring (DocStyleContext)
-        """
-        if docstringContext is None:
-            return
-        
-        docstring = docstringContext.ssource().strip()
-        if (
-            not docstring.startswith('u"""') and
-            any(ord(char) > 127 for char in docstring)
-        ):
-            self.__error(docstringContext.start(), 0, "D113")
-    
     def __checkOneLiner(self, docstringContext, context):
         """
         Private method to check, that one-liner docstrings fit on
@@ -853,7 +784,8 @@
         
         lines = docstringContext.source()
         if len(lines) > 1:
-            nonEmptyLines = [l for l in lines if l.strip().strip('\'"')]
+            nonEmptyLines = [line for line in lines
+                             if line.strip().strip('\'"')]
             if len(nonEmptyLines) == 1:
                 modLen = len(context.indent() + '"""' +
                              nonEmptyLines[0].strip() + '"""')
@@ -879,11 +811,11 @@
         if len(lines) == 1:
             return
         
-        nonEmptyLines = [l.rstrip() for l in lines[1:] if l.strip()]
+        nonEmptyLines = [line.rstrip() for line in lines[1:] if line.strip()]
         if not nonEmptyLines:
             return
         
-        indent = min(len(l) - len(l.strip()) for l in nonEmptyLines)
+        indent = min(len(line) - len(line.strip()) for line in nonEmptyLines)
         if context.contextType() == "module":
             expectedIndent = 0
         else:
@@ -1510,6 +1442,3 @@
                 if firstWord != 'public':
                     self.__error(docstringContext.start() + lineNumber, 0,
                                  "D232", 'public')
-
-#
-# eflag: noqa = M702
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/MiscellaneousChecker.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/MiscellaneousChecker.py	Sun Jul 05 11:11:24 2020 +0200
@@ -151,14 +151,9 @@
         self.__pep3101FormatRegex = re.compile(
             r'^(?:[^\'"]*[\'"][^\'"]*[\'"])*\s*%|^\s*%')
         
-        if sys.version_info >= (3, 0):
-            import builtins
-            self.__builtins = [b for b in dir(builtins)
-                               if b not in self.BuiltinsWhiteList]
-        else:
-            import __builtin__
-            self.__builtins = [b for b in dir(__builtin__)
-                               if b not in self.BuiltinsWhiteList]
+        import builtins
+        self.__builtins = [b for b in dir(builtins)
+                           if b not in self.BuiltinsWhiteList]
 
         # statistics counters
         self.counters = {}
@@ -292,13 +287,6 @@
         @rtype ast.AST
         """
         source = "".join(self.__source)
-        # Check type for py2: if not str it's unicode
-        if sys.version_info[0] == 2:
-            try:
-                source = source.encode('utf-8')
-            except UnicodeError:
-                pass
-        
         return compile(source, self.__filename, 'exec', ast.PyCF_ONLY_AST)
     
     def run(self):
@@ -533,7 +521,7 @@
         visitor.visit(self.__tree)
         for node in visitor.nodes:
             text = node.s
-            if sys.version_info[0] > 2 and isinstance(text, bytes):
+            if isinstance(text, bytes):
                 try:
                     text = text.decode(coding)
                 except UnicodeDecodeError:
@@ -711,22 +699,13 @@
             elif any(isinstance(node, functionDef)
                      for functionDef in functionDefs):
                 # (asynchronous) function definition
-                if sys.version_info >= (3, 0):
-                    for arg in node.args.args:
-                        if (
-                            isinstance(arg, ast.arg) and
-                            arg.arg in self.__builtins
-                        ):
-                            self.__error(arg.lineno - 1, arg.col_offset,
-                                         "M132", arg.arg)
-                else:
-                    for arg in node.args.args:
-                        if (
-                            isinstance(arg, ast.Name) and
-                            arg.id in self.__builtins
-                        ):
-                            self.__error(arg.lineno - 1, arg.col_offset,
-                                         "M132", arg.id)
+                for arg in node.args.args:
+                    if (
+                        isinstance(arg, ast.arg) and
+                        arg.arg in self.__builtins
+                    ):
+                        self.__error(arg.lineno - 1, arg.col_offset,
+                                     "M132", arg.arg)
     
     def __checkComprehensions(self):
         """
@@ -962,23 +941,20 @@
         """
         Private method to check use of naive datetime functions.
         """
-        if sys.version_info[0] >= 3:
-            # this check is only performed for Python 3
-            
-            # step 1: generate an augmented node tree containing parent info
-            #         for each child node
-            tree = self.__generateTree()
-            for node in ast.walk(tree):
-                for childNode in ast.iter_child_nodes(node):
-                    childNode._dtCheckerParent = node
-            
-            # step 2: perform checks and report issues
-            visitor = DateTimeVisitor()
-            visitor.visit(tree)
-            for violation in visitor.violations:
-                node = violation[0]
-                reason = violation[1]
-                self.__error(node.lineno - 1, node.col_offset, reason)
+        # step 1: generate an augmented node tree containing parent info
+        #         for each child node
+        tree = self.__generateTree()
+        for node in ast.walk(tree):
+            for childNode in ast.iter_child_nodes(node):
+                childNode._dtCheckerParent = node
+        
+        # step 2: perform checks and report issues
+        visitor = DateTimeVisitor()
+        visitor.visit(tree)
+        for violation in visitor.violations:
+            node = violation[0]
+            reason = violation[1]
+            self.__error(node.lineno - 1, node.col_offset, reason)
     
     def __checkSysVersion(self):
         """
@@ -1384,16 +1360,12 @@
         @param node reference to the node to be processed
         @type ast.Call
         """
-        if sys.version_info >= (3, 0):
-            validPaths = ("six", "future.utils", "builtins")
-            methodsDict = {
-                "M521": ("iterkeys", "itervalues", "iteritems", "iterlists"),
-                "M522": ("viewkeys", "viewvalues", "viewitems", "viewlists"),
-                "M523": ("next",),
-            }
-        else:
-            validPaths = ()
-            methodsDict = {}
+        validPaths = ("six", "future.utils", "builtins")
+        methodsDict = {
+            "M521": ("iterkeys", "itervalues", "iteritems", "iterlists"),
+            "M522": ("viewkeys", "viewvalues", "viewitems", "viewlists"),
+            "M523": ("next",),
+        }
         
         if isinstance(node.func, ast.Attribute):
             for code, methods in methodsDict.items():
@@ -1450,13 +1422,12 @@
         """
         callPath = list(composeCallPath(node))
         
-        if '.'.join(callPath) == 'sys.maxint' and sys.version_info >= (3, 0):
+        if '.'.join(callPath) == 'sys.maxint':
             self.violations.append((node, "M504"))
         
         elif (
             len(callPath) == 2 and
-            callPath[1] == 'message' and
-            sys.version_info >= (2, 6)
+            callPath[1] == 'message'
         ):
             name = callPath[0]
             for elem in reversed(self.__nodeStack[:-1]):
@@ -1475,7 +1446,7 @@
             # By using 'hasattr' below we're ignoring starred arguments, slices
             # and tuples for simplicity.
             assignTargets = {t.id for t in node.targets if hasattr(t, 'id')}
-            if '__metaclass__' in assignTargets and sys.version_info >= (3, 0):
+            if '__metaclass__' in assignTargets:
                 self.violations.append((node, "M524"))
         
         elif len(node.targets) == 1:
@@ -1785,13 +1756,10 @@
         @type ast.AST
         @return flag indicating the node contains a None value
         """
-        if sys.version_info[0] > 2:
-            return (
-                AstUtilities.isNameConstant(node) and
-                AstUtilities.getValue(node) is None
-            )
-        else:
-            return isinstance(node, ast.Name) and node.id == "None"
+        return (
+            AstUtilities.isNameConstant(node) and
+            AstUtilities.getValue(node) is None
+        )
     
     def __resultExists(self):
         """
@@ -1850,7 +1818,6 @@
         try:
             okNodes = (ast.Return, ast.Raise, ast.While, ast.Try)
         except AttributeError:
-            # Py2
             okNodes = (ast.Return, ast.Raise, ast.While)
         if not isinstance(node, okNodes):
             self.violations.append((node, "M833"))
@@ -2323,4 +2290,4 @@
         self.generic_visit(node)
 
 #
-# eflag: noqa = M702, M891
+# eflag: noqa = M891
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/NamingStyleChecker.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/NamingStyleChecker.py	Sun Jul 05 11:11:24 2020 +0200
@@ -188,27 +188,9 @@
         @param node AST node to extract arguments names from
         @return list of argument names (list of string)
         """
-        if sys.version_info[0] >= 3:
-            posArgs = [arg.arg for arg in node.args.args]
-            kwOnly = [arg.arg for arg in node.args.kwonlyargs]
-            return posArgs + kwOnly
-        else:
-            def unpackArgs(args):
-                """
-                Local helper function to unpack function argument names.
-                
-                @param args list of AST node arguments
-                @return list of argument names (list of string)
-                """
-                ret = []
-                for arg in args:
-                    if isinstance(arg, ast.Tuple):
-                        ret.extend(unpackArgs(arg.elts))
-                    else:
-                        ret.append(arg.id)
-                return ret
-           
-            return unpackArgs(node.args.args)
+        posArgs = [arg.arg for arg in node.args.args]
+        kwOnly = [arg.arg for arg in node.args.kwonlyargs]
+        return posArgs + kwOnly
     
     def __error(self, node, code):
         """
@@ -457,6 +439,3 @@
                 yield self.__error(node, "N813")
             elif self.UppercaseRegexp.match(name.asname):
                 yield self.__error(node, "N814")
-
-#
-# eflag: noqa = M702
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/awsHardcodedPassword.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/awsHardcodedPassword.py	Sun Jul 05 11:11:24 2020 +0200
@@ -13,7 +13,7 @@
 #
 # Original Copyright 2020 CMCRC (devcdt@cmcrc.com)
 #
-# License: GPLv3
+# Original License: GPLv3
 #
 
 from collections import Counter
@@ -21,6 +21,7 @@
 import re
 import string
 
+
 def getChecks():
     """
     Public method to get a dictionary with checks handled by this module.
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/blackListCalls.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/blackListCalls.py	Sun Jul 05 11:11:24 2020 +0200
@@ -211,7 +211,7 @@
             # argument name as an actual import module name.
             # Will produce None if argument is not a literal or identifier.
             if name in ["importlib.import_module", "importlib.__import__"]:
-                name = context.call_args[0]
+                name = context.callArgs[0]
         
         for code in _blacklists:
             qualnames, severity = _blacklists[code]
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/djangoXssVulnerability.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/djangoXssVulnerability.py	Sun Jul 05 11:11:24 2020 +0200
@@ -16,12 +16,9 @@
 #
 
 import ast
-import sys
 
 import AstUtilities
 
-PY2 = sys.version_info[0] == 2
-
 
 def getChecks():
     """
@@ -85,8 +82,7 @@
         isParam = False
         if isinstance(parent, ast.FunctionDef):
             for name in parent.args.args:
-                argName = name.id if PY2 else name.arg
-                if argName == xssVar.id:
+                if name.arg == xssVar.id:
                     isParam = True
                     break
         
@@ -179,28 +175,13 @@
             
             assigned = self.isAssignedIn(node.body)
         elif isinstance(node, ast.With):
-            if PY2:
-                if node.optional_vars.id == self.__varName.id:
+            for withitem in node.items:
+                varId = getattr(withitem.optional_vars, 'id', None)
+                if varId == self.__varName.id:
                     assigned = node
                 else:
                     assigned = self.isAssignedIn(node.body)
-            else:
-                for withitem in node.items:
-                    varId = getattr(withitem.optional_vars, 'id', None)
-                    if varId == self.__varName.id:
-                        assigned = node
-                    else:
-                        assigned = self.isAssignedIn(node.body)
-        elif PY2 and isinstance(node, ast.TryFinally):
-            assigned = []
-            assigned.extend(self.isAssignedIn(node.body))
-            assigned.extend(self.isAssignedIn(node.finalbody))
-        elif PY2 and isinstance(node, ast.TryExcept):
-            assigned = []
-            assigned.extend(self.isAssignedIn(node.body))
-            assigned.extend(self.isAssignedIn(node.handlers))
-            assigned.extend(self.isAssignedIn(node.orelse))
-        elif not PY2 and isinstance(node, ast.Try):
+        elif isinstance(node, ast.Try):
             assigned = []
             assigned.extend(self.isAssignedIn(node.body))
             assigned.extend(self.isAssignedIn(node.handlers))
@@ -252,8 +233,7 @@
     if isinstance(xssVar, ast.Name):
         if isinstance(parent, ast.FunctionDef):
             for name in parent.args.args:
-                argName = name.id if PY2 else name.arg
-                if argName == xssVar.id:
+                if name.arg == xssVar.id:
                     return False  # Params are not secure
         
         analyser = DeepAssignation(xssVar, ignoreNodes)
@@ -316,17 +296,11 @@
             call.func.attr == 'format'
         ):
             evaluate = True
-            if call.keywords or (PY2 and call.kwargs):
+            if call.keywords:
                 evaluate = False
     
     if evaluate:
         args = list(call.args)
-        if (
-            PY2 and
-            call.starargs and
-            isinstance(call.starargs, (ast.List, ast.Tuple))
-        ):
-            args.extend(call.starargs.elts)
         
         numSecure = 0
         for arg in args:
@@ -343,7 +317,6 @@
                 else:
                     break
             elif (
-                not PY2 and
                 isinstance(arg, ast.Starred) and
                 isinstance(arg.value, (ast.List, ast.Tuple))
             ):
@@ -372,19 +345,13 @@
             newCall = ast.Call()
             newCall.args = []
             newCall.args = []
-            if PY2:
-                newCall.starargs = None
             newCall.keywords = None
-            if PY2:
-                newCall.kwargs = None
             newCall.lineno = var.lineno
             newCall.func = ast.Attribute()
             newCall.func.value = var.left
             newCall.func.attr = 'format'
             if isinstance(var.right, ast.Tuple):
                 newCall.args = var.right.elts
-            elif PY2 and isinstance(var.right, ast.Dict):
-                newCall.kwargs = var.right
             else:
                 newCall.args = [var.right]
             
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/exec.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/exec.py	Sun Jul 05 11:11:24 2020 +0200
@@ -15,8 +15,6 @@
 # SPDX-License-Identifier: Apache-2.0
 #
 
-import sys
-
 
 def getChecks():
     """
@@ -26,18 +24,11 @@
         list of codes
     @rtype dict
     """
-    if sys.version_info[0] == 2:
-        return {
-            "Exec": [
-                (checkExecUsed, ("S102",)),
-            ],
-        }
-    else:
-        return {
-            "Call": [
-                (checkExecUsed, ("S102",)),
-            ],
-        }
+    return {
+        "Call": [
+            (checkExecUsed, ("S102",)),
+        ],
+    }
 
 
 def checkExecUsed(reportError, context, config):
@@ -51,10 +42,7 @@
     @param config dictionary with configuration data
     @type dict
     """
-    if (
-        sys.version_info[0] == 2 or
-        context.callFunctionNameQual == 'exec'
-    ):
+    if context.callFunctionNameQual == 'exec':
         reportError(
             context.node.lineno - 1,
             context.node.col_offset,
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalBindAllInterfaces.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalBindAllInterfaces.py	Sun Jul 05 11:11:24 2020 +0200
@@ -42,7 +42,7 @@
     @param config dictionary with configuration data
     @type dict
     """
-    if context.stringVal == '0.0.0.0':
+    if context.stringVal == '0.0.0.0':          # secok
         reportError(
             context.node.lineno - 1,
             context.node.col_offset,
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalHardcodedPassword.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalHardcodedPassword.py	Sun Jul 05 11:11:24 2020 +0200
@@ -17,7 +17,6 @@
 
 import ast
 import re
-import sys
 
 import AstUtilities
 
@@ -154,12 +153,8 @@
     
     # go through all (param, value)s and look for candidates
     for key, val in zip(context.node.args.args, defs):
-        isPy3Arg = True
-        if sys.version_info[0] > 2:
-            isPy3Arg = isinstance(key, ast.arg)
-        if isinstance(key, ast.Name) or isPy3Arg:
-            check = key.arg if sys.version_info[0] > 2 else key.id  # Py3
-            if AstUtilities.isString(val) and RE_CANDIDATES.search(check):
+        if isinstance(key, ast.Name) or isinstance(key, ast.arg):
+            if AstUtilities.isString(val) and RE_CANDIDATES.search(key.arg):
                 reportError(
                     context.node.lineno - 1,
                     context.node.col_offset,
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionShell.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionShell.py	Sun Jul 05 11:11:24 2020 +0200
@@ -17,7 +17,6 @@
 
 import ast
 import re
-import sys
 
 import AstUtilities
 
@@ -91,10 +90,7 @@
                     result = bool(val.keys)
                 elif isinstance(val, ast.Name) and val.id in ['False', 'None']:
                     result = False
-                elif (
-                    sys.version_info[0] >= 3 and
-                    AstUtilities.isNameConstant(val)
-                ):
+                elif AstUtilities.isNameConstant(val):
                     result = val.value
                 else:
                     result = True
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/weakCryptographicKey.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/weakCryptographicKey.py	Sun Jul 05 11:11:24 2020 +0200
@@ -170,6 +170,7 @@
                    2048)
         return _classifyKeySize(reportError, config, keyType, keySize,
                                 context.node)
+    return False
 
 
 def checkWeakCryptographicKey(reportError, context, config):
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityChecker.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityChecker.py	Sun Jul 05 11:11:24 2020 +0200
@@ -224,13 +224,6 @@
         @rtype ast.AST
         """
         source = "".join(self.__source)
-        # Check type for py2: if not str it's unicode
-        if sys.version_info[0] == 2:
-            try:
-                source = source.encode('utf-8')
-            except UnicodeError:
-                pass
-        
         return compile(source, self.__filename, 'exec', ast.PyCF_ONLY_AST)
     
     def getConfig(self):
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityContext.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityContext.py	Sun Jul 05 11:11:24 2020 +0200
@@ -180,7 +180,6 @@
         """
         val = self.stringVal
         if val is not None:
-            # it's any of str or unicode in py2, or str in py3
             return val.encode('unicode_escape')
         
         val = self.bytesVal
@@ -267,20 +266,10 @@
         elif isinstance(literal, ast.Name):
             literalValue = literal.id
         
-        # NameConstants are only part of the AST in Python 3. NameConstants
-        # tend to refer to things like True and False. This prevents them from
-        # being re-assigned in Python 3.
-        elif (
-            sys.version_info[0] >= 3 and
-            AstUtilities.isNameConstant(literal)
-        ):
+        elif AstUtilities.isNameConstant(literal):
             literalValue = str(literal.value)
         
-        # Bytes are only part of the AST in Python 3
-        elif (
-            sys.version_info[0] >= 3 and
-            AstUtilities.isBytes(literal)
-        ):
+        elif AstUtilities.isBytes(literal):
             literalValue = literal.s
         
         else:
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityDefaults.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityDefaults.py	Sun Jul 05 11:11:24 2020 +0200
@@ -10,6 +10,7 @@
 SecurityDefaults = {
     # generalHardcodedTmp.py
     "hardcoded_tmp_directories": ["/tmp", "/var/tmp", "/dev/shm", "~/tmp"],
+    # secok
     
     # insecureHashlibNew.py
     "insecure_hashes": ['md4', 'md5', 'sha', 'sha1'],
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityUtils.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityUtils.py	Sun Jul 05 11:11:24 2020 +0200
@@ -160,7 +160,7 @@
                 prefix = aliases[val]
             else:
                 prefix = deepgetattr(node, 'value.id')
-        except Exception:
+        except Exception:           # secok
             # We can't get the fully qualified name for an attr, just return
             # its base name.
             pass
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/translations.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/translations.py	Sun Jul 05 11:11:24 2020 +0200
@@ -364,10 +364,10 @@
     # hardcoded AWS passwords
     "S801": QCoreApplication.translate(
         "Security",
-        "Possible hardcoded AWS access key ID: {0:r}"),
+        "Possible hardcoded AWS access key ID: {0}"),
     "S802": QCoreApplication.translate(
         "Security",
-        "Possible hardcoded AWS secret access key: {0:r}"),
+        "Possible hardcoded AWS secret access key: {0}"),
     
     # Syntax error
     "S999": QCoreApplication.translate(
@@ -410,8 +410,8 @@
     
     "S609": ["os.system"],
     
-    "S801": ["A1B2C3D4E5F6G7H8I9J0"],
-    "S802": ["aA1bB2cC3dD4/eE5fF6gG7+hH8iI9jJ0=kKlLM+="],
+    "S801": ["A1B2C3D4E5F6G7H8I9J0"],                           # secok
+    "S802": ["aA1bB2cC3dD4/eE5fF6gG7+hH8iI9jJ0=kKlLM+="],       # secok
     
     "S999": ["SyntaxError", "Invalid Syntax"],
 }
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/eradicate.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/eradicate.py	Sun Jul 05 11:11:24 2020 +0200
@@ -21,9 +21,6 @@
 
 """Removes commented-out Python code."""
 
-from __future__ import print_function
-from __future__ import unicode_literals
-
 import difflib
 import io
 import os
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/mccabe.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/mccabe.py	Sun Jul 05 11:11:24 2020 +0200
@@ -3,7 +3,6 @@
     http://nedbatchelder.com/blog/200803/python_code_complexity_microtool.html
     MIT License.
 """
-from __future__ import with_statement
 
 import collections
 import ast
@@ -215,6 +214,3 @@
         self.dispatch_list(node.body)
 
     visitAsyncWith = visitWith
-
-#
-# eflag: noqa = M702
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/pycodestyle.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/pycodestyle.py	Sun Jul 05 11:11:24 2020 +0200
@@ -49,7 +49,6 @@
 700 statements
 900 syntax error
 """
-from __future__ import with_statement
 
 #
 # This is a modified version to make the original pycodestyle.py better
@@ -2828,4 +2827,4 @@
 if __name__ == '__main__':
     _main()
 #
-# eflag: noqa = D2, M601, M701, M702, M801
+# eflag: noqa = D2, M601, M801
--- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/translations.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/translations.py	Sun Jul 05 11:11:24 2020 +0200
@@ -305,9 +305,6 @@
     "D112": QCoreApplication.translate(
         "DocStyleChecker",
         'docstring containing \\ not surrounded by r"""'),
-    "D113": QCoreApplication.translate(
-        "DocStyleChecker",
-        'docstring containing unicode character not surrounded by u"""'),
     "D121": QCoreApplication.translate(
         "DocStyleChecker", "one-liner docstring on multiple lines"),
     "D122": QCoreApplication.translate(
--- a/eric6/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheck.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheck.py	Sun Jul 05 11:11:24 2020 +0200
@@ -4,17 +4,12 @@
 #
 
 """
-Module implementing the syntax check for Python 2/3.
+Module implementing the syntax check for Python 3.
 """
 
-try:  # Only for Py2
-    import Queue as queue
-except ImportError:
-    import queue
-
+import queue
 import ast
 import re
-import sys
 import traceback
 import multiprocessing
 
@@ -66,13 +61,6 @@
 
     if codestring and codestring[-1] != '\n':
         codestring = codestring + '\n'
-
-    # Check type for py2: if not str it's unicode
-    if sys.version_info[0] == 2:
-        try:
-            codestring = codestring.encode('utf-8')
-        except UnicodeError:
-            pass
     
     return codestring
 
@@ -229,19 +217,9 @@
             (file name, line number, column, codestring (only at syntax
             errors), the message, a list with arguments for the message)
     """
-    try:
-        import builtins
-    except ImportError:
-        import __builtin__ as builtins        # __IGNORE_WARNING__
+    import builtins
     
     try:
-        if sys.version_info[0] == 2:
-            file_enc = filename.encode(sys.getfilesystemencoding())
-        else:
-            file_enc = filename
-        
-        # It also encode the code back to avoid 'Encoding declaration in
-        # unicode string' exception on Python2
         codestring = normalizeCode(codestring)
         
         # Check for VCS conflict markers
@@ -251,7 +229,7 @@
                 start, i = conflict.span()
                 lineindex = 1 + codestring.count("\n", 0, start)
                 return [{'error':
-                         (file_enc, lineindex, 0, "",
+                         (filename, lineindex, 0, "",
                           "VCS conflict marker found")
                          }]
         
@@ -261,18 +239,16 @@
             except ImportError:
                 return [{'error': (filename, 0, 0, '',
                         'Quixote plugin not found.')}]
-            template = quixote.ptl_compile.Template(codestring, file_enc)
+            template = quixote.ptl_compile.Template(codestring, filename)
             template.compile()
         else:
             module = builtins.compile(
-                codestring, file_enc, 'exec', ast.PyCF_ONLY_AST)
+                codestring, filename, 'exec', ast.PyCF_ONLY_AST)
     except SyntaxError as detail:
         index = 0
         code = ""
         error = ""
         lines = traceback.format_exception_only(SyntaxError, detail)
-        if sys.version_info[0] == 2:
-            lines = [x.decode(sys.getfilesystemencoding()) for x in lines]
         match = re.match(r'\s*File "(.+)", line (\d+)',
                          lines[0].replace('<string>', filename))
         if match is not None:
@@ -307,7 +283,7 @@
             line = detail.lineno
             error = detail.msg
             return [{'error': (fn, line, 0, "", error)}]
-        except Exception:
+        except Exception:           # secok
             pass
     
     # pyflakes
@@ -346,6 +322,3 @@
         results.append((filename, err.lineno, 0, "FLAKES_ERROR", msg, []))
     
     return [{'warnings': results}]
-
-#
-# eflag: noqa = M702
--- a/eric6/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckService.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckService.py	Sun Jul 05 11:11:24 2020 +0200
@@ -9,8 +9,6 @@
 check.
 """
 
-from __future__ import unicode_literals
-
 from PyQt5.QtCore import QObject, pyqtSignal
 
 from E5Gui.E5Application import e5App
@@ -179,9 +177,12 @@
         Public method to cancel all batch jobs.
         """
         for lang in self.getLanguages():
-            env = self.__supportedLanguages[lang][0]
-            self.backgroundService.requestCancel(
-                'batch_{0}Syntax'.format(lang), env)
+            try:
+                env = self.__supportedLanguages[lang][0]
+                self.backgroundService.requestCancel(
+                    'batch_{0}Syntax'.format(lang), env)
+            except KeyError:
+                continue
     
     def __serviceError(self, fn, msg):
         """
@@ -192,25 +193,9 @@
         """
         self.error.emit(fn, msg)
     
-    def serviceErrorPy2(self, fx, lang, fn, msg):
-        """
-        Public method handling service errors for Python 2.
-        
-        @param fx service name (string)
-        @param lang language (string)
-        @param fn file name (string)
-        @param msg message text (string)
-        """
-        if fx in ['Python2Syntax', 'batch_Python2Syntax']:
-            if fx == 'Python2Syntax':
-                self.__serviceError(fn, msg)
-            else:
-                self.__serviceError(self.tr("Python 2 batch check"), msg)
-                self.batchJobDone(fx, lang)
-    
     def serviceErrorPy3(self, fx, lang, fn, msg):
         """
-        Public method handling service errors for Python 2.
+        Public method handling service errors for Python 3.
         
         @param fx service name (string)
         @param lang language (string)
@@ -280,7 +265,6 @@
         @param lang language (string)
         """
         if fx in [
-            'Python2Syntax', 'batch_Python2Syntax',
             'Python3Syntax', 'batch_Python3Syntax',
             'JavaScriptSyntax', 'batch_JavaScriptSyntax',
             'YAMLSyntax', 'batch_YAMLSyntax',
--- a/eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/__init__.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/__init__.py	Sun Jul 05 11:11:24 2020 +0200
@@ -279,6 +279,3 @@
   - Add reporting for some types of import shadowing.
   - Improve reporting of unbound locals
 """
-
-#
-# eflag: noqa = M702
--- a/eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/checker.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/checker.py	Sun Jul 05 11:11:24 2020 +0200
@@ -2254,6 +2254,3 @@
             left = right
 
         self.handleChildren(node)
-
-#
-# eflag: noqa = M702
--- a/eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/messages.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/messages.py	Sun Jul 05 11:11:24 2020 +0200
@@ -4,7 +4,7 @@
 #
 # Original (c) 2005 Divmod, Inc.  See __init__.py file for details
 #
-# This module is based on pyflakes for Python2 and Python3, but was modified to
+# This module is based on pyflakes, but was modified to
 # be integrated into eric6
 
 """
@@ -834,6 +834,3 @@
     """
     message_id = 'F48'
     message = "'...' %% ... `*` specifier requires sequence"
-
-#
-# eflag: noqa = M702
--- a/eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/translations.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/translations.py	Sun Jul 05 11:11:24 2020 +0200
@@ -179,7 +179,6 @@
     @return translated and formatted message (string)
     """
     if message_id in _messages:
-        # Avoid leading "u" at Python2 unicode strings
         msg = _messages[message_id].replace("{0!r}", "'{0}'")
         msg = msg.replace("{1!r}", "'{1}'")
         return msg.format(*message_args)
--- a/eric6/Plugins/CheckerPlugins/Tabnanny/Tabnanny.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/Tabnanny/Tabnanny.py	Sun Jul 05 11:11:24 2020 +0200
@@ -18,8 +18,6 @@
 @exception ValueError The tokenize module is too old.
 """
 
-from __future__ import unicode_literals
-
 # Released to the public domain, by Tim Peters, 15 April 1998.
 
 # XXX Note: this is now a standard library module.
--- a/eric6/Plugins/CheckerPlugins/Tabnanny/TabnannyDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/CheckerPlugins/Tabnanny/TabnannyDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -155,8 +155,7 @@
             self.files = fn
         elif os.path.isdir(fn):
             self.files = []
-            extensions = set(Preferences.getPython("PythonExtensions") +
-                             Preferences.getPython("Python3Extensions"))
+            extensions = set(Preferences.getPython("Python3Extensions"))
             for ext in extensions:
                 self.files.extend(
                     Utilities.direntries(fn, True, '*{0}'.format(ext), 0))
--- a/eric6/Plugins/PluginCodeStyleChecker.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/PluginCodeStyleChecker.py	Sun Jul 05 11:11:24 2020 +0200
@@ -72,11 +72,6 @@
         path = os.path.join(
             os.path.dirname(__file__), 'CheckerPlugins', 'CodeStyleChecker')
         self.backgroundService.serviceConnect(
-            'style', 'Python2', path, 'CodeStyleChecker',
-            self.__translateStyleCheck,
-            onErrorCallback=self.serviceErrorPy2,
-            onBatchDone=self.batchJobDone)
-        self.backgroundService.serviceConnect(
             'style', 'Python3', path, 'CodeStyleChecker',
             self.__translateStyleCheck,
             onErrorCallback=self.serviceErrorPy3,
@@ -96,25 +91,9 @@
         """
         self.error.emit(fn, msg)
     
-    def serviceErrorPy2(self, fx, lang, fn, msg):
-        """
-        Public slot handling service errors for Python 2.
-        
-        @param fx service name (string)
-        @param lang language (string)
-        @param fn file name (string)
-        @param msg message text (string)
-        """
-        if fx in ['style', 'batch_style'] and lang == 'Python2':
-            if fx == 'style':
-                self.__serviceError(fn, msg)
-            else:
-                self.__serviceError(self.tr("Python 2 batch check"), msg)
-                self.batchJobDone(fx, lang)
-    
     def serviceErrorPy3(self, fx, lang, fn, msg):
         """
-        Public slot handling service errors for Python 2.
+        Public slot handling service errors for Python 3.
         
         @param fx service name (string)
         @param lang language (string)
@@ -179,7 +158,7 @@
         """
         if lang is None:
             lang = 'Python{0}'.format(determinePythonVersion(filename, source))
-        if lang not in ['Python2', 'Python3']:
+        if lang != 'Python3':
             return
         
         data = [source, args]
@@ -195,30 +174,27 @@
         @type list of tuple of (str, str, list)
         """
         data = {
-            "Python2": [],
             "Python3": [],
         }
         for filename, source, args in argumentsList:
             lang = 'Python{0}'.format(determinePythonVersion(filename, source))
-            if lang not in ['Python2', 'Python3']:
+            if lang != 'Python3':
                 continue
             else:
                 data[lang].append((filename, source, args))
         
         self.queuedBatches = []
-        for lang in ['Python2', 'Python3']:
-            if data[lang]:
-                self.queuedBatches.append(lang)
-                self.backgroundService.enqueueRequest('batch_style', lang, "",
-                                                      data[lang])
-                self.batchesFinished = False
+        if data['Python3']:
+            self.queuedBatches.append('Python3')
+            self.backgroundService.enqueueRequest('batch_style', 'Python3', "",
+                                                  data['Python3'])
+            self.batchesFinished = False
     
     def cancelStyleBatchCheck(self):
         """
         Public method to cancel all batch jobs.
         """
-        for lang in ['Python2', 'Python3']:
-            self.backgroundService.requestCancel('batch_style', lang)
+        self.backgroundService.requestCancel('batch_style', 'Python3')
     
     def __translateStyleCheck(self, fn, codeStyleCheckerStats, results):
         """
@@ -340,7 +316,7 @@
         if menuName == "Checks" and self.__projectAct is not None:
             self.__projectAct.setEnabled(
                 e5App().getObject("Project").getProjectLanguage() in
-                ["Python3", "Python2", "Python", "MicroPython"])
+                ["Python3", "MicroPython"])
     
     def __projectBrowserShowMenu(self, menuName, menu):
         """
@@ -353,7 +329,7 @@
         if (
             menuName == "Checks" and
             e5App().getObject("Project").getProjectLanguage() in
-                ["Python3", "Python2", "Python", "MicroPython"]
+                ["Python3", "MicroPython"]
         ):
             self.__projectBrowserMenu = menu
             if self.__projectBrowserAct is None:
@@ -381,8 +357,7 @@
         files = [os.path.join(ppath, file)
                  for file in project.pdata["SOURCES"]
                  if file.endswith(
-                     tuple(Preferences.getPython("Python3Extensions")) +
-                     tuple(Preferences.getPython("PythonExtensions")))]
+                     tuple(Preferences.getPython("Python3Extensions")))]
         
         from CheckerPlugins.CodeStyleChecker import CodeStyleCheckerDialog
         self.__projectCodeStyleCheckerDialog = (
--- a/eric6/Plugins/PluginSyntaxChecker.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/PluginSyntaxChecker.py	Sun Jul 05 11:11:24 2020 +0200
@@ -66,20 +66,12 @@
                             'SyntaxChecker')
         
         self.syntaxCheckService.addLanguage(
-            'Python2', 'Python2', path, 'SyntaxCheck',
-            self.__getPythonOptions,
-            lambda: Preferences.getPython("PythonExtensions"),
-            self.__translateSyntaxCheck,
-            self.syntaxCheckService.serviceErrorPy2)
-        
-        self.syntaxCheckService.addLanguage(
             'Python3', 'Python3', path, 'SyntaxCheck',
             self.__getPythonOptions,
             lambda: Preferences.getPython("Python3Extensions"),
             self.__translateSyntaxCheck,
             self.syntaxCheckService.serviceErrorPy3)
         
-        # Jasy isn't yet compatible to Python2
         self.syntaxCheckService.addLanguage(
             'JavaScript', 'Python3', path,
             'jsCheckSyntax',
--- a/eric6/Plugins/PluginTabnanny.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/PluginTabnanny.py	Sun Jul 05 11:11:24 2020 +0200
@@ -7,6 +7,7 @@
 Module implementing the Tabnanny plugin.
 """
 
+# TODO: remove tabnanny as it is obsolete
 
 import os
 
@@ -68,11 +69,6 @@
         path = os.path.join(
             os.path.dirname(__file__), 'CheckerPlugins', 'Tabnanny')
         self.backgroundService.serviceConnect(
-            'indent', 'Python2', path, 'Tabnanny',
-            lambda *args: self.indentChecked.emit(*args),
-            onErrorCallback=self.serviceErrorPy2,
-            onBatchDone=self.batchJobDone)
-        self.backgroundService.serviceConnect(
             'indent', 'Python3', path, 'Tabnanny',
             lambda *args: self.indentChecked.emit(*args),
             onErrorCallback=self.serviceErrorPy3,
@@ -90,25 +86,9 @@
         """
         self.error.emit(fn, msg)
     
-    def serviceErrorPy2(self, fx, lang, fn, msg):
-        """
-        Public slot handling service errors for Python 2.
-        
-        @param fx service name (string)
-        @param lang language (string)
-        @param fn file name (string)
-        @param msg message text (string)
-        """
-        if fx in ['indent', 'batch_indent'] and lang == 'Python2':
-            if fx == 'indent':
-                self.__serviceError(fn, msg)
-            else:
-                self.__serviceError(self.tr("Python 2 batch check"), msg)
-                self.batchJobDone(fx, lang)
-    
     def serviceErrorPy3(self, fx, lang, fn, msg):
         """
-        Public slot handling service errors for Python 2.
+        Public slot handling service errors for Python 3.
         
         @param fx service name (string)
         @param lang language (string)
@@ -164,7 +144,7 @@
         """
         if lang is None:
             lang = 'Python{0}'.format(determinePythonVersion(filename, source))
-        if lang not in ['Python2', 'Python3']:
+        if lang != 'Python3':
             return
         
         self.backgroundService.enqueueRequest(
@@ -179,30 +159,27 @@
             containing filename and source (string, string)
         """
         data = {
-            "Python2": [],
             "Python3": [],
         }
         for filename, source in argumentsList:
             lang = 'Python{0}'.format(determinePythonVersion(filename, source))
-            if lang not in ['Python2', 'Python3']:
+            if lang != 'Python3':
                 continue
             else:
                 data[lang].append((filename, source))
         
         self.queuedBatches = []
-        for lang in ['Python2', 'Python3']:
-            if data[lang]:
-                self.queuedBatches.append(lang)
-                self.backgroundService.enqueueRequest('batch_indent', lang, "",
-                                                      data[lang])
-                self.batchesFinished = False
+        if data['Python3']:
+            self.queuedBatches.append('Python3')
+            self.backgroundService.enqueueRequest(
+                'batch_indent', 'Python3', "", data['Python3'])
+            self.batchesFinished = False
     
     def cancelIndentBatchCheck(self):
         """
         Public method to cancel all batch jobs.
         """
-        for lang in ['Python2', 'Python3']:
-            self.backgroundService.requestCancel('batch_style', lang)
+        self.backgroundService.requestCancel('batch_style', 'Python3')
     
     def activate(self):
         """
@@ -292,7 +269,7 @@
         if menuName == "Checks" and self.__projectAct is not None:
             self.__projectAct.setEnabled(
                 e5App().getObject("Project").getProjectLanguage() in
-                ["Python3", "Python2", "Python", "MicroPython"])
+                ["Python3", "MicroPython"])
     
     def __projectBrowserShowMenu(self, menuName, menu):
         """
@@ -305,7 +282,7 @@
         if (
             menuName == "Checks" and
             e5App().getObject("Project").getProjectLanguage() in
-                ["Python3", "Python2", "Python", "MicroPython"]
+                ["Python3", "MicroPython"]
         ):
             self.__projectBrowserMenu = menu
             if self.__projectBrowserAct is None:
@@ -333,8 +310,7 @@
         files = [os.path.join(ppath, file)
                  for file in project.pdata["SOURCES"]
                  if file.endswith(
-                     tuple(Preferences.getPython("Python3Extensions")) +
-                     tuple(Preferences.getPython("PythonExtensions")))]
+                     tuple(Preferences.getPython("Python3Extensions")))]
         
         from CheckerPlugins.Tabnanny.TabnannyDialog import TabnannyDialog
         self.__projectTabnannyDialog = TabnannyDialog(self)
--- a/eric6/Plugins/PluginWizardQFileDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/PluginWizardQFileDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -48,8 +48,8 @@
         super(FileDialogWizard, self).__init__(ui)
         self.__ui = ui
         
-        # PyQt4 or PyQt5
-        self.__pyqtRe = re.compile(r"(?:import|from)\s+PyQt([45])")
+        # PyQt5
+        self.__pyqtRe = re.compile(r"(?:import|from)\s+PyQt([5])")
 
     def activate(self):
         """
@@ -124,7 +124,7 @@
         @param editor reference to the current editor
         @type Editor
         @param variant variant of code to be generated
-            (-1 = E5FileDialog, 0 = unknown, 4 = PyQt4, 5 = PyQt5)
+            (-1 = E5FileDialog, 0 = unknown, 5 = PyQt5)
         @type int
         @return the generated code (string)
         """
@@ -166,7 +166,7 @@
                     # unknown
                     dialogVariant = 0
                 else:
-                    # PyQt4 or PyQt5
+                    # PyQt5
                     dialogVariant = int(match.group(1))
             elif variant == "E5FileDialog":
                 # E5FileDialog
--- a/eric6/Plugins/VcsPlugins/vcsGit/GitDiffDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsGit/GitDiffDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -123,9 +123,12 @@
             'stash' shows the diff for a stash)
         @param stashName name of the stash to show a diff for (string)
         @param refreshable flag indicating a refreshable diff (boolean)
+        @exception ValueError raised to indicate a bad value for the 'diffMode'
+            parameter.
         """
-        assert diffMode in ["work2repo", "work2stage", "stage2repo",
-                            "work2stage2repo", "stash"]
+        if diffMode not in ["work2repo", "work2stage", "stage2repo",
+                            "work2stage2repo", "stash"]:
+            raise ValueError("Bad value for 'diffMode' parameter.")
         
         self.refreshButton.setVisible(refreshable)
         
--- a/eric6/Plugins/VcsPlugins/vcsGit/GitDiffGenerator.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsGit/GitDiffGenerator.py	Sun Jul 05 11:11:24 2020 +0200
@@ -78,9 +78,12 @@
             'stash' shows the diff for a stash)
         @param stashName name of the stash to show a diff for (string)
         @return flag indicating the start status (boolean)
+        @exception ValueError raised to indicate a bad value for the 'diffMode'
+            parameter.
         """
-        assert diffMode in ["work2repo", "work2stage", "stage2repo",
-                            "work2stage2repo", "stash"]
+        if diffMode not in ["work2repo", "work2stage", "stage2repo",
+                            "work2stage2repo", "stash"]:
+            raise ValueError("Bad value for 'diffMode' parameter.")
         
         self.__output1 = []
         self.__output2 = []
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/HgClient.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/HgClient.py	Sun Jul 05 11:11:24 2020 +0200
@@ -428,6 +428,3 @@
         @rtype bool
         """
         return self.__commandRunning
-
-#
-# eflag: noqa = M702
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/ProjectHelper.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/ProjectHelper.py	Sun Jul 05 11:11:24 2020 +0200
@@ -194,8 +194,11 @@
         
         @param direction direction of the conversion (string; one of
             'largefiles' or 'normal')
+        @exception ValueError raised to indicate a bad value for the
+            'direction' parameter.
         """
-        assert direction in ["largefiles", "normal"]
+        if direction not in ["largefiles", "normal"]:
+            raise ValueError("Bad value for 'direction' parameter.")
         
         self.vcs.getExtensionObject("largefiles").hgLfconvert(
             direction, self.project.getProjectFile())
@@ -218,8 +221,11 @@
         Private slot to verify large files integrity.
         
         @param mode verify mode (string; one of 'large', 'lfa' or 'lfc')
+        @exception ValueError raised to indicate a bad value for the
+            'mode' parameter.
         """
-        assert mode in ['large', 'lfa', 'lfc']
+        if mode not in ['large', 'lfa', 'lfc']:
+            raise ValueError("Bad value for 'mode' parameter.")
         
         self.vcs.getExtensionObject("largefiles").hgLfVerify(
             self.project.getProjectPath(), mode)
--- a/eric6/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/largefiles.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/largefiles.py	Sun Jul 05 11:11:24 2020 +0200
@@ -38,8 +38,11 @@
         @param direction direction of the conversion (string, one of
             'largefiles' or 'normal')
         @param projectFile file name of the current project file (string)
+        @exception ValueError raised to indicate a bad value for the
+            'direction' parameter.
         """
-        assert direction in ["largefiles", "normal"]
+        if direction not in ["largefiles", "normal"]:
+            raise ValueError("Bad value for 'direction' parameter.")
         
         projectDir = os.path.dirname(projectFile)
         
--- a/eric6/Plugins/VcsPlugins/vcsPySvn/SvnCommitDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsPySvn/SvnCommitDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -94,8 +94,9 @@
         @return tuple containing the changelists (list of strings) and a flag
             indicating to keep changelists (boolean)
         """
-        slists = [l.text().strip() for l in self.changeLists.selectedItems()
-                  if l.text().strip() != ""]
+        slists = [line.text().strip()
+                  for line in self.changeLists.selectedItems()
+                  if line.text().strip() != ""]
         
         if len(slists) == 0:
             return [], False
--- a/eric6/Plugins/VcsPlugins/vcsPySvn/SvnDiffDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsPySvn/SvnDiffDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -158,12 +158,12 @@
             tmpdir = Utilities.getEnvironmentEntry('TMPDIR')
         elif Utilities.hasEnvironmentEntry('TMP'):
             tmpdir = Utilities.getEnvironmentEntry('TMP')
-        elif os.path.exists('/var/tmp'):
-            tmpdir = '/var/tmp'
+        elif os.path.exists('/var/tmp'):    # secok
+            tmpdir = '/var/tmp'             # secok
         elif os.path.exists('/usr/tmp'):
             tmpdir = '/usr/tmp'
-        elif os.path.exists('/tmp'):
-            tmpdir = '/tmp'
+        elif os.path.exists('/tmp'):        # secok
+            tmpdir = '/tmp'                 # secok
         else:
             E5MessageBox.critical(
                 self,
--- a/eric6/Plugins/VcsPlugins/vcsPySvn/SvnRepoBrowserDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsPySvn/SvnRepoBrowserDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -162,7 +162,6 @@
             try:
                 entries = self.client.list(url, recurse=False)
                 firstTime = parent == self.repoTree
-                # dirent elements are all unicode in Python 2
                 for dirent, _lock in entries:
                     if (
                         (firstTime and dirent["path"] != url) or
--- a/eric6/Plugins/VcsPlugins/vcsPySvn/SvnTagBranchListDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsPySvn/SvnTagBranchListDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -136,7 +136,6 @@
         os.chdir(dname)
         try:
             entries = self.client.list(path, recurse=False)
-            # dirent, lock already unicode in Python 2
             for dirent, _lock in entries:
                 if dirent["path"] != path:
                     name = dirent["path"].replace(path + '/', "")
--- a/eric6/Plugins/VcsPlugins/vcsPySvn/subversion.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsPySvn/subversion.py	Sun Jul 05 11:11:24 2020 +0200
@@ -1502,7 +1502,6 @@
                 locker.unlock()
                 dirs = [x for x in names.keys() if os.path.isdir(x)]
                 for file in allFiles:
-                    # file.path is always unicode in Python 2
                     name = os.path.normcase(file.path)
                     if self.__isVersioned(file):
                         if name in names:
@@ -1582,7 +1581,6 @@
                                          ignore=True, update=False)
                 locker.unlock()
                 for file in allFiles:
-                    # file.path is always unicode in Python 2
                     name = os.path.normcase(file.path)
                     if self.__isVersioned(file):
                         if name in names:
--- a/eric6/Plugins/VcsPlugins/vcsSubversion/SvnCommitDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsSubversion/SvnCommitDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -89,8 +89,9 @@
         @return tuple containing the changelists (list of strings) and a flag
             indicating to keep changelists (boolean)
         """
-        slists = [l.text().strip() for l in self.changeLists.selectedItems()
-                  if l.text().strip() != ""]
+        slists = [line.text().strip()
+                  for line in self.changeLists.selectedItems()
+                  if line.text().strip() != ""]
         
         if len(slists) == 0:
             return [], False
--- a/eric6/Plugins/VcsPlugins/vcsSubversion/SvnDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/VcsPlugins/vcsSubversion/SvnDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -186,11 +186,11 @@
             self.resultbox.ensureCursorVisible()
             if not self.__hasAddOrDelete and len(s) > 0:
                 # check the output
-                for l in s.split(os.linesep):
-                    if '.e4p' in l:
+                for line in s.split(os.linesep):
+                    if '.e4p' in line:
                         self.__hasAddOrDelete = True
                         break
-                    if l and l[0:2].strip() in ['A', 'D']:
+                    if line and line[0:2].strip() in ['A', 'D']:
                         self.__hasAddOrDelete = True
                         break
         
--- a/eric6/Plugins/WizardPlugins/ColorDialogWizard/ColorDialogWizardDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/WizardPlugins/ColorDialogWizard/ColorDialogWizardDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -65,7 +65,7 @@
                 else:
                     coStr = "QColor({0})".format(coStr)
                 try:
-                    exec('from PyQt5.QtCore import Qt;'
+                    exec('from PyQt5.QtCore import Qt;'             # secok
                          ' QColorDialog.getColor({0}, None, "{1}")'.format(
                              coStr, self.eTitle.text()))
                 except Exception:
--- a/eric6/Plugins/WizardPlugins/FileDialogWizard/FileDialogWizardDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/WizardPlugins/FileDialogWizard/FileDialogWizardDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -34,7 +34,7 @@
         Constructor
         
         @param dialogVariant variant of the file dialog to be generated
-            (-1 = E5FileDialog, 0 = unknown, 4 = PyQt4, 5 = PyQt5)
+            (-1 = E5FileDialog, 0 = unknown, 5 = PyQt5)
         @type int
         @param parent parent widget
         @type QWidget
@@ -71,7 +71,7 @@
             self.pyqtComboBox.setCurrentIndex(0)
             self.pyqtComboBox.setEnabled(False)
         else:
-            self.pyqtComboBox.addItems(["PyQt5", "PyQt4"])
+            self.pyqtComboBox.addItems(["PyQt5"])
             self.setWindowTitle(self.tr("QFileDialog Wizard"))
             if self.__dialogVariant == 5:
                 self.pyqtComboBox.setCurrentIndex(0)
@@ -113,9 +113,9 @@
         
         @param txt text of the selected combo box entry (string)
         """
-        self.rfOpenFile.setEnabled(txt in ("eric", "PyQt4"))
-        self.rfOpenFiles.setEnabled(txt in ("eric", "PyQt4"))
-        self.rfSaveFile.setEnabled(txt in ("eric", "PyQt4"))
+        self.rfOpenFile.setEnabled(txt == "eric")
+        self.rfOpenFiles.setEnabled(txt == "eric")
+        self.rfSaveFile.setEnabled(txt == "eric")
         
         self.rOpenFileUrl.setEnabled(txt == "PyQt5")
         self.rOpenFileUrls.setEnabled(txt == "PyQt5")
@@ -143,8 +143,6 @@
             self.__dialogVariant = -1
         elif txt == "PyQt5":
             self.__dialogVariant = 5
-        elif txt == "PyQt4":
-            self.__dialogVariant = 4
         else:
             # default is PyQt5
             self.__dialogVariant = 5
@@ -364,7 +362,7 @@
     
     def getCode(self, indLevel, indString):
         """
-        Public method to get the source code for Qt4 and Qt5.
+        Public method to get the source code for Qt5.
         
         @param indLevel indentation level (int)
         @param indString string used for indentation (space or tab) (string)
--- a/eric6/Plugins/WizardPlugins/SetupWizard/SetupWizardDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Plugins/WizardPlugins/SetupWizard/SetupWizardDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -9,7 +9,6 @@
 
 
 import os
-import sys
 import datetime
 
 from PyQt5.QtCore import pyqtSlot, Qt, QUrl
@@ -253,8 +252,7 @@
         
         # now generate the code
         if self.introCheckBox.isChecked():
-            code = "#!/usr/bin/env python{0}{1}".format(
-                sys.version_info[0], os.linesep)
+            code = "#!/usr/bin/env python3{0}".format(os.linesep)
             code += "# -*- coding: utf-8 -*-{0}{0}".format(os.linesep)
         else:
             code = ""
--- a/eric6/Preferences/ConfigurationDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Preferences/ConfigurationDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -97,14 +97,6 @@
         @keyparam expandedEntries list of entries to be shown expanded
             (list of strings)
         """
-        assert displayMode in (
-            ConfigurationWidget.DefaultMode,
-            ConfigurationWidget.HelpBrowserMode,
-            ConfigurationWidget.TrayStarterMode,
-            ConfigurationWidget.HexEditorMode,
-            ConfigurationWidget.WebBrowserMode,
-        )
-        
         super(ConfigurationWidget, self).__init__(parent)
         self.fromEric = fromEric
         self.displayMode = displayMode
@@ -230,9 +222,6 @@
                 "debuggerGeneralPage":
                 [self.tr("General"), "preferences-debugger",
                  "DebuggerGeneralPage", "0debuggerPage", None],
-                "debuggerPython2Page":
-                [self.tr("Python2"), "preferences-pyDebugger",
-                 "DebuggerPython2Page", "0debuggerPage", None],
                 "debuggerPython3Page":
                 [self.tr("Python3"), "preferences-pyDebugger",
                  "DebuggerPython3Page", "0debuggerPage", None],
--- a/eric6/Preferences/ConfigurationPages/ApplicationPage.ui	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/ApplicationPage.ui	Sun Jul 05 11:11:24 2020 +0200
@@ -155,7 +155,7 @@
          <string>Select to disable update checking</string>
         </property>
         <property name="text">
-         <string>None</string>
+         <string>Never</string>
         </property>
        </widget>
       </item>
--- a/eric6/Preferences/ConfigurationPages/DebuggerPython2Page.py	Wed Jun 17 17:14:12 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Copyright (c) 2006 - 2020 Detlev Offenbach <detlev@die-offenbachs.de>
-#
-
-"""
-Module implementing the Debugger Python2 configuration page.
-"""
-
-
-from PyQt5.QtCore import pyqtSlot
-
-from E5Gui.E5Application import e5App
-from E5Gui.E5PathPicker import E5PathPickerModes
-
-from .ConfigurationPageBase import ConfigurationPageBase
-from .Ui_DebuggerPython2Page import Ui_DebuggerPython2Page
-
-import Preferences
-import UI.PixmapCache
-
-
-class DebuggerPython2Page(ConfigurationPageBase, Ui_DebuggerPython2Page):
-    """
-    Class implementing the Debugger Python2 configuration page.
-    """
-    def __init__(self):
-        """
-        Constructor
-        """
-        super(DebuggerPython2Page, self).__init__()
-        self.setupUi(self)
-        self.setObjectName("DebuggerPython2Page")
-        
-        try:
-            self.__virtualenvManager = e5App().getObject("VirtualEnvManager")
-        except KeyError:
-            from VirtualEnv.VirtualenvManager import VirtualenvManager
-            self.__virtualenvManager = VirtualenvManager()
-        
-        self.venvDlgButton.setIcon(UI.PixmapCache.getIcon("virtualenv"))
-        
-        self.debugClientPicker.setMode(E5PathPickerModes.OpenFileMode)
-        self.debugClientPicker.setToolTip(self.tr(
-            "Press to select the Debug Client via a file selection dialog"))
-        self.debugClientPicker.setFilters(self.tr("Python Files (*.py *.py2)"))
-        
-        self.__populateAndSetVenvComboBox()
-        
-        # set initial values
-        dct = Preferences.getDebugger("DebugClientType")
-        if dct == "standard":
-            self.standardButton.setChecked(True)
-        else:
-            self.customButton.setChecked(True)
-        self.debugClientPicker.setText(
-            Preferences.getDebugger("DebugClient"), toNative=False)
-        self.pyRedirectCheckBox.setChecked(
-            Preferences.getDebugger("PythonRedirect"))
-        self.pyNoEncodingCheckBox.setChecked(
-            Preferences.getDebugger("PythonNoEncoding"))
-        self.sourceExtensionsEdit.setText(
-            Preferences.getDebugger("PythonExtensions"))
-    
-    def save(self):
-        """
-        Public slot to save the Debugger Python configuration.
-        """
-        Preferences.setDebugger(
-            "Python2VirtualEnv",
-            self.venvComboBox.currentText())
-        if self.standardButton.isChecked():
-            dct = "standard"
-        else:
-            dct = "custom"
-        Preferences.setDebugger("DebugClientType", dct)
-        Preferences.setDebugger(
-            "DebugClient",
-            self.debugClientPicker.text(toNative=False))
-        Preferences.setDebugger(
-            "PythonRedirect",
-            self.pyRedirectCheckBox.isChecked())
-        Preferences.setDebugger(
-            "PythonNoEncoding",
-            self.pyNoEncodingCheckBox.isChecked())
-    
-    def __populateAndSetVenvComboBox(self):
-        """
-        Private method to populate and set the virtual environment combo box.
-        """
-        self.venvComboBox.clear()
-        self.venvComboBox.addItems(
-            [""] +
-            sorted(self.__virtualenvManager.getVirtualenvNamesForVariant(2))
-        )
-        
-        # set initial value
-        venvName = Preferences.getDebugger("Python2VirtualEnv")
-        if venvName:
-            index = self.venvComboBox.findText(venvName)
-            if index < 0:
-                index = 0
-            self.venvComboBox.setCurrentIndex(index)
-    
-    @pyqtSlot()
-    def on_refreshButton_clicked(self):
-        """
-        Private slot handling a click of the refresh button.
-        """
-        self.sourceExtensionsEdit.setText(
-            Preferences.getDebugger("PythonExtensions"))
-    
-    @pyqtSlot()
-    def on_venvDlgButton_clicked(self):
-        """
-        Private slot to show the virtual environment manager dialog.
-        """
-        self.__virtualenvManager.showVirtualenvManagerDialog(modal=True)
-        self.__populateAndSetVenvComboBox()
-        self.activateWindow()
-        self.raise_()
-    
-
-def create(dlg):
-    """
-    Module function to create the configuration page.
-    
-    @param dlg reference to the configuration dialog
-    @return reference to the instantiated page (ConfigurationPageBase)
-    """
-    page = DebuggerPython2Page()
-    return page
--- a/eric6/Preferences/ConfigurationPages/DebuggerPython2Page.ui	Wed Jun 17 17:14:12 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,241 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>DebuggerPython2Page</class>
- <widget class="QWidget" name="DebuggerPython2Page">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>455</width>
-    <height>500</height>
-   </rect>
-  </property>
-  <layout class="QVBoxLayout" name="verticalLayout_3">
-   <item>
-    <widget class="QLabel" name="headerLabel">
-     <property name="text">
-      <string>&lt;b&gt;Configure Python2 Debugger&lt;/b&gt;</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="Line" name="line11_2">
-     <property name="frameShape">
-      <enum>QFrame::HLine</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Sunken</enum>
-     </property>
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QGroupBox" name="groupBox_4">
-     <property name="title">
-      <string>Python2 Virtual Environment</string>
-     </property>
-     <layout class="QHBoxLayout" name="horizontalLayout_2">
-      <item>
-       <widget class="QComboBox" name="venvComboBox">
-        <property name="toolTip">
-         <string>Select the virtual environment to be used</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QToolButton" name="venvDlgButton">
-        <property name="toolTip">
-         <string>Press to open the virtual environment manager dialog</string>
-        </property>
-        <property name="text">
-         <string notr="true"/>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <widget class="QGroupBox" name="groupBox_2">
-     <property name="title">
-      <string>Debug Client Type</string>
-     </property>
-     <layout class="QGridLayout" name="gridLayout">
-      <item row="1" column="0" colspan="2">
-       <widget class="E5PathPicker" name="debugClientPicker" native="true">
-        <property name="enabled">
-         <bool>false</bool>
-        </property>
-        <property name="focusPolicy">
-         <enum>Qt::StrongFocus</enum>
-        </property>
-        <property name="toolTip">
-         <string>Enter the path of the Debug Client to be used.  Leave empty to use the default.</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="0">
-       <widget class="QRadioButton" name="standardButton">
-        <property name="toolTip">
-         <string>Select the standard debug client</string>
-        </property>
-        <property name="text">
-         <string>Standard</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1">
-       <widget class="QRadioButton" name="customButton">
-        <property name="toolTip">
-         <string>Select the custom selected debug client</string>
-        </property>
-        <property name="text">
-         <string>Custom</string>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <widget class="QGroupBox" name="groupBox_3">
-     <property name="title">
-      <string>Source association</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout">
-      <item>
-       <widget class="QLabel" name="label">
-        <property name="text">
-         <string>Please configure the associated file extensions on the 'Python' page.</string>
-        </property>
-        <property name="wordWrap">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLineEdit" name="sourceExtensionsEdit">
-        <property name="readOnly">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <layout class="QHBoxLayout" name="horizontalLayout">
-        <item>
-         <spacer name="horizontalSpacer">
-          <property name="orientation">
-           <enum>Qt::Horizontal</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>40</width>
-            <height>20</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-        <item>
-         <widget class="QPushButton" name="refreshButton">
-          <property name="toolTip">
-           <string>Press to update the display of the source associations</string>
-          </property>
-          <property name="text">
-           <string>Refresh</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <spacer name="horizontalSpacer_2">
-          <property name="orientation">
-           <enum>Qt::Horizontal</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>40</width>
-            <height>20</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-       </layout>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <widget class="QCheckBox" name="pyRedirectCheckBox">
-     <property name="toolTip">
-      <string>Select, to redirect stdin, stdout and stderr of the program being debugged to the eric6 IDE</string>
-     </property>
-     <property name="text">
-      <string>Redirect stdin/stdout/stderr</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <widget class="QCheckBox" name="pyNoEncodingCheckBox">
-     <property name="toolTip">
-      <string>Select to not set the debug client encoding</string>
-     </property>
-     <property name="text">
-      <string>Don't set the encoding of the debug client</string>
-     </property>
-    </widget>
-   </item>
-   <item>
-    <spacer>
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>435</width>
-       <height>21</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-  </layout>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>E5PathPicker</class>
-   <extends>QWidget</extends>
-   <header>E5Gui/E5PathPicker.h</header>
-   <container>1</container>
-  </customwidget>
- </customwidgets>
- <tabstops>
-  <tabstop>venvComboBox</tabstop>
-  <tabstop>venvDlgButton</tabstop>
-  <tabstop>standardButton</tabstop>
-  <tabstop>customButton</tabstop>
-  <tabstop>debugClientPicker</tabstop>
-  <tabstop>sourceExtensionsEdit</tabstop>
-  <tabstop>refreshButton</tabstop>
-  <tabstop>pyRedirectCheckBox</tabstop>
-  <tabstop>pyNoEncodingCheckBox</tabstop>
- </tabstops>
- <resources/>
- <connections>
-  <connection>
-   <sender>customButton</sender>
-   <signal>toggled(bool)</signal>
-   <receiver>debugClientPicker</receiver>
-   <slot>setEnabled(bool)</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>328</x>
-     <y>116</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>328</x>
-     <y>135</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
--- a/eric6/Preferences/ConfigurationPages/DebuggerPython3Page.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/DebuggerPython3Page.py	Sun Jul 05 11:11:24 2020 +0200
@@ -91,7 +91,7 @@
         self.venvComboBox.clear()
         self.venvComboBox.addItems(
             [""] +
-            sorted(self.__virtualenvManager.getVirtualenvNamesForVariant(3))
+            sorted(self.__virtualenvManager.getVirtualenvNames())
         )
         
         # set initial value
--- a/eric6/Preferences/ConfigurationPages/EditorHighlightersPage.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/EditorHighlightersPage.py	Sun Jul 05 11:11:24 2020 +0200
@@ -54,7 +54,7 @@
                 QScintilla.Lexers.getLanguageIcon(lang, False),
                 lang)
         
-        pygmentsLexers = [''] + sorted(l[0] for l in get_all_lexers())
+        pygmentsLexers = [''] + sorted(lex[0] for lex in get_all_lexers())
         self.pygmentsLexerCombo.addItems(pygmentsLexers)
         
         # set initial values
--- a/eric6/Preferences/ConfigurationPages/HelpDocumentationPage.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/HelpDocumentationPage.py	Sun Jul 05 11:11:24 2020 +0200
@@ -32,64 +32,32 @@
         self.ericDocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
         self.ericDocDirPicker.setFilters(self.tr(
             "HTML Files (*.html *.htm);;All Files (*)"))
-        self.python2DocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
-        self.python2DocDirPicker.setFilters(self.tr(
-            "HTML Files (*.html *.htm);;"
-            "Compressed Help Files (*.chm);;"
-            "All Files (*)"))
         self.pythonDocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
         self.pythonDocDirPicker.setFilters(self.tr(
             "HTML Files (*.html *.htm);;"
             "Compressed Help Files (*.chm);;"
             "All Files (*)"))
-        self.qt4DocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
-        self.qt4DocDirPicker.setFilters(self.tr(
-            "HTML Files (*.html *.htm);;All Files (*)"))
         self.qt5DocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
         self.qt5DocDirPicker.setFilters(self.tr(
             "HTML Files (*.html *.htm);;All Files (*)"))
-        self.pyqt4DocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
-        self.pyqt4DocDirPicker.setFilters(self.tr(
-            "HTML Files (*.html *.htm);;All Files (*)"))
         self.pyqt5DocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
         self.pyqt5DocDirPicker.setFilters(self.tr(
             "HTML Files (*.html *.htm);;All Files (*)"))
-        self.pysideDocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
-        self.pysideDocDirPicker.setFilters(self.tr(
-            "HTML Files (*.html *.htm);;All Files (*)"))
         self.pyside2DocDirPicker.setMode(E5PathPickerModes.OpenFileMode)
         self.pyside2DocDirPicker.setFilters(self.tr(
             "HTML Files (*.html *.htm);;All Files (*)"))
         
-        pyside_py2, pyside_py3 = Utilities.checkPyside("1")
-        if pyside_py2 or pyside_py3:
-            self.pysideGroup.setEnabled(True)
-        else:
-            self.pysideGroup.setEnabled(False)
-        
-        pyside2_py2, pyside2_py3 = Utilities.checkPyside("2")
-        if pyside2_py2 or pyside2_py3:
-            self.pyside2Group.setEnabled(True)
-        else:
-            self.pyside2Group.setEnabled(False)
+        self.pyside2Group.setEnabled(Utilities.checkPyside())
         
         # set initial values
         self.ericDocDirPicker.setText(
             Preferences.getHelp("EricDocDir"), toNative=False)
-        self.python2DocDirPicker.setText(
-            Preferences.getHelp("Python2DocDir"), toNative=False)
         self.pythonDocDirPicker.setText(
             Preferences.getHelp("PythonDocDir"), toNative=False)
-        self.qt4DocDirPicker.setText(
-            Preferences.getHelp("Qt4DocDir"), toNative=False)
         self.qt5DocDirPicker.setText(
             Preferences.getHelp("Qt5DocDir"), toNative=False)
-        self.pyqt4DocDirPicker.setText(
-            Preferences.getHelp("PyQt4DocDir"), toNative=False)
         self.pyqt5DocDirPicker.setText(
             Preferences.getHelp("PyQt5DocDir"), toNative=False)
-        self.pysideDocDirPicker.setText(
-            Preferences.getHelp("PySideDocDir"), toNative=False)
         self.pyside2DocDirPicker.setText(
             Preferences.getHelp("PySide2DocDir"), toNative=False)
         
@@ -101,27 +69,15 @@
             "EricDocDir",
             self.ericDocDirPicker.text(toNative=False))
         Preferences.setHelp(
-            "Python2DocDir",
-            self.python2DocDirPicker.text(toNative=False))
-        Preferences.setHelp(
             "PythonDocDir",
             self.pythonDocDirPicker.text(toNative=False))
         Preferences.setHelp(
-            "Qt4DocDir",
-            self.qt4DocDirPicker.text(toNative=False))
-        Preferences.setHelp(
             "Qt5DocDir",
             self.qt5DocDirPicker.text(toNative=False))
         Preferences.setHelp(
-            "PyQt4DocDir",
-            self.pyqt4DocDirPicker.text(toNative=False))
-        Preferences.setHelp(
             "PyQt5DocDir",
             self.pyqt5DocDirPicker.text(toNative=False))
         Preferences.setHelp(
-            "PySideDocDir",
-            self.pysideDocDirPicker.text(toNative=False))
-        Preferences.setHelp(
             "PySide2DocDir",
             self.pyside2DocDirPicker.text(toNative=False))
     
--- a/eric6/Preferences/ConfigurationPages/HelpDocumentationPage.ui	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/HelpDocumentationPage.ui	Sun Jul 05 11:11:24 2020 +0200
@@ -67,41 +67,6 @@
     </widget>
    </item>
    <item>
-    <widget class="QGroupBox" name="groupBox_5">
-     <property name="title">
-      <string>Python 2 Documentation</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout_2">
-      <item>
-       <widget class="E5PathPicker" name="python2DocDirPicker" native="true">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="focusPolicy">
-         <enum>Qt::StrongFocus</enum>
-        </property>
-        <property name="toolTip">
-         <string>Enter the Python 2 documentation directory</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="textLabel1_8_3">
-        <property name="text">
-         <string>&lt;b&gt;Note&lt;/b&gt;: Leave empty to use the PYTHON2DOCDIR environment variable, if set.</string>
-        </property>
-        <property name="wordWrap">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
     <widget class="QGroupBox" name="groupBox_4">
      <property name="title">
       <string>Python 3 Documentation</string>
@@ -137,41 +102,6 @@
     </widget>
    </item>
    <item>
-    <widget class="QGroupBox" name="groupBox_6">
-     <property name="title">
-      <string>Qt4 Documentation</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout_4">
-      <item>
-       <widget class="E5PathPicker" name="qt4DocDirPicker" native="true">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="focusPolicy">
-         <enum>Qt::StrongFocus</enum>
-        </property>
-        <property name="toolTip">
-         <string>Enter the Qt4 documentation directory</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="textLabel1_8_2_2_2">
-        <property name="text">
-         <string>&lt;b&gt;Note&lt;/b&gt;: Leave empty to use the QT4DOCDIR environment variable, if set.</string>
-        </property>
-        <property name="wordWrap">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
     <widget class="QGroupBox" name="groupBox_8">
      <property name="title">
       <string>Qt5 Documentation</string>
@@ -207,41 +137,6 @@
     </widget>
    </item>
    <item>
-    <widget class="QGroupBox" name="groupBox_7">
-     <property name="title">
-      <string>PyQt4 Documentation</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout_6">
-      <item>
-       <widget class="E5PathPicker" name="pyqt4DocDirPicker" native="true">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="focusPolicy">
-         <enum>Qt::StrongFocus</enum>
-        </property>
-        <property name="toolTip">
-         <string>Enter the PyQt4 documentation directory</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="textLabel1_8_2_2_3">
-        <property name="text">
-         <string>&lt;b&gt;Note&lt;/b&gt;: Leave empty to use the PYQT4DOCDIR environment variable, if set.</string>
-        </property>
-        <property name="wordWrap">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
     <widget class="QGroupBox" name="pyqt5Group">
      <property name="title">
       <string>PyQt5 Documentation</string>
@@ -277,41 +172,6 @@
     </widget>
    </item>
    <item>
-    <widget class="QGroupBox" name="pysideGroup">
-     <property name="title">
-      <string>PySide Documentation</string>
-     </property>
-     <layout class="QVBoxLayout" name="verticalLayout_8">
-      <item>
-       <widget class="E5PathPicker" name="pysideDocDirPicker" native="true">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <property name="focusPolicy">
-         <enum>Qt::StrongFocus</enum>
-        </property>
-        <property name="toolTip">
-         <string>Enter the PySide documentation directory</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="textLabel1_8_2_2">
-        <property name="text">
-         <string>&lt;b&gt;Note&lt;/b&gt;: Leave empty to use the PYSIDEDOCDIR environment variable, if set.</string>
-        </property>
-        <property name="wordWrap">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
     <widget class="QGroupBox" name="pyside2Group">
      <property name="title">
       <string>PySide2 Documentation</string>
@@ -371,13 +231,9 @@
  </customwidgets>
  <tabstops>
   <tabstop>ericDocDirPicker</tabstop>
-  <tabstop>python2DocDirPicker</tabstop>
   <tabstop>pythonDocDirPicker</tabstop>
-  <tabstop>qt4DocDirPicker</tabstop>
   <tabstop>qt5DocDirPicker</tabstop>
-  <tabstop>pyqt4DocDirPicker</tabstop>
   <tabstop>pyqt5DocDirPicker</tabstop>
-  <tabstop>pysideDocDirPicker</tabstop>
  </tabstops>
  <resources/>
  <connections/>
--- a/eric6/Preferences/ConfigurationPages/NetworkPage.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/NetworkPage.py	Sun Jul 05 11:11:24 2020 +0200
@@ -118,30 +118,30 @@
              ConfigurationWidget.WebBrowserMode)
         """
         from ..ConfigurationDialog import ConfigurationWidget
-        assert displayMode in (
+        if displayMode in (
             ConfigurationWidget.DefaultMode,
             ConfigurationWidget.HelpBrowserMode,
             ConfigurationWidget.WebBrowserMode
-        )
-        
-        self.__displayMode = displayMode
-        if not self.__configDlg.isUsingWebEngine():
-            self.cleanupGroup.hide()
-            self.displayGroup.hide()
-        else:
-            policy = Preferences.getWebBrowser("DownloadManagerRemovePolicy")
-            from WebBrowser.Download.DownloadManager import DownloadManager
-            if policy == DownloadManager.RemoveNever:
-                self.cleanupNeverButton.setChecked(True)
-            elif policy == DownloadManager.RemoveExit:
-                self.cleanupExitButton.setChecked(True)
+        ):
+            self.__displayMode = displayMode
+            if not self.__configDlg.isUsingWebEngine():
+                self.cleanupGroup.hide()
+                self.displayGroup.hide()
             else:
-                self.cleanupSuccessfulButton.setChecked(True)
-            self.openOnStartCheckBox.setChecked(
-                Preferences.getWebBrowser("DownloadManagerAutoOpen"))
-            self.closeOnFinishedCheckBox.setChecked(
-                Preferences.getWebBrowser("DownloadManagerAutoClose"))
-            self.__webEngine = True
+                policy = Preferences.getWebBrowser(
+                    "DownloadManagerRemovePolicy")
+                from WebBrowser.Download.DownloadManager import DownloadManager
+                if policy == DownloadManager.RemoveNever:
+                    self.cleanupNeverButton.setChecked(True)
+                elif policy == DownloadManager.RemoveExit:
+                    self.cleanupExitButton.setChecked(True)
+                else:
+                    self.cleanupSuccessfulButton.setChecked(True)
+                self.openOnStartCheckBox.setChecked(
+                    Preferences.getWebBrowser("DownloadManagerAutoOpen"))
+                self.closeOnFinishedCheckBox.setChecked(
+                    Preferences.getWebBrowser("DownloadManagerAutoClose"))
+                self.__webEngine = True
     
     def save(self):
         """
--- a/eric6/Preferences/ConfigurationPages/PythonPage.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/PythonPage.py	Sun Jul 05 11:11:24 2020 +0200
@@ -41,13 +41,9 @@
         self.ioEncodingComboBox.setCurrentIndex(index)
         
         # these are the same as in the debugger pages
-        self.py2ExtensionsEdit.setText(
-            Preferences.getDebugger("PythonExtensions"))
         self.py3ExtensionsEdit.setText(
             Preferences.getDebugger("Python3Extensions"))
         
-        self.py2EnvironmentEdit.setText(
-            Preferences.getDebugger("Python2VirtualEnv"))
         self.py3EnvironmentEdit.setText(
             Preferences.getDebugger("Python3VirtualEnv"))
     
@@ -66,9 +62,6 @@
         Preferences.setSystem("IOEncoding", enc)
         
         Preferences.setDebugger(
-            "PythonExtensions",
-            self.py2ExtensionsEdit.text())
-        Preferences.setDebugger(
             "Python3Extensions",
             self.py3ExtensionsEdit.text())
     
@@ -77,8 +70,6 @@
         """
         Private slot handling a click of the refresh button.
         """
-        self.py2EnvironmentEdit.setText(
-            Preferences.getDebugger("Python2VirtualEnv"))
         self.py3EnvironmentEdit.setText(
             Preferences.getDebugger("Python3VirtualEnv"))
     
--- a/eric6/Preferences/ConfigurationPages/PythonPage.ui	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/PythonPage.ui	Sun Jul 05 11:11:24 2020 +0200
@@ -89,7 +89,7 @@
       <item row="0" column="0" colspan="2">
        <widget class="QLabel" name="label_3">
         <property name="text">
-         <string>Enter the file extensions to be associated with the Python versions separated by a space. They must not overlap with each other.</string>
+         <string>Enter the file extensions to be associated with Python separated by a space.</string>
         </property>
         <property name="wordWrap">
          <bool>true</bool>
@@ -97,23 +97,13 @@
        </widget>
       </item>
       <item row="1" column="0">
-       <widget class="QLabel" name="label_4">
-        <property name="text">
-         <string>Python 2:</string>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="QLineEdit" name="py2ExtensionsEdit"/>
-      </item>
-      <item row="2" column="0">
        <widget class="QLabel" name="label_5">
         <property name="text">
          <string>Python 3:</string>
         </property>
        </widget>
       </item>
-      <item row="2" column="1">
+      <item row="1" column="1">
        <widget class="QLineEdit" name="py3ExtensionsEdit"/>
       </item>
      </layout>
@@ -142,27 +132,13 @@
         </property>
         <layout class="QGridLayout" name="gridLayout_3">
          <item row="0" column="0">
-          <widget class="QLabel" name="label_7">
-           <property name="text">
-            <string>Python 2:</string>
-           </property>
-          </widget>
-         </item>
-         <item row="0" column="1">
-          <widget class="QLineEdit" name="py2EnvironmentEdit">
-           <property name="readOnly">
-            <bool>true</bool>
-           </property>
-          </widget>
-         </item>
-         <item row="1" column="0">
           <widget class="QLabel" name="label_9">
            <property name="text">
             <string>Python 3:</string>
            </property>
           </widget>
          </item>
-         <item row="1" column="1">
+         <item row="0" column="1">
           <widget class="QLineEdit" name="py3EnvironmentEdit">
            <property name="readOnly">
             <bool>true</bool>
@@ -233,9 +209,7 @@
  <tabstops>
   <tabstop>stringEncodingComboBox</tabstop>
   <tabstop>ioEncodingComboBox</tabstop>
-  <tabstop>py2ExtensionsEdit</tabstop>
   <tabstop>py3ExtensionsEdit</tabstop>
-  <tabstop>py2EnvironmentEdit</tabstop>
   <tabstop>py3EnvironmentEdit</tabstop>
   <tabstop>refreshButton</tabstop>
  </tabstops>
--- a/eric6/Preferences/ConfigurationPages/QtPage.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/QtPage.py	Sun Jul 05 11:11:24 2020 +0200
@@ -58,7 +58,7 @@
         self.pyside2uicImportsCheckBox.setChecked(
             Preferences.getQt("PySide2FromImports"))
         
-        self.pyside2Group.setEnabled(any(Utilities.checkPyside()))
+        self.pyside2Group.setEnabled(Utilities.checkPyside())
         
     def save(self):
         """
--- a/eric6/Preferences/ConfigurationPages/SecurityPage.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/SecurityPage.py	Sun Jul 05 11:11:24 2020 +0200
@@ -59,17 +59,16 @@
              ConfigurationWidget.WebBrowserMode)
         """
         from ..ConfigurationDialog import ConfigurationWidget
-        assert displayMode in (
+        if displayMode in (
             ConfigurationWidget.DefaultMode,
             ConfigurationWidget.HelpBrowserMode,
             ConfigurationWidget.WebBrowserMode
-        )
-        
-        self.__displayMode = displayMode
-        
-        self.certificateErrorsGroup.setVisible(
-            displayMode == ConfigurationWidget.WebBrowserMode
-        )
+        ):
+            self.__displayMode = displayMode
+            
+            self.certificateErrorsGroup.setVisible(
+                displayMode == ConfigurationWidget.WebBrowserMode
+            )
     
     def save(self):
         """
--- a/eric6/Preferences/ConfigurationPages/WebBrowserAppearancePage.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/WebBrowserAppearancePage.py	Sun Jul 05 11:11:24 2020 +0200
@@ -121,12 +121,11 @@
              ConfigurationWidget.TrayStarterMode)
         """
         from ..ConfigurationDialog import ConfigurationWidget
-        assert displayMode in (
+        if displayMode in (
             ConfigurationWidget.DefaultMode,
             ConfigurationWidget.WebBrowserMode,
-        )
-        
-        self.__displayMode = displayMode
+        ):
+            self.__displayMode = displayMode
     
     def save(self):
         """
--- a/eric6/Preferences/ConfigurationPages/WebBrowserInterfacePage.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/WebBrowserInterfacePage.py	Sun Jul 05 11:11:24 2020 +0200
@@ -7,8 +7,6 @@
 Module implementing the Interface configuration page (variant for web browser).
 """
 
-from __future__ import unicode_literals
-
 from PyQt5.QtWidgets import QStyleFactory
 
 from E5Gui.E5PathPicker import E5PathPickerModes
--- a/eric6/Preferences/ConfigurationPages/WebBrowserPage.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Preferences/ConfigurationPages/WebBrowserPage.py	Sun Jul 05 11:11:24 2020 +0200
@@ -171,7 +171,7 @@
         self.expireHistory.setCurrentIndex(idx)
         
         for language in range(2, QLocale.LastLanguage + 1):
-            countries = [l.country() for l in QLocale.matchingLocales(
+            countries = [loc.country() for loc in QLocale.matchingLocales(
                 language, QLocale.AnyScript, QLocale.AnyCountry)]
             if len(countries) > 0:
                 self.languageCombo.addItem(
--- a/eric6/Preferences/ProgramsDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Preferences/ProgramsDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -141,88 +141,42 @@
             self.tr("Qt Assistant"), exe, version=version)
         
         # 2. do the PyQt programs
-        # 2.1 do the PyQt4 programs
-        # deprecated
-        # 2.1a. Translation Extractor PyQt4
-        self.__createProgramEntry(
-            self.tr("Translation Extractor (Python, PyQt4)"),
-            Utilities.generatePyQtToolPath("pylupdate4"),
-            '-version', 'pylupdate', -1)
-        # 2.1b. Forms Compiler PyQt4
-        self.__createProgramEntry(
-            self.tr("Forms Compiler (Python, PyQt4)"),
-            Utilities.generatePyQtToolPath("pyuic4", ["py3uic4"]),
-            '--version', 'Python User', 4)
-        # 2.1c. Resource Compiler PyQt4
-        self.__createProgramEntry(
-            self.tr("Resource Compiler (Python, PyQt4)"),
-            Utilities.generatePyQtToolPath("pyrcc4"),
-            '-version', 'Resource Compiler', -1)
-        
-        # 2.2 do the PyQt5 programs
-        # 2.2a. Translation Extractor PyQt5
+        # 2.1 do the PyQt5 programs
+        # 2.1a. Translation Extractor PyQt5
         self.__createProgramEntry(
             self.tr("Translation Extractor (Python, PyQt5)"),
             Utilities.generatePyQtToolPath("pylupdate5"),
             '-version', 'pylupdate', -1)
-        # 2.2b. Forms Compiler PyQt5
+        # 2.1b. Forms Compiler PyQt5
         self.__createProgramEntry(
             self.tr("Forms Compiler (Python, PyQt5)"),
             Utilities.generatePyQtToolPath("pyuic5", ["py3uic5"]),
             '--version', 'Python User', 4)
-        # 2.2c. Resource Compiler PyQt5
+        # 2.1c. Resource Compiler PyQt5
         self.__createProgramEntry(
             self.tr("Resource Compiler (Python, PyQt5)"),
             Utilities.generatePyQtToolPath("pyrcc5"),
             '-version', '', -1, versionRe='Resource Compiler|pyrcc5')
         
-        # 3.1 do the PySide programs
-        # 3.1a. Translation Extractor PySide
-        self.__createProgramEntry(
-            self.tr("Translation Extractor (Python, PySide)"),
-            Utilities.generatePySideToolPath("pyside-lupdate", "1"),
-            '-version', '', -1, versionRe='lupdate')
-        # 3.1b. Forms Compiler PySide
-        self.__createProgramEntry(
-            self.tr("Forms Compiler (Python, PySide)"),
-            Utilities.generatePySideToolPath("pyside-uic", "1"),
-            '--version', 'PySide User', 5, versionCleanup=(0, -1))
-        # 3.1c Resource Compiler PySide
-        self.__createProgramEntry(
-            self.tr("Resource Compiler (Python, PySide)"),
-            Utilities.generatePySideToolPath("pyside-rcc", "1"),
-            '-version', 'Resource Compiler', -1)
-        
-        # 3.2 do the PySide2 programs
-        # 3.2a. Translation Extractor PySide2
+        # 3. do the PySide programs
+        # 3.1 do the PySide2 programs
+        # 3.1a. Translation Extractor PySide2
         self.__createProgramEntry(
             self.tr("Translation Extractor (Python, PySide2)"),
-            Utilities.generatePySideToolPath("pyside2-lupdate", "2"),
+            Utilities.generatePySideToolPath("pyside2-lupdate"),
             '-version', '', -1, versionRe='lupdate')
-        # 3.2b. Forms Compiler PySide2
+        # 3.1b. Forms Compiler PySide2
         self.__createProgramEntry(
             self.tr("Forms Compiler (Python, PySide2)"),
-            Utilities.generatePySideToolPath("pyside2-uic", "2"),
+            Utilities.generatePySideToolPath("pyside2-uic"),
             '--version', '', -1, versionRe='uic')
-        # 3.2c Resource Compiler PySide2
+        # 3.1c Resource Compiler PySide2
         self.__createProgramEntry(
             self.tr("Resource Compiler (Python, PySide2)"),
-            Utilities.generatePySideToolPath("pyside2-rcc", "2"),
+            Utilities.generatePySideToolPath("pyside2-rcc"),
             '-version', '', -1, versionRe='rcc')
         
-        # 4. do the Ruby programs
-        # 4a. Forms Compiler for Qt4
-        self.__createProgramEntry(
-            self.tr("Forms Compiler (Ruby, Qt4)"),
-            Utilities.isWindowsPlatform() and "rbuic4.exe" or "rbuic4",
-            '-version', 'Qt', -1)
-        # 4b. Resource Compiler for Qt4
-        self.__createProgramEntry(
-            self.tr("Resource Compiler (Ruby, Qt4)"),
-            Utilities.isWindowsPlatform() and "rbrcc.exe" or "rbrcc",
-            '-version', 'Ruby Resource Compiler', -1)
-        
-        # 5. do the Conda program(s)
+        # 4. do the Conda program(s)
         exe = Preferences.getConda("CondaExecutable")
         if not exe:
             exe = "conda"
@@ -231,7 +185,7 @@
         self.__createProgramEntry(
             self.tr("conda Manager"), exe, '--version', 'conda', -1)
         
-        # 6. do the pip program(s)
+        # 5. do the pip program(s)
         virtualenvManager = e5App().getObject("VirtualEnvManager")
         for venvName in virtualenvManager.getVirtualenvNames():
             interpreter = virtualenvManager.getVirtualenvInterpreter(venvName)
@@ -239,8 +193,8 @@
                 self.tr("PyPI Package Management"), interpreter, '--version',
                 'pip', 1, exeModule=["-m", "pip"])
         
-        # 7. do the CORBA and Protobuf programs
-        # 7a. omniORB
+        # 6. do the CORBA and Protobuf programs
+        # 6a. omniORB
         exe = Preferences.getCorba("omniidl")
         if not exe:
             exe = "omniidl"
@@ -248,7 +202,7 @@
                 exe += ".exe"
         self.__createProgramEntry(
             self.tr("CORBA IDL Compiler"), exe, '-V', 'omniidl', -1)
-        # 7b. protobuf
+        # 6b. protobuf
         exe = Preferences.getProtobuf("protoc")
         if not exe:
             exe = "protoc"
@@ -256,7 +210,7 @@
                 exe += ".exe"
         self.__createProgramEntry(
             self.tr("Protobuf Compiler"), exe, '--version', 'libprotoc', -1)
-        # 7c. grpc
+        # 6c. grpc
         exe = Preferences.getProtobuf("grpcPython")
         if not exe:
             exe = sys.executable
@@ -264,7 +218,7 @@
             self.tr("gRPC Compiler"), exe, '--version', 'libprotoc', -1,
             exeModule=['-m', 'grpc_tools.protoc'])
         
-        # 8. do the spell checking entry
+        # 7. do the spell checking entry
         try:
             import enchant
             try:
@@ -281,7 +235,7 @@
         self.__createEntry(
             self.tr("Spell Checker - PyEnchant"), text, version)
         
-        # 9. do the pygments entry
+        # 8. do the pygments entry
         try:
             import pygments
             try:
@@ -298,7 +252,7 @@
         self.__createEntry(
             self.tr("Source Highlighter - Pygments"), text, version)
         
-        # 10. do the MicroPython related entries
+        # 9. do the MicroPython related entries
         exe = Preferences.getMicroPython("MpyCrossCompiler")
         if not exe:
             exe = "mpy-cross"
--- a/eric6/Preferences/__init__.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Preferences/__init__.py	Sun Jul 05 11:11:24 2020 +0200
@@ -17,6 +17,7 @@
 """
 
 
+import ast
 import os
 import fnmatch
 import shutil
@@ -81,12 +82,8 @@
         "SuppressClientExit": False,
         "BreakAlways": False,
         "ShowExceptionInShell": True,
-        "Python2VirtualEnv": "",
         "Python3VirtualEnv": "",
         "RubyInterpreter": "",
-        "DebugClientType": "standard",
-        # supported "standard", "custom"
-        "DebugClient": "",
         "DebugClientType3": "standard",
         # supported "standard", "custom"
         "DebugClient3": "",
@@ -108,8 +105,6 @@
         "BgColorNew": QColor("#28FFEEAA"),
         "BgColorChanged": QColor("#2870FF66"),
         "AllowedHosts": ["127.0.0.1", "::1%0"],
-        # space separated list of Python2 extensions
-        "PythonExtensions": ".py2 .pyw2 .ptl",
         # space separated list of Python3 extensions
         "Python3Extensions": ".py .pyw .py3 .pyw3",
         # Global Multiprocess Debugging Support
@@ -471,7 +466,7 @@
         
         "DefaultEncoding": "utf-8",
         "DefaultOpenFilter": QCoreApplication.translate(
-            'Lexers', 'Python Files (*.py *.py2 *.py3)'),
+            'Lexers', 'Python Files (*.py *.py3)'),
         "DefaultSaveFilter": QCoreApplication.translate(
             'Lexers', "Python3 Files (*.py)"),
         "AdditionalOpenFilters": [],
@@ -807,23 +802,6 @@
     
     # defaults for the project browser flags settings
     projectBrowserFlagsDefaults = {
-        # deprecated
-        "Qt4": (
-            SourcesBrowserFlag |
-            FormsBrowserFlag |
-            ResourcesBrowserFlag |
-            TranslationsBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
-        # deprecated
-        "Qt4C": (
-            SourcesBrowserFlag |
-            ResourcesBrowserFlag |
-            TranslationsBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
         "PyQt5": (
             SourcesBrowserFlag |
             FormsBrowserFlag |
@@ -857,21 +835,6 @@
             InterfacesBrowserFlag |
             OthersBrowserFlag |
             ProtocolsBrowserFlag),
-        "PySide": (
-            SourcesBrowserFlag |
-            FormsBrowserFlag |
-            ResourcesBrowserFlag |
-            TranslationsBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
-        "PySideC": (
-            SourcesBrowserFlag |
-            ResourcesBrowserFlag |
-            TranslationsBrowserFlag |
-            InterfacesBrowserFlag |
-            OthersBrowserFlag |
-            ProtocolsBrowserFlag),
         "PySide2": (
             SourcesBrowserFlag |
             FormsBrowserFlag |
@@ -905,12 +868,8 @@
     helpDefaults = {
         "CustomViewer": "",
         "PythonDocDir": "",
-        "Python2DocDir": "",
-        "Qt4DocDir": "",
         "Qt5DocDir": "",
-        "PyQt4DocDir": "",
         "PyQt5DocDir": "",
-        "PySideDocDir": "",
         "PySide2DocDir": "",
         "EricDocDir": "",
     }
@@ -1621,7 +1580,6 @@
         # backward compatibility fot Qt < 5.10
         pass
     
-    # Avoid nasty behavior of QSettings in combination with Py2
     Prefs.settings.value("UI/SingleApplicationMode")
     
 
@@ -1714,9 +1672,9 @@
     @param prefClass preferences class used as the storage area
     @return a tuple defining the variables filter
     """
-    localsFilter = eval(prefClass.settings.value(
+    localsFilter = ast.literal_eval(prefClass.settings.value(
         "Variables/LocalsFilter", prefClass.varDefaults["LocalsFilter"]))
-    globalsFilter = eval(prefClass.settings.value(
+    globalsFilter = ast.literal_eval(prefClass.settings.value(
         "Variables/GlobalsFilter", prefClass.varDefaults["GlobalsFilter"]))
     return (localsFilter, globalsFilter)
     
@@ -1763,10 +1721,8 @@
                 "Debugger/" + key, prefClass.debuggerDefaults[key]))
     elif key in ["PythonInterpreter", "Python3Interpreter"]:
         # This code is here to ensure backward compatibility.
-        if key == "PythonInterpreter":
-            newKey = "Python2VirtualEnv"
-        else:
-            newKey = "Python3VirtualEnv"
+        # Keep "PythonInterpreter" for backward compatibility.
+        newKey = "Python3VirtualEnv"
         venvName = prefClass.settings.value(
             "Debugger/" + newKey, prefClass.debuggerDefaults[newKey])
         if venvName:
@@ -1780,11 +1736,9 @@
         else:
             interpreter = ""
         if not interpreter:
-            pyVersion = 2 if key == "PythonInterpreter" else 3
-            if sys.version_info[0] == pyVersion:
-                return sys.executable
+            return sys.executable
         return interpreter
-    elif key in ["DebugClientType", "DebugClientType3"]:
+    elif key == "DebugClientType3":
         debugClientType = prefClass.settings.value(
             "Debugger/" + key, prefClass.debuggerDefaults[key])
         # Correct obsolete entry "threaded"
@@ -1792,6 +1746,12 @@
             return "standard"
         else:
             return debugClientType
+    elif key == "PythonExtensions":
+        # we don't support Python2 anymore
+        return ""
+    elif key == "Python2VirtualEnv":
+        # we don't support Python2 anymore
+        return ""
     else:
         return prefClass.settings.value(
             "Debugger/" + key, prefClass.debuggerDefaults[key])
@@ -1816,7 +1776,11 @@
     @param prefClass preferences class used as the storage area
     @return the requested debugger setting
     """
-    if key in ["PythonExtensions", "Python3Extensions"]:
+    if key == "PythonExtensions":
+        # we don't support Python2 anymore
+        return []
+    
+    if key == "Python3Extensions":
         exts = []
         for ext in getDebugger(key, prefClass).split():
             if ext.startswith("."):
@@ -1836,7 +1800,7 @@
     @param value the value to be set
     @param prefClass preferences class used as the storage area
     """
-    if key in ["PythonExtensions", "Python3Extensions"]:
+    if key == "Python3Extensions":
         setDebugger(key, value, prefClass)
 
 
@@ -2633,7 +2597,7 @@
     else:
         return prefClass.settings.value(
             "MultiProject/" + key, prefClass.multiProjectDefaults[key])
-    
+
 
 def setMultiProject(key, value, prefClass=Prefs):
     """
@@ -2644,24 +2608,7 @@
     @param prefClass preferences class used as the storage area
     """
     prefClass.settings.setValue("MultiProject/" + key, value)
-    
 
-def getQt4DocDir(prefClass=Prefs):
-    """
-    Module function to retrieve the Qt4DocDir setting.
-    
-    @param prefClass preferences class used as the storage area
-    @return the requested Qt4DocDir setting (string)
-    """
-    s = prefClass.settings.value(
-        "Help/Qt4DocDir", prefClass.helpDefaults["Qt4DocDir"])
-    if s == "":
-        s = os.getenv("QT4DOCDIR", "")
-    if s == "":
-        s = os.path.join(
-            QLibraryInfo.location(QLibraryInfo.DocumentationPath), "html")
-    return s
-    
 
 def getQt5DocDir(prefClass=Prefs):
     """
--- a/eric6/Project/CreateDialogCodeDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Project/CreateDialogCodeDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -288,22 +288,18 @@
         # I. always check for *
         mapped = mapped.replace("*", "")
         
-        if (
-            self.project.getProjectLanguage() != "Python2" or
-            self.project.getProjectType in ("PySide", "PySide2")
-        ):
-            # 1. check for const
-            mapped = mapped.replace("const ", "")
-            
-            # 2. replace QString and QStringList
-            mapped = (
-                mapped
-                .replace("QStringList", "list")
-                .replace("QString", "str")
-            )
-            
-            # 3. replace double by float
-            mapped = mapped.replace("double", "float")
+        # 1. check for const
+        mapped = mapped.replace("const ", "")
+        
+        # 2. replace QString and QStringList
+        mapped = (
+            mapped
+            .replace("QStringList", "list")
+            .replace("QString", "str")
+        )
+        
+        # 3. replace double by float
+        mapped = mapped.replace("double", "float")
         
         return mapped
     
@@ -377,7 +373,7 @@
         elif self.filenameEdit.text().endswith(".rb"):
             pass
         # second decide on project language
-        elif self.project.getProjectLanguage() in ["Python2", "Python3"]:
+        elif self.project.getProjectLanguage() == "Python3":
             self.__generatePythonCode()
         elif self.project.getProjectLanguage() == "Ruby":
             pass
@@ -389,6 +385,16 @@
         """
         Private slot to generate Python code as requested by the user.
         """
+        if self.project.getProjectLanguage() != "Python3":
+            E5MessageBox.critical(
+                self,
+                self.tr("Code Generation"),
+                self.tr(
+                    """<p>Code generation for project language"""
+                    """ "{0}" is not supported.</p>""")
+                .format(self.project.getProjectLanguage()))
+            return
+        
         # init some variables
         sourceImpl = []
         appendAtIndex = -1
@@ -398,41 +404,24 @@
         if self.__module is None:
             # new file
             try:
-                if self.project.getProjectLanguage() == "Python2":
-                    if self.project.getProjectType() == "PySide":
-                        tmplName = os.path.join(
-                            getConfig('ericCodeTemplatesDir'),
-                            "impl_pyside.py2.tmpl")
-                    elif self.project.getProjectType() == "PySide2":
-                        tmplName = os.path.join(
-                            getConfig('ericCodeTemplatesDir'),
-                            "impl_pyside2.py2.tmpl")
-                    elif self.project.getProjectType() == "PyQt5":
-                        tmplName = os.path.join(
-                            getConfig('ericCodeTemplatesDir'),
-                            "impl_pyqt5.py2.tmpl")
-                    else:
-                        tmplName = os.path.join(
-                            getConfig('ericCodeTemplatesDir'),
-                            "impl_pyqt.py2.tmpl")
+                if self.project.getProjectType() == "PySide2":
+                    tmplName = os.path.join(
+                        getConfig('ericCodeTemplatesDir'),
+                        "impl_pyside2.py.tmpl")
+                elif self.project.getProjectType() in [
+                        "PyQt5", "E6Plugin"]:
+                    tmplName = os.path.join(
+                        getConfig('ericCodeTemplatesDir'),
+                        "impl_pyqt5.py.tmpl")
                 else:
-                    if self.project.getProjectType() == "PySide":
-                        tmplName = os.path.join(
-                            getConfig('ericCodeTemplatesDir'),
-                            "impl_pyside.py.tmpl")
-                    elif self.project.getProjectType() == "PySide2":
-                        tmplName = os.path.join(
-                            getConfig('ericCodeTemplatesDir'),
-                            "impl_pyside2.py.tmpl")
-                    elif self.project.getProjectType() in [
-                            "PyQt5", "E6Plugin"]:
-                        tmplName = os.path.join(
-                            getConfig('ericCodeTemplatesDir'),
-                            "impl_pyqt5.py.tmpl")
-                    else:
-                        tmplName = os.path.join(
-                            getConfig('ericCodeTemplatesDir'),
-                            "impl_pyqt.py.tmpl")
+                    E5MessageBox.critical(
+                        self,
+                        self.tr("Code Generation"),
+                        self.tr(
+                            """<p>No code template file available for"""
+                            """ project type "{0}".</p>""")
+                        .format(self.project.getProjectType()))
+                    return
                 tmplFile = open(tmplName, 'r', encoding="utf-8")
                 template = tmplFile.read()
                 tmplFile.close()
@@ -503,18 +492,10 @@
                     break
         
         # do the coding stuff
-        if self.project.getProjectLanguage() == "Python2":
-            if self.project.getProjectType() in ("PySide", "PySide2"):
-                pyqtSignatureFormat = '@Slot({0})'
-            elif self.project.getProjectType() == "PyQt5":
-                pyqtSignatureFormat = '@pyqtSlot({0})'
-            else:
-                pyqtSignatureFormat = '@pyqtSignature("{0}")'
+        if self.project.getProjectType() in ("PySide2",):
+            pyqtSignatureFormat = '@Slot({0})'
         else:
-            if self.project.getProjectType() in ("PySide", "PySide2"):
-                pyqtSignatureFormat = '@Slot({0})'
-            else:
-                pyqtSignatureFormat = '@pyqtSlot({0})'
+            pyqtSignatureFormat = '@pyqtSlot({0})'
         for row in range(self.slotsModel.rowCount()):
             topItem = self.slotsModel.item(row)
             for childRow in range(topItem.rowCount()):
--- a/eric6/Project/DebuggerPropertiesDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Project/DebuggerPropertiesDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -68,9 +68,7 @@
             venvIndex = max(0, self.venvComboBox.findText(
                 self.project.debugProperties["VIRTUALENV"]))
         else:
-            if self.project.pdata["PROGLANGUAGE"] == "Python2":
-                venvName = Preferences.getDebugger("Python2VirtualEnv")
-            elif self.project.pdata["PROGLANGUAGE"] == "Python3":
+            if self.project.pdata["PROGLANGUAGE"] == "Python3":
                 venvName = Preferences.getDebugger("Python3VirtualEnv")
             else:
                 venvName = ""
@@ -86,8 +84,7 @@
                 self.project.debugProperties["DEBUGCLIENT"],
                 toNative=False)
         else:
-            if self.project.pdata["PROGLANGUAGE"] in ["Python", "Python2",
-                                                      "Python3"]:
+            if self.project.pdata["PROGLANGUAGE"] == "Python3":
                 debugClient = os.path.join(
                     getConfig('ericDir'),
                     "DebugClients", "Python", "DebugClient.py")
@@ -145,8 +142,7 @@
             self.debugClientPicker.text(toNative=False)
         )
         if not self.project.debugProperties["DEBUGCLIENT"]:
-            if self.project.pdata["PROGLANGUAGE"] in ["Python", "Python2",
-                                                      "Python3"]:
+            if self.project.pdata["PROGLANGUAGE"] == "Python3":
                 debugClient = os.path.join(
                     getConfig('ericDir'),
                     "DebugClients", "Python", "DebugClient.py")
--- a/eric6/Project/LexerAssociationDialog.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Project/LexerAssociationDialog.py	Sun Jul 05 11:11:24 2020 +0200
@@ -55,7 +55,7 @@
                 lang)
         
         from pygments.lexers import get_all_lexers
-        pygmentsLexers = [''] + sorted(l[0] for l in get_all_lexers())
+        pygmentsLexers = [''] + sorted(lex[0] for lex in get_all_lexers())
         self.pygmentsLexerCombo.addItems(pygmentsLexers)
         
         # set initial values
--- a/eric6/Project/Project.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Project/Project.py	Sun Jul 05 11:11:24 2020 +0200
@@ -164,7 +164,6 @@
         self.ui = parent
         
         self.__progLanguages = [
-            "Python2",
             "Python3",
             "MicroPython",
             "Ruby",
@@ -172,9 +171,6 @@
         ]
         
         self.__dbgFilters = {
-            "Python2": self.tr(
-                "Python2 Files (*.py2);;"
-                "Python2 GUI Files (*.pyw2);;"),
             "Python3": self.tr(
                 "Python3 Files (*.py *.py3);;"
                 "Python3 GUI Files (*.pyw *.pyw3);;"),
@@ -212,14 +208,7 @@
         @param language programming language (string)
         @return source extensions (list of string)
         """
-        if language == "Python2":
-            extensions = Preferences.getPython("PythonExtensions")
-            # *.py and *.pyw should always be associated with source files
-            for ext in [".py", ".pyw"]:
-                if ext not in extensions:
-                    extensions.append(ext)
-            return extensions
-        elif language == "Python3":
+        if language == "Python3":
             extensions = Preferences.getPython("Python3Extensions")
             # *.py and *.pyw should always be associated with source files
             for ext in [".py", ".pyw"]:
@@ -239,7 +228,6 @@
             return ['.js']
         elif language == "Mixed":
             return (Preferences.getPython("Python3Extensions") +
-                    Preferences.getPython("PythonExtensions") +
                     ['.rb', '.js'])
         else:
             return [""]
@@ -275,8 +263,6 @@
         self.__binaryTranslationsCallbacks = {}
         
         self.__projectTypes = {
-            "Qt4": self.tr("PyQt4 GUI (deprecated)"),
-            "Qt4C": self.tr("PyQt4 Console (deprecated)"),
             "PyQt5": self.tr("PyQt5 GUI"),
             "PyQt5C": self.tr("PyQt5 Console"),
             "E6Plugin": self.tr("Eric6 Plugin"),
@@ -285,36 +271,17 @@
         }
         
         self.__projectProgLanguages = {
-            "Python2": ["Qt4", "Qt4C", "PyQt5", "PyQt5C",
-                        "E6Plugin", "Console", "Other"],
-            "Python3": ["Qt4", "Qt4C", "PyQt5", "PyQt5C",
-                        "E6Plugin", "Console", "Other"],
+            "Python3": ["PyQt5", "PyQt5C", "E6Plugin", "Console", "Other"],
             "MicroPython": ["Console", "Other"],
-            "Ruby": ["Qt4", "Qt4C", "Console", "Other"],
+            "Ruby": ["Console", "Other"],
             "JavaScript": ["Other"],
         }
         
-        pyside_py2, pyside_py3 = Utilities.checkPyside("1")
-        if pyside_py2 or pyside_py3:
-            self.__projectTypes["PySide"] = self.tr("PySide GUI")
-            self.__projectTypes["PySideC"] = self.tr("PySide Console")
-            if pyside_py2:
-                self.__projectProgLanguages["Python2"].extend(
-                    ["PySide", "PySideC"])
-            if pyside_py3:
-                self.__projectProgLanguages["Python3"].extend(
-                    ["PySide", "PySideC"])
-        
-        pyside2_py2, pyside2_py3 = Utilities.checkPyside("2")
-        if pyside2_py2 or pyside2_py3:
+        if Utilities.checkPyside():
             self.__projectTypes["PySide2"] = self.tr("PySide2 GUI")
             self.__projectTypes["PySide2C"] = self.tr("PySide2 Console")
-            if pyside2_py2:
-                self.__projectProgLanguages["Python2"].extend(
-                    ["PySide2", "PySide2C"])
-            if pyside2_py3:
-                self.__projectProgLanguages["Python3"].extend(
-                    ["PySide2", "PySide2C"])
+            self.__projectProgLanguages["Python3"].extend(
+                ["PySide2", "PySide2C"])
         
     def getProjectTypes(self, progLanguage=""):
         """
@@ -369,14 +336,18 @@
         """
         if progLanguages:
             for progLanguage in progLanguages:
+                if progLanguage in ["Python", "Python2"]:
+                    # ignore that silently for Python2
+                    return
+                
                 if progLanguage not in self.__projectProgLanguages:
                     E5MessageBox.critical(
                         self.ui,
                         self.tr("Registering Project Type"),
                         self.tr(
                             """<p>The Programming Language <b>{0}</b> is not"""
-                            """ supported.</p>""")
-                        .format(progLanguage)
+                            """ supported (project type: {1}).</p>""")
+                        .format(progLanguage, type_)
                     )
                     return
                 
@@ -616,24 +587,20 @@
         self.pdata["FILETYPES"]["*.proto"] = "PROTOCOLS"
         
         # Forms
-        if self.pdata["PROJECTTYPE"] in ["Qt4", "PyQt5",
-                                         "E6Plugin", "PySide",
+        if self.pdata["PROJECTTYPE"] in ["E6Plugin",
+                                         "PyQt5",
                                          "PySide2"]:
             self.pdata["FILETYPES"]["*.ui"] = "FORMS"
         
         # Resources
-        if self.pdata["PROJECTTYPE"] in ["Qt4", "Qt4C",
-                                         "E6Plugin",
+        if self.pdata["PROJECTTYPE"] in ["E6Plugin",
                                          "PyQt5", "PyQt5C",
-                                         "PySide", "PySideC",
                                          "PySide2", "PySide2C"]:
             self.pdata["FILETYPES"]["*.qrc"] = "RESOURCES"
         
         # Translations
-        if self.pdata["PROJECTTYPE"] in ["Qt4", "Qt4C",
-                                         "E6Plugin",
+        if self.pdata["PROJECTTYPE"] in ["E6Plugin",
                                          "PyQt5", "PyQt5C",
-                                         "PySide", "PySideC",
                                          "PySide2", "PySide2C"]:
             self.pdata["FILETYPES"]["*.ts"] = "TRANSLATIONS"
             self.pdata["FILETYPES"]["*.qm"] = "TRANSLATIONS"
@@ -654,10 +621,8 @@
         Public method to update the filetype associations with new default
         values.
         """
-        if self.pdata["PROJECTTYPE"] in ["Qt4", "Qt4C",
-                                         "E6Plugin",
+        if self.pdata["PROJECTTYPE"] in ["E6Plugin",
                                          "PyQt5", "PyQt5C",
-                                         "PySide", "PySideC",
                                          "PySide2", "PySide2C"]:
             if "*.ts" not in self.pdata["FILETYPES"]:
                 self.pdata["FILETYPES"]["*.ts"] = "TRANSLATIONS"
@@ -1414,8 +1379,7 @@
         if dlg.exec_() == QDialog.Accepted:
             lang = dlg.getSelectedLanguage()
             if self.pdata["PROJECTTYPE"] in [
-                "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-                "PySide", "PySideC", "PySide2", "PySide2C"
+                "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
             ]:
                 langFile = self.pdata["TRANSLATIONPATTERN"].replace(
                     "%language%", lang)
@@ -2385,7 +2349,7 @@
                 # create an empty __init__.py file to make it a Python package
                 # (only for Python and Python3)
                 if self.pdata["PROGLANGUAGE"] in [
-                    "Python", "Python2", "Python3", "MicroPython"
+                    "Python3", "MicroPython"
                 ]:
                     fn = os.path.join(self.ppath, "__init__.py")
                     f = open(fn, "w", encoding="utf-8")
@@ -2499,7 +2463,7 @@
                 # create an empty __init__.py file to make it a Python package
                 # if none exists (only for Python and Python3)
                 if self.pdata["PROGLANGUAGE"] in [
-                    "Python", "Python2", "Python3", "MicroPython"
+                    "Python3", "MicroPython"
                 ]:
                     fn = os.path.join(self.ppath, "__init__.py")
                     if not os.path.exists(fn):
@@ -2731,7 +2695,7 @@
                         self.projectLanguageAdded.emit(qm)
             if not self.pdata["MAINSCRIPT"] and bool(mainscriptname):
                 if self.pdata["PROGLANGUAGE"] in [
-                    "Python", "Python2", "Python3", "MicroPython"
+                    "Python3", "MicroPython"
                 ]:
                     self.pdata["MAINSCRIPT"] = '{0}.py'.format(mainscriptname)
                 elif self.pdata["PROGLANGUAGE"] == "Ruby":
@@ -3444,13 +3408,12 @@
         
     def isPythonProject(self):
         """
-        Public method to check, if this project is a Python2 or Python3
+        Public method to check, if this project is a Python3 or MicroPython
         project.
         
         @return flag indicating a Python project (boolean)
         """
-        return self.pdata["PROGLANGUAGE"] in ["Python", "Python2",
-                                              "Python3", "MicroPython"]
+        return self.pdata["PROGLANGUAGE"] in ["Python3", "MicroPython"]
         
     def isPy3Project(self):
         """
@@ -3459,15 +3422,7 @@
         @return flag indicating a Python3 project (boolean)
         """
         return self.pdata["PROGLANGUAGE"] == "Python3"
-        
-    def isPy2Project(self):
-        """
-        Public method to check, if this project is a Python2 project.
-        
-        @return flag indicating a Python2 project (boolean)
-        """
-        return self.pdata["PROGLANGUAGE"] in ["Python", "Python2"]
-        
+    
     def isMicroPythonProject(self):
         """
         Public method to check, if this project is a MicroPython project.
@@ -3529,7 +3484,7 @@
         if lang == "":
             lang = "Python3"
         elif lang == "Python":
-            lang = "Python2"
+            lang = "Python3"
         return self.__sourceExtensions(lang)[0]
         
     def getProjectPath(self):
@@ -5116,7 +5071,7 @@
                 os.path.isfile("{0}.profile".format(basename)) or
                 os.path.isfile("{0}.profile".format(tbasename)))
             self.codeCoverageAct.setEnabled(
-                (self.isPy3Project() or self.isPy2Project()) and
+                self.isPy3Project() and
                 (os.path.isfile("{0}.coverage".format(basename)) or
                  os.path.isfile("{0}.coverage".format(tbasename))))
         else:
--- a/eric6/Project/ProjectBrowser.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Project/ProjectBrowser.py	Sun Jul 05 11:11:24 2020 +0200
@@ -283,9 +283,7 @@
         if not self.project.isOpen():
             icon = UI.PixmapCache.getIcon("projectSources")
         else:
-            if self.project.getProjectLanguage() in [
-                "Python", "Python2", "Python3"
-            ]:
+            if self.project.getProjectLanguage() == "Python3":
                 if self.project.isMixedLanguageProject():
                     icon = UI.PixmapCache.getIcon("projectSourcesPyMixed")
                 else:
--- a/eric6/Project/ProjectBrowserFlags.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Project/ProjectBrowserFlags.py	Sun Jul 05 11:11:24 2020 +0200
@@ -24,6 +24,3 @@
     OthersBrowserFlag |
     ProtocolsBrowserFlag
 )
-
-#
-# eflag: noqa = M702
--- a/eric6/Project/ProjectFormsBrowser.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Project/ProjectFormsBrowser.py	Sun Jul 05 11:11:24 2020 +0200
@@ -74,7 +74,7 @@
             """ context menu.</p>"""
         ))
         
-        # templates for Qt4
+        # templates for Qt
         # these two lists have to stay in sync
         self.templates4 = [
             'dialog4.tmpl', 'widget4.tmpl', 'mainwindow4.tmpl',
@@ -125,9 +125,7 @@
         self.menusAboutToBeCreated.emit()
         
         self.menu = QMenu(self)
-        if self.project.getProjectType() in [
-            "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
-        ]:
+        if self.project.getProjectType() in ["PyQt5", "E6Plugin", "PySide2"]:
             self.menu.addAction(
                 self.tr('Compile form'), self.__compileForm)
             self.menu.addAction(
@@ -187,9 +185,7 @@
         act = self.menu.addAction(self.tr('Delete'), self.__deleteFile)
         self.menuActions.append(act)
         self.menu.addSeparator()
-        if self.project.getProjectType() in [
-            "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
-        ]:
+        if self.project.getProjectType() in ["PyQt5", "E6Plugin", "PySide2"]:
             self.menu.addAction(self.tr('New form...'), self.__newForm)
         else:
             if self.hooks["newForm"] is not None:
@@ -213,7 +209,7 @@
         self.backMenu = QMenu(self)
         if (
             self.project.getProjectType() in [
-                "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
+                "PyQt5", "E6Plugin", "PySide2"
             ] or
             self.hooks["compileAllForms"] is not None
         ):
@@ -245,9 +241,7 @@
 
         # create the menu for multiple selected files
         self.multiMenu = QMenu(self)
-        if self.project.getProjectType() in [
-            "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
-        ]:
+        if self.project.getProjectType() in ["PyQt5", "E6Plugin", "PySide2"]:
             self.multiMenu.addAction(
                 self.tr('Compile forms'), self.__compileSelectedForms)
             self.multiMenu.addSeparator()
@@ -292,9 +286,7 @@
         self.multiMenu.addAction(self.tr('Configure...'), self._configure)
 
         self.dirMenu = QMenu(self)
-        if self.project.getProjectType() in [
-            "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
-        ]:
+        if self.project.getProjectType() in ["PyQt5", "E6Plugin", "PySide2"]:
             self.dirMenu.addAction(
                 self.tr('Compile all forms'), self.__compileAllForms)
             self.dirMenu.addSeparator()
@@ -317,9 +309,7 @@
             self.tr('Delete'), self._deleteDirectory)
         self.dirMenuActions.append(act)
         self.dirMenu.addSeparator()
-        if self.project.getProjectType() in [
-            "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
-        ]:
+        if self.project.getProjectType() in ["PyQt5", "E6Plugin", "PySide2"]:
             self.dirMenu.addAction(self.tr('New form...'), self.__newForm)
         else:
             if self.hooks["newForm"] is not None:
@@ -343,9 +333,7 @@
         self.dirMenu.addAction(self.tr('Configure...'), self._configure)
         
         self.dirMultiMenu = QMenu(self)
-        if self.project.getProjectType() in [
-            "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
-        ]:
+        if self.project.getProjectType() in ["PyQt5", "E6Plugin", "PySide2"]:
             self.dirMultiMenu.addAction(
                 self.tr('Compile all forms'), self.__compileAllForms)
             self.dirMultiMenu.addSeparator()
@@ -390,7 +378,7 @@
         if not self.project.isOpen():
             return
         
-        enable = self.project.getProjectType() in ("Qt4", "PyQt5", "E6Plugin")
+        enable = self.project.getProjectType() in ("PyQt5", "E6Plugin")
         self.__pyuicConfigAct.setEnabled(enable)
         self.__pyuicMultiConfigAct.setEnabled(enable)
         self.__pyuicDirConfigAct.setEnabled(enable)
@@ -427,7 +415,7 @@
                         self.backMenu.popup(self.mapToGlobal(coord))
                 else:
                     self.backMenu.popup(self.mapToGlobal(coord))
-        except Exception:
+        except Exception:           # secok
             pass
         
     def __showContextMenu(self):
@@ -515,7 +503,7 @@
                         self.hooks["open"](itm.fileName())
                     else:
                         self.designerFile.emit(itm.fileName())
-            except Exception:
+            except Exception:           # secok
                 pass
         
     def __openFileInEditor(self):
@@ -578,7 +566,7 @@
             self.hooks["newForm"](path)
         else:
             if self.project.getProjectType() in [
-                "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
+                "PyQt5", "E6Plugin", "PySide2"
             ]:
                 self.__newUiForm(path)
         
@@ -690,30 +678,16 @@
         """
         self.__resetUiCompiler()
         
-        if self.project.getProjectLanguage() in [
-            "Python", "Python2", "Python3"
-        ]:
-            if self.project.getProjectType() in ["Qt4", ]:
-                self.__uicompiler = Utilities.generatePyQtToolPath(
-                    'pyuic4', ["py3uic4"])
-            elif self.project.getProjectType() in ["PyQt5"]:
+        if self.project.getProjectLanguage() == "Python3":
+            if self.project.getProjectType() in ["PyQt5"]:
                 self.__uicompiler = Utilities.generatePyQtToolPath(
                     'pyuic5', ["py3uic5"])
             elif self.project.getProjectType() in ["E6Plugin"]:
                 self.__uicompiler = Utilities.generatePyQtToolPath(
                     'pyuic5', ["py3uic5"])
-            elif self.project.getProjectType() == "PySide":
-                self.__uicompiler = Utilities.generatePySideToolPath(
-                    'pyside-uic', "1")
             elif self.project.getProjectType() == "PySide2":
                 self.__uicompiler = Utilities.generatePySideToolPath(
-                    'pyside2-uic', "2")
-        elif self.project.getProjectLanguage() == "Ruby":
-            if self.project.getProjectType() == "Qt4":
-                self.__uicompiler = 'rbuic4'
-                if Utilities.isWindowsPlatform():
-                    self.__uicompiler = Utilities.getWindowsExecutablePath(
-                        self.__uicompiler)
+                    'pyside2-uic')
     
     def getUiCompiler(self):
         """
@@ -730,7 +704,7 @@
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal of the
-        pyuic4/pyuic5/pyside-uic/pyside2-uic/rbuic4 process.
+        pyuic5/pyside2-uic process.
         """
         if self.compileProc is None:
             return
@@ -743,7 +717,7 @@
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal of the
-        pyuic4/pyuic5/pyside-uic/pyside2-uic/rbuic4 process.
+        pyuic5/pyside2-uic process.
         """
         if self.compileProc is None:
             return
@@ -842,18 +816,16 @@
         ofn, ext = os.path.splitext(fn)
         fn = os.path.join(self.project.ppath, fn)
         
-        if self.project.getProjectLanguage() in [
-            "Python", "Python2", "Python3"
-        ]:
+        if self.project.getProjectLanguage() == "Python3":
             dirname, filename = os.path.split(ofn)
             self.compiledFile = os.path.join(dirname, "Ui_" + filename + ".py")
             
-            if self.project.getProjectType() in ["PySide", "PySide2"]:
-                # PySide and PySide2
+            if self.project.getProjectType() == "PySide2":
+                # PySide2
                 if Preferences.getQt("PySide2FromImports"):
                     args.append("--from-imports")
             else:
-                # PyQt4 and PyQt5
+                # PyQt5
                 if Preferences.getQt("PyuicExecute"):
                     args.append("-x")
                 indentWidth = Preferences.getQt("PyuicIndent")
@@ -902,7 +874,7 @@
         
     def __generateDialogCode(self):
         """
-        Private method to generate dialog code for the form (Qt4 only).
+        Private method to generate dialog code for the form (Qt only).
         """
         itm = self.model().item(self.currentIndex())
         fn = itm.fileName()
@@ -1017,7 +989,7 @@
             self.hooks["compileChangedForms"](self.project.pdata["FORMS"])
         else:
             if self.project.getProjectType() not in [
-                "Qt4", "PyQt5", "E6Plugin", "PySide", "PySide2"
+                "PyQt5", "E6Plugin", "PySide2"
             ]:
                 # ignore the request for non Qt GUI projects
                 return
@@ -1037,9 +1009,7 @@
                 QApplication.processEvents()
                 
                 ifn = os.path.join(self.project.ppath, fn)
-                if self.project.getProjectLanguage() in [
-                    "Python", "Python2", "Python3"
-                ]:
+                if self.project.getProjectLanguage() == "Python3":
                     dirname, filename = os.path.split(os.path.splitext(ifn)[0])
                     ofn = os.path.join(dirname, "Ui_" + filename + ".py")
                 elif self.project.getProjectLanguage() == "Ruby":
@@ -1093,7 +1063,7 @@
         
         params = self.project.pdata["UICPARAMS"]
         
-        if self.project.getProjectType() in ["Qt4", "PyQt5", "E6Plugin"]:
+        if self.project.getProjectType() in ["PyQt5", "E6Plugin"]:
             dlg = UicCompilerOptionsDialog(params, self.getUiCompiler())
             if dlg.exec_() == QDialog.Accepted:
                 package, suffix, root = dlg.getData()
--- a/eric6/Project/ProjectInterfacesBrowser.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Project/ProjectInterfacesBrowser.py	Sun Jul 05 11:11:24 2020 +0200
@@ -338,7 +338,7 @@
                         self.backMenu.popup(self.mapToGlobal(coord))
                 else:
                     self.backMenu.popup(self.mapToGlobal(coord))
-        except Exception:
+        except Exception:           # secok
             pass
         
     def __showContextMenu(self):
--- a/eric6/Project/ProjectOthersBrowser.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Project/ProjectOthersBrowser.py	Sun Jul 05 11:11:24 2020 +0200
@@ -171,7 +171,7 @@
                         self.backMenu.popup(self.mapToGlobal(coord))
                 else:
                     self.backMenu.popup(self.mapToGlobal(coord))
-        except Exception:
+        except Exception:           # secok
             pass
         
     def __showContextMenu(self):
--- a/eric6/Project/ProjectProtocolsBrowser.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Project/ProjectProtocolsBrowser.py	Sun Jul 05 11:11:24 2020 +0200
@@ -330,7 +330,7 @@
                         self.backMenu.popup(self.mapToGlobal(coord))
                 else:
                     self.backMenu.popup(self.mapToGlobal(coord))
-        except Exception:
+        except Exception:           # secok
             pass
         
     def __showContextMenu(self):
--- a/eric6/Project/ProjectResourcesBrowser.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Project/ProjectResourcesBrowser.py	Sun Jul 05 11:11:24 2020 +0200
@@ -79,8 +79,7 @@
         
         self.menu = QMenu(self)
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             self.menu.addAction(
                 self.tr('Compile resource'),
@@ -122,8 +121,7 @@
         self.menuActions.append(act)
         self.menu.addSeparator()
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             self.menu.addAction(
                 self.tr('New resource...'), self.__newResource)
@@ -151,8 +149,7 @@
 
         self.backMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             self.backMenu.addAction(
                 self.tr('Compile all resources'),
@@ -194,8 +191,7 @@
         # create the menu for multiple selected files
         self.multiMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             act = self.multiMenu.addAction(
                 self.tr('Compile resources'),
@@ -231,8 +227,7 @@
 
         self.dirMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             self.dirMenu.addAction(
                 self.tr('Compile all resources'),
@@ -277,8 +272,7 @@
         
         self.dirMultiMenu = QMenu(self)
         if self.project.getProjectType() in [
-            "Qt4", "Qt4C", "PyQt5", "PyQt5C", "E6Plugin",
-            "PySide", "PySideC", "PySide2", "PySideC2"
+            "PyQt5", "PyQt5C", "E6Plugin", "PySide2", "PySide2C"
         ]:
             self.dirMultiMenu.addAction(
                 self.tr('Compile all resources'),
@@ -357,7 +351,7 @@
                         self.backMenu.popup(self.mapToGlobal(coord))
                 else:
                     self.backMenu.popup(self.mapToGlobal(coord))
-        except Exception:
+        except Exception:           # secok
             pass
         
     def __showContextMenu(self):
@@ -556,7 +550,7 @@
     def __readStdout(self):
         """
         Private slot to handle the readyReadStandardOutput signal of the
-        pyrcc4/pyrcc5/pyside-rcc/pyside2-rcc/rbrcc process.
+        pyrcc5/pyside2-rcc process.
         """
         if self.compileProc is None:
             return
@@ -570,7 +564,7 @@
     def __readStderr(self):
         """
         Private slot to handle the readyReadStandardError signal of the
-        pyrcc4/pyrcc5/pyside-rcc/pyside2-rcc/rbrcc process.
+        pyrcc5/pyside2-rcc/ process.
         """
         if self.compileProc is None:
             return
@@ -656,33 +650,14 @@
         args = []
         self.buf = ""
         
-        if self.project.getProjectLanguage() in [
-            "Python", "Python2", "Python3"
-        ]:
-            if self.project.getProjectType() in ["Qt4", "Qt4C"]:
-                self.rccCompiler = Utilities.generatePyQtToolPath('pyrcc4')
-                if self.project.getProjectLanguage() in [
-                    "Python", "Python2"
-                ]:
-                    args.append("-py2")
-                else:
-                    args.append("-py3")
-            elif self.project.getProjectType() in ["PyQt5", "PyQt5C"]:
+        if self.project.getProjectLanguage() == "Python3":
+            if self.project.getProjectType() in ["PyQt5", "PyQt5C"]:
                 self.rccCompiler = Utilities.generatePyQtToolPath('pyrcc5')
             elif self.project.getProjectType() in ["E6Plugin"]:
                 self.rccCompiler = Utilities.generatePyQtToolPath('pyrcc5')
-            elif self.project.getProjectType() in ["PySide", "PySideC"]:
-                self.rccCompiler = Utilities.generatePySideToolPath(
-                    'pyside-rcc', "1")
-                if self.project.getProjectLanguage() in [
-                    "Python", "Python2"
-                ]:
-                    args.append("-py2")
-                else:
-                    args.append("-py3")
             elif self.project.getProjectType() in ["PySide2", "PySide2C"]:
                 self.rccCompiler = Utilities.generatePySideToolPath(
-                    'pyside2-rcc', "2")
+                    'pyside2-rcc')
             else:
                 return None
             defaultParameters = self.project.getDefaultRccCompilerParameters()
@@ -707,13 +682,6 @@
             if rccParameters["PathPrefix"] != defaultParameters["PathPrefix"]:
                 args.append("-root")
                 args.append(rccParameters["PathPrefix"])
-        elif self.project.getProjectLanguage() == "Ruby":
-            if self.project.getProjectType() == "Qt4":
-                self.rccCompiler = 'rbrcc'
-                if Utilities.isWindowsPlatform():
-                    self.rccCompiler += '.exe'
-            else:
-                return None
         else:
             return None
         
@@ -723,9 +691,7 @@
         fn = os.path.join(self.project.ppath, fn)
         
         dirname, filename = os.path.split(ofn)
-        if self.project.getProjectLanguage() in [
-            "Python", "Python2", "Python3"
-        ]:
+        if self.project.getProjectLanguage() == "Python3":
             self.compiledFile = os.path.join(
                 dirname, self.RCFilenameFormatPython.format(filename))
         elif self.project.getProjectLanguage() == "Ruby":
@@ -903,9 +869,7 @@
                 progress.setValue(i)
                 QApplication.processEvents()
                 ifn = os.path.join(self.project.ppath, fn)
-                if self.project.getProjectLanguage() in [
-                    "Python", "Python2", "Python3"
-                ]:
+                if self.project.getProjectLanguage() == "Python3":
                     dirname, filename = os.path.split(os.path.splitext(ifn)[0])
                     ofn = os.path.join(
                         dirname, self.RCFilenameFormatPython.format(filename))
--- a/eric6/Project/ProjectSourcesBrowser.py	Wed Jun 17 17:14:12 2020 +0200
+++ b/eric6/Project/ProjectSourcesBrowser.py	Sun Jul 05 11:11:24 2020 +0200
@@ -670,7 +670,7 @@
                         self.backMenu.popup(self.mapToGlobal(coord))
                 else:
                     self.backMenu.popup(self.mapToGlobal(coord))
-        except Exception:
+        except Exception:           # secok
             pass
         
     def __showContextMenu(self):
@@ -736,8 +736,7 @@
                 (coEnable or
                  os.path.isfile("{0}.coverage".format(basename)) or
                  os.path.isfile("{0}.coverage".format(tbasename))) and
-                (self.project.isPy3Project() or
-                 self.project.isPy2Project())
+                self.project.isPy3Project()
             )
         
         # now check the selected item
@@ -752,7 +751,7 @@
             coEnable = (
                 (coEnable or
                  os.path.isfile("{0}.coverage".format(basename))) and
-                (itm.isPython3File() or itm.isPython2File())
+                itm.isPython3File()
             )
         
         self.profileMenuAction.setEnabled(prEnable)
@@ -770,9 +769,7 @@