base.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. from abc import ABCMeta, abstractmethod
  2. from datetime import timedelta
  3. import random
  4. import six
  5. class BaseTrigger(six.with_metaclass(ABCMeta)):
  6. """Abstract base class that defines the interface that every trigger must implement."""
  7. __slots__ = ()
  8. @abstractmethod
  9. def get_next_fire_time(self, previous_fire_time, now):
  10. """
  11. Returns the next datetime to fire on, If no such datetime can be calculated, returns
  12. ``None``.
  13. :param datetime.datetime previous_fire_time: the previous time the trigger was fired
  14. :param datetime.datetime now: current datetime
  15. """
  16. def _apply_jitter(self, next_fire_time, jitter, now):
  17. """
  18. Randomize ``next_fire_time`` by adding a random value (the jitter).
  19. :param datetime.datetime|None next_fire_time: next fire time without jitter applied. If
  20. ``None``, returns ``None``.
  21. :param int|None jitter: maximum number of seconds to add to ``next_fire_time``
  22. (if ``None`` or ``0``, returns ``next_fire_time``)
  23. :param datetime.datetime now: current datetime
  24. :return datetime.datetime|None: next fire time with a jitter.
  25. """
  26. if next_fire_time is None or not jitter:
  27. return next_fire_time
  28. return next_fire_time + timedelta(seconds=random.uniform(0, jitter))