PipInterface/Pip.py

branch
pypi
changeset 6792
9dd854f05c83
parent 6785
058d63c537a4
child 6793
cca6a35f3ad2
diff -r 058d63c537a4 -r 9dd854f05c83 PipInterface/Pip.py
--- a/PipInterface/Pip.py	Mon Feb 18 19:49:43 2019 +0100
+++ b/PipInterface/Pip.py	Tue Feb 19 19:56:24 2019 +0100
@@ -15,6 +15,7 @@
 
 import os
 import sys
+import json
 
 from PyQt5.QtCore import pyqtSlot, QObject, QProcess
 from PyQt5.QtWidgets import QMenu, QInputDialog, QDialog
@@ -45,7 +46,7 @@
         """
         super(Pip, self).__init__(parent)
         
-        self.__virtualenvManager = e5App().getObject("VirtualEnvManager")
+##        self.__virtualenvManager = e5App().getObject("VirtualEnvManager")
 ##        self.__project = e5App().getObject("Project")
         
         self.__menus = {}   # dictionary with references to menus
@@ -545,11 +546,11 @@
             if not venvName:
                 self.__selectPipVirtualenv()
                 venvName = Preferences.getPip("CurrentEnvironment")
-            if self.__virtualenvManager.isGlobalEnvironment(venvName):
+            venvManager = e5App().getObject("VirtualEnvManager")
+            if venvManager.isGlobalEnvironment(venvName):
                 venvDirectory = self.__getUserConfig()
             else:
-                venvDirectory = \
-                    self.__virtualenvManager.getVirtualenvDirectory(venvName)
+                venvDirectory = venvManager.getVirtualenvDirectory(venvName)
         
         if venvDirectory:
             config = os.path.join(venvDirectory, pip)
@@ -591,13 +592,15 @@
         if venvName == self.getDefaultEnvironmentString():
             venvName = Preferences.getPip("CurrentEnvironment")
         elif venvName == self.getProjectEnvironmentString():
-            venvName = e5App().getObject("Project").getDebugProperty("VIRTUALENV")
+            venvName = \
+                e5App().getObject("Project").getDebugProperty("VIRTUALENV")
             if not venvName:
                 # fall back to standard if not defined
                 venvName = Preferences.getPip("CurrentEnvironment")
         
-        interpreter = self.__virtualenvManager.getVirtualenvInterpreter(
-            venvName)
+        interpreter = \
+            e5App().getObject("VirtualEnvManager").getVirtualenvInterpreter(
+                venvName)
         if not interpreter:
             E5MessageBox.critical(
                 None,
@@ -614,7 +617,8 @@
         @return sorted list of virtual environment names
         @rtype list of str
         """
-        return sorted(self.__virtualenvManager.getVirtualenvNames())
+        return sorted(
+            e5App().getObject("VirtualEnvManager").getVirtualenvNames())
     
     ##########################################################################
     ## Methods below implement the individual menu entries
@@ -1130,6 +1134,121 @@
         self.__searchDialog = PipSearchDialog(self, indexUrl)
         self.__searchDialog.show()
     
+    def getInstalledPackages(self, envName, localPackages=True,
+                             notRequired=False, usersite=False):
+        """
+        Public method to get the list of installed packages.
+        
+        @param envName name of the environment to get the packages for
+        @type str
+        @param localPackages flag indicating to get local packages only
+        @type bool
+        @param notRequired flag indicating to list packages that are not
+            dependencies of installed packages as well
+        @type bool
+        @param usersite flag indicating to only list packages installed
+            in user-site
+        @type bool
+        @return list of tuples containing the package name and version
+        @rtype list of tuple of (str, str)
+        """
+        packages = []
+        
+        if envName:
+            interpreter = self.getVirtualenvInterpreter(envName)
+            if interpreter:
+                args = [
+                    "-m", "pip",
+                    "list",
+                    "--format=json",
+                ]
+                if localPackages:
+                    args.append("--local")
+                if notRequired:
+                    args.append("--not-required")
+                if usersite:
+                    args.append("--user")
+                
+                proc = QProcess()
+                proc.start(interpreter, args)
+                if proc.waitForStarted(15000):
+                    if proc.waitForFinished(30000):
+                        output = str(proc.readAllStandardOutput(),
+                                     Preferences.getSystem("IOEncoding"),
+                                     'replace').strip()
+                        try:
+                            jsonList = json.loads(output)
+                        except Exception:
+                            jsonList = []
+                        
+                        for package in jsonList:
+                            if isinstance(package, dict):
+                                packages.append((
+                                    package["name"],
+                                    package["version"],
+                                ))
+           
+        return packages
+    
+    def getOutdatedPackages(self, envName, localPackages=True,
+                            notRequired=False, usersite=False):
+        """
+        Public method to get the list of outdated packages.
+        
+        @param envName name of the environment to get the packages for
+        @type str
+        @param localPackages flag indicating to get local packages only
+        @type bool
+        @param notRequired flag indicating to list packages that are not
+            dependencies of installed packages as well
+        @type bool
+        @param usersite flag indicating to only list packages installed
+            in user-site
+        @type bool
+        @return list of tuples containing the package name, installed version
+            and available version
+        @rtype list of tuple of (str, str, str)
+        """
+        packages = []
+        
+        if envName:
+            interpreter = self.getVirtualenvInterpreter(envName)
+            if interpreter:
+                args = [
+                    "-m", "pip",
+                    "list",
+                    "--outdated",
+                    "--format=json",
+                ]
+                if localPackages:
+                    args.append("--local")
+                if notRequired:
+                    args.append("--not-required")
+                if usersite:
+                    args.append("--user")
+                
+                proc = QProcess()
+                proc.start(interpreter, args)
+                if proc.waitForStarted(15000):
+                    if proc.waitForFinished(30000):
+                        output = str(proc.readAllStandardOutput(),
+                                     Preferences.getSystem("IOEncoding"),
+                                     'replace').strip()
+                        try:
+                            jsonList = json.loads(output)
+                        except Exception:
+                            jsonList = []
+                        
+                        for package in jsonList:
+                            if isinstance(package, dict):
+                                packages.append((
+                                    package["name"],
+                                    package["version"],
+                                    package["latest_version"],
+                                ))
+           
+        return packages
+ 
     def __pipConfigure(self):
         """
         Private slot to open the configuration page.

eric ide

mercurial