Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
- #896 patchedast cleanup and refactoring (@lieryan)
- #905 Ignore `node_modules` directories by default when scanning project files and source folders. (@marcoeangeli)
- #933 Add type annotations to project.py (@lieryan)
- #119 Fix IndexError in rename and find occurrences when a `from` import is the last thing in a module without a trailing newline (@mcepl)

# Release 1.15.1

Expand Down
2 changes: 2 additions & 0 deletions rope/base/worder.py
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,8 @@ def is_from_aliased(self, offset):
return False
try:
end = self._find_word_end(offset)
if not self._has_enough_len_for_as(end):
return False
as_end = min(self._find_word_end(end + 1), len(self.code))
as_start = self._find_word_start(as_end)
return self.code[as_start : as_end + 1] == "as"
Expand Down
10 changes: 10 additions & 0 deletions ropetest/codeanalyzetest.py
Original file line number Diff line number Diff line change
Expand Up @@ -507,6 +507,16 @@ def test_is_from_aliased(self):
self._make_offset_annotation(code, word_finder.is_from_aliased),
)

def test_is_from_aliased_at_end_of_file_without_newline(self):
code = "from os import system"
word_finder = worder.Worder(code)
self.assertFalse(word_finder.is_from_aliased(code.index("system")))

def test_is_import_statement_aliased_module_at_end_of_file_without_newline(self):
code = "import os"
word_finder = worder.Worder(code)
self.assertFalse(word_finder.is_import_statement_aliased_module(code.index("os")))

def test_is_from_with_from_import_and_multiline_parens(self):
code = "from mod import \\\n (f,\n g, h)\n"
word_finder = worder.Worder(code)
Expand Down
12 changes: 12 additions & 0 deletions ropetest/refactor/renametest.py
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,18 @@ def new_func():
mod2.read(),
)

def test_renaming_from_import_at_end_of_file_without_newline(self):
mod1 = testutils.create_module(self.project, "mod1")
mod1.write("def a_func():\n pass\n")
mod2 = testutils.create_module(self.project, "mod2")
mod2.write("from mod1 import a_func")
mod3 = testutils.create_module(self.project, "mod3")
mod3.write("from mod2 import a_func\na_func()\n")
self._rename(mod3, mod3.read().rindex("a_func"), "new_func")
self.assertEqual("def new_func():\n pass\n", mod1.read())
self.assertEqual("from mod1 import new_func", mod2.read())
self.assertEqual("from mod2 import new_func\nnew_func()\n", mod3.read())

def test_renaming_functions_across_modules_from_import(self):
mod1 = testutils.create_module(self.project, "mod1")
mod1.write(dedent("""\
Expand Down
Loading