diff --git a/jedi/api/refactoring.py b/jedi/api/refactoring.py index 5bc3af58..9fbde02f 100644 --- a/jedi/api/refactoring.py +++ b/jedi/api/refactoring.py @@ -1,3 +1,5 @@ +from os.path import dirname, basename, join +import re import difflib from parso import split_lines @@ -54,36 +56,44 @@ class Refactoring(object): Returns ``Iterable[Tuple[str, str]]``. """ - return self._renames + return sorted(self._renames) def get_diff(self): - return ''.join(f.get_diff() for f in self.get_changed_files()) + text = '' + for from_, to in self.get_renames(): + text += 'rename from %s\nrename to %s\n' % (from_, to) + + return text + ''.join(f.get_diff() for f in self.get_changed_files()) def apply(self): - for old, new in self._renames: + for old, new in self.get_renames(): rename(old, new) for f in self.get_changed_files(): f.apply() -def _rename_path(path, new_name): - pass +def _calculate_rename(path, new_name): + name = basename(path) + dir_ = dirname(path) + if name in ('__init__.py', '__init__.pyi'): + parent_dir = dirname(dir_) + return dir_, join(parent_dir, new_name, name) + ending = re.search(r'\.pyi?$', name).group(0) + return path, join(dir_, new_name + ending) def rename(grammar, definitions, new_name): - file_renames = [] + file_renames = set() file_tree_name_map = {} for d in definitions: - if d.type == 'module': - file_renames.append( - (d.module_path, _rename_path(d.module_path, new_name)) - ) + tree_name = d._name.tree_name + if d.type == 'module' and tree_name is None: + file_renames.add(_calculate_rename(d.module_path, new_name)) else: # This private access is ok in a way. It's not public to # protect Jedi users from seeing it. - tree_name = d._name.tree_name if tree_name is not None: fmap = file_tree_name_map.setdefault(d.module_path, {}) fmap[tree_name] = tree_name.prefix + new_name diff --git a/test/refactor.py b/test/refactor.py index 3c263911..555f2071 100644 --- a/test/refactor.py +++ b/test/refactor.py @@ -32,7 +32,7 @@ class RefactoringCase(object): return f_name.replace('.py', '') def calculate_diff(self): - project = jedi.Project(os.path.join(test_dir, 'completion')) + project = jedi.Project(os.path.join(test_dir, 'refactor')) script = jedi.Script(self._code, path=self._path, project=project) refactor_func = getattr(script, self.refactor_type) refactor_object = refactor_func(self._line_nr, self._index, *self._args) diff --git a/test/refactor/import_tree/mod.py b/test/refactor/import_tree/mod.py new file mode 100644 index 00000000..ccb0f5e6 --- /dev/null +++ b/test/refactor/import_tree/mod.py @@ -0,0 +1 @@ +foobar = 3 diff --git a/test/refactor/rename.py b/test/refactor/rename.py index b1ddd22c..db3f7fe9 100644 --- a/test/refactor/rename.py +++ b/test/refactor/rename.py @@ -43,44 +43,35 @@ def y(): some_var = 3 some_var # ----- import -from import_tree.mod1 import foobarbaz +from import_tree.mod import foobar #? 0 renamed -foobarbaz +foobar # +++++ ---- /home/dave/source/jedi/test/completion/import_tree/mod1.py -+++ /home/dave/source/jedi/test/completion/import_tree/mod1.py -@@ -1,5 +1,5 @@ - a = 1 - from import_tree.random import a as c - --foobarbaz = 3.0 -+renamed = 3.0 +--- /home/dave/source/jedi/test/refactor/import_tree/mod.py ++++ /home/dave/source/jedi/test/refactor/import_tree/mod.py +@@ -1,2 +1,2 @@ +-foobar = 3 ++renamed = 3 --- /home/dave/source/jedi/test/refactor/rename.py +++ /home/dave/source/jedi/test/refactor/rename.py @@ -1,4 +1,4 @@ --from import_tree.mod1 import foobarbaz -+from import_tree.mod1 import renamed +-from import_tree.mod import foobar ++from import_tree.mod import renamed #? 0 renamed --foobarbaz +-foobar +renamed # ----- module -from import_tree import mod1 +from import_tree import mod #? 0 renamedm -mod1 +mod # +++++ ---- /home/dave/source/jedi/test/completion/import_tree/mod1.py -+++ /home/dave/source/jedi/test/completion/import_tree/renamedm.py -@@ -1,5 +1,5 @@ - a = 1 - from import_tree.random import a as c - --foobarbaz = 3.0 -+renamed = 3.0 +rename from /home/dave/source/jedi/test/refactor/import_tree/mod.py +rename to /home/dave/source/jedi/test/refactor/import_tree/renamedm.py --- /home/dave/source/jedi/test/refactor/rename.py +++ /home/dave/source/jedi/test/refactor/rename.py @@ -1,4 +1,4 @@ --from import_tree import mod1 +-from import_tree import mod +from import_tree import renamedm #? 0 renamedm --mod1 +-mod +renamedm