--- a/PyLintInterface/PyLintConfigDialog.py Tue Jun 28 08:21:17 2022 +0200 +++ b/PyLintInterface/PyLintConfigDialog.py Tue Sep 20 17:16:37 2022 +0200 @@ -26,10 +26,11 @@ """ Class implementing a dialog to configure the PyLint process. """ + def __init__(self, ppath, exe, parms, version): """ Constructor - + @param ppath project path; used to set the default path for the rcfile picker @type str @@ -42,245 +43,237 @@ """ super().__init__(None) self.setupUi(self) - + self.__version = version self.__pylintProc = None self.__lint = exe - + self.__initializeDefaults() - + # get a copy of the defaults to store the user settings self.parameters = copy.deepcopy(self.defaults) - + # combine it with the values of parms if parms is not None: self.parameters.update(parms) - - self.configfilePicker.setWindowTitle( - self.tr("Select configuration file")) + + self.configfilePicker.setWindowTitle(self.tr("Select configuration file")) self.configfilePicker.setMode(EricPathPickerModes.OPEN_FILE_MODE) - self.configfilePicker.setFilters(self.tr( - "Configuration Files (*.cfg *.cnf *.rc);;" - "All Files (*)" - )) + self.configfilePicker.setFilters( + self.tr("Configuration Files (*.cfg *.cnf *.rc);;" "All Files (*)") + ) self.configfilePicker.setDefaultDirectory(ppath) - - self.reportfilePicker.setWindowTitle( - self.tr("Select report file")) + + self.reportfilePicker.setWindowTitle(self.tr("Select report file")) self.reportfilePicker.setMode(EricPathPickerModes.SAVE_FILE_MODE) - self.reportfilePicker.setFilters(self.tr( - "HTML Files (*.html);;" - "Report Files (*.rpt);;" - "Text Files (*.txt);;" - "All Files (*)" - )) - + self.reportfilePicker.setFilters( + self.tr( + "HTML Files (*.html);;" + "Report Files (*.rpt);;" + "Text Files (*.txt);;" + "All Files (*)" + ) + ) + # initialize general tab - self.configfilePicker.setText(self.parameters['configFile']) - self.txtOutputButton.setChecked(self.parameters['txtReport']) - self.htmlOutputButton.setChecked(self.parameters['htmlReport']) - self.dialogOutputButton.setChecked(self.parameters['dialogReport']) - self.reportfilePicker.setText(self.parameters['reportFile']) - + self.configfilePicker.setText(self.parameters["configFile"]) + self.txtOutputButton.setChecked(self.parameters["txtReport"]) + self.htmlOutputButton.setChecked(self.parameters["htmlReport"]) + self.dialogOutputButton.setChecked(self.parameters["dialogReport"]) + self.reportfilePicker.setText(self.parameters["reportFile"]) + # initialize checkers tab - self.basicCheckBox.setChecked(self.parameters['enableBasic']) - self.classesCheckBox.setChecked(self.parameters['enableClasses']) - self.designCheckBox.setChecked(self.parameters['enableDesign']) - self.exceptionsCheckBox.setChecked(self.parameters['enableExceptions']) - self.formatCheckBox.setChecked(self.parameters['enableFormat']) - self.importsCheckBox.setChecked(self.parameters['enableImports']) - self.metricsCheckBox.setChecked(self.parameters['enableMetrics']) - self.miscellaneousCheckBox.setChecked( - self.parameters['enableMiscellaneous']) - self.newstyleCheckBox.setChecked(self.parameters['enableNewstyle']) - self.similaritiesCheckBox.setChecked( - self.parameters['enableSimilarities']) - self.typecheckCheckBox.setChecked(self.parameters['enableTypecheck']) - self.variablesCheckBox.setChecked(self.parameters['enableVariables']) - self.loggingCheckBox.setChecked(self.parameters['enableLogging']) - self.stringFormatCheckBox.setChecked( - self.parameters['enableStringFormat']) - + self.basicCheckBox.setChecked(self.parameters["enableBasic"]) + self.classesCheckBox.setChecked(self.parameters["enableClasses"]) + self.designCheckBox.setChecked(self.parameters["enableDesign"]) + self.exceptionsCheckBox.setChecked(self.parameters["enableExceptions"]) + self.formatCheckBox.setChecked(self.parameters["enableFormat"]) + self.importsCheckBox.setChecked(self.parameters["enableImports"]) + self.metricsCheckBox.setChecked(self.parameters["enableMetrics"]) + self.miscellaneousCheckBox.setChecked(self.parameters["enableMiscellaneous"]) + self.newstyleCheckBox.setChecked(self.parameters["enableNewstyle"]) + self.similaritiesCheckBox.setChecked(self.parameters["enableSimilarities"]) + self.typecheckCheckBox.setChecked(self.parameters["enableTypecheck"]) + self.variablesCheckBox.setChecked(self.parameters["enableVariables"]) + self.loggingCheckBox.setChecked(self.parameters["enableLogging"]) + self.stringFormatCheckBox.setChecked(self.parameters["enableStringFormat"]) + # initialize messages tab - self.enabledMessagesEdit.setText(self.parameters['enabledMessages']) - self.disabledMessagesEdit.setText(self.parameters['disabledMessages']) + self.enabledMessagesEdit.setText(self.parameters["enabledMessages"]) + self.disabledMessagesEdit.setText(self.parameters["disabledMessages"]) def __initializeDefaults(self): """ Private method to set the default values. - + These are needed later on to generate the commandline parameters. """ self.defaults = { # general options - 'configFile': '', - 'reportFile': '', - 'txtReport': False, - 'htmlReport': True, - 'dialogReport': False, - + "configFile": "", + "reportFile": "", + "txtReport": False, + "htmlReport": True, + "dialogReport": False, # enabled checkers - 'enableBasic': True, - 'enableClasses': True, - 'enableDesign': True, - 'enableExceptions': True, - 'enableFormat': False, - 'enableImports': False, - 'enableLogging': True, - 'enableMetrics': True, - 'enableMiscellaneous': True, - 'enableNewstyle': True, - 'enableSimilarities': True, - 'enableStringFormat': True, - 'enableTypecheck': True, - 'enableVariables': True, - + "enableBasic": True, + "enableClasses": True, + "enableDesign": True, + "enableExceptions": True, + "enableFormat": False, + "enableImports": False, + "enableLogging": True, + "enableMetrics": True, + "enableMiscellaneous": True, + "enableNewstyle": True, + "enableSimilarities": True, + "enableStringFormat": True, + "enableTypecheck": True, + "enableVariables": True, # messages - 'enabledMessages': '', - 'disabledMessages': '', + "enabledMessages": "", + "disabledMessages": "", } def generateParameters(self): """ Public method that generates the commandline parameters. - + It generates a list of strings to be used to set the QProcess arguments for the pylint call and a list containing the non default parameters. The second list can be passed back upon object generation to overwrite the default settings. - + <b>Note</b>: The arguments list contains the name of the pylint executable as the first parameter. - + @return a tuple of the commandline parameters and non default parameters @rtype tuple of (list of str, dict) """ parms = {} args = [] - + # 1. the program name args.append(self.__lint) - + # 2. the commandline options # 2.1 general options - if self.parameters['configFile'] != self.defaults['configFile']: - parms['configFile'] = self.parameters['configFile'] - args.append('--rcfile={0}'.format(self.parameters['configFile'])) - parms['txtReport'] = self.parameters['txtReport'] - parms['htmlReport'] = self.parameters['htmlReport'] - parms['dialogReport'] = self.parameters['dialogReport'] - if self.parameters['htmlReport']: - args.append('--output-format=html') - elif self.parameters['dialogReport']: - args.append('--output-format=parseable') - args.append('--reports=n') + if self.parameters["configFile"] != self.defaults["configFile"]: + parms["configFile"] = self.parameters["configFile"] + args.append("--rcfile={0}".format(self.parameters["configFile"])) + parms["txtReport"] = self.parameters["txtReport"] + parms["htmlReport"] = self.parameters["htmlReport"] + parms["dialogReport"] = self.parameters["dialogReport"] + if self.parameters["htmlReport"]: + args.append("--output-format=html") + elif self.parameters["dialogReport"]: + args.append("--output-format=parseable") + args.append("--reports=n") else: - args.append('--output-format=text') - if self.parameters['reportFile'] != self.defaults['reportFile']: - parms['reportFile'] = self.parameters['reportFile'] - + args.append("--output-format=text") + if self.parameters["reportFile"] != self.defaults["reportFile"]: + parms["reportFile"] = self.parameters["reportFile"] + # 2.2 checkers options - parms['enableBasic'] = self.parameters['enableBasic'] - parms['enableClasses'] = self.parameters['enableClasses'] - parms['enableDesign'] = self.parameters['enableDesign'] - parms['enableExceptions'] = self.parameters['enableExceptions'] - parms['enableFormat'] = self.parameters['enableFormat'] - parms['enableImports'] = self.parameters['enableImports'] - parms['enableMetrics'] = self.parameters['enableMetrics'] - parms['enableMiscellaneous'] = self.parameters['enableMiscellaneous'] - parms['enableNewstyle'] = self.parameters['enableNewstyle'] - parms['enableSimilarities'] = self.parameters['enableSimilarities'] - parms['enableTypecheck'] = self.parameters['enableTypecheck'] - parms['enableVariables'] = self.parameters['enableVariables'] - parms['enableLogging'] = self.parameters['enableLogging'] - parms['enableStringFormat'] = self.parameters['enableStringFormat'] - + parms["enableBasic"] = self.parameters["enableBasic"] + parms["enableClasses"] = self.parameters["enableClasses"] + parms["enableDesign"] = self.parameters["enableDesign"] + parms["enableExceptions"] = self.parameters["enableExceptions"] + parms["enableFormat"] = self.parameters["enableFormat"] + parms["enableImports"] = self.parameters["enableImports"] + parms["enableMetrics"] = self.parameters["enableMetrics"] + parms["enableMiscellaneous"] = self.parameters["enableMiscellaneous"] + parms["enableNewstyle"] = self.parameters["enableNewstyle"] + parms["enableSimilarities"] = self.parameters["enableSimilarities"] + parms["enableTypecheck"] = self.parameters["enableTypecheck"] + parms["enableVariables"] = self.parameters["enableVariables"] + parms["enableLogging"] = self.parameters["enableLogging"] + parms["enableStringFormat"] = self.parameters["enableStringFormat"] + checkers = [] - if self.parameters['enableBasic']: - checkers.append('basic') - if self.parameters['enableClasses']: - checkers.append('classes') - if self.parameters['enableDesign']: - checkers.append('design') - if self.parameters['enableExceptions']: - checkers.append('exceptions') - if self.parameters['enableFormat']: - checkers.append('format') - if self.parameters['enableImports']: - checkers.append('imports') - if self.parameters['enableMetrics']: - checkers.append('metrics') - if self.parameters['enableMiscellaneous']: - checkers.append('miscellaneous') - if self.parameters['enableNewstyle']: - checkers.append('newstyle') - if self.parameters['enableSimilarities']: - checkers.append('similarities') - if self.parameters['enableTypecheck']: - checkers.append('typecheck') - if self.parameters['enableVariables']: - checkers.append('variables') - if self.parameters['enableLogging']: - checkers.append('logging') - if self.parameters['enableStringFormat']: - checkers.append('string') - - args.append('--disable=all') + if self.parameters["enableBasic"]: + checkers.append("basic") + if self.parameters["enableClasses"]: + checkers.append("classes") + if self.parameters["enableDesign"]: + checkers.append("design") + if self.parameters["enableExceptions"]: + checkers.append("exceptions") + if self.parameters["enableFormat"]: + checkers.append("format") + if self.parameters["enableImports"]: + checkers.append("imports") + if self.parameters["enableMetrics"]: + checkers.append("metrics") + if self.parameters["enableMiscellaneous"]: + checkers.append("miscellaneous") + if self.parameters["enableNewstyle"]: + checkers.append("newstyle") + if self.parameters["enableSimilarities"]: + checkers.append("similarities") + if self.parameters["enableTypecheck"]: + checkers.append("typecheck") + if self.parameters["enableVariables"]: + checkers.append("variables") + if self.parameters["enableLogging"]: + checkers.append("logging") + if self.parameters["enableStringFormat"]: + checkers.append("string") + + args.append("--disable=all") if checkers: - args.append('--enable={0}'.format(','.join(checkers))) - + args.append("--enable={0}".format(",".join(checkers))) + # 2.3 messages options - parms['enabledMessages'] = self.parameters['enabledMessages'] - parms['disabledMessages'] = self.parameters['disabledMessages'] - if parms['enabledMessages']: - args.append('--enable={0}'.format(parms['enabledMessages'])) - if parms['disabledMessages']: - args.append('--disable={0}'.format(parms['disabledMessages'])) - + parms["enabledMessages"] = self.parameters["enabledMessages"] + parms["disabledMessages"] = self.parameters["disabledMessages"] + if parms["enabledMessages"]: + args.append("--enable={0}".format(parms["enabledMessages"])) + if parms["disabledMessages"]: + args.append("--disable={0}".format(parms["disabledMessages"])) + return (args, parms) def accept(self): """ Public slot called by the Ok button. - + It saves the values in the parameters dictionary. """ # get data of general tab - self.parameters['configFile'] = self.configfilePicker.text() - self.parameters['txtReport'] = self.txtOutputButton.isChecked() - self.parameters['htmlReport'] = self.htmlOutputButton.isChecked() - self.parameters['dialogReport'] = self.dialogOutputButton.isChecked() - self.parameters['reportFile'] = self.reportfilePicker.text() - + self.parameters["configFile"] = self.configfilePicker.text() + self.parameters["txtReport"] = self.txtOutputButton.isChecked() + self.parameters["htmlReport"] = self.htmlOutputButton.isChecked() + self.parameters["dialogReport"] = self.dialogOutputButton.isChecked() + self.parameters["reportFile"] = self.reportfilePicker.text() + # get data of checkers tab - self.parameters['enableBasic'] = self.basicCheckBox.isChecked() - self.parameters['enableClasses'] = self.classesCheckBox.isChecked() - self.parameters['enableDesign'] = self.designCheckBox.isChecked() - self.parameters['enableExceptions'] = ( - self.exceptionsCheckBox.isChecked()) - self.parameters['enableFormat'] = self.formatCheckBox.isChecked() - self.parameters['enableImports'] = self.importsCheckBox.isChecked() - self.parameters['enableMetrics'] = self.metricsCheckBox.isChecked() - self.parameters['enableMiscellaneous'] = ( - self.miscellaneousCheckBox.isChecked()) - self.parameters['enableNewstyle'] = self.newstyleCheckBox.isChecked() - self.parameters['enableSimilarities'] = ( - self.similaritiesCheckBox.isChecked()) - self.parameters['enableTypecheck'] = self.typecheckCheckBox.isChecked() - self.parameters['enableVariables'] = self.variablesCheckBox.isChecked() - self.parameters['enableLogging'] = self.loggingCheckBox.isChecked() - self.parameters['enableStringFormat'] = ( - self.stringFormatCheckBox.isChecked()) - + self.parameters["enableBasic"] = self.basicCheckBox.isChecked() + self.parameters["enableClasses"] = self.classesCheckBox.isChecked() + self.parameters["enableDesign"] = self.designCheckBox.isChecked() + self.parameters["enableExceptions"] = self.exceptionsCheckBox.isChecked() + self.parameters["enableFormat"] = self.formatCheckBox.isChecked() + self.parameters["enableImports"] = self.importsCheckBox.isChecked() + self.parameters["enableMetrics"] = self.metricsCheckBox.isChecked() + self.parameters["enableMiscellaneous"] = self.miscellaneousCheckBox.isChecked() + self.parameters["enableNewstyle"] = self.newstyleCheckBox.isChecked() + self.parameters["enableSimilarities"] = self.similaritiesCheckBox.isChecked() + self.parameters["enableTypecheck"] = self.typecheckCheckBox.isChecked() + self.parameters["enableVariables"] = self.variablesCheckBox.isChecked() + self.parameters["enableLogging"] = self.loggingCheckBox.isChecked() + self.parameters["enableStringFormat"] = self.stringFormatCheckBox.isChecked() + # get data of messages tab - self.parameters['enabledMessages'] = ','.join( - [m.strip() for m in self.enabledMessagesEdit.text().split(',')]) - self.parameters['disabledMessages'] = ','.join( - [m.strip() for m in self.disabledMessagesEdit.text().split(',')]) - + self.parameters["enabledMessages"] = ",".join( + [m.strip() for m in self.enabledMessagesEdit.text().split(",")] + ) + self.parameters["disabledMessages"] = ",".join( + [m.strip() for m in self.disabledMessagesEdit.text().split(",")] + ) + # call the accept slot of the base class super().accept() @@ -296,15 +289,15 @@ self.buf = "" self.__pylintProc = QProcess() args = [] - + self.__ioEncoding = Preferences.getSystem("IOEncoding") - - args.append('--generate-rcfile') - + + args.append("--generate-rcfile") + self.__pylintProc.readyReadStandardOutput.connect(self.__readStdout) self.__pylintProc.readyReadStandardError.connect(self.__readStderr) self.__pylintProc.finished.connect(self.__createConfigDone) - + self.__pylintProc.start(self.__lint, args) procStarted = self.__pylintProc.waitForStarted() if procStarted: @@ -312,16 +305,16 @@ else: EricMessageBox.critical( self, - self.tr('Process Generation Error'), + self.tr("Process Generation Error"), self.tr( - 'Could not start {0}.<br>' - 'Ensure that it is in the search path.' - ).format(self.__lint)) - + "Could not start {0}.<br>" "Ensure that it is in the search path." + ).format(self.__lint), + ) + def __createConfigDone(self, exitCode, exitStatus): """ Private slot to handle the the finished signal of the pylint process. - + @param exitCode exit code of the process @type int @param exitStatus exit status of the process @@ -333,9 +326,9 @@ vm.newEditor() aw = vm.activeWindow() aw.insertAt(self.buf, 0, 0) - aw.setLanguage('dummy.rc') + aw.setLanguage("dummy.rc") self.reject() - + def __readStdout(self): """ Private slot to handle the readyReadStandardOutput signal of the @@ -343,15 +336,15 @@ """ if self.__pylintProc is None: return - - self.__pylintProc.setReadChannel( - QProcess.ProcessChannel.StandardOutput) - + + self.__pylintProc.setReadChannel(QProcess.ProcessChannel.StandardOutput) + while self.__pylintProc and self.__pylintProc.canReadLine(): - line = str(self.__pylintProc.readLine(), self.__ioEncoding, - "replace").rstrip() + line = str( + self.__pylintProc.readLine(), self.__ioEncoding, "replace" + ).rstrip() self.buf += line + os.linesep - + def __readStderr(self): """ Private slot to handle the readyReadStandardError signal of the @@ -359,10 +352,10 @@ """ if self.__pylintProc is None: return - - self.__pylintProc.setReadChannel( - QProcess.ProcessChannel.StandardError) + + self.__pylintProc.setReadChannel(QProcess.ProcessChannel.StandardError) while self.__pylintProc and self.__pylintProc.canReadLine(): - s = 'pylint: ' + str( - self.__pylintProc.readLine(), self.__ioEncoding, "replace") + s = "pylint: " + str( + self.__pylintProc.readLine(), self.__ioEncoding, "replace" + ) ericApp().getObject("UserInterface").appendStderr.emit(s)