diff -r e9e7eca7efee -r bf71ee032bb4 src/eric7/PipInterface/PipLicensesDialog.py --- a/src/eric7/PipInterface/PipLicensesDialog.py Wed Jul 13 11:16:20 2022 +0200 +++ b/src/eric7/PipInterface/PipLicensesDialog.py Wed Jul 13 14:55:47 2022 +0200 @@ -23,18 +23,20 @@ """ Class implementing a dialog to show the licenses of an environment. """ + LicensesPackageColumn = 0 LicensesVersionColumn = 1 LicensesLicenseColumn = 2 - + SummaryCountColumn = 0 SummaryLicenseColumn = 1 - - def __init__(self, pip, environment, localPackages=True, usersite=False, - parent=None): + + def __init__( + self, pip, environment, localPackages=True, usersite=False, parent=None + ): """ Constructor - + @param pip reference to the pip interface object @type Pip @param environment name of the environment to show the licenses for @@ -50,38 +52,39 @@ """ super().__init__(parent) self.setupUi(self) - + self.__pip = pip self.__environment = environment - + self.__allFilter = self.tr("<All>") - + self.__saveCSVButton = self.buttonBox.addButton( - self.tr("Save as CSV..."), QDialogButtonBox.ButtonRole.ActionRole) + self.tr("Save as CSV..."), QDialogButtonBox.ButtonRole.ActionRole + ) self.__saveCSVButton.clicked.connect(self.__saveAsCSV) - - self.buttonBox.button( - QDialogButtonBox.StandardButton.Close).setDefault(True) - + + self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True) + self.localCheckBox.setChecked(localPackages) self.userCheckBox.setChecked(usersite) - + self.localCheckBox.toggled.connect(self.__refreshLicenses) self.userCheckBox.toggled.connect(self.__refreshLicenses) - + if environment: - self.environmentLabel.setText("<b>{0}</b>".format( - self.tr('Licenses of "{0}"').format(environment) - )) + self.environmentLabel.setText( + "<b>{0}</b>".format(self.tr('Licenses of "{0}"').format(environment)) + ) else: # That should never happen; play it safe. self.environmentLabel.setText(self.tr("No environment specified.")) - + self.licenseFilterComboBox.currentTextChanged.connect( - self.__filterPackagesByLicense) - + self.__filterPackagesByLicense + ) + self.__refreshLicenses() - + @pyqtSlot() def __refreshLicenses(self): """ @@ -91,9 +94,9 @@ self.licensesList.clear() self.summaryList.clear() self.licenseFilterComboBox.clear() - + licensesForFilter = set() - + # step 1: show the licenses per package self.licensesList.setUpdatesEnabled(False) licenses = self.__pip.getLicenses( @@ -102,19 +105,22 @@ usersite=self.userCheckBox.isChecked(), ) for lic in licenses: - QTreeWidgetItem(self.licensesList, [ - lic["Name"], - lic["Version"], - lic["License"].replace("; ", "\n"), - ]) - + QTreeWidgetItem( + self.licensesList, + [ + lic["Name"], + lic["Version"], + lic["License"].replace("; ", "\n"), + ], + ) + self.licensesList.sortItems( - PipLicensesDialog.LicensesPackageColumn, - Qt.SortOrder.AscendingOrder) + PipLicensesDialog.LicensesPackageColumn, Qt.SortOrder.AscendingOrder + ) for col in range(self.licensesList.columnCount()): self.licensesList.resizeColumnToContents(col) self.licensesList.setUpdatesEnabled(True) - + # step 2: show the licenses summary self.summaryList.setUpdatesEnabled(False) licenses = self.__pip.getLicensesSummary( @@ -123,30 +129,34 @@ usersite=self.userCheckBox.isChecked(), ) for lic in licenses: - QTreeWidgetItem(self.summaryList, [ - "{0:4d}".format(lic["Count"]), - lic["License"].replace("; ", "\n"), - ]) + QTreeWidgetItem( + self.summaryList, + [ + "{0:4d}".format(lic["Count"]), + lic["License"].replace("; ", "\n"), + ], + ) licensesForFilter |= set(lic["License"].split("; ")) - + self.summaryList.sortItems( - PipLicensesDialog.SummaryLicenseColumn, - Qt.SortOrder.AscendingOrder) + PipLicensesDialog.SummaryLicenseColumn, Qt.SortOrder.AscendingOrder + ) for col in range(self.summaryList.columnCount()): self.summaryList.resizeColumnToContents(col) self.summaryList.setUpdatesEnabled(True) - + self.licenseFilterComboBox.addItems( - [self.__allFilter] + sorted(licensesForFilter)) - + [self.__allFilter] + sorted(licensesForFilter) + ) + enable = bool(self.licensesList.topLevelItemCount()) self.__saveCSVButton.setEnabled(enable) - + @pyqtSlot(str) def __filterPackagesByLicense(self, licenseName): """ Private slot to filter the list of packages by license. - + @param licenseName license name @type str """ @@ -160,25 +170,24 @@ itm.setHidden(False) else: itm.setHidden( - regexp.search( - itm.text(PipLicensesDialog.LicensesLicenseColumn) - ) is None + regexp.search(itm.text(PipLicensesDialog.LicensesLicenseColumn)) + is None ) - + @pyqtSlot() def __saveAsCSV(self): """ Private slot to save the license information as a CSV file. """ import csv - + fileName, selectedFilter = EricFileDialog.getSaveFileNameAndFilter( self, self.tr("Save as CSV"), os.path.expanduser("~"), self.tr("CSV Files (*.csv);;All Files (*)"), None, - EricFileDialog.DontConfirmOverwrite + EricFileDialog.DontConfirmOverwrite, ) if fileName: ext = os.path.splitext(fileName)[1] @@ -186,21 +195,22 @@ ex = selectedFilter.split("(*")[1].split(")")[0] if ex: fileName += ex - + try: - with open(fileName, "w", newline="", - encoding="utf-8") as csvFile: + with open(fileName, "w", newline="", encoding="utf-8") as csvFile: fieldNames = ["Name", "Version", "License"] writer = csv.DictWriter(csvFile, fieldnames=fieldNames) - + writer.writeheader() for row in range(self.licensesList.topLevelItemCount()): itm = self.licensesList.topLevelItem(row) - writer.writerow({ - "Name": itm.text(0), - "Version": itm.text(1), - "License": itm.text(2), - }) + writer.writerow( + { + "Name": itm.text(0), + "Version": itm.text(1), + "License": itm.text(2), + } + ) except OSError as err: EricMessageBox.critical( self, @@ -209,5 +219,5 @@ """<p>The license information could not be saved""" """ into the CSV file <b>{0}</b>.</p>""" """<p>Reason: {1}</p>""" - ).format(fileName, str(err)) + ).format(fileName, str(err)), )