Skip to content

Commit a2025ba

Browse files
BANG-225: add more corner cases
1 parent 2598217 commit a2025ba

File tree

4 files changed

+26
-21
lines changed

4 files changed

+26
-21
lines changed

flake8_variables_names/ast_helpers.py

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,30 @@
44
from flake8_variables_names.list_helpers import flat
55

66

7-
def extract_name_nodes_from_assignment(assignment_node: ast.Assign) -> List[ast.Name]:
8-
names = []
9-
for target in assignment_node.targets:
10-
if isinstance(target, ast.Name):
11-
names.append(target)
12-
elif isinstance(target, ast.Tuple):
13-
names.extend([dim for dim in target.dims if isinstance(dim, ast.Name)])
14-
return names
7+
def extract_names_from_node(node: Union[ast.expr, ast.stmt]) -> List[ast.Name]:
8+
if isinstance(node, ast.Name):
9+
return [node]
10+
if isinstance(node, ast.Assign):
11+
nodes = []
12+
for target in node.targets:
13+
nodes.extend(extract_names_from_node(target))
14+
return nodes
15+
if isinstance(node, ast.AnnAssign):
16+
return extract_names_from_node(node.target)
17+
if isinstance(node, ast.Starred):
18+
return extract_names_from_node(node.value)
19+
if isinstance(node, ast.Tuple):
20+
nodes = []
21+
for elt in node.elts:
22+
nodes.extend(extract_names_from_node(elt))
23+
return nodes
24+
return []
1525

1626

1727
def get_var_names_from_assignment(
1828
assignment_node: Union[ast.Assign, ast.AnnAssign],
1929
) -> List[Tuple[str, ast.AST]]:
20-
if (
21-
isinstance(assignment_node, ast.AnnAssign)
22-
and isinstance(assignment_node.target, ast.Name)
23-
):
24-
return [(assignment_node.target.id, assignment_node.target)]
25-
elif isinstance(assignment_node, ast.Assign):
26-
return [(n.id, n) for n in extract_name_nodes_from_assignment(assignment_node)]
27-
return []
30+
return [(n.id, n) for n in extract_names_from_node(assignment_node)]
2831

2932

3033
def get_var_names_from_funcdef(funcdef_node: ast.FunctionDef) -> List[Tuple[str, ast.arg]]:
@@ -46,10 +49,8 @@ def get_var_names_from_for(for_node: ast.For) -> List[Tuple[str, ast.AST]]:
4649

4750
def extract_all_variable_names(ast_tree: ast.AST) -> List[Tuple[str, ast.AST]]:
4851
var_info: List[Tuple[str, ast.AST]] = []
49-
assignments = [n for n in ast.walk(ast_tree) if isinstance(n, ast.Assign)]
52+
assignments = [n for n in ast.walk(ast_tree) if isinstance(n, (ast.Assign, ast.AnnAssign))]
5053
var_info += flat([get_var_names_from_assignment(a) for a in assignments])
51-
ann_assignments = [n for n in ast.walk(ast_tree) if isinstance(n, ast.AnnAssign)]
52-
var_info += flat([get_var_names_from_assignment(a) for a in ann_assignments])
5354
funcdefs = [n for n in ast.walk(ast_tree) if isinstance(n, ast.FunctionDef)]
5455
var_info += flat([get_var_names_from_funcdef(f) for f in funcdefs])
5556
fors = [n for n in ast.walk(ast_tree) if isinstance(n, ast.For)]

tests/test_files/ok_names.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
user_id = 23
22
some_email = '[email protected]'
3+
some_normal_name, _ = -1, -2
4+
some_other_name, *_ = -1, -2, -3
5+
some_different_name, *other_different_name = -1, -2, -3

tests/test_files/short_names.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
c = 3
44
i = 4
55
x, y, z = 5, 6, 7
6+
w, *q = 1, 2, 3

tests/test_variables_names.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ def test_ok_good_names():
1313

1414
def test_ok_for_short_names_file():
1515
errors = run_validator_for_test_file('short_names.py', use_strict_mode=True)
16-
assert len(errors) == 7
16+
assert len(errors) == 9
1717
errors = run_validator_for_test_file('short_names.py', use_strict_mode=False)
18-
assert len(errors) == 6
18+
assert len(errors) == 8
1919
assert (
2020
get_error_message(errors[0])
2121
== "VNE001 single letter variable names like 'a' are not allowed"

0 commit comments

Comments
 (0)