1198 # updateVulnerabilityDbAct |
1198 # updateVulnerabilityDbAct |
1199 self.__pipMenu.addAction( |
1199 self.__pipMenu.addAction( |
1200 self.tr("Update Vulnerability Database"), |
1200 self.tr("Update Vulnerability Database"), |
1201 self.__updateVulnerabilityDbCache) |
1201 self.__updateVulnerabilityDbCache) |
1202 self.__pipMenu.addSeparator() |
1202 self.__pipMenu.addSeparator() |
|
1203 self.__cyclonedxAct = self.__pipMenu.addAction( |
|
1204 self.tr("Create SBOM file"), |
|
1205 self.__createSBOMFile) |
|
1206 self.__pipMenu.addSeparator() |
1203 self.__cacheInfoAct = self.__pipMenu.addAction( |
1207 self.__cacheInfoAct = self.__pipMenu.addAction( |
1204 self.tr("Show Cache Info..."), |
1208 self.tr("Show Cache Info..."), |
1205 self.__showCacheInfo) |
1209 self.__showCacheInfo) |
1206 self.__cacheShowListAct = self.__pipMenu.addAction( |
1210 self.__cacheShowListAct = self.__pipMenu.addAction( |
1207 self.tr("Show Cached Files..."), |
1211 self.tr("Show Cached Files..."), |
1258 self.__editVirtualenvConfigAct.setEnabled(enable) |
1262 self.__editVirtualenvConfigAct.setEnabled(enable) |
1259 |
1263 |
1260 self.__checkVulnerabilityAct.setEnabled( |
1264 self.__checkVulnerabilityAct.setEnabled( |
1261 enable & self.vulnerabilityCheckBox.isEnabled()) |
1265 enable & self.vulnerabilityCheckBox.isEnabled()) |
1262 |
1266 |
|
1267 self.__cyclonedxAct.setEnabled(enable) |
|
1268 |
1263 self.__showLicensesDialogAct.setEnabled(enable) |
1269 self.__showLicensesDialogAct.setEnabled(enable) |
1264 |
1270 |
1265 @pyqtSlot() |
1271 @pyqtSlot() |
1266 def __installPip(self): |
1272 def __installPip(self): |
1267 """ |
1273 """ |
1486 @param checked flag indicating the state of the check box |
1492 @param checked flag indicating the state of the check box |
1487 @type bool |
1493 @type bool |
1488 """ |
1494 """ |
1489 if checked: |
1495 if checked: |
1490 self.__updateVulnerabilityData(clearFirst=True) |
1496 self.__updateVulnerabilityData(clearFirst=True) |
|
1497 |
|
1498 self.packagesList.header().setSectionHidden( |
|
1499 PipPackagesWidget.VulnerabilityColumn, not checked) |
1491 |
1500 |
1492 @pyqtSlot() |
1501 @pyqtSlot() |
1493 def __clearVulnerabilityInfo(self): |
1502 def __clearVulnerabilityInfo(self): |
1494 """ |
1503 """ |
1495 Private slot to clear the vulnerability info. |
1504 Private slot to clear the vulnerability info. |
1668 venvName = self.environmentsComboBox.currentText() |
1677 venvName = self.environmentsComboBox.currentText() |
1669 if venvName: |
1678 if venvName: |
1670 interpreter = self.__pip.getVirtualenvInterpreter(venvName) |
1679 interpreter = self.__pip.getVirtualenvInterpreter(venvName) |
1671 if interpreter: |
1680 if interpreter: |
1672 with EricOverrideCursor(): |
1681 with EricOverrideCursor(): |
1673 dependencies = self.__pip.getDependecyTree( |
1682 dependencies = self.__pip.getDependencyTree( |
1674 venvName, |
1683 venvName, |
1675 localPackages=self.localDepCheckBox.isChecked(), |
1684 localPackages=self.localDepCheckBox.isChecked(), |
1676 usersite=self.userDepCheckBox.isChecked(), |
1685 usersite=self.userDepCheckBox.isChecked(), |
1677 reverse=self.requiredByButton.isChecked(), |
1686 reverse=self.requiredByButton.isChecked(), |
1678 ) |
1687 ) |
1704 dependency["installed_version"], |
1713 dependency["installed_version"], |
1705 dependency["required_version"], |
1714 dependency["required_version"], |
1706 ]) |
1715 ]) |
1707 itm.setExpanded(True) |
1716 itm.setExpanded(True) |
1708 |
1717 |
1709 if dependency["required_version"].lower() != "any": |
1718 if dependency["installed_version"] == "?": |
|
1719 itm.setText(PipPackagesWidget.DepInstalledVersionColumn, |
|
1720 self.tr("unknown")) |
|
1721 |
|
1722 if dependency["required_version"].lower() not in ("any", "?"): |
1710 spec = ( |
1723 spec = ( |
1711 "=={0}".format(dependency["required_version"]) |
1724 "=={0}".format(dependency["required_version"]) |
1712 if dependency["required_version"][0] in "0123456789" else |
1725 if dependency["required_version"][0] in "0123456789" else |
1713 dependency["required_version"] |
1726 dependency["required_version"] |
1714 ) |
1727 ) |
1715 specifierSet = SpecifierSet(specifiers=spec) |
1728 specifierSet = SpecifierSet(specifiers=spec) |
1716 if not specifierSet.contains(dependency["installed_version"]): |
1729 if not specifierSet.contains(dependency["installed_version"]): |
1717 itm.setIcon(PipPackagesWidget.DepRequiredVersionColumn, |
1730 itm.setIcon(PipPackagesWidget.DepRequiredVersionColumn, |
1718 UI.PixmapCache.getIcon("warning")) |
1731 UI.PixmapCache.getIcon("warning")) |
1719 |
1732 |
1720 if dependency["required_version"].lower() == "any": |
1733 elif dependency["required_version"].lower() == "any": |
1721 itm.setText(PipPackagesWidget.DepRequiredVersionColumn, |
1734 itm.setText(PipPackagesWidget.DepRequiredVersionColumn, |
1722 self.tr("any")) |
1735 self.tr("any")) |
|
1736 |
|
1737 elif dependency["required_version"] == "?": |
|
1738 itm.setText(PipPackagesWidget.DepRequiredVersionColumn, |
|
1739 self.tr("unknown")) |
1723 |
1740 |
1724 # recursively add sub-dependencies |
1741 # recursively add sub-dependencies |
1725 for dep in dependency["dependencies"]: |
1742 for dep in dependency["dependencies"]: |
1726 self.__addDependency(dep, itm) |
1743 self.__addDependency(dep, itm) |
1727 |
1744 |
1845 localPackages=localPackages, |
1862 localPackages=localPackages, |
1846 usersite=usersite, |
1863 usersite=usersite, |
1847 parent=self |
1864 parent=self |
1848 ) |
1865 ) |
1849 dlg.exec() |
1866 dlg.exec() |
|
1867 |
|
1868 ################################################################## |
|
1869 ## Interface to create a SBOM file using CycloneDX |
|
1870 ################################################################## |
|
1871 |
|
1872 @pyqtSlot() |
|
1873 def __createSBOMFile(self): |
|
1874 """ |
|
1875 Private slot to create a "Software Bill Of Material" file. |
|
1876 """ |
|
1877 import CycloneDXInterface |
|
1878 |
|
1879 venvName = self.environmentsComboBox.currentText() |
|
1880 if venvName == self.__pip.getProjectEnvironmentString(): |
|
1881 venvName = "<project>" |
|
1882 CycloneDXInterface.createCycloneDXFile(venvName) |