Skip to content

Commit 9d199f1

Browse files
author
Daniel Patrick
committed
Ignore TypedDict attribute casing
1 parent 407fa0c commit 9d199f1

File tree

2 files changed

+31
-12
lines changed

2 files changed

+31
-12
lines changed

src/pep8ext_naming.py

+19-12
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ def visit_tree(self, node):
202202
def visit_node(self, node):
203203
if isinstance(node, ast.ClassDef):
204204
self.tag_class_functions(node)
205+
self.tag_class_superclasses(node)
205206
elif isinstance(node, FUNC_NODES):
206207
self.find_global_defs(node)
207208

@@ -264,6 +265,11 @@ def set_function_nodes_types(self, nodes, ismetaclass, late_decoration):
264265
node.function_type = self.decorator_to_type[name]
265266
break
266267

268+
def tag_class_superclasses(self, cls_node):
269+
cls_node.superclasses = self.superclass_names(
270+
cls_node.name, self.parents
271+
)
272+
267273
@classmethod
268274
def find_decorator_name(cls, d):
269275
if isinstance(d, ast.Name):
@@ -286,16 +292,6 @@ def find_global_defs(func_def_node):
286292
nodes_to_check.extend(iter_child_nodes(node))
287293
func_def_node.global_names = global_names
288294

289-
290-
class ClassNameCheck(BaseASTCheck):
291-
"""
292-
Almost without exception, class names use the CapWords convention.
293-
294-
Classes for internal use have a leading underscore in addition.
295-
"""
296-
N801 = "class name '{name}' should use CapWords convention"
297-
N818 = "exception name '{name}' should be named with an Error suffix"
298-
299295
@classmethod
300296
def get_classdef(cls, name, parents):
301297
for parent in parents:
@@ -315,15 +311,24 @@ def superclass_names(cls, name, parents, _names=None):
315311
names.update(cls.superclass_names(base.id, parents, names))
316312
return names
317313

314+
315+
class ClassNameCheck(BaseASTCheck):
316+
"""
317+
Almost without exception, class names use the CapWords convention.
318+
319+
Classes for internal use have a leading underscore in addition.
320+
"""
321+
N801 = "class name '{name}' should use CapWords convention"
322+
N818 = "exception name '{name}' should be named with an Error suffix"
323+
318324
def visit_classdef(self, node, parents, ignore=None):
319325
name = node.name
320326
if _ignored(name, ignore):
321327
return
322328
name = name.strip('_')
323329
if not name[:1].isupper() or '_' in name:
324330
yield self.err(node, 'N801', name=name)
325-
superclasses = self.superclass_names(name, parents)
326-
if "Exception" in superclasses and not name.endswith("Error"):
331+
if "Exception" in node.superclasses and not name.endswith("Error"):
327332
yield self.err(node, 'N818', name=name)
328333

329334

@@ -448,6 +453,8 @@ class VariablesCheck(BaseASTCheck):
448453
def _find_errors(self, assignment_target, parents, ignore):
449454
for parent_func in reversed(parents):
450455
if isinstance(parent_func, ast.ClassDef):
456+
if "TypedDict" in parent_func.superclasses:
457+
return
451458
checker = self.class_variable_check
452459
break
453460
if isinstance(parent_func, FUNC_NODES):

testsuite/N815_py38.py

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# python_version >= '3.8'
2+
#: Okay
3+
class MyDict(TypedDict):
4+
mixedCase: str
5+
class MyOtherDict(MyDict):
6+
more_Mixed_Case: str
7+
#: N815
8+
class TypedDict:
9+
mixedCase: str
10+
#: N815
11+
class TypedDict:
12+
more_Mixed_Case: str

0 commit comments

Comments
 (0)