--- 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.