diff -r e43bf8d7baf9 -r c53117374255 eric6/PipInterface/PipPackagesWidget.py --- a/eric6/PipInterface/PipPackagesWidget.py Tue Feb 09 11:39:58 2021 +0100 +++ b/eric6/PipInterface/PipPackagesWidget.py Tue Feb 09 17:51:16 2021 +0100 @@ -148,8 +148,6 @@ SearchVersionRole = Qt.UserRole + 1 - SearchUrl = "https://pypi.org/search/" - def __init__(self, pip, parent=None): """ Constructor @@ -281,6 +279,15 @@ return pipVersionTuple + def getPip(self): + """ + Public method to get a reference to the pip interface object. + + @return reference to the pip interface object + @rtype Pip + """ + return self.__pip + ####################################################################### ## Slots handling widget signals below ####################################################################### @@ -503,6 +510,7 @@ @type int """ packageName = item.text(0) + upgradable = bool(item.text(2)) if column == 1: # show details for installed version packageVersion = item.text(1) @@ -513,7 +521,8 @@ else: packageVersion = item.text(1) - self.__showPackageDetails(packageName, packageVersion) + self.__showPackageDetails(packageName, packageVersion, + upgradable=upgradable) @pyqtSlot(bool) def on_verboseCheckBox_clicked(self, checked): @@ -563,9 +572,7 @@ """ packages = [itm.text(0) for itm in self.__selectedUpdateableItems()] if packages: - ok = self.__executeUpgradePackages(packages) - if ok: - self.on_refreshButton_clicked() + self.executeUpgradePackages(packages) @pyqtSlot() def on_upgradeAllButton_clicked(self): @@ -574,9 +581,7 @@ """ packages = [itm.text(0) for itm in self.__allUpdateableItems()] if packages: - ok = self.__executeUpgradePackages(packages) - if ok: - self.on_refreshButton_clicked() + self.executeUpgradePackages(packages) @pyqtSlot() def on_uninstallButton_clicked(self): @@ -584,6 +589,15 @@ Private slot to remove selected packages of the selected environment. """ packages = [itm.text(0) for itm in self.packagesList.selectedItems()] + self.executeUninstallPackages(packages) + + def executeUninstallPackages(self, packages): + """ + Public method to uninstall the given list of packages. + + @param packages list of package names to be uninstalled + @type list of str + """ if packages: ok = self.__pip.uninstallPackages( packages, @@ -591,19 +605,18 @@ if ok: self.on_refreshButton_clicked() - def __executeUpgradePackages(self, packages): + def executeUpgradePackages(self, packages): """ - Private method to execute the pip upgrade command. + Public method to execute the pip upgrade command. @param packages list of package names to be upgraded @type list of str - @return flag indicating success - @rtype bool """ ok = self.__pip.upgradePackages( packages, venvName=self.environmentsComboBox.currentText(), userSite=self.userCheckBox.isChecked()) - return ok + if ok: + self.on_refreshButton_clicked() @pyqtSlot() def on_showPackageDetailsButton_clicked(self): @@ -613,13 +626,15 @@ item = self.packagesList.selectedItems()[0] if item: packageName = item.text(0) + upgradable = bool(item.text(2)) # show details for available version or installed one if item.text(2): packageVersion = item.text(2) else: packageVersion = item.text(1) - self.__showPackageDetails(packageName, packageVersion) + self.__showPackageDetails(packageName, packageVersion, + upgradable=upgradable) ####################################################################### ## Search widget related methods below @@ -716,7 +731,7 @@ searchTerm = bytes(QUrl.toPercentEncoding(searchTerm)).decode() urlQuery = QUrlQuery() urlQuery.addQueryItem("q", searchTerm) - url = QUrl(self.SearchUrl) + url = QUrl(self.__pip.getIndexUrlSearch()) url.setQuery(urlQuery) request = QNetworkRequest(QUrl(url)) @@ -782,6 +797,7 @@ itm = QTreeWidgetItem( self.searchResultList, [ result['name'].strip(), + result['version'], result["released"].strip(), description, ]) @@ -812,31 +828,37 @@ """ Private slot to handle pressing the Install button.. """ - self.__install() + packages = [ + itm.text(0).strip() + for itm in self.searchResultList.selectedItems() + ] + self.executeInstallPackages(packages) @pyqtSlot() def on_installUserSiteButton_clicked(self): """ Private slot to handle pressing the Install to User-Site button.. """ - self.__install(userSite=True) + packages = [ + itm.text(0).strip() + for itm in self.searchResultList.selectedItems() + ] + self.executeInstallPackages(packages, userSite=True) - def __install(self, userSite=False): + def executeInstallPackages(self, packages, userSite=False): """ - Private slot to install the selected packages. + Public method to install the given list of packages. + @param packages list of package names to be installed + @type list of str @param userSite flag indicating to install to the user directory @type bool """ venvName = self.environmentsComboBox.currentText() - if venvName: - packages = [] - for itm in self.searchResultList.selectedItems(): - packages.append(itm.text(0).strip()) - if packages: - self.__pip.installPackages(packages, venvName=venvName, - userSite=userSite) - self.on_refreshButton_clicked() + if venvName and packages: + self.__pip.installPackages(packages, venvName=venvName, + userSite=userSite) + self.on_refreshButton_clicked() @pyqtSlot() def on_showDetailsButton_clicked(self): @@ -872,9 +894,11 @@ packageVersion = item.data(0, self.SearchVersionRole) packageName = item.text(0) - self.__showPackageDetails(packageName, packageVersion) + self.__showPackageDetails(packageName, packageVersion, + installable=True) - def __showPackageDetails(self, packageName, packageVersion): + def __showPackageDetails(self, packageName, packageVersion, + upgradable=False, installable=False): """ Private method to populate the package details dialog. @@ -882,6 +906,12 @@ @type str @param packageVersion version of the package @type str + @param upgradable flag indicating that the package may be upgraded + (defaults to False) + @type bool (optional) + @param installable flag indicating that the package may be installed + (defaults to False) + @type bool (optional) """ with E5OverrideCursor(): packageData = self.__pip.getPackageDetails( @@ -892,11 +922,22 @@ self.showDetailsButton.setEnabled(True) + if installable: + buttonsMode = PipPackageDetailsDialog.ButtonInstall + elif upgradable: + buttonsMode = ( + PipPackageDetailsDialog.ButtonRemove | + PipPackageDetailsDialog.ButtonUpgrade + ) + else: + buttonsMode = PipPackageDetailsDialog.ButtonRemove + if self.__packageDetailsDialog is not None: self.__packageDetailsDialog.close() self.__packageDetailsDialog = ( - PipPackageDetailsDialog(packageData, self) + PipPackageDetailsDialog(packageData, buttonsMode=buttonsMode, + parent=self) ) self.__packageDetailsDialog.show() else: @@ -1042,10 +1083,7 @@ dlg = PipPackagesInputDialog(self, self.tr("Install Packages")) if dlg.exec() == QDialog.Accepted: packages, user = dlg.getData() - if packages: - self.__pip.installPackages(packages, venvName=venvName, - userSite=user) - self.on_refreshButton_clicked() + self.executeInstallPackages(packages, userSite=user) @pyqtSlot() def __installLocalPackage(self): @@ -1059,9 +1097,7 @@ if dlg.exec() == QDialog.Accepted: package, user = dlg.getData() if package and os.path.exists(package): - self.__pip.installPackages([package], venvName=venvName, - userSite=user) - self.on_refreshButton_clicked() + self.executeInstallPackages([package], userSite=user) @pyqtSlot() def __installRequirements(self):