Skip to content

Commit

Permalink
rename: don't leave trailing commas (#1254)
Browse files Browse the repository at this point in the history
When renaming the last element of a `from a import b,c` import, don't leave the trailing comma after `b`
  • Loading branch information
zsol authored Dec 2, 2024
1 parent c05ac74 commit 8c30fce
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 1 deletion.
6 changes: 5 additions & 1 deletion libcst/codemod/commands/rename.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ def leave_ImportFrom(
return updated_node

else:
new_names = []
new_names: list[cst.ImportAlias] = []
for import_alias in names:
alias_name = get_full_name_for_node(import_alias.name)
if alias_name is not None:
Expand Down Expand Up @@ -252,6 +252,10 @@ def leave_ImportFrom(
# This import might be in use elsewhere in the code, so schedule a potential removal.
self.scheduled_removals.add(original_node)
new_names.append(import_alias)
if isinstance(new_names[-1].comma, cst.Comma):
new_names[-1] = new_names[-1].with_changes(
comma=cst.MaybeSentinel.DEFAULT
)

return updated_node.with_changes(names=new_names)
return updated_node
Expand Down
45 changes: 45 additions & 0 deletions libcst/codemod/commands/tests/test_rename.py
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,28 @@ class Foo(d.z):
new_name="d.z",
)

def test_comma_import(self) -> None:
before = """
import a, b, c
class Foo(a.z):
bar: b.bar
baz: c.baz
"""
after = """
import a, b, d
class Foo(a.z):
bar: b.bar
baz: d.baz
"""
self.assertCodemod(
before,
after,
old_name="c.baz",
new_name="d.baz",
)

def test_other_import_froms_untouched(self) -> None:
before = """
from a import b, c, d
Expand All @@ -405,6 +427,29 @@ class Foo(b):
new_name="f.b",
)

def test_comma_import_from(self) -> None:
before = """
from a import b, c, d
class Foo(b):
bar: c.bar
baz: d.baz
"""
after = """
from a import b, c
from f import d
class Foo(b):
bar: c.bar
baz: d.baz
"""
self.assertCodemod(
before,
after,
old_name="a.d",
new_name="f.d",
)

def test_no_removal_of_import_in_use(self) -> None:
before = """
import a
Expand Down

0 comments on commit 8c30fce

Please sign in to comment.