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);
+ }
+}