From 60e17645e337dad3187d3413e382e2ccd682e4e8 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Sat, 17 Jul 2010 18:54:30 +0400 Subject: [PATCH] don't create unittest run configuration inside "if __name__ == '__main__'" block (PY-877) --- .../run/PythonRunConfigurationProducer.java | 2 +- .../python/run/RunnableScriptFilter.java | 3 +- .../PythonUnitTestConfigurationProducer.java | 4 +++ .../PythonUnitTestRunnableScriptFilter.java | 34 +++++++++++++++++-- .../pytest/PyTestRunnableScriptFilter.java | 3 +- 5 files changed, 41 insertions(+), 5 deletions(-) diff --git a/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java b/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java index 8978fd742693..dbe3ce694a8b 100644 --- a/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java +++ b/python/src/com/jetbrains/python/run/PythonRunConfigurationProducer.java @@ -37,7 +37,7 @@ public class PythonRunConfigurationProducer extends RuntimeConfigurationProducer Module module = ModuleUtil.findModuleForPsiElement(script); if (module != null) { for (RunnableScriptFilter f : Extensions.getExtensions(RunnableScriptFilter.EP_NAME)) { - if (f.isRunnableScript(script, module)) { + if (f.isRunnableScript(script, module, location)) { return null; } } diff --git a/python/src/com/jetbrains/python/run/RunnableScriptFilter.java b/python/src/com/jetbrains/python/run/RunnableScriptFilter.java index 75d4e74cabdb..beb6b1de09aa 100644 --- a/python/src/com/jetbrains/python/run/RunnableScriptFilter.java +++ b/python/src/com/jetbrains/python/run/RunnableScriptFilter.java @@ -1,5 +1,6 @@ package com.jetbrains.python.run; +import com.intellij.execution.Location; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.module.Module; import com.intellij.psi.PsiFile; @@ -14,5 +15,5 @@ import org.jetbrains.annotations.NotNull; public interface RunnableScriptFilter { ExtensionPointName EP_NAME = ExtensionPointName.create("Pythonid.runnableScriptFilter"); - boolean isRunnableScript(PsiFile script, @NotNull Module module); + boolean isRunnableScript(PsiFile script, @NotNull Module module, Location location); } diff --git a/python/src/com/jetbrains/python/testing/PythonUnitTestConfigurationProducer.java b/python/src/com/jetbrains/python/testing/PythonUnitTestConfigurationProducer.java index c5ee2c686271..37f2f7ac6bd5 100644 --- a/python/src/com/jetbrains/python/testing/PythonUnitTestConfigurationProducer.java +++ b/python/src/com/jetbrains/python/testing/PythonUnitTestConfigurationProducer.java @@ -52,6 +52,10 @@ public class PythonUnitTestConfigurationProducer extends RuntimeConfigurationPro } } + if (PythonUnitTestRunnableScriptFilter.isIfNameMain(location)) { + return null; + } + settings = createConfigurationFromFolder(location); if (settings != null) return settings; diff --git a/python/src/com/jetbrains/python/testing/PythonUnitTestRunnableScriptFilter.java b/python/src/com/jetbrains/python/testing/PythonUnitTestRunnableScriptFilter.java index 17eb56a777a5..88e6e14f4884 100644 --- a/python/src/com/jetbrains/python/testing/PythonUnitTestRunnableScriptFilter.java +++ b/python/src/com/jetbrains/python/testing/PythonUnitTestRunnableScriptFilter.java @@ -1,8 +1,15 @@ package com.jetbrains.python.testing; +import com.intellij.execution.Location; import com.intellij.openapi.module.Module; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.util.PsiTreeUtil; +import com.jetbrains.python.PyTokenTypes; +import com.jetbrains.python.psi.PyBinaryExpression; +import com.jetbrains.python.psi.PyExpression; import com.jetbrains.python.psi.PyFile; +import com.jetbrains.python.psi.PyIfStatement; import com.jetbrains.python.run.RunnableScriptFilter; import org.jetbrains.annotations.NotNull; @@ -10,7 +17,30 @@ import org.jetbrains.annotations.NotNull; * @author yole */ public class PythonUnitTestRunnableScriptFilter implements RunnableScriptFilter { - public boolean isRunnableScript(PsiFile script, @NotNull Module module) { - return script instanceof PyFile && PythonUnitTestUtil.getTestCaseClassesFromFile((PyFile) script).size() > 0; + public boolean isRunnableScript(PsiFile script, @NotNull Module module, Location location) { + return script instanceof PyFile && PythonUnitTestUtil.getTestCaseClassesFromFile((PyFile) script).size() > 0 && !isIfNameMain(location); + } + + public static boolean isIfNameMain(Location location) { + PsiElement element = location.getPsiElement(); + while (true) { + final PyIfStatement ifStatement = PsiTreeUtil.getParentOfType(element, PyIfStatement.class); + if (ifStatement == null) { + break; + } + element = ifStatement; + } + if (element instanceof PyIfStatement) { + PyIfStatement ifStatement = (PyIfStatement)element; + final PyExpression condition = ifStatement.getIfPart().getCondition(); + if (condition instanceof PyBinaryExpression) { + PyBinaryExpression binaryExpression = (PyBinaryExpression)condition; + final PyExpression rhs = binaryExpression.getRightExpression(); + return binaryExpression.getOperator() == PyTokenTypes.EQEQ && + binaryExpression.getLeftExpression().getText().equals("__name__") && + rhs != null && rhs.getText().contains("__main__"); + } + } + return false; } } diff --git a/python/src/com/jetbrains/python/testing/pytest/PyTestRunnableScriptFilter.java b/python/src/com/jetbrains/python/testing/pytest/PyTestRunnableScriptFilter.java index 7f103f1ad3c8..fd0c37092cd1 100644 --- a/python/src/com/jetbrains/python/testing/pytest/PyTestRunnableScriptFilter.java +++ b/python/src/com/jetbrains/python/testing/pytest/PyTestRunnableScriptFilter.java @@ -1,5 +1,6 @@ package com.jetbrains.python.testing.pytest; +import com.intellij.execution.Location; import com.intellij.openapi.module.Module; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.psi.PsiFile; @@ -15,7 +16,7 @@ import org.jetbrains.annotations.NotNull; * @author yole */ public class PyTestRunnableScriptFilter implements RunnableScriptFilter { - public boolean isRunnableScript(PsiFile script, @NotNull Module module) { + public boolean isRunnableScript(PsiFile script, @NotNull Module module, Location location) { return isPyTestInstalled(module) && isPyTestScript(script); }