Path: blob/master/elisp/emacs-for-python/rope-dist/rope/contrib/fixmodnames.py
1494 views
"""Fix the name of modules12This module is useful when you want to rename many of the modules in3your project. That can happen specially when you want to change their4naming style.56For instance::78fixer = FixModuleNames(project)9changes = fixer.get_changes(fixer=str.lower)10project.do(changes)1112Here it renames all modules and packages to use lower-cased chars.13You can tell it to use any other style by using the ``fixer``14argument.1516"""17from rope.base import change, taskhandle18from rope.contrib import changestack19from rope.refactor import rename202122class FixModuleNames(object):2324def __init__(self, project):25self.project = project2627def get_changes(self, fixer=str.lower,28task_handle=taskhandle.NullTaskHandle()):29"""Fix module names3031`fixer` is a function that takes and returns a `str`. Given32the name of a module, it should return the fixed name.3334"""35stack = changestack.ChangeStack(self.project, 'Fixing module names')36jobset = task_handle.create_jobset('Fixing module names',37self._count_fixes(fixer) + 1)38try:39while True:40for resource in self._tobe_fixed(fixer):41jobset.started_job(resource.path)42renamer = rename.Rename(self.project, resource)43changes = renamer.get_changes(fixer(self._name(resource)))44stack.push(changes)45jobset.finished_job()46break47else:48break49finally:50jobset.started_job('Reverting to original state')51stack.pop_all()52jobset.finished_job()53return stack.merged()5455def _count_fixes(self, fixer):56return len(list(self._tobe_fixed(fixer)))5758def _tobe_fixed(self, fixer):59for resource in self.project.pycore.get_python_files():60modname = self._name(resource)61if modname != fixer(modname):62yield resource6364def _name(self, resource):65modname = resource.name.rsplit('.', 1)[0]66if modname == '__init__':67modname = resource.parent.name68return modname697071