diff --git a/python/src/META-INF/python-core.xml b/python/src/META-INF/python-core.xml index 241b3df18185..e9f9a0ab042a 100644 --- a/python/src/META-INF/python-core.xml +++ b/python/src/META-INF/python-core.xml @@ -326,7 +326,7 @@ - + diff --git a/python/src/com/jetbrains/python/inspections/PyPep8NamingInspection.java b/python/src/com/jetbrains/python/inspections/PyPep8NamingInspection.java index d6eb42f413cb..2b421db54ab6 100644 --- a/python/src/com/jetbrains/python/inspections/PyPep8NamingInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyPep8NamingInspection.java @@ -10,6 +10,9 @@ import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.impl.PyQualifiedName; import com.jetbrains.python.psi.search.PySuperMethodsSearch; +import com.jetbrains.python.psi.types.PyModuleType; +import com.jetbrains.python.psi.types.PyType; +import com.jetbrains.python.psi.types.TypeEvalContext; import com.jetbrains.python.testing.pytest.PyTestUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -48,6 +51,13 @@ public class PyPep8NamingInspection extends PyInspection { for (PyExpression expression : node.getTargets()) { final String name = expression.getName(); if (name == null) continue; + if (expression instanceof PyTargetExpression) { + final PyExpression qualifier = ((PyTargetExpression)expression).getQualifier(); + if (qualifier != null) { + final PyType type = TypeEvalContext.codeAnalysis(node.getContainingFile()).getType(qualifier); + if (type instanceof PyModuleType) return; + } + } if (!LOWERCASE_REGEX.matcher(name).matches() && !name.startsWith("_")) { registerProblem(expression, "Variable in function should be lowercase", new PyRenameElementQuickFix()); } diff --git a/python/testData/inspections/PyPep8NamingInspection/argumentName.py b/python/testData/inspections/PyPep8NamingInspection/argumentName.py new file mode 100644 index 000000000000..2480c417d9ea --- /dev/null +++ b/python/testData/inspections/PyPep8NamingInspection/argumentName.py @@ -0,0 +1 @@ +def do_stuff(a, BCD): pass diff --git a/python/testData/inspections/PyPep8NamingInspection/className.py b/python/testData/inspections/PyPep8NamingInspection/className.py new file mode 100644 index 000000000000..fa6bfed80a72 --- /dev/null +++ b/python/testData/inspections/PyPep8NamingInspection/className.py @@ -0,0 +1,4 @@ + +class A_B: + def foo(self): + pass \ No newline at end of file diff --git a/python/testData/inspections/PyPep8NamingInspection/functionName.py b/python/testData/inspections/PyPep8NamingInspection/functionName.py new file mode 100644 index 000000000000..319fdd5be3b1 --- /dev/null +++ b/python/testData/inspections/PyPep8NamingInspection/functionName.py @@ -0,0 +1 @@ +def doStuff(a): print a diff --git a/python/testData/inspections/PyPep8NamingInspection/functionVariable.py b/python/testData/inspections/PyPep8NamingInspection/functionVariable.py new file mode 100644 index 000000000000..c675903c03eb --- /dev/null +++ b/python/testData/inspections/PyPep8NamingInspection/functionVariable.py @@ -0,0 +1,5 @@ +def do_stuff(): pass + +class A: + def foo(self): + Abc = do_stuff() \ No newline at end of file diff --git a/python/testData/inspections/PyPep8NamingInspection/importCamelAsLower.py b/python/testData/inspections/PyPep8NamingInspection/importCamelAsLower.py new file mode 100644 index 000000000000..94a113921758 --- /dev/null +++ b/python/testData/inspections/PyPep8NamingInspection/importCamelAsLower.py @@ -0,0 +1 @@ +from x import TestX as test diff --git a/python/testData/inspections/PyPep8NamingInspection/importConstant.py b/python/testData/inspections/PyPep8NamingInspection/importConstant.py new file mode 100644 index 000000000000..540871d005c0 --- /dev/null +++ b/python/testData/inspections/PyPep8NamingInspection/importConstant.py @@ -0,0 +1 @@ +from x import TEST as test diff --git a/python/testData/inspections/PyPep8NamingInspection/importLowerAsNonLower.py b/python/testData/inspections/PyPep8NamingInspection/importLowerAsNonLower.py new file mode 100644 index 000000000000..2480236375b9 --- /dev/null +++ b/python/testData/inspections/PyPep8NamingInspection/importLowerAsNonLower.py @@ -0,0 +1 @@ +from x import y as TEST diff --git a/python/testData/inspections/PyPep8NamingInspection/overridden.py b/python/testData/inspections/PyPep8NamingInspection/overridden.py new file mode 100644 index 000000000000..604d76c47de3 --- /dev/null +++ b/python/testData/inspections/PyPep8NamingInspection/overridden.py @@ -0,0 +1,5 @@ +class A: + def fooBar(self): pass + +class B(A): + def fooBar(self): pass \ No newline at end of file diff --git a/python/testData/inspections/PyPep8NamingInspection/overrideFromModule.py b/python/testData/inspections/PyPep8NamingInspection/overrideFromModule.py new file mode 100644 index 000000000000..a3ead11f965a --- /dev/null +++ b/python/testData/inspections/PyPep8NamingInspection/overrideFromModule.py @@ -0,0 +1,5 @@ +import tmp1 + +class A: + def set_up(self): + tmp1.X = do_stuff() \ No newline at end of file diff --git a/python/testData/inspections/PyPep8NamingInspection/test.py b/python/testData/inspections/PyPep8NamingInspection/test.py new file mode 100644 index 000000000000..1f3186c9b0a7 --- /dev/null +++ b/python/testData/inspections/PyPep8NamingInspection/test.py @@ -0,0 +1,5 @@ +from unittest import TestCase + +class TestX(TestCase): + def testFoo(self): + self.assertTrue(True) \ No newline at end of file diff --git a/python/testData/inspections/PyPep8NamingInspection/tmp1.py b/python/testData/inspections/PyPep8NamingInspection/tmp1.py new file mode 100644 index 000000000000..2d23ac672abc --- /dev/null +++ b/python/testData/inspections/PyPep8NamingInspection/tmp1.py @@ -0,0 +1,2 @@ +class X: + pass \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/inspections/PyPep8NamingInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyPep8NamingInspectionTest.java new file mode 100644 index 000000000000..9af026358fb9 --- /dev/null +++ b/python/testSrc/com/jetbrains/python/inspections/PyPep8NamingInspectionTest.java @@ -0,0 +1,58 @@ +package com.jetbrains.python.inspections; + +import com.jetbrains.python.fixtures.PyTestCase; + +/** + * User: ktisha + */ +public class PyPep8NamingInspectionTest extends PyTestCase { + + public void testFunctionVariable() { + doTest(); + } + + public void testClassName() { + doTest(); + } + + public void testArgumentName() { + doTest(); + } + + public void testFunctionName() { + doTest(); + } + + public void testImportConstant() { + doTest(); + } + + public void testImportCamelAsLower() { + doTest(); + } + + public void testImportLowerAsNonLower() { + doTest(); + } + + public void testOverridden() { + doTest(); + } + + public void testTest() { + doTest(); + } + + public void testOverrideFromModule() { + myFixture.configureByFiles("inspections/PyPep8NamingInspection/" + getTestName(true) + ".py", + "inspections/PyPep8NamingInspection/tmp1.py"); + myFixture.enableInspections(PyPep8NamingInspection.class); + myFixture.checkHighlighting(false, false, true); + } + + private void doTest() { + myFixture.configureByFile("inspections/PyPep8NamingInspection/" + getTestName(true) + ".py"); + myFixture.enableInspections(PyPep8NamingInspection.class); + myFixture.checkHighlighting(false, false, true); + } +}