eric6/PipInterface/PipPackagesWidget.py

changeset 8090
c53117374255
parent 8085
f6db8b3ecea9
child 8143
2c730d5fd177
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):

eric ide

mercurial