taskhandle.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import warnings
  2. from rope.base import exceptions
  3. class TaskHandle(object):
  4. def __init__(self, name='Task', interrupts=True):
  5. """Construct a TaskHandle
  6. If `interrupts` is `False` the task won't be interrupted by
  7. calling `TaskHandle.stop()`.
  8. """
  9. self.name = name
  10. self.interrupts = interrupts
  11. self.stopped = False
  12. self.job_sets = []
  13. self.observers = []
  14. def stop(self):
  15. """Interrupts the refactoring"""
  16. if self.interrupts:
  17. self.stopped = True
  18. self._inform_observers()
  19. def current_jobset(self):
  20. """Return the current `JobSet`"""
  21. if self.job_sets:
  22. return self.job_sets[-1]
  23. def add_observer(self, observer):
  24. """Register an observer for this task handle
  25. The observer is notified whenever the task is stopped or
  26. a job gets finished.
  27. """
  28. self.observers.append(observer)
  29. def is_stopped(self):
  30. return self.stopped
  31. def get_jobsets(self):
  32. return self.job_sets
  33. def create_jobset(self, name='JobSet', count=None):
  34. result = JobSet(self, name=name, count=count)
  35. self.job_sets.append(result)
  36. self._inform_observers()
  37. return result
  38. def _inform_observers(self):
  39. for observer in list(self.observers):
  40. observer()
  41. class JobSet(object):
  42. def __init__(self, handle, name, count):
  43. self.handle = handle
  44. self.name = name
  45. self.count = count
  46. self.done = 0
  47. self.job_name = None
  48. def started_job(self, name):
  49. self.check_status()
  50. self.job_name = name
  51. self.handle._inform_observers()
  52. def finished_job(self):
  53. self.check_status()
  54. self.done += 1
  55. self.handle._inform_observers()
  56. self.job_name = None
  57. def check_status(self):
  58. if self.handle.is_stopped():
  59. raise exceptions.InterruptedTaskError()
  60. def get_active_job_name(self):
  61. return self.job_name
  62. def get_percent_done(self):
  63. if self.count is not None and self.count > 0:
  64. percent = self.done * 100 // self.count
  65. return min(percent, 100)
  66. def get_name(self):
  67. return self.name
  68. class NullTaskHandle(object):
  69. def __init__(self):
  70. pass
  71. def is_stopped(self):
  72. return False
  73. def stop(self):
  74. pass
  75. def create_jobset(self, *args, **kwds):
  76. return NullJobSet()
  77. def get_jobsets(self):
  78. return []
  79. def add_observer(self, observer):
  80. pass
  81. class NullJobSet(object):
  82. def started_job(self, name):
  83. pass
  84. def finished_job(self):
  85. pass
  86. def check_status(self):
  87. pass
  88. def get_active_job_name(self):
  89. pass
  90. def get_percent_done(self):
  91. pass
  92. def get_name(self):
  93. pass