--- a/PipInterface/Pip.py Thu Feb 21 19:55:35 2019 +0100 +++ b/PipInterface/Pip.py Fri Feb 22 19:34:44 2019 +0100 @@ -17,19 +17,25 @@ import sys import json -from PyQt5.QtCore import pyqtSlot, QObject, QProcess -from PyQt5.QtWidgets import QMenu, QInputDialog, QDialog +from PyQt5.QtCore import pyqtSlot, QObject, QProcess, QUrl, QCoreApplication +from PyQt5.QtWidgets import QDialog +from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, \ + QNetworkReply from E5Gui import E5MessageBox -from E5Gui.E5Action import E5Action from E5Gui.E5Application import e5App +from E5Network.E5NetworkProxyFactory import proxyAuthenticationRequired +try: + from E5Network.E5SslErrorHandler import E5SslErrorHandler + SSL_AVAILABLE = True +except ImportError: + SSL_AVAILABLE = False + from .PipDialog import PipDialog import Preferences import Globals -## -##import UI.PixmapCache class Pip(QObject): @@ -48,413 +54,16 @@ @type QObject """ super(Pip, self).__init__(parent) -## -## self.__virtualenvManager = e5App().getObject("VirtualEnvManager") -## self.__project = e5App().getObject("Project") -## -## self.__menus = {} # dictionary with references to menus -## -## self.__plugin.currentEnvironmentChanged.connect( -## self.__handleTearOffMenu) - -## def initActions(self): -## """ -## Public method to define the actions. -## """ -## self.actions = [] -## -## self.selectEnvironmentAct = E5Action( -## self.tr('Virtual Environment for pip'), -## self.tr('&Virtual Environment for pip'), -## 0, 0, -## self, 'pip_select_environment') -## self.selectEnvironmentAct.setStatusTip(self.tr( -## 'Selects the virtual environment to be used for pip')) -## self.selectEnvironmentAct.setWhatsThis(self.tr( -## """<b>Virtual Environment for pip</b>""" -## """<p>This selects the virtual environment to be used for pip.""" -## """</p>""" -## )) -## self.selectEnvironmentAct.triggered.connect(self.__selectPipVirtualenv) -## self.actions.append(self.selectEnvironmentAct) -## -## ############################################## -## ## Actions for listing packages -## ############################################## -## -## self.listPackagesAct = E5Action( -## self.tr('List Installed Packages'), -## self.tr('&List Installed Packages...'), -## 0, 0, -## self, 'pip_list_packages') -## self.listPackagesAct.setStatusTip(self.tr( -## 'List all installed packages with versions')) -## self.listPackagesAct.setWhatsThis(self.tr( -## """<b>List Installed Packages</b>""" -## """<p>This lists all the installed packages together""" -## """ with their versions.</p>""" -## )) -## self.listPackagesAct.triggered.connect(self.__listPackages) -## self.actions.append(self.listPackagesAct) -## -## self.listUptodatePackagesAct = E5Action( -## self.tr('List Up-to-date Packages'), -## self.tr('List Up-to-&date Packages...'), -## 0, 0, -## self, 'pip_list_uptodate_packages') -## self.listUptodatePackagesAct.setStatusTip(self.tr( -## 'List all installed, up-to-date packages with versions')) -## self.listUptodatePackagesAct.setWhatsThis(self.tr( -## """<b>List Up-to-date Packages</b>""" -## """<p>This lists all the installed, up-to-date packages together""" -## """ with their versions.</p>""" -## )) -## self.listUptodatePackagesAct.triggered.connect( -## self.__listUptodatePackages) -## self.actions.append(self.listUptodatePackagesAct) -## -## self.listOutdatedPackagesAct = E5Action( -## self.tr('List Outdated Packages'), -## self.tr('List &Outdated Packages...'), -## 0, 0, -## self, 'pip_list_outdated_packages') -## self.listOutdatedPackagesAct.setStatusTip(self.tr( -## 'List all installed, outdated packages with versions')) -## self.listOutdatedPackagesAct.setWhatsThis(self.tr( -## """<b>List Up-to-date Packages</b>""" -## """<p>This lists all the installed, outdated packages together""" -## """ with their current and latest versions.</p>""" -## )) -## self.listOutdatedPackagesAct.triggered.connect( -## self.__listOutdatedPackages) -## self.actions.append(self.listOutdatedPackagesAct) -## -## ############################################## -## ## Actions for installing packages -## ############################################## -## -## self.installPackagesAct = E5Action( -## self.tr('Install Packages'), -## self.tr('&Install Packages'), -## 0, 0, -## self, 'pip_install_packages') -## self.installPackagesAct.setStatusTip(self.tr( -## 'Install packages according to user input')) -## self.installPackagesAct.setWhatsThis(self.tr( -## """<b>Install Packages</b>""" -## """<p>This installs packages according to user input.</p>""" -## )) -## self.installPackagesAct.triggered.connect(self.__installPackages) -## self.actions.append(self.installPackagesAct) -## -## self.installLocalPackageAct = E5Action( -## self.tr('Install Local Package'), -## self.tr('Install Local Package'), -## 0, 0, -## self, 'pip_install_local_package') -## self.installLocalPackageAct.setStatusTip(self.tr( -## 'Install a package from local storage')) -## self.installLocalPackageAct.setWhatsThis(self.tr( -## """<b>Install Local Package</b>""" -## """<p>This installs a package available on local storage.</p>""" -## )) -## self.installLocalPackageAct.triggered.connect( -## self.__installLocalPackage) -## self.actions.append(self.installLocalPackageAct) -## -## self.installRequirementsAct = E5Action( -## self.tr('Install Requirements'), -## self.tr('Install Requirements'), -## 0, 0, -## self, 'pip_install_requirements') -## self.installRequirementsAct.setStatusTip(self.tr( -## 'Install packages according to a requirements file')) -## self.installRequirementsAct.setWhatsThis(self.tr( -## """<b>Install Requirements</b>""" -## """<p>This installs packages according to a requirements""" -## """ file.</p>""" -## )) -## self.installRequirementsAct.triggered.connect( -## self.__installRequirements) -## self.actions.append(self.installRequirementsAct) -## -## self.installPipAct = E5Action( -## self.tr('Install Pip'), -## self.tr('Install Pip'), -## 0, 0, -## self, 'pip_install_pip') -## self.installPipAct.setStatusTip(self.tr( -## 'Install the pip package itself')) -## self.installPipAct.setWhatsThis(self.tr( -## """<b>Install Pip</b>""" -## """<p>This installs the pip package itself.</p>""" -## )) -## self.installPipAct.triggered.connect(self.__installPip) -## self.actions.append(self.installPipAct) -## -## self.repairPipAct = E5Action( -## self.tr('Repair Pip'), -## self.tr('Repair Pip'), -## 0, 0, -## self, 'pip_repair_pip') -## self.repairPipAct.setStatusTip(self.tr( -## 'Repair the pip package')) -## self.repairPipAct.setWhatsThis(self.tr( -## """<b>Repair Pip</b>""" -## """<p>This repairs the pip package by re-installing it.</p>""" -## )) -## self.repairPipAct.triggered.connect(self.__repairPip) -## self.actions.append(self.repairPipAct) -## -## self.upgradePipAct = E5Action( -## self.tr('Upgrade Pip'), -## self.tr('Upgrade &Pip'), -## 0, 0, -## self, 'pip_upgrade_pip') -## self.upgradePipAct.setStatusTip(self.tr( -## 'Upgrade the pip package itself')) -## self.upgradePipAct.setWhatsThis(self.tr( -## """<b>Upgrade Pip</b>""" -## """<p>This upgrades the pip package itself.</p>""" -## )) -## self.upgradePipAct.triggered.connect(self.upgradePip) -## self.actions.append(self.upgradePipAct) -## -## self.upgradePackagesAct = E5Action( -## self.tr('Upgrade Packages'), -## self.tr('&Upgrade Packages'), -## 0, 0, -## self, 'pip_upgrade_packages') -## self.upgradePackagesAct.setStatusTip(self.tr( -## 'Upgrade packages according to user input')) -## self.upgradePackagesAct.setWhatsThis(self.tr( -## """<b>Upgrade Packages</b>""" -## """<p>This upgrades packages according to user input.</p>""" -## )) -## self.upgradePackagesAct.triggered.connect(self.__upgradePackages) -## self.actions.append(self.upgradePackagesAct) -## -## ############################################## -## ## Actions for uninstalling packages -## ############################################## -## -## self.uninstallPackagesAct = E5Action( -## self.tr('Uninstall Packages'), -## self.tr('Uninstall Packages'), -## 0, 0, -## self, 'pip_uninstall_packages') -## self.uninstallPackagesAct.setStatusTip(self.tr( -## 'Uninstall packages according to user input')) -## self.uninstallPackagesAct.setWhatsThis(self.tr( -## """<b>Uninstall Packages</b>""" -## """<p>This uninstalls packages according to user input.</p>""" -## )) -## self.uninstallPackagesAct.triggered.connect(self.__uninstallPackages) -## self.actions.append(self.uninstallPackagesAct) -## -## self.uninstallRequirementsAct = E5Action( -## self.tr('Uninstall Requirements'), -## self.tr('Uninstall Requirements'), -## 0, 0, -## self, 'pip_uninstall_requirements') -## self.uninstallRequirementsAct.setStatusTip(self.tr( -## 'Uninstall packages according to a requirements file')) -## self.uninstallRequirementsAct.setWhatsThis(self.tr( -## """<b>Uninstall Requirements</b>""" -## """<p>This uninstalls packages according to a requirements""" -## """ file.</p>""" -## )) -## self.uninstallRequirementsAct.triggered.connect( -## self.__uninstallRequirements) -## self.actions.append(self.uninstallRequirementsAct) -## -## ############################################## -## ## Actions for generating requirements files -## ############################################## -## -## self.generateRequirementsAct = E5Action( -## self.tr('Generate Requirements'), -## self.tr('&Generate Requirements...'), -## 0, 0, -## self, 'pip_generate_requirements') -## self.generateRequirementsAct.setStatusTip(self.tr( -## 'Generate the contents of a requirements file')) -## self.generateRequirementsAct.setWhatsThis(self.tr( -## """<b>Generate Requirements</b>""" -## """<p>This generates the contents of a requirements file.</p>""" -## )) -## self.generateRequirementsAct.triggered.connect( -## self.__generateRequirements) -## self.actions.append(self.generateRequirementsAct) -## -## ############################################## -## ## Actions for generating requirements files -## ############################################## -## -## self.searchPyPIAct = E5Action( -## self.tr('Search PyPI'), -## self.tr('&Search PyPI...'), -## 0, 0, -## self, 'pip_search_pypi') -## self.searchPyPIAct.setStatusTip(self.tr( -## 'Open a dialog to search the Python Package Index')) -## self.searchPyPIAct.setWhatsThis(self.tr( -## """<b>Search PyPI</b>""" -## """<p>This opens a dialog to search the Python Package""" -## """ Index.</p>""" -## )) -## self.searchPyPIAct.triggered.connect(self.__searchPyPI) -## self.actions.append(self.searchPyPIAct) -## -## ############################################## -## ## Actions for editing configuration files -## ############################################## -## -## self.editUserConfigAct = E5Action( -## self.tr('Edit User Configuration'), -## self.tr('Edit User Configuration...'), -## 0, 0, -## self, 'pip_edit_user_config') -## self.editUserConfigAct.setStatusTip(self.tr( -## 'Open the per user configuration file in an editor')) -## self.editUserConfigAct.setWhatsThis(self.tr( -## """<b>Edit User Configuration</b>""" -## """<p>This opens the per user configuration file in an editor.""" -## """</p>""" -## )) -## self.editUserConfigAct.triggered.connect(self.__editUserConfiguration) -## self.actions.append(self.editUserConfigAct) -## -## self.editVirtualenvConfigAct = E5Action( -## self.tr('Edit Current Virtualenv Configuration'), -## self.tr('Edit Current Virtualenv Configuration...'), -## 0, 0, -## self, 'pip_edit_virtualenv_config') -## self.editVirtualenvConfigAct.setStatusTip(self.tr( -## 'Open the current virtualenv configuration file in an editor')) -## self.editVirtualenvConfigAct.setWhatsThis(self.tr( -## """<b>Edit Current Virtualenv Configuration</b>""" -## """<p>This opens the current virtualenv configuration file in""" -## """ an editor. </p>""" -## )) -## self.editVirtualenvConfigAct.triggered.connect( -## self.__editVirtualenvConfiguration) -## self.actions.append(self.editVirtualenvConfigAct) -## -## self.pipConfigAct = E5Action( -## self.tr('Configure'), -## self.tr('Configure...'), -## 0, 0, self, 'pip_configure') -## self.pipConfigAct.setStatusTip(self.tr( -## 'Show the configuration dialog with the Python Package Management' -## ' page selected' -## )) -## self.pipConfigAct.setWhatsThis(self.tr( -## """<b>Configure</b>""" -## """<p>Show the configuration dialog with the Python Package""" -## """ Management page selected.</p>""" -## )) -## self.pipConfigAct.triggered.connect(self.__pipConfigure) -## self.actions.append(self.pipConfigAct) -## -## def initMenu(self): -## """ -## Public slot to initialize the menu. -## -## @return the menu generated -## @rtype QMenu -## """ -## self.__menus = {} # clear menus references -## -## menu = QMenu() -## menu.setTearOffEnabled(True) -## menu.setIcon(UI.PixmapCache.getIcon("pypi.png")) -## -## menu.addAction(self.selectEnvironmentAct) -## menu.addSeparator() -## menu.addAction(self.listPackagesAct) -## menu.addAction(self.listUptodatePackagesAct) -## menu.addAction(self.listOutdatedPackagesAct) -## menu.addSeparator() -## menu.addAction(self.installPipAct) -## menu.addSeparator() -## menu.addAction(self.installPackagesAct) -## menu.addAction(self.installLocalPackageAct) -## menu.addAction(self.installRequirementsAct) -## menu.addSeparator() -## menu.addAction(self.upgradePipAct) -## menu.addAction(self.upgradePackagesAct) -## menu.addSeparator() -## menu.addAction(self.uninstallPackagesAct) -## menu.addAction(self.uninstallRequirementsAct) -## menu.addSeparator() -## menu.addAction(self.generateRequirementsAct) -## menu.addSeparator() -## menu.addAction(self.searchPyPIAct) -## menu.addSeparator() -## menu.addAction(self.repairPipAct) -## menu.addSeparator() -## menu.addAction(self.editUserConfigAct) -## menu.addAction(self.editVirtualenvConfigAct) -## menu.addSeparator() -## menu.addAction(self.pipConfigAct) -## -## self.__menus["main"] = menu -## -## menu.aboutToShow.connect(self.__aboutToShowMenu) -## -## return menu -## -## def __aboutToShowMenu(self): -## """ -## Private slot to set the action enabled status. -## """ -## enable = bool(Preferences.getPip("CurrentEnvironment")) -## for act in self.actions: -## if act not in [self.selectEnvironmentAct, -## self.installPipAct, -## self.editUserConfigAct, -## self.editVirtualenvConfigAct, -## self.pipConfigAct]: -## act.setEnabled(enable) -## -## def getMenu(self, name): -## """ -## Public method to get a reference to the requested menu. -## -## @param name name of the menu -## @type str -## @return reference to the menu or None, if no -## menu with the given name exists -## @rtype QMenu or None -## """ -## if name in self.__menus: -## return self.__menus[name] -## else: -## return None -## -## def getMenuNames(self): -## """ -## Public method to get the names of all menus. -## -## @return menu names -## @rtype list of str -## """ -## return list(self.__menus.keys()) -## -## def __handleTearOffMenu(self, venvName): -## """ -## Private slot to handle a change of the selected virtual environment. -## -## @param venvName logical name of the virtual environment -## @type str -## """ -## if self.__menus["main"].isTearOffMenuVisible(): -## # determine, if torn off menu needs to be refreshed -## enabled = self.listPackagesAct.isEnabled() -## if ((bool(venvName) and not enabled) or -## (not bool(venvName) and enabled)): -## self.__menus["main"].hideTearOffMenu() + + # attributes for the network objects + self.__networkManager = QNetworkAccessManager(self) + self.__networkManager.proxyAuthenticationRequired.connect( + proxyAuthenticationRequired) + if SSL_AVAILABLE: + self.__sslErrorHandler = E5SslErrorHandler(self) + self.__networkManager.sslErrors.connect( + self.__sslErrorHandler.sslErrorsReply) + self.__replies = [] ########################################################################## ## Methods below implement some utility functions @@ -501,9 +110,9 @@ return False, self.tr("python could not be started.") - def __getUserConfig(self): + def getUserConfig(self): """ - Private method to get the name of the user configuration file. + Public method to get the name of the user configuration file. @return path of the user configuration file @rtype str @@ -528,33 +137,28 @@ return config - def __getVirtualenvConfig(self): + def getVirtualenvConfig(self, venvName): """ - Private method to get the name of the virtualenv configuration file. + Public method to get the name of the virtualenv configuration file. + @param venvName name of the environment to get config file path for + @type str @return path of the virtualenv configuration file @rtype str """ # Unix, OS X: $VIRTUAL_ENV/pip.conf # Windows: %VIRTUAL_ENV%\pip.ini - # TODO: modify to use venvName if Globals.isWindowsPlatform(): pip = "pip.ini" else: pip = "pip.conf" - try: - venvDirectory = os.environ["VIRTUAL_ENV"] - except KeyError: - venvName = Preferences.getPip("CurrentEnvironment") - if not venvName: - self.__selectPipVirtualenv() - venvName = Preferences.getPip("CurrentEnvironment") - venvManager = e5App().getObject("VirtualEnvManager") - if venvManager.isGlobalEnvironment(venvName): - venvDirectory = self.__getUserConfig() - else: - venvDirectory = venvManager.getVirtualenvDirectory(venvName) + + venvManager = e5App().getObject("VirtualEnvManager") + if venvManager.isGlobalEnvironment(venvName): + venvDirectory = self.__getUserConfig() + else: + venvDirectory = venvManager.getVirtualenvDirectory(venvName) if venvDirectory: config = os.path.join(venvDirectory, pip) @@ -563,15 +167,6 @@ return config -## def getDefaultEnvironmentString(self): -## """ -## Public method to get the string for the default environment. -## -## @return string for the default environment -## @rtype str -## """ -## return self.tr("<standard>") -## def getProjectEnvironmentString(self): """ Public method to get the string for the project environment. @@ -593,16 +188,12 @@ @return interpreter path @rtype str """ -## if venvName == self.getDefaultEnvironmentString(): -## venvName = Preferences.getPip("CurrentEnvironment") if venvName == self.getProjectEnvironmentString(): venvName = \ e5App().getObject("Project").getDebugProperty("VIRTUALENV") if not venvName: # fall back to interpreter used to run eric6 return sys.executable -## # fall back to standard if not defined -## venvName = Preferences.getPip("CurrentEnvironment") interpreter = \ e5App().getObject("VirtualEnvManager").getVirtualenvInterpreter( @@ -626,137 +217,6 @@ return sorted( e5App().getObject("VirtualEnvManager").getVirtualenvNames()) - ########################################################################## - ## Methods below implement the individual menu entries - ########################################################################## - -## def __selectPipVirtualenv(self): -## """ -## Private method to select the virtual environment to be used. -## """ -## environments = self.getVirtualenvNames() -## if environments: -## currentEnvironment = Preferences.getPip("CurrentEnvironment") -## try: -## index = environments.index(currentEnvironment) -## except ValueError: -## index = 0 -## environment, ok = QInputDialog.getItem( -## None, -## self.tr("Virtual Environment for pip"), -## self.tr("Select the virtual environment to be used:"), -## environments, index, False) -## -## if ok and environment: -## Preferences.getPip("CurrentEnvironment", environment) -## else: -## E5MessageBox.warning( -## None, -## self.tr("Virtual Environment for pip"), -## self.tr("""No virtual environments have been configured yet.""" -## """ Please use the Virtualenv Manager to do that.""")) -## -## def __listPackages(self): -## """ -## Private slot to list all installed packages. -## """ -## from .PipListDialog import PipListDialog -## self.__listDialog = PipListDialog( -## self, "list", Preferences.getPip("PipSearchIndex"), -## self.tr("Installed Packages")) -## self.__listDialog.show() -## self.__listDialog.start() -## -## def __listUptodatePackages(self): -## """ -## Private slot to list all installed, up-to-date packages. -## """ -## from .PipListDialog import PipListDialog -## self.__listUptodateDialog = PipListDialog( -## self, "uptodate", Preferences.getPip("PipSearchIndex"), -## self.tr("Up-to-date Packages")) -## self.__listUptodateDialog.show() -## self.__listUptodateDialog.start() -## -## def __listOutdatedPackages(self): -## """ -## Private slot to list all installed, up-to-date packages. -## """ -## from .PipListDialog import PipListDialog -## self.__listOutdatedDialog = PipListDialog( -## self, "outdated", Preferences.getPip("PipSearchIndex"), -## self.tr("Outdated Packages")) -## self.__listOutdatedDialog.show() -## self.__listOutdatedDialog.start() -## -## def __editUserConfiguration(self): -## """ -## Private slot to edit the user configuration. -## """ -## self.__editConfiguration() -## -## def __editVirtualenvConfiguration(self): -## """ -## Private slot to edit the current virtualenv configuration. -## """ -## self.__editConfiguration(virtualenv=True) -## -## def __editConfiguration(self, virtualenv=False): -## """ -## Private method to edit a configuration. -## -## @param virtualenv flag indicating to edit the current virtualenv -## configuration file -## @type bool -## """ -## from QScintilla.MiniEditor import MiniEditor -## if virtualenv: -## cfgFile = self.__getVirtualenvConfig() -## if not cfgFile: -## return -## else: -## cfgFile = self.__getUserConfig() -## cfgDir = os.path.dirname(cfgFile) -## if not cfgDir: -## E5MessageBox.critical( -## None, -## self.tr("Edit Configuration"), -## self.tr("""No valid configuration path determined.""" -## """ Is a virtual environment selected? Aborting""")) -## return -## -## try: -## if not os.path.isdir(cfgDir): -## os.makedirs(cfgDir) -## except OSError: -## E5MessageBox.critical( -## None, -## self.tr("Edit Configuration"), -## self.tr("""No valid configuration path determined.""" -## """ Is a virtual environment selected? Aborting""")) -## return -## -## if not os.path.exists(cfgFile): -## try: -## f = open(cfgFile, "w") -## f.write("[global]\n") -## f.close() -## except (IOError, OSError): -## # ignore these -## pass -## -## # check, if the destination is writeable -## if not os.access(cfgFile, os.W_OK): -## E5MessageBox.critical( -## None, -## self.tr("Edit Configuration"), -## self.tr("""No valid configuartion path determined.""" -## """ Is a virtual environment selected? Aborting""")) -## return -## -## self.__editor = MiniEditor(cfgFile, "Properties") -## self.__editor.show() -## def installPip(self, venvName, userSite=False): """ Public method to install pip. @@ -791,50 +251,6 @@ if res: dia.exec_() -## @pyqtSlot() -## def upgradePip(self, venvName="", userSite=False): -## """ -## Public method to upgrade pip itself. -## -## @param venvName name of the virtual environment to be used -## @type str -## @param userSite flag indicating an install to the user install -## directory -## @type bool -## @return flag indicating a successful execution -## @rtype bool -## """ -## # Upgrading pip needs to be treated specially because -## # it must be done using the python executable -## -## if not venvName: -## from .PipSelectionDialog import PipSelectionDialog -## dlg = PipSelectionDialog(self) -## if dlg.exec_() != QDialog.Accepted: -## return -## -## venvName, userSite = dlg.getData() -## -## interpreter = self.getVirtualenvInterpreter(venvName) -## if not interpreter: -## return -## -## if Preferences.getPip("PipSearchIndex"): -## indexUrl = Preferences.getPip("PipSearchIndex") + "/simple" -## args = ["-m", "pip", "install", "--index-url", indexUrl, -## "--upgrade"] -## else: -## args = ["-m", "pip", "install", "--upgrade"] -## if userSite: -## args.append("--user") -## args.append("pip") -## -## dia = PipDialog(self.tr('Upgrade PIP')) -## res = dia.startProcess(interpreter, args) -## if res: -## dia.exec_() -## return res -## @pyqtSlot() def repairPip(self, venvName): """ @@ -842,8 +258,6 @@ @param venvName name of the environment to install pip into @type str - @return flag indicating a successful execution - @rtype bool """ interpreter = self.getVirtualenvInterpreter(venvName) if not interpreter: @@ -873,14 +287,15 @@ @rtype bool """ pyqtPackages = [p for p in packages - if p.lower() in ["pyqt5", "qscintilla", "sip"]] + if p.lower() in ["pyqt5", "pyqt5-sip", "pyqtwebengine", + "qscintilla", "sip"]] if bool(pyqtPackages): abort = not E5MessageBox.yesNo( None, self.tr("Upgrade Packages"), self.tr( - """You are trying to upgrade PyQt packages. This will""" + """You are trying to upgrade PyQt packages. This might""" """ not work for the current instance of Python ({0}).""" """ Do you want to continue?""").format(sys.executable), icon=E5MessageBox.Critical) @@ -889,7 +304,7 @@ return abort - def upgradePackages(self, packages, venvName="", userSite=False): + def upgradePackages(self, packages, venvName, userSite=False): """ Public method to upgrade the given list of packages. @@ -907,10 +322,11 @@ return False if not venvName: - venvName = Preferences.getPip("CurrentEnvironment") + return False + interpreter = self.getVirtualenvInterpreter(venvName) if not interpreter: - return + return False if Preferences.getPip("PipSearchIndex"): indexUrl = Preferences.getPip("PipSearchIndex") + "/simple" @@ -927,19 +343,7 @@ dia.exec_() return res - def __upgradePackages(self): - """ - Private slot to upgrade packages to be given by the user. - """ - from .PipPackagesInputDialog import PipPackagesInputDialog - dlg = PipPackagesInputDialog(self, self.tr("Upgrade Packages")) - if dlg.exec_() == QDialog.Accepted: - venvName, packages, user = dlg.getData() - if packages: - self.upgradePackages(packages, venvName=venvName, - userSite=user) - - def installPackages(self, packages, venvName="", userSite=False): + def installPackages(self, packages, venvName, userSite=False): """ Public method to install the given list of packages. @@ -951,62 +355,40 @@ directory @type bool """ - if not venvName: - venvName = Preferences.getPip("CurrentEnvironment") - interpreter = self.getVirtualenvInterpreter(venvName) - if not interpreter: - return + if venvName: + interpreter = self.getVirtualenvInterpreter(venvName) + if not interpreter: + return + + if Preferences.getPip("PipSearchIndex"): + indexUrl = Preferences.getPip("PipSearchIndex") + "/simple" + args = ["-m", "pip", "install", "--index-url", indexUrl] + else: + args = ["-m", "pip", "install"] + if userSite: + args.append("--user") + args += packages + dia = PipDialog(self.tr('Install Packages')) + res = dia.startProcess(interpreter, args) + if res: + dia.exec_() + + def installRequirements(self, venvName): + """ + Public method to install packages as given in a requirements file. - if Preferences.getPip("PipSearchIndex"): - indexUrl = Preferences.getPip("PipSearchIndex") + "/simple" - args = ["-m", "pip", "install", "--index-url", indexUrl] - else: - args = ["-m", "pip", "install"] - if userSite: - args.append("--user") - args += packages - dia = PipDialog(self.tr('Install Packages')) - res = dia.startProcess(interpreter, args) - if res: - dia.exec_() -## -## def __installPackages(self): -## """ -## Private slot to install packages to be given by the user. -## """ -## from .PipPackagesInputDialog import PipPackagesInputDialog -## dlg = PipPackagesInputDialog( -## self, self.tr("Install Packages")) -## if dlg.exec_() == QDialog.Accepted: -## venvName, packages, user = dlg.getData() -## if packages: -## self.installPackages(packages, venvName=venvName, -## userSite=user) -## -## def __installLocalPackage(self): -## """ -## Private slot to install a package available on local storage. -## """ -## from .PipFileSelectionDialog import PipFileSelectionDialog -## dlg = PipFileSelectionDialog(self, "package") -## if dlg.exec_() == QDialog.Accepted: -## venvName, package, user = dlg.getData() -## if package and os.path.exists(package): -## self.installPackages([package], venvName=venvName, -## userSite=user) - - def __installRequirements(self): - """ - Private slot to install packages as given in a requirements file. + @param venvName name of the virtual environment to be used + @type str """ from .PipFileSelectionDialog import PipFileSelectionDialog dlg = PipFileSelectionDialog(self, "requirements") if dlg.exec_() == QDialog.Accepted: - venvName, requirements, user = dlg.getData() + requirements, user = dlg.getData() if requirements and os.path.exists(requirements): interpreter = self.getVirtualenvInterpreter(venvName) if not interpreter: return + if Preferences.getPip("PipSearchIndex"): indexUrl = Preferences.getPip("PipSearchIndex") + \ "/simple" @@ -1021,7 +403,7 @@ if res: dia.exec_() - def uninstallPackages(self, packages, venvName=""): + def uninstallPackages(self, packages, venvName): """ Public method to uninstall the given list of packages. @@ -1033,7 +415,7 @@ @rtype bool """ res = False - if packages: + if packages and venvName: from UI.DeleteFilesConfirmationDialog import \ DeleteFilesConfirmationDialog dlg = DeleteFilesConfirmationDialog( @@ -1043,8 +425,6 @@ "Do you really want to uninstall these packages?"), packages) if dlg.exec_() == QDialog.Accepted: - if not venvName: - venvName = Preferences.getPip("CurrentEnvironment") interpreter = self.getVirtualenvInterpreter(venvName) if not interpreter: return @@ -1055,80 +435,48 @@ dia.exec_() return res -## def __uninstallPackages(self): -## """ -## Private slot to uninstall packages to be given by the user. -## """ -## from .PipPackagesInputDialog import PipPackagesInputDialog -## dlg = PipPackagesInputDialog( -## self, self.tr("Uninstall Packages"), install=False) -## if dlg.exec_() == QDialog.Accepted: -## venvName, packages, _user = dlg.getData() -## if packages: -## self.uninstallPackages(packages, venvName=venvName) -## - def __uninstallRequirements(self): + def uninstallRequirements(self, venvName): """ - Private slot to uninstall packages as given in a requirements file. + Public method to uninstall packages as given in a requirements file. + + @param venvName name of the virtual environment to be used + @type str """ - from .PipFileSelectionDialog import PipFileSelectionDialog - dlg = PipFileSelectionDialog(self, "requirements", - install=False) - if dlg.exec_() == QDialog.Accepted: - venvName, requirements, _user = dlg.getData() - if requirements and os.path.exists(requirements): - try: - f = open(requirements, "r") - reqs = f.read().splitlines() - f.close() - except (OSError, IOError): - return - - from UI.DeleteFilesConfirmationDialog import \ - DeleteFilesConfirmationDialog - dlg = DeleteFilesConfirmationDialog( - self.parent(), - self.tr("Uninstall Packages"), - self.tr( - "Do you really want to uninstall these packages?"), - reqs) - if dlg.exec_() == QDialog.Accepted: - if not venvName: - venvName = Preferences.getPip("CurrentEnvironment") - interpreter = self.getVirtualenvInterpreter(venvName) - if not interpreter: + if venvName: + from .PipFileSelectionDialog import PipFileSelectionDialog + dlg = PipFileSelectionDialog(self, "requirements", + install=False) + if dlg.exec_() == QDialog.Accepted: + requirements, _user = dlg.getData() + if requirements and os.path.exists(requirements): + try: + f = open(requirements, "r") + reqs = f.read().splitlines() + f.close() + except (OSError, IOError): return - args = ["-m", "pip", "uninstall", "--requirement", - requirements] - dia = PipDialog( - self.tr('Uninstall Packages from Requirements')) - res = dia.startProcess(interpreter, args) - if res: - dia.exec_() + + from UI.DeleteFilesConfirmationDialog import \ + DeleteFilesConfirmationDialog + dlg = DeleteFilesConfirmationDialog( + self.parent(), + self.tr("Uninstall Packages"), + self.tr( + "Do you really want to uninstall these packages?"), + reqs) + if dlg.exec_() == QDialog.Accepted: + interpreter = self.getVirtualenvInterpreter(venvName) + if not interpreter: + return + + args = ["-m", "pip", "uninstall", "--requirement", + requirements] + dia = PipDialog( + self.tr('Uninstall Packages from Requirements')) + res = dia.startProcess(interpreter, args) + if res: + dia.exec_() -## def __generateRequirements(self): -## """ -## Private slot to generate the contents for a requirements file. -## """ -## from .PipFreezeDialog import PipFreezeDialog -## self.__freezeDialog = PipFreezeDialog(self) -## self.__freezeDialog.show() -## self.__freezeDialog.start() -## -## def __searchPyPI(self): -## """ -## Private slot to search the Python Package Index. -## """ -## from .PipSearchDialog import PipSearchDialog -## -## if Preferences.getPip("PipSearchIndex"): -## indexUrl = Preferences.getPip("PipSearchIndex") + "/pypi" -## else: -## indexUrl = DefaultIndexUrlXml -## -## self.__searchDialog = PipSearchDialog(self, indexUrl) -## self.__searchDialog.show() -## def getIndexUrl(self): """ Public method to get the index URL for PyPI. @@ -1271,9 +619,36 @@ )) return packages -## -## def __pipConfigure(self): -## """ -## Private slot to open the configuration page. -## """ -## e5App().getObject("UserInterface").showPreferences("pipPage") + + def getPackageDetails(self, name, version): + """ + Public method to get package details using the PyPI JSON interface. + + @param name package name + @type str + @param version package version + @type str + @return dictionary containing PyPI package data + @rtype dict + """ + result = {} + + if name and version: + url = "https://pypi.org/pypi/{0}/{1}/json".format(name, version) + request = QNetworkRequest(QUrl(url)) + reply = self.__networkManager.get(request) + while not reply.isFinished(): + QCoreApplication.processEvents() + + reply.deleteLater() + if reply.error() == QNetworkReply.NoError: + data = str(reply.readAll(), + Preferences.getSystem("IOEncoding"), + 'replace') + try: + result = json.loads(data) + except Exception: + # ignore JSON exceptions + pass + + return result