eric6/PipInterface/PipPackagesWidget.py

changeset 8090
c53117374255
parent 8085
f6db8b3ecea9
child 8143
2c730d5fd177
equal deleted inserted replaced
8089:e43bf8d7baf9 8090:c53117374255
146 ShowProcessEntryPointsMode = 2 146 ShowProcessEntryPointsMode = 2
147 ShowProcessFilesListMode = 3 147 ShowProcessFilesListMode = 3
148 148
149 SearchVersionRole = Qt.UserRole + 1 149 SearchVersionRole = Qt.UserRole + 1
150 150
151 SearchUrl = "https://pypi.org/search/"
152
153 def __init__(self, pip, parent=None): 151 def __init__(self, pip, parent=None):
154 """ 152 """
155 Constructor 153 Constructor
156 154
157 @param pip reference to the global pip interface 155 @param pip reference to the global pip interface
278 "pip", Qt.MatchExactly | Qt.MatchCaseSensitive) 276 "pip", Qt.MatchExactly | Qt.MatchCaseSensitive)
279 if len(pipList) > 0: 277 if len(pipList) > 0:
280 pipVersionTuple = Globals.versionToTuple(pipList[0].text(1)) 278 pipVersionTuple = Globals.versionToTuple(pipList[0].text(1))
281 279
282 return pipVersionTuple 280 return pipVersionTuple
281
282 def getPip(self):
283 """
284 Public method to get a reference to the pip interface object.
285
286 @return reference to the pip interface object
287 @rtype Pip
288 """
289 return self.__pip
283 290
284 ####################################################################### 291 #######################################################################
285 ## Slots handling widget signals below 292 ## Slots handling widget signals below
286 ####################################################################### 293 #######################################################################
287 294
501 @type QTreeWidgetItem 508 @type QTreeWidgetItem
502 @param column activated column 509 @param column activated column
503 @type int 510 @type int
504 """ 511 """
505 packageName = item.text(0) 512 packageName = item.text(0)
513 upgradable = bool(item.text(2))
506 if column == 1: 514 if column == 1:
507 # show details for installed version 515 # show details for installed version
508 packageVersion = item.text(1) 516 packageVersion = item.text(1)
509 else: 517 else:
510 # show details for available version or installed one 518 # show details for available version or installed one
511 if item.text(2): 519 if item.text(2):
512 packageVersion = item.text(2) 520 packageVersion = item.text(2)
513 else: 521 else:
514 packageVersion = item.text(1) 522 packageVersion = item.text(1)
515 523
516 self.__showPackageDetails(packageName, packageVersion) 524 self.__showPackageDetails(packageName, packageVersion,
525 upgradable=upgradable)
517 526
518 @pyqtSlot(bool) 527 @pyqtSlot(bool)
519 def on_verboseCheckBox_clicked(self, checked): 528 def on_verboseCheckBox_clicked(self, checked):
520 """ 529 """
521 Private slot to handle a change of the verbose package information 530 Private slot to handle a change of the verbose package information
561 """ 570 """
562 Private slot to upgrade selected packages of the selected environment. 571 Private slot to upgrade selected packages of the selected environment.
563 """ 572 """
564 packages = [itm.text(0) for itm in self.__selectedUpdateableItems()] 573 packages = [itm.text(0) for itm in self.__selectedUpdateableItems()]
565 if packages: 574 if packages:
566 ok = self.__executeUpgradePackages(packages) 575 self.executeUpgradePackages(packages)
567 if ok:
568 self.on_refreshButton_clicked()
569 576
570 @pyqtSlot() 577 @pyqtSlot()
571 def on_upgradeAllButton_clicked(self): 578 def on_upgradeAllButton_clicked(self):
572 """ 579 """
573 Private slot to upgrade all packages of the selected environment. 580 Private slot to upgrade all packages of the selected environment.
574 """ 581 """
575 packages = [itm.text(0) for itm in self.__allUpdateableItems()] 582 packages = [itm.text(0) for itm in self.__allUpdateableItems()]
576 if packages: 583 if packages:
577 ok = self.__executeUpgradePackages(packages) 584 self.executeUpgradePackages(packages)
578 if ok:
579 self.on_refreshButton_clicked()
580 585
581 @pyqtSlot() 586 @pyqtSlot()
582 def on_uninstallButton_clicked(self): 587 def on_uninstallButton_clicked(self):
583 """ 588 """
584 Private slot to remove selected packages of the selected environment. 589 Private slot to remove selected packages of the selected environment.
585 """ 590 """
586 packages = [itm.text(0) for itm in self.packagesList.selectedItems()] 591 packages = [itm.text(0) for itm in self.packagesList.selectedItems()]
592 self.executeUninstallPackages(packages)
593
594 def executeUninstallPackages(self, packages):
595 """
596 Public method to uninstall the given list of packages.
597
598 @param packages list of package names to be uninstalled
599 @type list of str
600 """
587 if packages: 601 if packages:
588 ok = self.__pip.uninstallPackages( 602 ok = self.__pip.uninstallPackages(
589 packages, 603 packages,
590 venvName=self.environmentsComboBox.currentText()) 604 venvName=self.environmentsComboBox.currentText())
591 if ok: 605 if ok:
592 self.on_refreshButton_clicked() 606 self.on_refreshButton_clicked()
593 607
594 def __executeUpgradePackages(self, packages): 608 def executeUpgradePackages(self, packages):
595 """ 609 """
596 Private method to execute the pip upgrade command. 610 Public method to execute the pip upgrade command.
597 611
598 @param packages list of package names to be upgraded 612 @param packages list of package names to be upgraded
599 @type list of str 613 @type list of str
600 @return flag indicating success
601 @rtype bool
602 """ 614 """
603 ok = self.__pip.upgradePackages( 615 ok = self.__pip.upgradePackages(
604 packages, venvName=self.environmentsComboBox.currentText(), 616 packages, venvName=self.environmentsComboBox.currentText(),
605 userSite=self.userCheckBox.isChecked()) 617 userSite=self.userCheckBox.isChecked())
606 return ok 618 if ok:
619 self.on_refreshButton_clicked()
607 620
608 @pyqtSlot() 621 @pyqtSlot()
609 def on_showPackageDetailsButton_clicked(self): 622 def on_showPackageDetailsButton_clicked(self):
610 """ 623 """
611 Private slot to show information for the selected package. 624 Private slot to show information for the selected package.
612 """ 625 """
613 item = self.packagesList.selectedItems()[0] 626 item = self.packagesList.selectedItems()[0]
614 if item: 627 if item:
615 packageName = item.text(0) 628 packageName = item.text(0)
629 upgradable = bool(item.text(2))
616 # show details for available version or installed one 630 # show details for available version or installed one
617 if item.text(2): 631 if item.text(2):
618 packageVersion = item.text(2) 632 packageVersion = item.text(2)
619 else: 633 else:
620 packageVersion = item.text(1) 634 packageVersion = item.text(1)
621 635
622 self.__showPackageDetails(packageName, packageVersion) 636 self.__showPackageDetails(packageName, packageVersion,
637 upgradable=upgradable)
623 638
624 ####################################################################### 639 #######################################################################
625 ## Search widget related methods below 640 ## Search widget related methods below
626 ####################################################################### 641 #######################################################################
627 642
714 729
715 searchTerm = self.searchEditName.text().strip() 730 searchTerm = self.searchEditName.text().strip()
716 searchTerm = bytes(QUrl.toPercentEncoding(searchTerm)).decode() 731 searchTerm = bytes(QUrl.toPercentEncoding(searchTerm)).decode()
717 urlQuery = QUrlQuery() 732 urlQuery = QUrlQuery()
718 urlQuery.addQueryItem("q", searchTerm) 733 urlQuery.addQueryItem("q", searchTerm)
719 url = QUrl(self.SearchUrl) 734 url = QUrl(self.__pip.getIndexUrlSearch())
720 url.setQuery(urlQuery) 735 url.setQuery(urlQuery)
721 736
722 request = QNetworkRequest(QUrl(url)) 737 request = QNetworkRequest(QUrl(url))
723 request.setAttribute(QNetworkRequest.CacheLoadControlAttribute, 738 request.setAttribute(QNetworkRequest.CacheLoadControlAttribute,
724 QNetworkRequest.AlwaysNetwork) 739 QNetworkRequest.AlwaysNetwork)
780 except KeyError: 795 except KeyError:
781 description = "" 796 description = ""
782 itm = QTreeWidgetItem( 797 itm = QTreeWidgetItem(
783 self.searchResultList, [ 798 self.searchResultList, [
784 result['name'].strip(), 799 result['name'].strip(),
800 result['version'],
785 result["released"].strip(), 801 result["released"].strip(),
786 description, 802 description,
787 ]) 803 ])
788 itm.setData(0, self.SearchVersionRole, result['version']) 804 itm.setData(0, self.SearchVersionRole, result['version'])
789 805
810 @pyqtSlot() 826 @pyqtSlot()
811 def on_installButton_clicked(self): 827 def on_installButton_clicked(self):
812 """ 828 """
813 Private slot to handle pressing the Install button.. 829 Private slot to handle pressing the Install button..
814 """ 830 """
815 self.__install() 831 packages = [
832 itm.text(0).strip()
833 for itm in self.searchResultList.selectedItems()
834 ]
835 self.executeInstallPackages(packages)
816 836
817 @pyqtSlot() 837 @pyqtSlot()
818 def on_installUserSiteButton_clicked(self): 838 def on_installUserSiteButton_clicked(self):
819 """ 839 """
820 Private slot to handle pressing the Install to User-Site button.. 840 Private slot to handle pressing the Install to User-Site button..
821 """ 841 """
822 self.__install(userSite=True) 842 packages = [
823 843 itm.text(0).strip()
824 def __install(self, userSite=False): 844 for itm in self.searchResultList.selectedItems()
825 """ 845 ]
826 Private slot to install the selected packages. 846 self.executeInstallPackages(packages, userSite=True)
827 847
848 def executeInstallPackages(self, packages, userSite=False):
849 """
850 Public method to install the given list of packages.
851
852 @param packages list of package names to be installed
853 @type list of str
828 @param userSite flag indicating to install to the user directory 854 @param userSite flag indicating to install to the user directory
829 @type bool 855 @type bool
830 """ 856 """
831 venvName = self.environmentsComboBox.currentText() 857 venvName = self.environmentsComboBox.currentText()
832 if venvName: 858 if venvName and packages:
833 packages = [] 859 self.__pip.installPackages(packages, venvName=venvName,
834 for itm in self.searchResultList.selectedItems(): 860 userSite=userSite)
835 packages.append(itm.text(0).strip()) 861 self.on_refreshButton_clicked()
836 if packages:
837 self.__pip.installPackages(packages, venvName=venvName,
838 userSite=userSite)
839 self.on_refreshButton_clicked()
840 862
841 @pyqtSlot() 863 @pyqtSlot()
842 def on_showDetailsButton_clicked(self): 864 def on_showDetailsButton_clicked(self):
843 """ 865 """
844 Private slot to handle pressing the Show Details button. 866 Private slot to handle pressing the Show Details button.
870 item = self.searchResultList.selectedItems()[0] 892 item = self.searchResultList.selectedItems()[0]
871 893
872 packageVersion = item.data(0, self.SearchVersionRole) 894 packageVersion = item.data(0, self.SearchVersionRole)
873 packageName = item.text(0) 895 packageName = item.text(0)
874 896
875 self.__showPackageDetails(packageName, packageVersion) 897 self.__showPackageDetails(packageName, packageVersion,
876 898 installable=True)
877 def __showPackageDetails(self, packageName, packageVersion): 899
900 def __showPackageDetails(self, packageName, packageVersion,
901 upgradable=False, installable=False):
878 """ 902 """
879 Private method to populate the package details dialog. 903 Private method to populate the package details dialog.
880 904
881 @param packageName name of the package to show details for 905 @param packageName name of the package to show details for
882 @type str 906 @type str
883 @param packageVersion version of the package 907 @param packageVersion version of the package
884 @type str 908 @type str
909 @param upgradable flag indicating that the package may be upgraded
910 (defaults to False)
911 @type bool (optional)
912 @param installable flag indicating that the package may be installed
913 (defaults to False)
914 @type bool (optional)
885 """ 915 """
886 with E5OverrideCursor(): 916 with E5OverrideCursor():
887 packageData = self.__pip.getPackageDetails( 917 packageData = self.__pip.getPackageDetails(
888 packageName, packageVersion) 918 packageName, packageVersion)
889 919
890 if packageData: 920 if packageData:
891 from .PipPackageDetailsDialog import PipPackageDetailsDialog 921 from .PipPackageDetailsDialog import PipPackageDetailsDialog
892 922
893 self.showDetailsButton.setEnabled(True) 923 self.showDetailsButton.setEnabled(True)
894 924
925 if installable:
926 buttonsMode = PipPackageDetailsDialog.ButtonInstall
927 elif upgradable:
928 buttonsMode = (
929 PipPackageDetailsDialog.ButtonRemove |
930 PipPackageDetailsDialog.ButtonUpgrade
931 )
932 else:
933 buttonsMode = PipPackageDetailsDialog.ButtonRemove
934
895 if self.__packageDetailsDialog is not None: 935 if self.__packageDetailsDialog is not None:
896 self.__packageDetailsDialog.close() 936 self.__packageDetailsDialog.close()
897 937
898 self.__packageDetailsDialog = ( 938 self.__packageDetailsDialog = (
899 PipPackageDetailsDialog(packageData, self) 939 PipPackageDetailsDialog(packageData, buttonsMode=buttonsMode,
940 parent=self)
900 ) 941 )
901 self.__packageDetailsDialog.show() 942 self.__packageDetailsDialog.show()
902 else: 943 else:
903 E5MessageBox.warning( 944 E5MessageBox.warning(
904 self, 945 self,
1040 if venvName: 1081 if venvName:
1041 from .PipPackagesInputDialog import PipPackagesInputDialog 1082 from .PipPackagesInputDialog import PipPackagesInputDialog
1042 dlg = PipPackagesInputDialog(self, self.tr("Install Packages")) 1083 dlg = PipPackagesInputDialog(self, self.tr("Install Packages"))
1043 if dlg.exec() == QDialog.Accepted: 1084 if dlg.exec() == QDialog.Accepted:
1044 packages, user = dlg.getData() 1085 packages, user = dlg.getData()
1045 if packages: 1086 self.executeInstallPackages(packages, userSite=user)
1046 self.__pip.installPackages(packages, venvName=venvName,
1047 userSite=user)
1048 self.on_refreshButton_clicked()
1049 1087
1050 @pyqtSlot() 1088 @pyqtSlot()
1051 def __installLocalPackage(self): 1089 def __installLocalPackage(self):
1052 """ 1090 """
1053 Private slot to install a package available on local storage. 1091 Private slot to install a package available on local storage.
1057 from .PipFileSelectionDialog import PipFileSelectionDialog 1095 from .PipFileSelectionDialog import PipFileSelectionDialog
1058 dlg = PipFileSelectionDialog(self, "package") 1096 dlg = PipFileSelectionDialog(self, "package")
1059 if dlg.exec() == QDialog.Accepted: 1097 if dlg.exec() == QDialog.Accepted:
1060 package, user = dlg.getData() 1098 package, user = dlg.getData()
1061 if package and os.path.exists(package): 1099 if package and os.path.exists(package):
1062 self.__pip.installPackages([package], venvName=venvName, 1100 self.executeInstallPackages([package], userSite=user)
1063 userSite=user)
1064 self.on_refreshButton_clicked()
1065 1101
1066 @pyqtSlot() 1102 @pyqtSlot()
1067 def __installRequirements(self): 1103 def __installRequirements(self):
1068 """ 1104 """
1069 Private slot to install packages as given in a requirements file. 1105 Private slot to install packages as given in a requirements file.

eric ide

mercurial