diff -r bd90cbe0b7d2 -r a763d57e23bc eric7/PipInterface/PipPackagesWidget.py --- a/eric7/PipInterface/PipPackagesWidget.py Mon Jun 06 16:34:37 2022 +0200 +++ b/eric7/PipInterface/PipPackagesWidget.py Fri Jul 01 11:02:32 2022 +0200 @@ -1200,6 +1200,10 @@ self.tr("Update Vulnerability Database"), self.__updateVulnerabilityDbCache) self.__pipMenu.addSeparator() + self.__cyclonedxAct = self.__pipMenu.addAction( + self.tr("Create SBOM file"), + self.__createSBOMFile) + self.__pipMenu.addSeparator() self.__cacheInfoAct = self.__pipMenu.addAction( self.tr("Show Cache Info..."), self.__showCacheInfo) @@ -1260,6 +1264,8 @@ self.__checkVulnerabilityAct.setEnabled( enable & self.vulnerabilityCheckBox.isEnabled()) + self.__cyclonedxAct.setEnabled(enable) + self.__showLicensesDialogAct.setEnabled(enable) @pyqtSlot() @@ -1488,6 +1494,9 @@ """ if checked: self.__updateVulnerabilityData(clearFirst=True) + + self.packagesList.header().setSectionHidden( + PipPackagesWidget.VulnerabilityColumn, not checked) @pyqtSlot() def __clearVulnerabilityInfo(self): @@ -1670,7 +1679,7 @@ interpreter = self.__pip.getVirtualenvInterpreter(venvName) if interpreter: with EricOverrideCursor(): - dependencies = self.__pip.getDependecyTree( + dependencies = self.__pip.getDependencyTree( venvName, localPackages=self.localDepCheckBox.isChecked(), usersite=self.userDepCheckBox.isChecked(), @@ -1706,7 +1715,11 @@ ]) itm.setExpanded(True) - if dependency["required_version"].lower() != "any": + if dependency["installed_version"] == "?": + itm.setText(PipPackagesWidget.DepInstalledVersionColumn, + self.tr("unknown")) + + if dependency["required_version"].lower() not in ("any", "?"): spec = ( "=={0}".format(dependency["required_version"]) if dependency["required_version"][0] in "0123456789" else @@ -1717,10 +1730,14 @@ itm.setIcon(PipPackagesWidget.DepRequiredVersionColumn, UI.PixmapCache.getIcon("warning")) - if dependency["required_version"].lower() == "any": + elif dependency["required_version"].lower() == "any": itm.setText(PipPackagesWidget.DepRequiredVersionColumn, self.tr("any")) + elif dependency["required_version"] == "?": + itm.setText(PipPackagesWidget.DepRequiredVersionColumn, + self.tr("unknown")) + # recursively add sub-dependencies for dep in dependency["dependencies"]: self.__addDependency(dep, itm) @@ -1847,3 +1864,19 @@ parent=self ) dlg.exec() + + ################################################################## + ## Interface to create a SBOM file using CycloneDX + ################################################################## + + @pyqtSlot() + def __createSBOMFile(self): + """ + Private slot to create a "Software Bill Of Material" file. + """ + import CycloneDXInterface + + venvName = self.environmentsComboBox.currentText() + if venvName == self.__pip.getProjectEnvironmentString(): + venvName = "<project>" + CycloneDXInterface.createCycloneDXFile(venvName)