states.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. """
  2. States
  3. ------
  4. .. data:: PENDING
  5. Task is waiting for execution or unknown.
  6. .. data:: STARTED
  7. Task has been started.
  8. .. data:: SUCCESS
  9. Task has been successfully executed.
  10. .. data:: FAILURE
  11. Task execution resulted in failure.
  12. .. data:: RETRY
  13. Task is being retried.
  14. .. data:: REVOKED
  15. Task has been revoked.
  16. Sets
  17. ----
  18. .. data:: READY_STATES
  19. Set of states meaning the task result is ready (has been executed).
  20. .. data:: UNREADY_STATES
  21. Set of states meaning the task result is not ready (has not been executed).
  22. .. data:: EXCEPTION_STATES
  23. Set of states meaning the task returned an exception.
  24. .. data:: PROPAGATE_STATES
  25. Set of exception states that should propagate exceptions to the user.
  26. .. data:: ALL_STATES
  27. Set of all possible states.
  28. """
  29. ## State precedence.
  30. # None represents the precedence of an unknown state.
  31. # Lower index means higher precedence.
  32. PRECEDENCE = ["SUCCESS",
  33. "FAILURE",
  34. None,
  35. "REVOKED",
  36. "STARTED",
  37. "RECEIVED",
  38. "PENDING"]
  39. def precedence(state):
  40. """Get the precedence index for state.
  41. Lower index means higher precedence.
  42. """
  43. try:
  44. return PRECEDENCE.index(state)
  45. except ValueError:
  46. return PRECEDENCE.index(None)
  47. class state(str):
  48. """State is a subclass of :class:`str`, implementing comparison
  49. methods adhering to state precedence rules."""
  50. def compare(self, other, fun, default=False):
  51. return fun(precedence(self), precedence(other))
  52. def __gt__(self, other):
  53. return self.compare(other, lambda a, b: a < b, True)
  54. def __ge__(self, other):
  55. return self.compare(other, lambda a, b: a <= b, True)
  56. def __lt__(self, other):
  57. return self.compare(other, lambda a, b: a > b, False)
  58. def __le__(self, other):
  59. return self.compare(other, lambda a, b: a >= b, False)
  60. PENDING = "PENDING"
  61. RECEIVED = "RECEIVED"
  62. STARTED = "STARTED"
  63. SUCCESS = "SUCCESS"
  64. FAILURE = "FAILURE"
  65. REVOKED = "REVOKED"
  66. RETRY = "RETRY"
  67. READY_STATES = frozenset([SUCCESS, FAILURE, REVOKED])
  68. UNREADY_STATES = frozenset([PENDING, RECEIVED, STARTED, RETRY])
  69. EXCEPTION_STATES = frozenset([RETRY, FAILURE, REVOKED])
  70. PROPAGATE_STATES = frozenset([FAILURE, REVOKED])
  71. ALL_STATES = frozenset([PENDING, RECEIVED, STARTED,
  72. SUCCESS, FAILURE, RETRY, REVOKED])