Use PyPackageManager only via its public interface

This commit is contained in:
Andrey Vlasovskikh
2014-09-09 17:07:32 +04:00
parent f137c9faf7
commit de271cbf0f
17 changed files with 121 additions and 143 deletions
@@ -36,7 +36,6 @@ import com.jetbrains.python.newProject.PythonProjectGenerator;
import com.jetbrains.python.packaging.PyExternalProcessException;
import com.jetbrains.python.packaging.PyPackage;
import com.jetbrains.python.packaging.PyPackageManager;
import com.jetbrains.python.packaging.PyPackageManagerImpl;
import com.jetbrains.python.sdk.PythonSdkType;
import com.jetbrains.python.sdk.flavors.JythonSdkFlavor;
import com.jetbrains.python.sdk.flavors.PyPySdkFlavor;
@@ -319,7 +318,7 @@ abstract public class AbstractProjectSettingsStep extends AbstractActionWithPane
PyFrameworkProjectGenerator frameworkProjectGenerator = (PyFrameworkProjectGenerator)myProjectGenerator;
String frameworkName = frameworkProjectGenerator.getFrameworkTitle();
if (sdk != null && !isFrameworkInstalled(sdk)) {
final PyPackageManagerImpl packageManager = (PyPackageManagerImpl)PyPackageManager.getInstance(sdk);
final PyPackageManager packageManager = PyPackageManager.getInstance(sdk);
final boolean onlyWithCache =
PythonSdkFlavor.getFlavor(sdk) instanceof JythonSdkFlavor || PythonSdkFlavor.getFlavor(sdk) instanceof PyPySdkFlavor;
String warningText = frameworkName + " will be installed on selected interpreter";
@@ -15,18 +15,45 @@
*/
package com.jetbrains.python.packaging;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.util.Key;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.awt.*;
import java.util.List;
import java.util.Set;
/**
* @author yole
*/
public abstract class PyPackageManager {
public static final Key<Boolean> RUNNING_PACKAGING_TASKS = Key.create("PyPackageRequirementsInspection.RunningPackagingTasks");
public static final String PACKAGE_SETUPTOOLS = "setuptools";
public static final String PACKAGE_PIP = "pip";
public static final String PACKAGE_DISTRIBUTE = "distribute";
// Bundled versions of package management tools
public static final String SETUPTOOLS_VERSION = "1.1.5";
public static final String PIP_VERSION = "1.4.1";
public static final String SETUPTOOLS = PACKAGE_SETUPTOOLS + "-" + SETUPTOOLS_VERSION;
public static final String PIP = PACKAGE_PIP + "-" + PIP_VERSION;
public static final int OK = 0;
public static final int ERROR_NO_PIP = 2;
public static final int ERROR_NO_SETUPTOOLS = 3;
public static final int ERROR_INVALID_SDK = -1;
public static final int ERROR_TOOL_NOT_FOUND = -2;
public static final int ERROR_TIMEOUT = -3;
public static final int ERROR_INVALID_OUTPUT = -4;
public static final int ERROR_ACCESS_DENIED = -5;
public static final int ERROR_EXECUTION = -6;
public static final String USE_USER_SITE = "--user";
public static PyPackageManager getInstance(Sdk sdk) {
return PyPackageManagers.getInstance().forSdk(sdk);
}
@@ -38,8 +65,19 @@ public abstract class PyPackageManager {
public abstract void showInstallationError(Project project, String title, String description);
public abstract void showInstallationError(Component owner, String title, String description);
public abstract void refresh();
@NotNull
public abstract String createVirtualEnv(@NotNull String destinationDir, boolean useGlobalSite) throws PyExternalProcessException;
@Nullable
public abstract List<PyPackage> getPackagesFast() throws PyExternalProcessException;
@NotNull
public abstract List<PyPackage> getPackages() throws PyExternalProcessException;
@Nullable
public abstract PyPackage findInstalledPackage(String name) throws PyExternalProcessException;
@Nullable
public abstract PyPackage findInstalledPackage(String name, boolean cachedOnly) throws PyExternalProcessException;
@Nullable
public abstract List<PyRequirement> getRequirements(@NotNull Module module);
public abstract Set<PyPackage> getDependents(@NotNull PyPackage pkg) throws PyExternalProcessException;
@Deprecated
public abstract boolean cacheIsNotNull();
}
@@ -16,12 +16,8 @@
package com.jetbrains.python.packaging;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.projectRoots.Sdk;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
/**
* @author yole
@@ -35,22 +31,4 @@ public abstract class PyPackageManagers {
@NotNull
public abstract PyPackageManager forSdk(Sdk sdk);
/**
* Returns the list of requirements from 'requirements.txt' or 'setup.py' files in the specified module.
*
* @param module the module to check for requirements
* @return the list of requirements, or null if the module contains neither requirements.txt nor setup.py.
*/
@Nullable
public abstract List<PyRequirement> getRequirements(Module module);
/**
* Returns the list of requirements from 'requirements.txt' file in the specified module.
*
* @param module the module to check for requirements
* @return the list of requirements, or null if the module does not contain a requirements.txt
*/
@Nullable
public abstract List<PyRequirement> getRequirementsFromTxt(Module module);
}
@@ -26,7 +26,6 @@ import com.intellij.openapi.projectRoots.Sdk;
import com.jetbrains.python.packaging.PyExternalProcessException;
import com.jetbrains.python.packaging.PyPackage;
import com.jetbrains.python.packaging.PyPackageManager;
import com.jetbrains.python.packaging.PyPackageManagerImpl;
import com.jetbrains.python.sdk.PythonSdkType;
/**
@@ -48,7 +47,7 @@ public class RestPythonUtil {
if (module != null) {
Sdk sdk = PythonSdkType.findPythonSdk(module);
if (sdk != null) {
PyPackageManagerImpl manager = (PyPackageManagerImpl)PyPackageManager.getInstance(sdk);
PyPackageManager manager = PyPackageManager.getInstance(sdk);
try {
final PyPackage sphinx = manager.findInstalledPackage("Sphinx");
presentation.setEnabled(sphinx != null);
@@ -160,15 +160,16 @@ public class PyPackageRequirementsInspection extends PyInspection {
return;
}
}
if (PyPackageManagerImpl.PACKAGE_SETUPTOOLS.equals(packageName)) {
if (PyPackageManager.PACKAGE_SETUPTOOLS.equals(packageName)) {
return;
}
final Module module = ModuleUtilCore.findModuleForPsiElement(packageReferenceExpression);
if (module != null) {
Collection<PyRequirement> requirements = PyPackageManagerImpl.getRequirements(module);
if (requirements != null) {
final Sdk sdk = PythonSdkType.findPythonSdk(module);
if (sdk != null) {
final Sdk sdk = PythonSdkType.findPythonSdk(module);
if (sdk != null) {
final PyPackageManager manager = PyPackageManager.getInstance(sdk);
Collection<PyRequirement> requirements = manager.getRequirements(module);
if (requirements != null) {
requirements = getTransitiveRequirements(sdk, requirements, new HashSet<PyPackage>());
}
if (requirements == null) return;
@@ -191,7 +192,7 @@ public class PyPackageRequirementsInspection extends PyInspection {
}
}
final List<LocalQuickFix> quickFixes = new ArrayList<LocalQuickFix>();
if (sdk != null && PyPackageManager.getInstance(sdk).hasPip()) {
if (manager.hasPip()) {
quickFixes.add(new AddToRequirementsFix(module, packageName, LanguageLevel.forElement(importedExpression)));
}
quickFixes.add(new IgnoreRequirementFix(Collections.singleton(packageName)));
@@ -211,7 +212,7 @@ public class PyPackageRequirementsInspection extends PyInspection {
final Set<PyRequirement> results = new HashSet<PyRequirement>(requirements);
final List<PyPackage> packages;
try {
packages = ((PyPackageManagerImpl) PyPackageManager.getInstance(sdk)).getPackagesFast();
packages = PyPackageManager.getInstance(sdk).getPackagesFast();
}
catch (PyExternalProcessException e) {
return null;
@@ -242,8 +243,8 @@ public class PyPackageRequirementsInspection extends PyInspection {
@Nullable
private static List<PyRequirement> findUnsatisfiedRequirements(@NotNull Module module, @NotNull Sdk sdk,
@NotNull Set<String> ignoredPackages) {
final PyPackageManagerImpl manager = (PyPackageManagerImpl)PyPackageManager.getInstance(sdk);
List<PyRequirement> requirements = PyPackageManagerImpl.getRequirements(module);
final PyPackageManager manager = PyPackageManager.getInstance(sdk);
List<PyRequirement> requirements = manager.getRequirements(module);
if (requirements != null) {
final List<PyPackage> packages;
try {
@@ -265,11 +266,11 @@ public class PyPackageRequirementsInspection extends PyInspection {
}
private static void setRunningPackagingTasks(@NotNull Module module, boolean value) {
module.putUserData(PyPackageManagerImpl.RUNNING_PACKAGING_TASKS, value);
module.putUserData(PyPackageManager.RUNNING_PACKAGING_TASKS, value);
}
private static boolean isRunningPackagingTasks(@NotNull Module module) {
final Boolean value = module.getUserData(PyPackageManagerImpl.RUNNING_PACKAGING_TASKS);
final Boolean value = module.getUserData(PyPackageManager.RUNNING_PACKAGING_TASKS);
return value != null && value;
}
@@ -30,7 +30,6 @@ import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkAdditionalData;
import com.intellij.openapi.projectRoots.impl.ProjectJdkImpl;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
@@ -46,7 +45,6 @@ import com.intellij.remote.RemoteSdkCredentials;
import com.intellij.remote.VagrantNotStartedException;
import com.intellij.util.ArrayUtil;
import com.intellij.util.PathMappingSettings;
import com.intellij.util.SystemProperties;
import com.intellij.util.containers.HashSet;
import com.intellij.util.messages.MessageBusConnection;
import com.intellij.util.net.HttpConfigurable;
@@ -76,42 +74,19 @@ import java.util.List;
public class PyPackageManagerImpl extends PyPackageManager {
private static final Logger LOG = Logger.getInstance(PyPackageManagerImpl.class);
public static final int OK = 0;
public static final int ERROR_NO_PIP = 2;
public static final int ERROR_NO_SETUPTOOLS = 3;
public static final int ERROR_INVALID_SDK = -1;
public static final int ERROR_TOOL_NOT_FOUND = -2;
public static final int ERROR_TIMEOUT = -3;
public static final int ERROR_INVALID_OUTPUT = -4;
public static final int ERROR_ACCESS_DENIED = -5;
public static final int ERROR_EXECUTION = -6;
public static final int ERROR_VAGRANT_NOT_LAUNCHED = 101;
public static final int ERROR_REMOTE_ACCESS = 102;
public static final String PACKAGE_PIP = "pip";
public static final String PACKAGE_DISTRIBUTE = "distribute";
public static final String PACKAGE_SETUPTOOLS = "setuptools";
public static final Key<Boolean> RUNNING_PACKAGING_TASKS = Key.create("PyPackageRequirementsInspection.RunningPackagingTasks");
private static final String PACKAGING_TOOL = "packaging_tool.py";
private static final String VIRTUALENV = "virtualenv.py";
private static final int TIMEOUT = 10 * 60 * 1000;
private static final String BUILD_DIR_OPTION = "--build-dir";
public static final String USE_USER_SITE = "--user";
public static final String INSTALL = "install";
public static final String UNINSTALL = "uninstall";
public static final String UNTAR = "untar";
// Bundled versions of package management tools
public static final String SETUPTOOLS_VERSION = "1.1.5";
public static final String PIP_VERSION = "1.4.1";
public static final String SETUPTOOLS = PACKAGE_SETUPTOOLS + "-" + SETUPTOOLS_VERSION;
public static final String PIP = PACKAGE_PIP + "-" + PIP_VERSION;
private static final String LAUNCH_VAGRANT = "launchVagrant";
private List<PyPackage> myPackagesCache = null;
@@ -267,17 +242,6 @@ public class PyPackageManagerImpl extends PyPackageManager {
}
}
public static String getUserSite() {
if (SystemInfo.isWindows) {
final String appdata = System.getenv("APPDATA");
return appdata + File.separator + "Python";
}
else {
final String userHome = SystemProperties.getUserHome();
return userHome + File.separator + ".local";
}
}
public boolean cacheIsNotNull() {
return myPackagesCache != null;
@@ -312,7 +276,7 @@ public class PyPackageManagerImpl extends PyPackageManager {
return myPackagesCache;
}
public synchronized Set<PyPackage> getDependents(String pkg) throws PyExternalProcessException {
public synchronized Set<PyPackage> getDependents(@NotNull PyPackage pkg) throws PyExternalProcessException {
if (myDependenciesCache == null) {
if (myExceptionCache != null) {
throw myExceptionCache;
@@ -320,7 +284,7 @@ public class PyPackageManagerImpl extends PyPackageManager {
loadPackages();
}
return myDependenciesCache.get(pkg);
return myDependenciesCache.get(pkg.getName());
}
public synchronized void loadPackages() throws PyExternalProcessException {
@@ -421,7 +385,7 @@ public class PyPackageManagerImpl extends PyPackageManager {
if (binaryFile != null) {
final ProjectJdkImpl tmpSdk = new ProjectJdkImpl("", PythonSdkType.getInstance());
tmpSdk.setHomePath(path);
final PyPackageManagerImpl manager = new PyPackageManagerImpl(tmpSdk);
final PyPackageManager manager = PyPackageManager.getInstance(tmpSdk);
manager.installManagement(SETUPTOOLS);
manager.installManagement(PIP);
}
@@ -430,9 +394,9 @@ public class PyPackageManagerImpl extends PyPackageManager {
}
@Nullable
public static List<PyRequirement> getRequirements(@NotNull Module module) {
public List<PyRequirement> getRequirements(@NotNull Module module) {
// TODO: Cache requirements, clear cache on requirements.txt or setup.py updates
List<PyRequirement> requirements = getRequirementsFromTxt(module);
List<PyRequirement> requirements = PySdkUtil.getRequirementsFromTxt(module);
if (requirements != null) {
return requirements;
}
@@ -456,15 +420,6 @@ public class PyPackageManagerImpl extends PyPackageManager {
return null;
}
@Nullable
public static List<PyRequirement> getRequirementsFromTxt(Module module) {
final VirtualFile requirementsTxt = PyPackageUtil.findRequirementsTxt(module);
if (requirementsTxt != null) {
return PyRequirement.parse(requirementsTxt);
}
return null;
}
private void clearCaches() {
myPackagesCache = null;
myDependenciesCache = null;
@@ -123,8 +123,7 @@ public class PyPackageManagerUI {
throws PyExternalProcessException {
Map<String, Set<PyPackage>> dependentPackages = new HashMap<String, Set<PyPackage>>();
for (PyPackage pkg : packages) {
final Set<PyPackage> dependents =
((PyPackageManagerImpl)PyPackageManager.getInstance(sdk)).getDependents(pkg.getName());
final Set<PyPackage> dependents = PyPackageManager.getInstance(sdk).getDependents(pkg);
if (dependents != null && !dependents.isEmpty()) {
for (PyPackage dependent : dependents) {
if (!packages.contains(dependent)) {
@@ -15,13 +15,10 @@
*/
package com.jetbrains.python.packaging;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.projectRoots.Sdk;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@@ -41,17 +38,4 @@ public class PyPackageManagersImpl extends PyPackageManagers {
}
return manager;
}
@Nullable
@Override
public List<PyRequirement> getRequirements(Module module) {
return PyPackageManagerImpl.getRequirements(module);
}
@Nullable
@Override
public List<PyRequirement> getRequirementsFromTxt(Module module) {
return PyPackageManagerImpl.getRequirementsFromTxt(module);
}
}
@@ -26,6 +26,7 @@ import com.intellij.webcore.packaging.InstalledPackage;
import com.intellij.webcore.packaging.InstalledPackagesPanel;
import com.intellij.webcore.packaging.PackagesNotificationPanel;
import com.jetbrains.python.packaging.*;
import com.jetbrains.python.sdk.PySdkUtil;
import com.jetbrains.python.sdk.PythonSdkType;
import com.jetbrains.python.sdk.flavors.IronPythonSdkFlavor;
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
@@ -53,7 +54,7 @@ public class PyInstalledPackagesPanel extends InstalledPackagesPanel {
public void run() {
final Sdk sdk = getSelectedSdk();
if (sdk != null) {
installManagementTool(sdk, PyPackageManagerImpl.SETUPTOOLS);
installManagementTool(sdk, PyPackageManager.SETUPTOOLS);
}
}
});
@@ -62,7 +63,7 @@ public class PyInstalledPackagesPanel extends InstalledPackagesPanel {
public void run() {
final Sdk sdk = getSelectedSdk();
if (sdk != null) {
installManagementTool(sdk, PyPackageManagerImpl.PIP);
installManagementTool(sdk, PyPackageManager.PIP);
}
}
});
@@ -84,12 +85,12 @@ public class PyInstalledPackagesPanel extends InstalledPackagesPanel {
public void run() {
PyExternalProcessException exc = null;
try {
PyPackageManagerImpl packageManager = (PyPackageManagerImpl)PyPackageManager.getInstance(selectedSdk);
myHasSetuptools = packageManager.findInstalledPackage(PyPackageManagerImpl.PACKAGE_SETUPTOOLS) != null;
PyPackageManager packageManager = PyPackageManager.getInstance(selectedSdk);
myHasSetuptools = packageManager.findInstalledPackage(PyPackageManager.PACKAGE_SETUPTOOLS) != null;
if (!myHasSetuptools) {
myHasSetuptools = packageManager.findInstalledPackage(PyPackageManagerImpl.PACKAGE_DISTRIBUTE) != null;
myHasSetuptools = packageManager.findInstalledPackage(PyPackageManager.PACKAGE_DISTRIBUTE) != null;
}
myHasPip = packageManager.findInstalledPackage(PyPackageManagerImpl.PACKAGE_PIP) != null;
myHasPip = packageManager.findInstalledPackage(PyPackageManager.PACKAGE_PIP) != null;
}
catch (PyExternalProcessException e) {
exc = e;
@@ -111,10 +112,10 @@ public class PyInstalledPackagesPanel extends InstalledPackagesPanel {
String text = null;
if (externalProcessException != null) {
final int retCode = externalProcessException.getRetcode();
if (retCode == PyPackageManagerImpl.ERROR_NO_PIP) {
if (retCode == PyPackageManager.ERROR_NO_PIP) {
myHasPip = false;
}
else if (retCode == PyPackageManagerImpl.ERROR_NO_SETUPTOOLS) {
else if (retCode == PyPackageManager.ERROR_NO_SETUPTOOLS) {
myHasSetuptools = false;
}
else {
@@ -177,7 +178,7 @@ public class PyInstalledPackagesPanel extends InstalledPackagesPanel {
@Override
public void finished(List<PyExternalProcessException> exceptions) {
myPackagesTable.setPaintBusy(false);
PyPackageManagerImpl packageManager = (PyPackageManagerImpl)PyPackageManager.getInstance(sdk);
PyPackageManager packageManager = PyPackageManager.getInstance(sdk);
if (!exceptions.isEmpty()) {
final String firstLine = "Install package failed. ";
final String description = PyPackageManagerUI.createDescription(exceptions, firstLine);
@@ -199,14 +200,14 @@ public class PyInstalledPackagesPanel extends InstalledPackagesPanel {
if (!myHasPip) return false;
if (PythonSdkType.isVirtualEnv(getSelectedSdk()) && pkg instanceof PyPackage) {
final String location = ((PyPackage)pkg).getLocation();
if (location != null && location.startsWith(PyPackageManagerImpl.getUserSite())) {
if (location != null && location.startsWith(PySdkUtil.getUserSite())) {
return false;
}
}
final String name = pkg.getName();
if (PyPackageManagerImpl.PACKAGE_PIP.equals(name) ||
PyPackageManagerImpl.PACKAGE_SETUPTOOLS.equals(name) ||
PyPackageManagerImpl.PACKAGE_DISTRIBUTE.equals(name)) {
if (PyPackageManager.PACKAGE_PIP.equals(name) ||
PyPackageManager.PACKAGE_SETUPTOOLS.equals(name) ||
PyPackageManager.PACKAGE_DISTRIBUTE.equals(name)) {
return false;
}
return true;
@@ -23,6 +23,7 @@ import com.intellij.webcore.packaging.InstalledPackage;
import com.intellij.webcore.packaging.PackageManagementService;
import com.intellij.webcore.packaging.RepoPackage;
import com.jetbrains.python.packaging.*;
import com.jetbrains.python.sdk.PySdkUtil;
import com.jetbrains.python.sdk.PythonSdkType;
import org.apache.xmlrpc.AsyncCallback;
import org.jetbrains.annotations.NonNls;
@@ -112,7 +113,7 @@ public class PyPackageManagementService extends PackageManagementService {
public String getInstallToUserText() {
String userSiteText = "Install to user's site packages directory";
if (!PythonSdkType.isRemote(mySdk))
userSiteText += " (" + PyPackageManagerImpl.getUserSite() + ")";
userSiteText += " (" + PySdkUtil.getUserSite() + ")";
return userSiteText;
}
@@ -130,7 +131,7 @@ public class PyPackageManagementService extends PackageManagementService {
public Collection<InstalledPackage> getInstalledPackages() throws IOException {
List<PyPackage> packages;
try {
packages = ((PyPackageManagerImpl)PyPackageManager.getInstance(mySdk)).getPackages();
packages = PyPackageManager.getInstance(mySdk).getPackages();
}
catch (PyExternalProcessException e) {
throw new IOException(e);
@@ -145,7 +146,7 @@ public class PyPackageManagementService extends PackageManagementService {
final String repository = PyPIPackageUtil.PYPI_URL.equals(repoPackage.getRepoUrl()) ? null : repoPackage.getRepoUrl();
final List<String> extraArgs = new ArrayList<String>();
if (installToUser) {
extraArgs.add(PyPackageManagerImpl.USE_USER_SITE);
extraArgs.add(PyPackageManager.USE_USER_SITE);
}
if (extraOptions != null) {
// TODO: Respect arguments quotation
@@ -50,7 +50,6 @@ import com.intellij.util.PathUtil;
import com.intellij.util.PlatformUtils;
import com.jetbrains.python.packaging.PyExternalProcessException;
import com.jetbrains.python.packaging.PyPackageManager;
import com.jetbrains.python.packaging.PyPackageManagerImpl;
import com.jetbrains.python.packaging.PyPackageService;
import com.jetbrains.python.sdk.flavors.VirtualEnvSdkFlavor;
import com.jetbrains.python.ui.IdeaDialog;
@@ -416,7 +415,7 @@ public class CreateVirtualEnvDialog extends IdeaDialog {
String myPath;
public void run(@NotNull final ProgressIndicator indicator) {
final PyPackageManagerImpl packageManager = (PyPackageManagerImpl)PyPackageManager.getInstance(basicSdk);
final PyPackageManager packageManager = PyPackageManager.getInstance(basicSdk);
try {
indicator.setText("Creating virtual environment for " + basicSdk.getName());
myPath = packageManager.createVirtualEnv(getDestination(), useGlobalSitePackages());
@@ -21,6 +21,7 @@ import com.intellij.execution.process.ProcessOutput;
import com.intellij.execution.util.ExecUtil;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.util.SystemInfo;
@@ -31,7 +32,10 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.remote.RemoteSdkAdditionalData;
import com.intellij.util.SystemProperties;
import com.intellij.util.containers.HashMap;
import com.jetbrains.python.packaging.PyPackageUtil;
import com.jetbrains.python.packaging.PyRequirement;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -39,7 +43,9 @@ import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* A more flexible cousin of SdkVersionUtil.
@@ -167,6 +173,17 @@ public class PySdkUtil {
return sdk != null && sdk.getSdkAdditionalData() instanceof RemoteSdkAdditionalData;
}
public static String getUserSite() {
if (SystemInfo.isWindows) {
final String appdata = System.getenv("APPDATA");
return appdata + File.separator + "Python";
}
else {
final String userHome = SystemProperties.getUserHome();
return userHome + File.separator + ".local";
}
}
public static boolean isElementInSkeletons(@NotNull final PsiElement element) {
final PsiFile file = element.getContainingFile();
if (file != null) {
@@ -215,4 +232,13 @@ public class PySdkUtil {
}
return null;
}
@Nullable
public static List<PyRequirement> getRequirementsFromTxt(Module module) {
final VirtualFile requirementsTxt = PyPackageUtil.findRequirementsTxt(module);
if (requirementsTxt != null) {
return PyRequirement.parse(requirementsTxt);
}
return null;
}
}
@@ -44,7 +44,6 @@ import com.jetbrains.python.PyNames;
import com.jetbrains.python.codeInsight.userSkeletons.PyUserSkeletonsUtil;
import com.jetbrains.python.packaging.PyExternalProcessException;
import com.jetbrains.python.packaging.PyPackageManager;
import com.jetbrains.python.packaging.PyPackageManagerImpl;
import com.jetbrains.python.psi.resolve.PythonSdkPathCache;
import com.jetbrains.python.remote.PythonRemoteInterpreterManager;
import com.jetbrains.python.sdk.InvalidSdkException;
@@ -349,7 +348,8 @@ public class PySkeletonRefresher {
}
if (PySdkUtil.isRemote(mySdk)) {
try {
((PyPackageManagerImpl)PyPackageManager.getInstance(mySdk)).loadPackages();
// Force loading packages
PyPackageManager.getInstance(mySdk).getPackages();
}
catch (PyExternalProcessException e) {
// ignore - already logged
@@ -25,7 +25,7 @@ import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.jetbrains.python.packaging.PyPIPackageUtil;
import com.jetbrains.python.packaging.PyPackageManagerImpl;
import com.jetbrains.python.packaging.PyPackageManager;
import com.jetbrains.python.packaging.PyRequirement;
import com.jetbrains.python.sdk.PythonSdkType;
import org.jetbrains.annotations.NotNull;
@@ -46,12 +46,12 @@ public class PyPackageUsagesCollector extends AbstractApplicationUsagesCollector
public Set<UsageDescriptor> getProjectUsages(@NotNull Project project) throws CollectUsagesException {
final Set<UsageDescriptor> result = new HashSet<UsageDescriptor>();
for(final Module m: ModuleManager.getInstance(project).getModules()) {
Sdk pythonSdk = PythonSdkType.findPythonSdk(m);
final Sdk pythonSdk = PythonSdkType.findPythonSdk(m);
if (pythonSdk != null) {
ApplicationManager.getApplication().runReadAction(new Runnable() {
@Override
public void run() {
List<PyRequirement> requirements = PyPackageManagerImpl.getRequirements(m);
List<PyRequirement> requirements = PyPackageManager.getInstance(pythonSdk).getRequirements(m);
if (requirements != null) {
Collection<String> packages = new HashSet<String>(PyPIPackageUtil.INSTANCE.getPackageNames());
for (PyRequirement requirement : requirements) {
@@ -35,7 +35,6 @@ import com.intellij.util.ui.update.Update;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.packaging.PyExternalProcessException;
import com.jetbrains.python.packaging.PyPackageManager;
import com.jetbrains.python.packaging.PyPackageManagerImpl;
import com.jetbrains.python.sdk.PySdkUtil;
import com.jetbrains.python.sdk.PythonSdkType;
import org.jetbrains.annotations.NotNull;
@@ -131,7 +130,7 @@ public class VFSTestFrameworkListener implements ApplicationComponent {
LOG.info("Searching test runner in empty sdk");
return null;
}
final PyPackageManagerImpl packageManager = (PyPackageManagerImpl)PyPackageManager.getInstance(sdk);
final PyPackageManager packageManager = PyPackageManager.getInstance(sdk);
try {
return packageManager.findInstalledPackage(testPackageName) != null;
}
@@ -31,7 +31,6 @@ import com.intellij.webcore.packaging.PackageVersionComparator;
import com.jetbrains.python.packaging.PyExternalProcessException;
import com.jetbrains.python.packaging.PyPackage;
import com.jetbrains.python.packaging.PyPackageManager;
import com.jetbrains.python.packaging.PyPackageManagerImpl;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.PyFunction;
@@ -97,7 +96,7 @@ public class PyTestConfigurationProducer extends PythonTestConfigurationProducer
if (pyFunction != null) {
keywords = pyFunction.getName();
if (pyClass != null) {
final PyPackageManagerImpl packageManager = (PyPackageManagerImpl)PyPackageManager.getInstance(sdk);
final PyPackageManager packageManager = PyPackageManager.getInstance(sdk);
try {
final PyPackage pytestPackage = packageManager.findInstalledPackage("pytest");
if (pytestPackage != null && PackageVersionComparator.VERSION_COMPARATOR.compare(pytestPackage.getVersion(), "2.3.3") >= 0) {
+10 -10
View File
@@ -43,11 +43,11 @@ public class PyPackagingTest extends PyEnvTestCase {
final Sdk sdk = createTempSdk(sdkHome, SdkCreationType.EMPTY_SDK);
List<PyPackage> packages = null;
try {
packages = ((PyPackageManagerImpl)PyPackageManager.getInstance(sdk)).getPackages();
packages = PyPackageManager.getInstance(sdk).getPackages();
}
catch (PyExternalProcessException e) {
final int retcode = e.getRetcode();
if (retcode != PyPackageManagerImpl.ERROR_NO_PIP && retcode != PyPackageManagerImpl.ERROR_NO_SETUPTOOLS) {
if (retcode != PyPackageManager.ERROR_NO_PIP && retcode != PyPackageManager.ERROR_NO_SETUPTOOLS) {
fail(String.format("Error for interpreter '%s': %s", sdk.getHomePath(), e.getMessage()));
}
}
@@ -74,21 +74,21 @@ public class PyPackagingTest extends PyEnvTestCase {
}
final File tempDir = FileUtil.createTempDirectory(getTestName(false), null);
final File venvDir = new File(tempDir, "venv");
final String venvSdkHome = ((PyPackageManagerImpl)PyPackageManagerImpl.getInstance(sdk)).createVirtualEnv(venvDir.toString(),
false);
final String venvSdkHome = PyPackageManager.getInstance(sdk).createVirtualEnv(venvDir.toString(),
false);
final Sdk venvSdk = createTempSdk(venvSdkHome, SdkCreationType.EMPTY_SDK);
assertNotNull(venvSdk);
assertTrue(PythonSdkType.isVirtualEnv(venvSdk));
assertInstanceOf(PythonSdkFlavor.getPlatformIndependentFlavor(venvSdk.getHomePath()), VirtualEnvSdkFlavor.class);
final List<PyPackage> packages = ((PyPackageManagerImpl)PyPackageManagerImpl.getInstance(venvSdk)).getPackages();
final List<PyPackage> packages = PyPackageManager.getInstance(venvSdk).getPackages();
final PyPackage setuptools = findPackage("setuptools", packages);
assertNotNull(setuptools);
assertEquals("setuptools", setuptools.getName());
assertEquals(PyPackageManagerImpl.SETUPTOOLS_VERSION, setuptools.getVersion());
assertEquals(PyPackageManager.SETUPTOOLS_VERSION, setuptools.getVersion());
final PyPackage pip = findPackage("pip", packages);
assertNotNull(pip);
assertEquals("pip", pip.getName());
assertEquals(PyPackageManagerImpl.PIP_VERSION, pip.getVersion());
assertEquals(PyPackageManager.PIP_VERSION, pip.getVersion());
}
catch (IOException e) {
throw new RuntimeException(e);
@@ -109,10 +109,10 @@ public class PyPackagingTest extends PyEnvTestCase {
try {
final File tempDir = FileUtil.createTempDirectory(getTestName(false), null);
final File venvDir = new File(tempDir, "venv");
final String venvSdkHome = ((PyPackageManagerImpl)PyPackageManager.getInstance(sdk)).createVirtualEnv(venvDir.getPath(), false);
final String venvSdkHome = PyPackageManager.getInstance(sdk).createVirtualEnv(venvDir.getPath(), false);
final Sdk venvSdk = createTempSdk(venvSdkHome, SdkCreationType.EMPTY_SDK);
assertNotNull(venvSdk);
final PyPackageManagerImpl manager = (PyPackageManagerImpl)PyPackageManager.getInstance(venvSdk);
final PyPackageManager manager = PyPackageManager.getInstance(venvSdk);
final List<PyPackage> packages1 = manager.getPackages();
// TODO: Install Markdown from a local file
manager.install(list(PyRequirement.fromString("Markdown<2.2"),
@@ -124,7 +124,7 @@ public class PyPackagingTest extends PyEnvTestCase {
final PyPackage pip1 = findPackage("pip", packages1);
assertNotNull(pip1);
assertEquals("pip", pip1.getName());
assertEquals(PyPackageManagerImpl.PIP_VERSION, pip1.getVersion());
assertEquals(PyPackageManager.PIP_VERSION, pip1.getVersion());
manager.uninstall(list(pip1));
final List<PyPackage> packages3 = manager.getPackages();
final PyPackage pip2 = findPackage("pip", packages3);