Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(586)

Unified Diff: third_party/APScheduler/build/lib.linux-x86_64-2.6/apscheduler/expressions.py

Issue 6673078: Initial checkin of media test matrix class, which will be used for media perf test later. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Put APScheduler in third_party directory for Media Performance test. Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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])

Powered by Google App Engine
This is Rietveld 408576698