eric7/PipInterface/PipPackagesWidget.py

branch
eric7-maintenance
changeset 9192
a763d57e23bc
parent 9111
4ac66b6c33a4
parent 9121
6ac528d4f318
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)

eric ide

mercurial