def get_next_fire_time(self, start_date): if self.start_date: start_date = max(start_date, self.start_date) next_date = datetime_ceil(start_date) fieldnum = 0 while 0 <= fieldnum < len(self.fields): field = self.fields[fieldnum] curr_value = field.get_value(next_date) next_value = field.get_next_value(next_date) if next_value is None: # No valid value was found next_date, fieldnum = self._increment_field_value(next_date, fieldnum - 1) elif next_value > curr_value: # A valid, but higher than the starting value, was found if field.REAL: next_date = self._set_field_value(next_date, fieldnum, next_value) fieldnum += 1 else: next_date, fieldnum = self._increment_field_value(next_date, fieldnum) else: # A valid value was found, no changes necessary fieldnum += 1 if fieldnum >= 0: return next_date
def get_next_fire_time(self, previous_fire_time, now): if previous_fire_time: start_date = min(now, previous_fire_time + timedelta(microseconds=1)) if start_date == previous_fire_time: start_date += timedelta(microseconds=1) else: start_date = max(now, self.start_date) if self.start_date else now fieldnum = 0 next_date = datetime_ceil(start_date).astimezone(self.timezone) while 0 <= fieldnum < len(self.fields): field = self.fields[fieldnum] curr_value = field.get_value(next_date) next_value = field.get_next_value(next_date) if next_value is None: # No valid value was found next_date, fieldnum = self._increment_field_value(next_date, fieldnum - 1) elif next_value > curr_value: # A valid, but higher than the starting value, was found if field.REAL: next_date = self._set_field_value(next_date, fieldnum, next_value) fieldnum += 1 else: next_date, fieldnum = self._increment_field_value(next_date, fieldnum) else: # A valid value was found, no changes necessary fieldnum += 1 # Return if the date has rolled past the end date if self.end_date and next_date > self.end_date: return None if fieldnum >= 0: return next_date
def get_next_fire_time(self, start_date): if self.start_date: start_date = max(start_date, self.start_date) next_date = datetime_ceil(start_date) fieldnum = 0 while 0 <= fieldnum < len(self.fields): field = self.fields[fieldnum] curr_value = field.get_value(next_date) next_value = field.get_next_value(next_date) if next_value is None: # No valid value was found next_date, fieldnum = self._increment_field_value( next_date, fieldnum - 1) elif next_value > curr_value: # A valid, but higher than the starting value, was found if field.REAL: next_date = self._set_field_value( next_date, fieldnum, next_value) fieldnum += 1 else: next_date, fieldnum = self._increment_field_value( next_date, fieldnum) else: # A valid value was found, no changes necessary fieldnum += 1 if fieldnum >= 0: return next_date
def get_next_fire_time(self, previous_fire_time, now): if previous_fire_time: start_date = min(now, previous_fire_time + timedelta(microseconds=1)) if start_date == previous_fire_time: start_date += timedelta(microseconds=1) else: start_date = max(now, self.start_date) if self.start_date else now fieldnum = 0 next_date = datetime_ceil(start_date).astimezone(self.timezone) while 0 <= fieldnum < len(self.fields): field = self.fields[fieldnum] curr_value = field.get_value(next_date) next_value = field.get_next_value(next_date) if next_value is None: # No valid value was found next_date, fieldnum = self._increment_field_value( next_date, fieldnum - 1) elif next_value > curr_value: # A valid, but higher than the starting value, was found if field.REAL: try: next_date = self._set_field_value( next_date, fieldnum, next_value) fieldnum += 1 except NonExistentTimeError: # Skip this field value next_date, fieldnum = self._increment_field_value( next_date, fieldnum) except AmbiguousTimeError: # Try this datetime with DST set unless it's earlier than start_date, # in which case don't set DST next_date = self._set_field_value(next_date, fieldnum, next_value, is_dst=True) if next_date < start_date: next_date = self._set_field_value(next_date, fieldnum, next_value, is_dst=False) fieldnum += 1 else: next_date, fieldnum = self._increment_field_value( next_date, fieldnum) else: # A valid value was found, no changes necessary fieldnum += 1 # Return if the date has rolled past the end date if self.end_date and next_date > self.end_date: return None if fieldnum >= 0: next_date = self._apply_jitter(next_date, self.jitter, now) return min(next_date, self.end_date) if self.end_date else next_date
def get_next_fire_time(self, previous_fire_time, now): if previous_fire_time: start_date = min(now, previous_fire_time + timedelta(microseconds=1)) if start_date == previous_fire_time: start_date += timedelta(microseconds=1) else: start_date = max(now, self.start_date) if self.start_date else now fieldnum = 0 next_date = datetime_ceil(start_date).astimezone(self.timezone) while 0 <= fieldnum < len(self.fields): field = self.fields[fieldnum] curr_value = field.get_value(next_date) next_value = field.get_next_value(next_date) if next_value is None: # No valid value was found next_date, fieldnum = self._increment_field_value(next_date, fieldnum - 1) elif next_value > curr_value: # A valid, but higher than the starting value, was found if field.REAL: try: next_date = self._set_field_value(next_date, fieldnum, next_value) fieldnum += 1 except NonExistentTimeError: # Skip this field value next_date, fieldnum = self._increment_field_value(next_date, fieldnum) except AmbiguousTimeError: # Try this datetime with DST set unless it's earlier than start_date, # in which case don't set DST next_date = self._set_field_value(next_date, fieldnum, next_value, is_dst=True) if next_date < start_date: next_date = self._set_field_value(next_date, fieldnum, next_value, is_dst=False) fieldnum += 1 else: next_date, fieldnum = self._increment_field_value(next_date, fieldnum) else: # A valid value was found, no changes necessary fieldnum += 1 # Return if the date has rolled past the end date if self.end_date and next_date > self.end_date: return None if fieldnum >= 0: next_date = self._apply_jitter(next_date, self.jitter, now) return min(next_date, self.end_date) if self.end_date else next_date
def test_datetime_ceil(input, expected): assert datetime_ceil(input) == expected