# HG changeset patch # User Paul Boddie # Date 1512684696 -3600 # Node ID f3b89d7e3e2a38982eb2c56805b0abe69ec29caf # Parent 28fe0ad38cd487845c6bd5ae04e9117dccfe9a45 Consolidate resolution-related information into a single table. diff -r 28fe0ad38cd4 -r f3b89d7e3e2a vRecurrence.py --- a/vRecurrence.py Mon Dec 04 23:47:37 2017 +0100 +++ b/vRecurrence.py Thu Dec 07 23:11:36 2017 +0100 @@ -58,19 +58,37 @@ import operator # Frequency levels, specified by FREQ in iCalendar. +# Enumeration levels, employed by BY... qualifiers. +# Labels, employed in string representations of selectors. +# Datetime tuple lengths. +# The first/lowest values at each resolution. +# Parent resolutions, employed for repetition at a lower resolution than selected. -freq_levels = ( - "YEARLY", - "MONTHLY", - "WEEKLY", - None, # yearday has no equivalent frequency - None, # monthday has no equivalent frequency - "DAILY", - "HOURLY", - "MINUTELY", - "SECONDLY" +resolutions = ( + # Frequency # Enumeration # Label # Length # First # Parent + ("YEARLY", None, "YEARS", 1, 0, None), # nothing beyond years + ("MONTHLY", "BYMONTH", "MONTHS", 2, 1, 0), # months -> years + ("WEEKLY", "BYWEEKNO", "WEEKS", 3, 1, 1), # weeks -> months + (None, "BYYEARDAY", "YEARDAYS", 3, 1, 0), # yeardays -> years + (None, "BYMONTHDAY", "MONTHDAYS", 3, 1, 1), # monthdays -> months + ("DAILY", "BYDAY", "DAYS", 3, 1, 2), # weekdays -> weeks + ("HOURLY", "BYHOUR", "HOURS", 4, 0, 5), # hours -> days + ("MINUTELY", "BYMINUTE", "MINUTES", 5, 0, 6), # minutes -> hours + ("SECONDLY", "BYSECOND", "SECONDS", 6, 0, 7), # seconds -> minutes ) +freq_levels = map(lambda x: x[0], resolutions) +enum_levels = map(lambda x: x[1], resolutions) +level_labels = map(lambda x: x[2], resolutions) +lengths = map(lambda x: x[3], resolutions) +positions = map(lambda x: x[3] - 1, resolutions) +firstvalues = map(lambda x: x[4], resolutions) +enum_parent_levels = map(lambda x: x[5], resolutions) + +# Add labels corresponding to negative indexes. + +level_labels += ("COUNT", "DTSTART") + # Symbols corresponding to resolution levels. YEARS, MONTHS, WEEKS, DAYS, HOURS, MINUTES, SECONDS = 0, 1, 2, 5, 6, 7, 8 @@ -83,56 +101,9 @@ COUNT, DTSTART, BYSETPOS = -2, -1, None -level_labels = ( - "YEARS", "MONTHS", "WEEKS", "YEARDAYS", "MONTHDAYS", "DAYS", "HOURS", - "MINUTES", "SECONDS", - - # Negative indexes. - - "COUNT", "DTSTART" - ) - -# Enumeration levels, employed by BY... qualifiers. - -enum_levels = ( - None, - "BYMONTH", - "BYWEEKNO", - "BYYEARDAY", - "BYMONTHDAY", - "BYDAY", - "BYHOUR", - "BYMINUTE", - "BYSECOND" - ) - -# Map levels to parent levels. - -enum_parent_levels = ( - None, # nothing beyond years - 0, # months -> years - 1, # weeks -> months - 0, # yeardays -> years - 1, # monthdays -> months - 2, # weekdays -> weeks - 5, # hours -> days - 6, # minutes -> hours - 7 # seconds -> minutes - ) - # Levels defining days. -daylevels = [2, 3, 4, 5] - -# Map from levels to lengths of datetime tuples. - -lengths = [1, 2, 3, 3, 3, 3, 4, 5, 6] -positions = [l-1 for l in lengths] - -# Define the lowest values at each resolution (years, months, days... hours, -# minutes, seconds). - -firstvalues = [0, 1, 1, 1, 1, 1, 0, 0, 0] +daylevels = map(lambda t: t[0], filter(lambda t: t[1] == 3, enumerate(lengths))) # Map from qualifiers to interval multiples. Here, weeks are defined as 7 days.