OLD | NEW |
(Empty) | |
| 1 """ |
| 2 Fields represent :class:`~apscheduler.triggers.CronTrigger` options which map |
| 3 to :class:`~datetime.datetime` fields. |
| 4 """ |
| 5 from calendar import monthrange |
| 6 |
| 7 from apscheduler.expressions import * |
| 8 |
| 9 __all__ = ('BaseField', 'WeekField', 'DayOfMonthField', 'DayOfWeekField') |
| 10 |
| 11 MIN_VALUES = {'year': 1970, 'month': 1, 'day': 1, 'week': 1, |
| 12 'day_of_week': 0, 'hour': 0, 'minute': 0, 'second': 0} |
| 13 MAX_VALUES = {'year': 2 ** 63, 'month': 12, 'day:': 31, 'week': 53, |
| 14 'day_of_week': 6, 'hour': 23, 'minute': 59, 'second': 59} |
| 15 |
| 16 class BaseField(object): |
| 17 REAL = True |
| 18 COMPILERS = [AllExpression, RangeExpression] |
| 19 |
| 20 def __init__(self, name, exprs): |
| 21 self.name = name |
| 22 self.compile_expressions(exprs) |
| 23 |
| 24 def get_min(self, dateval): |
| 25 return MIN_VALUES[self.name] |
| 26 |
| 27 def get_max(self, dateval): |
| 28 return MAX_VALUES[self.name] |
| 29 |
| 30 def get_value(self, dateval): |
| 31 return getattr(dateval, self.name) |
| 32 |
| 33 def get_next_value(self, dateval): |
| 34 smallest = None |
| 35 for expr in self.expressions: |
| 36 value = expr.get_next_value(dateval, self) |
| 37 if smallest is None or (value is not None and value < smallest): |
| 38 smallest = value |
| 39 |
| 40 return smallest |
| 41 |
| 42 def compile_expressions(self, exprs): |
| 43 self.expressions = [] |
| 44 |
| 45 # Split a comma-separated expression list, if any |
| 46 exprs = str(exprs).strip() |
| 47 if ',' in exprs: |
| 48 for expr in exprs.split(','): |
| 49 self.compile_expression(expr) |
| 50 else: |
| 51 self.compile_expression(exprs) |
| 52 |
| 53 def compile_expression(self, expr): |
| 54 for compiler in self.COMPILERS: |
| 55 match = compiler.value_re.match(expr) |
| 56 if match: |
| 57 compiled_expr = compiler(**match.groupdict()) |
| 58 self.expressions.append(compiled_expr) |
| 59 return |
| 60 |
| 61 raise ValueError('Unrecognized expression "%s" for field "%s"' % |
| 62 (expr, self.name)) |
| 63 |
| 64 def __str__(self): |
| 65 expr_strings = (str(e) for e in self.expressions) |
| 66 return ','.join(expr_strings) |
| 67 |
| 68 def __repr__(self): |
| 69 return "%s('%s', '%s')" % (self.__class__.__name__, self.name, |
| 70 str(self)) |
| 71 |
| 72 |
| 73 class WeekField(BaseField): |
| 74 REAL = False |
| 75 |
| 76 def get_value(self, dateval): |
| 77 return dateval.isocalendar()[1] |
| 78 |
| 79 |
| 80 class DayOfMonthField(BaseField): |
| 81 COMPILERS = BaseField.COMPILERS + [WeekdayPositionExpression] |
| 82 |
| 83 def get_max(self, dateval): |
| 84 return monthrange(dateval.year, dateval.month)[1] |
| 85 |
| 86 |
| 87 class DayOfWeekField(BaseField): |
| 88 REAL = False |
| 89 COMPILERS = BaseField.COMPILERS + [WeekdayRangeExpression] |
| 90 |
| 91 def get_value(self, dateval): |
| 92 return dateval.weekday() |
OLD | NEW |