pip Interface: continued adding support for the '--user' option.

Fri, 08 Jun 2018 19:24:24 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 08 Jun 2018 19:24:24 +0200
changeset 6331
758b1cb7a2e6
parent 6330
f2674335cf69
child 6332
1697b1f40833

pip Interface: continued adding support for the '--user' option.

Plugins/UiExtensionPlugins/PipInterface/Pip.py file | annotate | diff | comparison | revisions
Plugins/UiExtensionPlugins/PipInterface/PipSearchDialog.py file | annotate | diff | comparison | revisions
--- a/Plugins/UiExtensionPlugins/PipInterface/Pip.py	Fri Jun 08 19:07:18 2018 +0200
+++ b/Plugins/UiExtensionPlugins/PipInterface/Pip.py	Fri Jun 08 19:24:24 2018 +0200
@@ -31,7 +31,6 @@
 
 
 # TODO: 1) change all uses of pip to python3 -m pip
-# TODO: 2) support --user for install, install --upgrade and list
 class Pip(QObject):
     """
     Class implementing the pip GUI logic.
@@ -183,11 +182,28 @@
             'Install the pip package itself'))
         self.installPipAct.setWhatsThis(self.tr(
             """<b>Install Pip</b>"""
-            """<p>This install the pip package itself.</p>"""
+            """<p>This installs the pip package itself.</p>"""
         ))
-        self.installPipAct.triggered.connect(self.__installPip)
+        self.installPipAct.triggered.connect(
+            lambda: self.__installPip(userSite=False))
         self.actions.append(self.installPipAct)
         
+        self.installPipUserAct = E5Action(
+            self.tr('Install Pip to User-Site'),
+            self.tr('Install Pip to User-Site'),
+            0, 0,
+            self, 'pip_install_pip_user')
+        self.installPipUserAct.setStatusTip(self.tr(
+            'Install the pip package itself to the user directory'))
+        self.installPipUserAct.setWhatsThis(self.tr(
+            """<b>Install Pip to User-Site</b>"""
+            """<p>This installs the pip package itself to the user"""
+            """ directory.</p>"""
+        ))
+        self.installPipUserAct.triggered.connect(
+            lambda: self.__installPip(userSite=True))
+        self.actions.append(self.installPipUserAct)
+        
         self.repairPipAct = E5Action(
             self.tr('Repair Pip'),
             self.tr('Repair Pip'),
@@ -371,6 +387,8 @@
         menu.addAction(self.listOutdatedPackagesAct)
         menu.addSeparator()
         menu.addAction(self.installPipAct)
+        menu.addAction(self.installPipUserAct)
+        menu.addSeparator()
         menu.addAction(self.installPackagesAct)
         menu.addAction(self.installLocalPackageAct)
         menu.addAction(self.installRequirementsAct)
@@ -406,6 +424,7 @@
         for act in self.actions:
             if act not in [self.selectExecutableAct,
                            self.installPipAct,
+                           self.installPipUserAct,
                            self.editUserConfigAct,
                            self.editVirtualenvConfigAct,
                            self.pipConfigAct]:
@@ -669,10 +688,13 @@
         self.__editor = MiniEditor(cfgFile, "Properties")
         self.__editor.show()
     
-    # TODO: add support for --user
-    def __installPip(self):
+    def __installPip(self, userSite=False):
         """
         Private slot to install pip.
+        
+        @param userSite flag indicating an install to the user install
+            directory
+        @type bool
         """
         python = E5FileDialog.getOpenFileName(
             None,
@@ -680,17 +702,21 @@
         if python:
             python = QDir.toNativeSeparators(python)
             dia = PipDialog(self.tr('Install PIP'))
-            commands = [(python, ["-m", "ensurepip"])]
+            if userSite:
+                commands = [(python, ["-m", "ensurepip", "--user"])]
+            else:
+                commands = [(python, ["-m", "ensurepip"])]
             if self.__plugin.getPreferences("PipSearchIndex"):
                 indexUrl = \
                     self.__plugin.getPreferences("PipSearchIndex") + "/simple"
-                commands.append(
-                    (python,
-                     ["-m", "pip", "install", "--index-url", indexUrl,
-                      "--upgrade", "pip"]))
+                args = ["-m", "pip", "install", "--index-url", indexUrl,
+                        "--upgrade"]
             else:
-                commands.append(
-                    (python, ["-m", "pip", "install", "--upgrade", "pip"]))
+                args = ["-m", "pip", "install", "--upgrade"]
+            if userSite:
+                args.append("--user")
+            args.append("pip")
+            commands.append((python, args[:]))
         
             res = dia.startProcesses(commands)
             if res:
@@ -763,7 +789,6 @@
             dia.exec_()
         return res
     
-    # TODO: add support for --user
     @pyqtSlot()
     def __repairPip(self):
         """
@@ -772,19 +797,14 @@
         @return flag indicating a successful execution
         @rtype bool
         """
-        default = self.tr("<Default>")
-        pipExecutables = sorted(
-            self.__plugin.getPreferences("PipExecutables"))
-        pip, ok = QInputDialog.getItem(
-            None,
-            self.tr("Upgrade pip"),
-            self.tr("Select pip Executable:"),
-            [default] + pipExecutables,
-            0, False)
-        if not ok or not pip:
+        from .PipSelectionDialog import PipSelectionDialog
+        dlg = PipSelectionDialog(self.__plugin)
+        if dlg.exec_() != QDialog.Accepted:
             return False
         
-        if pip == default:
+        pip, userSite = dlg.getData()
+        
+        if not pip:
             pip = self.__plugin.getPreferences("CurrentPipExecutable")
         
         python = self.__getPython(pip)
@@ -803,9 +823,13 @@
             indexUrl = \
                 self.__plugin.getPreferences("PipSearchIndex") + "/simple"
             args = ["-m", "pip", "install", "--index-url", indexUrl,
-                    "--ignore-installed", "pip"]
+                    "--ignore-installed"]
         else:
-            args = ["-m", "pip", "install", "--ignore-installed", "pip"]
+            args = ["-m", "pip", "install", "--ignore-installed"]
+        if userSite:
+            args.append("--user")
+        args.append("pip")
+        
         dia = PipDialog(self.tr('Repair PIP'))
         res = dia.startProcess(python, args)
         if res:
--- a/Plugins/UiExtensionPlugins/PipInterface/PipSearchDialog.py	Fri Jun 08 19:07:18 2018 +0200
+++ b/Plugins/UiExtensionPlugins/PipInterface/PipSearchDialog.py	Fri Jun 08 19:24:24 2018 +0200
@@ -26,7 +26,6 @@
 from . import DefaultIndexUrlXml
 
 
-# TODO: add support for --user; additional button
 class PipSearchDialog(QDialog, Ui_PipSearchDialog):
     """
     Class implementing a dialog to search PyPI.
@@ -59,6 +58,10 @@
             self.tr("&Install"), QDialogButtonBox.ActionRole)
         self.__installButton.setEnabled(False)
         
+        self.__installUserButton = self.buttonBox.addButton(
+            self.tr("Install to &User-Site"), QDialogButtonBox.ActionRole)
+        self.__installUserButton.setEnabled(False)
+        
         self.__showDetailsButton = self.buttonBox.addButton(
             self.tr("&Show Details..."), QDialogButtonBox.ActionRole)
         self.__showDetailsButton.setEnabled(False)
@@ -119,6 +122,8 @@
         """
         self.__installButton.setEnabled(
             len(self.resultList.selectedItems()) > 0)
+        self.__installUserButton.setEnabled(
+            len(self.resultList.selectedItems()) > 0)
         self.__showDetailsButton.setEnabled(
             len(self.resultList.selectedItems()) == 1)
     
@@ -136,6 +141,8 @@
             self.__canceled = True
         elif button == self.__installButton:
             self.__install()
+        elif button == self.__installUserButton:
+            self.__install(userSite=True)
         elif button == self.__showDetailsButton:
             self.__showDetails()
     
@@ -321,10 +328,12 @@
         
         return score
     
-    # TODO: add support for --user
-    def __install(self):
+    def __install(self,  userSite=False):
         """
         Private slot to install the selected packages.
+        
+        @param userSite flag indicating to install to the user directory
+        @type bool
         """
         command = self.pipComboBox.currentText()
         if command == self.__default:
@@ -334,7 +343,8 @@
         for itm in self.resultList.selectedItems():
             packages.append(itm.text(0).strip())
         if packages:
-            self.__pip.installPackages(packages, cmd=command)
+            self.__pip.installPackages(packages, cmd=command,
+                                       userSite=userSite)
     
     def __showDetails(self):
         """

eric ide

mercurial