fixmodnames.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. """Fix the name of modules
  2. This module is useful when you want to rename many of the modules in
  3. your project. That can happen specially when you want to change their
  4. naming style.
  5. For instance::
  6. fixer = FixModuleNames(project)
  7. changes = fixer.get_changes(fixer=str.lower)
  8. project.do(changes)
  9. Here it renames all modules and packages to use lower-cased chars.
  10. You can tell it to use any other style by using the ``fixer``
  11. argument.
  12. """
  13. from rope.base import change, taskhandle
  14. from rope.contrib import changestack
  15. from rope.refactor import rename
  16. class FixModuleNames(object):
  17. def __init__(self, project):
  18. self.project = project
  19. def get_changes(self, fixer=str.lower,
  20. task_handle=taskhandle.NullTaskHandle()):
  21. """Fix module names
  22. `fixer` is a function that takes and returns a `str`. Given
  23. the name of a module, it should return the fixed name.
  24. """
  25. stack = changestack.ChangeStack(self.project, 'Fixing module names')
  26. jobset = task_handle.create_jobset('Fixing module names',
  27. self._count_fixes(fixer) + 1)
  28. try:
  29. while True:
  30. for resource in self._tobe_fixed(fixer):
  31. jobset.started_job(resource.path)
  32. renamer = rename.Rename(self.project, resource)
  33. changes = renamer.get_changes(fixer(self._name(resource)))
  34. stack.push(changes)
  35. jobset.finished_job()
  36. break
  37. else:
  38. break
  39. finally:
  40. jobset.started_job('Reverting to original state')
  41. stack.pop_all()
  42. jobset.finished_job()
  43. return stack.merged()
  44. def _count_fixes(self, fixer):
  45. return len(list(self._tobe_fixed(fixer)))
  46. def _tobe_fixed(self, fixer):
  47. for resource in self.project.pycore.get_python_files():
  48. modname = self._name(resource)
  49. if modname != fixer(modname):
  50. yield resource
  51. def _name(self, resource):
  52. modname = resource.name.rsplit('.', 1)[0]
  53. if modname == '__init__':
  54. modname = resource.parent.name
  55. return modname