mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
don't create unittest run configuration inside "if __name__ == '__main__'" block (PY-877)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<RunnableScriptFilter> EP_NAME = ExtensionPointName.create("Pythonid.runnableScriptFilter");
|
||||
|
||||
boolean isRunnableScript(PsiFile script, @NotNull Module module);
|
||||
boolean isRunnableScript(PsiFile script, @NotNull Module module, Location location);
|
||||
}
|
||||
|
||||
@@ -52,6 +52,10 @@ public class PythonUnitTestConfigurationProducer extends RuntimeConfigurationPro
|
||||
}
|
||||
}
|
||||
|
||||
if (PythonUnitTestRunnableScriptFilter.isIfNameMain(location)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
settings = createConfigurationFromFolder(location);
|
||||
if (settings != null) return settings;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user