Provide Django runtime console
This commit is contained in:
Oleg Shpynov
2010-04-15 17:01:25 +04:00
parent 23dac84cb0
commit 86745b67cf
2 changed files with 27 additions and 19 deletions
@@ -8,6 +8,7 @@ import com.intellij.execution.console.LanguageConsoleViewImpl;
import com.intellij.execution.process.CommandLineArgumentsProvider;
import com.intellij.execution.process.ProcessOutputTypes;
import com.intellij.execution.runners.AbstractConsoleRunnerWithHistory;
import com.intellij.execution.ui.ConsoleViewContentType;
import com.intellij.execution.ui.RunContentDescriptor;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
@@ -18,10 +19,10 @@ import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.encoding.EncodingManager;
import com.intellij.psi.PsiElement;
import com.intellij.util.PathUtil;
import com.intellij.util.net.NetUtils;
import com.jetbrains.django.run.Runner;
import com.jetbrains.django.util.DjangoUtil;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PythonHelpersLocator;
import com.jetbrains.python.console.pydev.ICallback;
import com.jetbrains.python.console.pydev.InterpreterResponse;
@@ -43,6 +44,7 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory {
private final int[] myPorts;
private PydevConsoleCommunication myPydevConsoleCommunication;
public static Key<PydevConsoleCommunication> CONSOLE_KEY = new Key<PydevConsoleCommunication>("PYDEV_CONSOLE_KEY");
private static final String PYTHON_ENV_COMMAND = "import sys; print('Python %s on %s' % (sys.version, sys.platform))\n";
protected PydevConsoleRunner(@NotNull final Project project,
@NotNull final String consoleTitle,
@@ -54,9 +56,10 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory {
}
public static void run(@NotNull final Project project,
@NotNull final Module module,
@NotNull final Sdk sdk) {
final String consoleTitle = PyBundle.message("python.console");
@NotNull final Sdk sdk,
final String consoleTitle,
final String projectRoot,
final String ... statements2execute) {
final int[] ports;
try {
// File "pydev/console/pydevconsole.py", line 223, in <module>
@@ -86,9 +89,9 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory {
}
};
final PydevConsoleRunner consoleRunner = new PydevConsoleRunner(project, consoleTitle, provider, DjangoUtil.getProjectRoot(module), ports);
final PydevConsoleRunner consoleRunner = new PydevConsoleRunner(project, consoleTitle, provider, projectRoot, ports);
try {
consoleRunner.initAndRun();
consoleRunner.initAndRun(statements2execute);
}
catch (ExecutionException e) {
ExecutionHelper.showErrors(project, Arrays.<Exception>asList(e), consoleTitle, null);
@@ -117,20 +120,27 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory {
return new PyConsoleProcessHandler(process, myConsoleView.getConsole(), getProviderCommandLine(myProvider), outputEncoding);
}
@Override
public void initAndRun() throws ExecutionException {
public void initAndRun(final String[] statements2execute) throws ExecutionException {
super.initAndRun();
// Propagate console communication to language console
((PydevLanguageConsoleView)myConsoleView).setPydevConsoleCommunication(myPydevConsoleCommunication);
try {
Thread.sleep(200);
Thread.sleep(300);
}
catch (InterruptedException e) {
// Ignore
}
sendInput("import sys; print('Python %s on %s' % (sys.version, sys.platform))\n");
// Make executed statements visible to developers
final LanguageConsoleImpl console = myConsoleView.getConsole();
PyConsoleHighlightingUtil.processOutput(console, PYTHON_ENV_COMMAND, ProcessOutputTypes.SYSTEM);
sendInput(PYTHON_ENV_COMMAND);
for (String statement : statements2execute) {
PyConsoleHighlightingUtil.processOutput(console, statement + "\n", ProcessOutputTypes.SYSTEM);
sendInput(statement+"\n");
}
}
@Override
@@ -216,4 +226,8 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory {
public static boolean isInPydevConsole(final PsiElement element){
return element.getContainingFile().getCopyableUserData(CONSOLE_KEY) != null;
}
public static String createExtendPathCommand(Module module) {
return "sys.path.append('" + PathUtil.getCanonicalPath(DjangoUtil.getProjectRoot(module)) + "')";
}
}
@@ -1,6 +1,5 @@
package com.jetbrains.python.console;
import com.intellij.execution.process.CommandLineArgumentsProvider;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.LangDataKeys;
@@ -9,17 +8,10 @@ import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.util.IconLoader;
import com.intellij.openapi.vfs.VirtualFile;
import com.jetbrains.django.util.DjangoUtil;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.sdk.PythonSdkType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collections;
import java.util.Map;
/**
* @author oleg
@@ -62,6 +54,8 @@ public class RunPythonConsoleAction extends AnAction implements DumbAware {
assert module != null : "Module is null";
assert sdk != null : "Sdk is null";
PydevConsoleRunner.run(project, module, sdk);
PydevConsoleRunner.run(project, sdk, PyBundle.message("python.console"), DjangoUtil.getProjectRoot(module),
PydevConsoleRunner.createExtendPathCommand(module));
}
}