Created
September 27, 2011 22:09
-
-
Save p7k/1246408 to your computer and use it in GitHub Desktop.
rrule converter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from dateutil import parser, rrule | |
class BaseArgConverter(object): | |
def convert_value(self, value): | |
"""convert either a single value or sequence""" | |
sequence = value.split(',') | |
if len(sequence) > 1: | |
return map(self._convert_value, sequence) | |
return self._convert_value(value) | |
class ConstantArgConverter(BaseArgConverter): | |
kwargs = {'freq', 'wkst'} | |
def _convert_value(self, value): | |
return getattr(rrule, value.upper()) | |
class BooleanArgConverter(BaseArgConverter): | |
kwargs = {'cache'} | |
def _convert_value(self, value): | |
return bool(value) | |
class DateTimeArgConverter(BaseArgConverter): | |
kwargs = {'dtstart', 'until'} | |
def _convert_value(self, value): | |
return parser.parse(value) | |
class IntegerArgConverter(BaseArgConverter): | |
kwargs = {'bysetpos', 'bymonth', 'bymonthday', 'byyearday', | |
'byweekno','byweekday', 'byhour', 'byminute', 'bysecond', 'byeaster', | |
'count', 'interval' | |
} | |
def _convert_value(self, value): | |
return int(value) | |
class ArgConverter(object): | |
registry = { | |
ConstantArgConverter, BooleanArgConverter, | |
DateTimeArgConverter, IntegerArgConverter, | |
} | |
def __init__(self): | |
self.arg_to_converter = dict() | |
for converter_class in self.registry: | |
converter = converter_class() | |
for kwarg in converter.kwargs: | |
self.arg_to_converter[kwarg.lower()] = converter | |
def convert(self, kwarg, value): | |
converter = self.arg_to_converter[kwarg.lower()] | |
return converter.convert_value(value) | |
class RruleConverter(object): | |
arg_converter = ArgConverter() | |
def _convert(self, raw_rrule): | |
args_raw = raw_rrule.split(';') | |
rrule_kwargs = dict() | |
for arg_raw in args_raw: | |
kwarg, value = arg_raw.split('=') | |
type_safe_value = self.arg_converter.convert(kwarg, value) | |
rrule_kwargs[kwarg.lower()] = type_safe_value | |
return rrule.rrule(**rrule_kwargs) | |
def convert(self, raw_rrules): | |
if isinstance(raw_rrules, (list, tuple)) and len(raw_rrules) > 1: | |
return map(self._convert, raw_rrules) | |
return self._convert(raw_rrules) | |
if __name__ == '__main__': | |
rrule_converter = RruleConverter() | |
rrule_raw = ['FREQ=DAILY;BYHOUR=10;BYMINUTE=00;UNTIL=20070527T235959', 'FREQ=DAILY;BYHOUR=17;BYMINUTE=00;UNTIL=20070527T235959', 'FREQ=DAILY;INTERVAL=1'] | |
print rrule_converter.convert(rrule_raw) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment