summaryrefslogtreecommitdiff
path: root/python/src/com/jetbrains/python/console/PydevConsoleRunner.java
diff options
context:
space:
mode:
Diffstat (limited to 'python/src/com/jetbrains/python/console/PydevConsoleRunner.java')
-rw-r--r--python/src/com/jetbrains/python/console/PydevConsoleRunner.java167
1 files changed, 98 insertions, 69 deletions
diff --git a/python/src/com/jetbrains/python/console/PydevConsoleRunner.java b/python/src/com/jetbrains/python/console/PydevConsoleRunner.java
index 848818b95e27..b3ebacd83ae3 100644
--- a/python/src/com/jetbrains/python/console/PydevConsoleRunner.java
+++ b/python/src/com/jetbrains/python/console/PydevConsoleRunner.java
@@ -17,9 +17,8 @@ package com.jetbrains.python.console;
import com.google.common.base.CharMatcher;
import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.Lists;
+import com.google.common.base.Joiner;
+import com.google.common.collect.Collections2;
import com.google.common.collect.Maps;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.ExecutionHelper;
@@ -48,6 +47,8 @@ import com.intellij.openapi.editor.actionSystem.EditorWriteActionHandler;
import com.intellij.openapi.editor.actions.SplitLineAction;
import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.fileEditor.FileDocumentManager;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
@@ -58,19 +59,17 @@ import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Couple;
import com.intellij.openapi.util.Key;
+import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.io.StreamUtil;
import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.encoding.EncodingManager;
-import com.intellij.openapi.wm.ToolWindow;
-import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.source.tree.FileElement;
import com.intellij.remote.RemoteSshProcess;
import com.intellij.testFramework.LightVirtualFile;
-import com.intellij.ui.content.Content;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IJSwingUtilities;
import com.intellij.util.PathMappingSettings;
@@ -94,6 +93,7 @@ import com.jetbrains.python.run.ProcessRunner;
import com.jetbrains.python.run.PythonCommandLineState;
import com.jetbrains.python.run.PythonTracebackFilter;
import com.jetbrains.python.sdk.PySdkUtil;
+import com.jetbrains.python.sdk.PythonSdkType;
import com.jetbrains.python.sdk.flavors.PythonSdkFlavor;
import icons.PythonIcons;
import org.apache.xmlrpc.XmlRpcException;
@@ -115,6 +115,9 @@ import static com.jetbrains.python.sdk.PythonEnvUtil.setPythonUnbuffered;
* @author oleg
*/
public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory<PythonConsoleView> {
+ public static final String WORKING_DIR_ENV = "WORKING_DIR_AND_PYTHON_PATHS";
+ public static final String CONSOLE_START_COMMAND = "import sys; print('Python %s on %s' % (sys.version, sys.platform))\n" +
+ "sys.path.extend([" + WORKING_DIR_ENV + "])\n";
private static final Logger LOG = Logger.getInstance(PydevConsoleRunner.class.getName());
@SuppressWarnings("SpellCheckingInspection")
public static final String PYDEV_PYDEVCONSOLE_PY = "pydev/pydevconsole.py";
@@ -139,18 +142,100 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory<PythonC
private static final long APPROPRIATE_TO_WAIT = 60000;
private PyRemoteSdkCredentials myRemoteCredentials;
- private ToolWindow myToolWindow;
private String myConsoleTitle = null;
- protected PydevConsoleRunner(@NotNull final Project project,
+ public PydevConsoleRunner(@NotNull final Project project,
@NotNull Sdk sdk, @NotNull final PyConsoleType consoleType,
@Nullable final String workingDir,
- Map<String, String> environmentVariables) {
+ Map<String, String> environmentVariables, String ... statementsToExecute) {
super(project, consoleType.getTitle(), workingDir);
mySdk = sdk;
myConsoleType = consoleType;
myEnvironmentVariables = environmentVariables;
+ myStatementsToExecute = statementsToExecute;
+ }
+
+ public static PathMappingSettings getMappings(Project project, Sdk sdk) {
+ PathMappingSettings mappingSettings = null;
+ if (PySdkUtil.isRemote(sdk)) {
+ PythonRemoteInterpreterManager instance = PythonRemoteInterpreterManager.getInstance();
+ if (instance != null) {
+ //noinspection ConstantConditions
+ mappingSettings =
+ instance.setupMappings(project, (PyRemoteSdkAdditionalDataBase)sdk.getSdkAdditionalData(), null);
+ }
+ }
+ return mappingSettings;
+ }
+
+ @NotNull
+ public static Pair<Sdk, Module> findPythonSdkAndModule(@NotNull Project project, @Nullable Module contextModule) {
+ Sdk sdk = null;
+ Module module = null;
+ PyConsoleOptions.PyConsoleSettings settings = PyConsoleOptions.getInstance(project).getPythonConsoleSettings();
+ String sdkHome = settings.getSdkHome();
+ if (sdkHome != null) {
+ sdk = PythonSdkType.findSdkByPath(sdkHome);
+ if (settings.getModuleName() != null) {
+ module = ModuleManager.getInstance(project).findModuleByName(settings.getModuleName());
+ }
+ else {
+ module = contextModule;
+ if (module == null && ModuleManager.getInstance(project).getModules().length > 0) {
+ module = ModuleManager.getInstance(project).getModules()[0];
+ }
+ }
+ }
+ if (sdk == null && settings.isUseModuleSdk()) {
+ if (contextModule != null) {
+ module = contextModule;
+ }
+ else if (settings.getModuleName() != null) {
+ module = ModuleManager.getInstance(project).findModuleByName(settings.getModuleName());
+ }
+ if (module != null) {
+ if (PythonSdkType.findPythonSdk(module) != null) {
+ sdk = PythonSdkType.findPythonSdk(module);
+ }
+ }
+ }
+ else if (contextModule != null) {
+ if (module == null) {
+ module = contextModule;
+ }
+ if (sdk == null) {
+ sdk = PythonSdkType.findPythonSdk(module);
+ }
+ }
+
+ if (sdk == null) {
+ for (Module m : ModuleManager.getInstance(project).getModules()) {
+ if (PythonSdkType.findPythonSdk(m) != null) {
+ sdk = PythonSdkType.findPythonSdk(m);
+ module = m;
+ break;
+ }
+ }
+ }
+ if (sdk == null) {
+ if (PythonSdkType.getAllSdks().size() > 0) {
+ //noinspection UnusedAssignment
+ sdk = PythonSdkType.getAllSdks().get(0); //take any python sdk
+ }
+ }
+ return Pair.create(sdk, module);
+ }
+
+ public static String constructPythonPathCommand(Collection<String> pythonPath, String command) {
+ final String path = Joiner.on(", ").join(Collections2.transform(pythonPath, new Function<String, String>() {
+ @Override
+ public String apply(String input) {
+ return "'" + input.replace("\\", "\\\\").replace("'", "\\'") + "'";
+ }
+ }));
+
+ return command.replace(WORKING_DIR_ENV, path);
}
public void setStatementsToExecute(String... statementsToExecute) {
@@ -196,21 +281,6 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory<PythonC
return actions;
}
- @NotNull
- public static PydevConsoleRunner createAndRun(@NotNull final Project project,
- @NotNull final Sdk sdk,
- @NotNull final PyConsoleType consoleType,
- @Nullable final String workingDirectory,
- @NotNull final Map<String, String> environmentVariables,
- @Nullable final ToolWindow toolWindow,
- final String... statements2execute) {
- final PydevConsoleRunner consoleRunner = create(project, sdk, consoleType, workingDirectory, environmentVariables);
- consoleRunner.setToolWindow(toolWindow);
- consoleRunner.setStatementsToExecute(statements2execute);
- consoleRunner.run();
- return consoleRunner;
- }
-
public void run() {
UIUtil.invokeAndWaitIfNeeded(new Runnable() {
@Override
@@ -250,16 +320,7 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory<PythonC
Sdk sdk,
PyConsoleType consoleType,
String workingDirectory) {
- return create(project, sdk, consoleType, workingDirectory, Maps.<String, String>newHashMap());
- }
-
- @NotNull
- private static PydevConsoleRunner create(@NotNull final Project project,
- @NotNull final Sdk sdk,
- @NotNull final PyConsoleType consoleType,
- @Nullable final String workingDirectory,
- @NotNull final Map<String, String> environmentVariables) {
- return new PydevConsoleRunner(project, sdk, consoleType, workingDirectory, environmentVariables);
+ return new PydevConsoleRunner(project, sdk, consoleType, workingDirectory, Maps.<String, String>newHashMap(), new String[]{});
}
private static int[] findAvailablePorts(Project project, PyConsoleType consoleType) {
@@ -501,12 +562,6 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory<PythonC
return myConsoleTitle;
}
- @Override
- protected void showConsole(Executor defaultExecutor, RunContentDescriptor contentDescriptor) {
- PythonConsoleToolWindow terminalView = PythonConsoleToolWindow.getInstance(getProject());
- terminalView.init(getToolWindow(), contentDescriptor);
- }
-
protected AnAction createRerunAction() {
return new RestartAction(this);
}
@@ -631,10 +686,7 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory<PythonC
return stopAction;
}
- private void clearContent(RunContentDescriptor descriptor) {
- Content content = getToolWindow().getContentManager().findContent(descriptor.getDisplayName());
- assert content != null;
- getToolWindow().getContentManager().removeContent(content, true);
+ protected void clearContent(RunContentDescriptor descriptor) {
}
private AnAction createConsoleStoppingAction(final AnAction generalStopAction) {
@@ -792,16 +844,6 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory<PythonC
}
}
- public ToolWindow getToolWindow() {
- if (myToolWindow == null) {
- myToolWindow = ToolWindowManager.getInstance(getProject()).getToolWindow(PythonConsoleToolWindowFactory.ID);
- }
- return myToolWindow;
- }
-
- public void setToolWindow(ToolWindow toolWindow) {
- myToolWindow = toolWindow;
- }
public interface ConsoleListener {
void handleConsoleInitialized(LanguageConsoleView consoleView);
@@ -955,20 +997,7 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory<PythonC
return session;
}
- @Override
- protected List<String> getActiveConsoleNames(final String consoleTitle) {
- return FluentIterable.from(
- Lists.newArrayList(PythonConsoleToolWindow.getInstance(getProject()).getToolWindow().getContentManager().getContents())).transform(
- new Function<Content, String>() {
- @Override
- public String apply(Content input) {
- return input.getDisplayName();
- }
- }).filter(new Predicate<String>() {
- @Override
- public boolean apply(String input) {
- return input.contains(consoleTitle);
- }
- }).toList();
+ public static PythonConsoleRunnerFactory factory() {
+ return new PydevConsoleRunnerFactory();
}
}