PipInterface/Pip.py

branch
pypi
changeset 6798
3985c1a67fa2
parent 6795
6e2ed2aac325
child 6819
6c49d4ed077d
diff -r 6e2ed2aac325 -r 3985c1a67fa2 PipInterface/Pip.py
--- 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

eric ide

mercurial