diff options
Diffstat (limited to 'python/src/com/jetbrains/python/console/PydevConsoleRunner.java')
-rw-r--r-- | python/src/com/jetbrains/python/console/PydevConsoleRunner.java | 167 |
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(); } } |