Repository navigation
Expand file tree
/
Copy pathrequire_descriptive_name.py
More file actions
88 lines (76 loc) · 1.95 KB
/
Copy pathrequire_descriptive_name.py
File metadata and controls
88 lines (76 loc) · 1.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
from __future__ import annotations
from typing import TYPE_CHECKING
from fixit import Invalid, Valid
from algorithms_keeper.parser import lint_rule
if TYPE_CHECKING:
import libcst as cst
MESSAGE: str = "Please provide descriptive name for the {nodetype}: `{nodename}`"
class RequireDescriptiveNameRule(lint_rule.ReviewLintRule):
VALID = [
Valid(
"""
class DescriptiveName:
pass
"""
),
Valid(
"""
class ThisClass:
def this_method(self):
pass
"""
),
Valid(
"""
def descriptive_function():
pass
"""
),
Valid(
"""
def function(descriptive, parameter):
pass
"""
),
]
INVALID = [
Invalid(
"""
class T:
pass
"""
),
Invalid(
"""
class ThisClass:
def m(self):
pass
"""
),
Invalid(
"""
def f():
pass
"""
),
Invalid(
"""
def fun(a):
pass
"""
),
]
def visit_ClassDef(self, node: cst.ClassDef) -> None:
self._validate_name_length(node, "class")
def visit_FunctionDef(self, node: cst.FunctionDef) -> None:
self._validate_name_length(node, "function")
def visit_Param(self, node: cst.Param) -> None:
self._validate_name_length(node, "parameter")
def _validate_name_length(
self, node: cst.ClassDef | cst.FunctionDef | cst.Param, nodetype: str
) -> None:
nodename = node.name.value
if len(nodename) == 1:
self.report(
node, message=MESSAGE.format(nodetype=nodetype, nodename=nodename)
)