| Index: third_party/APScheduler/build/lib.linux-x86_64-2.6/apscheduler/expressions.py
|
| diff --git a/third_party/APScheduler/build/lib.linux-x86_64-2.6/apscheduler/expressions.py b/third_party/APScheduler/build/lib.linux-x86_64-2.6/apscheduler/expressions.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d19754d1f2ea0da1b6886383995ecfb9a7b5fd8a
|
| --- /dev/null
|
| +++ b/third_party/APScheduler/build/lib.linux-x86_64-2.6/apscheduler/expressions.py
|
| @@ -0,0 +1,176 @@
|
| +"""
|
| +This module contains the expressions applicable for CronTrigger's fields.
|
| +"""
|
| +from calendar import monthrange
|
| +import re
|
| +
|
| +from apscheduler.util import asint
|
| +
|
| +__all__ = ('AllExpression', 'RangeExpression', 'WeekdayRangeExpression',
|
| + 'WeekdayPositionExpression')
|
| +
|
| +WEEKDAYS = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
|
| +
|
| +
|
| +class AllExpression(object):
|
| + value_re = re.compile(r'\*(?:/(?P<step>\d+))?$')
|
| +
|
| + def __init__(self, step=None):
|
| + self.step = asint(step)
|
| + if self.step == 0:
|
| + raise ValueError('Increment must be higher than 0')
|
| +
|
| + def get_next_value(self, date, field):
|
| + start = field.get_value(date)
|
| + minval = field.get_min(date)
|
| + maxval = field.get_max(date)
|
| + start = max(start, minval)
|
| +
|
| + if not self.step:
|
| + next = start
|
| + else:
|
| + distance_to_next = (self.step - (start - minval)) % self.step
|
| + next = start + distance_to_next
|
| +
|
| + if next <= maxval:
|
| + return next
|
| +
|
| + def __str__(self):
|
| + if self.step:
|
| + return '*/%d' % self.step
|
| + return '*'
|
| +
|
| + def __repr__(self):
|
| + return "%s(%s)" % (self.__class__.__name__, self.step)
|
| +
|
| +
|
| +class RangeExpression(AllExpression):
|
| + value_re = re.compile(
|
| + r'(?P<first>\d+)(?:-(?P<last>\d+))?(?:/(?P<step>\d+))?$')
|
| +
|
| + def __init__(self, first, last=None, step=None):
|
| + AllExpression.__init__(self, step)
|
| + first = asint(first)
|
| + last = asint(last)
|
| + if last is None and step is None:
|
| + last = first
|
| + if last is not None and first > last:
|
| + raise ValueError('The minimum value in a range must not be '
|
| + 'higher than the maximum')
|
| + self.first = first
|
| + self.last = last
|
| +
|
| + def get_next_value(self, date, field):
|
| + start = field.get_value(date)
|
| + minval = field.get_min(date)
|
| + maxval = field.get_max(date)
|
| +
|
| + # Apply range limits
|
| + minval = max(minval, self.first)
|
| + if self.last is not None:
|
| + maxval = min(maxval, self.last)
|
| + start = max(start, minval)
|
| +
|
| + if not self.step:
|
| + next = start
|
| + else:
|
| + distance_to_next = (self.step - (start - minval)) % self.step
|
| + next = start + distance_to_next
|
| +
|
| + if next <= maxval:
|
| + return next
|
| +
|
| + def __str__(self):
|
| + if self.last != self.first and self.last is not None:
|
| + range = '%d-%d' % (self.first, self.last)
|
| + else:
|
| + range = str(self.first)
|
| +
|
| + if self.step:
|
| + return '%s/%d' % (range, self.step)
|
| + return range
|
| +
|
| + def __repr__(self):
|
| + args = [str(self.first)]
|
| + if self.last != self.first and self.last is not None or self.step:
|
| + args.append(str(self.last))
|
| + if self.step:
|
| + args.append(str(self.step))
|
| + return "%s(%s)" % (self.__class__.__name__, ', '.join(args))
|
| +
|
| +
|
| +class WeekdayRangeExpression(RangeExpression):
|
| + value_re = re.compile(r'(?P<first>[a-z]+)(?:-(?P<last>[a-z]+))?',
|
| + re.IGNORECASE)
|
| +
|
| + def __init__(self, first, last=None):
|
| + try:
|
| + first_num = WEEKDAYS.index(first.lower())
|
| + except ValueError:
|
| + raise ValueError('Invalid weekday name "%s"' % first)
|
| +
|
| + if last:
|
| + try:
|
| + last_num = WEEKDAYS.index(last.lower())
|
| + except ValueError:
|
| + raise ValueError('Invalid weekday name "%s"' % last)
|
| + else:
|
| + last_num = None
|
| +
|
| + RangeExpression.__init__(self, first_num, last_num)
|
| +
|
| + def __str__(self):
|
| + if self.last != self.first and self.last is not None:
|
| + return '%s-%s' % (WEEKDAYS[self.first], WEEKDAYS[self.last])
|
| + return WEEKDAYS[self.first]
|
| +
|
| + def __repr__(self):
|
| + args = ["'%s'" % WEEKDAYS[self.first]]
|
| + if self.last != self.first and self.last is not None:
|
| + args.append("'%s'" % WEEKDAYS[self.last])
|
| + return "%s(%s)" % (self.__class__.__name__, ', '.join(args))
|
| +
|
| +
|
| +class WeekdayPositionExpression(AllExpression):
|
| + options = ['1st', '2nd', '3rd', '4th', '5th', 'last']
|
| + value_re = re.compile(r'(?P<option_name>%s) +(?P<weekday_name>(?:\d+|\w+))'
|
| + % '|'.join(options), re.IGNORECASE)
|
| +
|
| + def __init__(self, option_name, weekday_name):
|
| + try:
|
| + self.option_num = self.options.index(option_name.lower())
|
| + except ValueError:
|
| + raise ValueError('Invalid weekday position "%s"' % option_name)
|
| +
|
| + try:
|
| + self.weekday = WEEKDAYS.index(weekday_name.lower())
|
| + except ValueError:
|
| + raise ValueError('Invalid weekday name "%s"' % weekday_name)
|
| +
|
| + def get_next_value(self, date, field):
|
| + # Figure out the weekday of the month's first day and the number
|
| + # of days in that month
|
| + first_day_wday, last_day = monthrange(date.year, date.month)
|
| +
|
| + # Calculate which day of the month is the first of the target weekdays
|
| + first_hit_day = self.weekday - first_day_wday + 1
|
| + if first_hit_day <= 0:
|
| + first_hit_day += 7
|
| +
|
| + # Calculate what day of the month the target weekday would be
|
| + if self.option_num < 5:
|
| + target_day = first_hit_day + self.option_num * 7
|
| + else:
|
| + target_day = first_hit_day + ((last_day - first_hit_day) / 7) * 7
|
| +
|
| + if target_day <= last_day and target_day >= date.day:
|
| + return target_day
|
| +
|
| + def __str__(self):
|
| + return '%s %s' % (self.options[self.option_num],
|
| + WEEKDAYS[self.weekday])
|
| +
|
| + def __repr__(self):
|
| + return "%s('%s', '%s')" % (self.__class__.__name__,
|
| + self.options[self.option_num],
|
| + WEEKDAYS[self.weekday])
|
|
|