changestack.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. """For performing many refactorings as a single command
  2. `changestack` module can be used to perform many refactorings on top
  3. of each other as one bigger command. It can be used like::
  4. stack = ChangeStack(project, 'my big command')
  5. #..
  6. stack.push(refactoring1.get_changes())
  7. #..
  8. stack.push(refactoring2.get_changes())
  9. #..
  10. stack.push(refactoringX.get_changes())
  11. stack.pop_all()
  12. changes = stack.merged()
  13. Now `changes` can be previewed or performed as before.
  14. """
  15. from rope.base import change
  16. class ChangeStack(object):
  17. def __init__(self, project, description='merged changes'):
  18. self.project = project
  19. self.description = description
  20. self.stack = []
  21. def push(self, changes):
  22. self.stack.append(changes)
  23. self.project.do(changes)
  24. def pop_all(self):
  25. for i in range(len(self.stack)):
  26. self.project.history.undo(drop=True)
  27. def merged(self):
  28. result = change.ChangeSet(self.description)
  29. for changes in self.stack:
  30. for c in self._basic_changes(changes):
  31. result.add_change(c)
  32. return result
  33. def _basic_changes(self, changes):
  34. if isinstance(changes, change.ChangeSet):
  35. for child in changes.changes:
  36. for atom in self._basic_changes(child):
  37. yield atom
  38. else:
  39. yield changes