vContent

Changeset

99:f3b89d7e3e2a
2017-12-07 Paul Boddie raw files shortlog changelog graph Consolidate resolution-related information into a single table.
vRecurrence.py (file)
     1.1 --- a/vRecurrence.py	Mon Dec 04 23:47:37 2017 +0100
     1.2 +++ b/vRecurrence.py	Thu Dec 07 23:11:36 2017 +0100
     1.3 @@ -58,19 +58,37 @@
     1.4  import operator
     1.5  
     1.6  # Frequency levels, specified by FREQ in iCalendar.
     1.7 +# Enumeration levels, employed by BY... qualifiers.
     1.8 +# Labels, employed in string representations of selectors.
     1.9 +# Datetime tuple lengths.
    1.10 +# The first/lowest values at each resolution.
    1.11 +# Parent resolutions, employed for repetition at a lower resolution than selected.
    1.12  
    1.13 -freq_levels = (
    1.14 -    "YEARLY",
    1.15 -    "MONTHLY",
    1.16 -    "WEEKLY",
    1.17 -    None,       # yearday has no equivalent frequency
    1.18 -    None,       # monthday has no equivalent frequency
    1.19 -    "DAILY",
    1.20 -    "HOURLY",
    1.21 -    "MINUTELY",
    1.22 -    "SECONDLY"
    1.23 +resolutions = (
    1.24 +    # Frequency  # Enumeration  # Label      # Length  # First  # Parent
    1.25 +    ("YEARLY",   None,          "YEARS",     1,        0,       None),  # nothing beyond years
    1.26 +    ("MONTHLY",  "BYMONTH",     "MONTHS",    2,        1,       0),     # months -> years
    1.27 +    ("WEEKLY",   "BYWEEKNO",    "WEEKS",     3,        1,       1),     # weeks -> months
    1.28 +    (None,       "BYYEARDAY",   "YEARDAYS",  3,        1,       0),     # yeardays -> years
    1.29 +    (None,       "BYMONTHDAY",  "MONTHDAYS", 3,        1,       1),     # monthdays -> months
    1.30 +    ("DAILY",    "BYDAY",       "DAYS",      3,        1,       2),     # weekdays -> weeks
    1.31 +    ("HOURLY",   "BYHOUR",      "HOURS",     4,        0,       5),     # hours -> days
    1.32 +    ("MINUTELY", "BYMINUTE",    "MINUTES",   5,        0,       6),     # minutes -> hours
    1.33 +    ("SECONDLY", "BYSECOND",    "SECONDS",   6,        0,       7),     # seconds -> minutes
    1.34      )
    1.35  
    1.36 +freq_levels        = map(lambda x: x[0], resolutions)
    1.37 +enum_levels        = map(lambda x: x[1], resolutions)
    1.38 +level_labels       = map(lambda x: x[2], resolutions)
    1.39 +lengths            = map(lambda x: x[3], resolutions)
    1.40 +positions          = map(lambda x: x[3] - 1, resolutions)
    1.41 +firstvalues        = map(lambda x: x[4], resolutions)
    1.42 +enum_parent_levels = map(lambda x: x[5], resolutions)
    1.43 +
    1.44 +# Add labels corresponding to negative indexes.
    1.45 +
    1.46 +level_labels += ("COUNT", "DTSTART")
    1.47 +
    1.48  # Symbols corresponding to resolution levels.
    1.49  
    1.50  YEARS, MONTHS, WEEKS, DAYS, HOURS, MINUTES, SECONDS = 0, 1, 2, 5, 6, 7, 8
    1.51 @@ -83,56 +101,9 @@
    1.52  
    1.53  COUNT, DTSTART, BYSETPOS = -2, -1, None
    1.54  
    1.55 -level_labels = (
    1.56 -    "YEARS", "MONTHS", "WEEKS", "YEARDAYS", "MONTHDAYS", "DAYS", "HOURS",
    1.57 -    "MINUTES", "SECONDS",
    1.58 -
    1.59 -    # Negative indexes.
    1.60 -
    1.61 -    "COUNT", "DTSTART"
    1.62 -    )
    1.63 -
    1.64 -# Enumeration levels, employed by BY... qualifiers.
    1.65 -
    1.66 -enum_levels = (
    1.67 -    None,
    1.68 -    "BYMONTH",
    1.69 -    "BYWEEKNO",
    1.70 -    "BYYEARDAY",
    1.71 -    "BYMONTHDAY",
    1.72 -    "BYDAY",
    1.73 -    "BYHOUR",
    1.74 -    "BYMINUTE",
    1.75 -    "BYSECOND"
    1.76 -    )
    1.77 -
    1.78 -# Map levels to parent levels.
    1.79 -
    1.80 -enum_parent_levels = (
    1.81 -    None,       # nothing beyond years
    1.82 -    0,          # months -> years
    1.83 -    1,          # weeks -> months
    1.84 -    0,          # yeardays -> years
    1.85 -    1,          # monthdays -> months
    1.86 -    2,          # weekdays -> weeks
    1.87 -    5,          # hours -> days
    1.88 -    6,          # minutes -> hours
    1.89 -    7           # seconds -> minutes
    1.90 -    )
    1.91 -
    1.92  # Levels defining days.
    1.93  
    1.94 -daylevels = [2, 3, 4, 5]
    1.95 -
    1.96 -# Map from levels to lengths of datetime tuples.
    1.97 -
    1.98 -lengths = [1, 2, 3, 3, 3, 3, 4, 5, 6]
    1.99 -positions = [l-1 for l in lengths]
   1.100 -
   1.101 -# Define the lowest values at each resolution (years, months, days... hours,
   1.102 -# minutes, seconds).
   1.103 -
   1.104 -firstvalues = [0, 1, 1, 1, 1, 1, 0, 0, 0]
   1.105 +daylevels = map(lambda t: t[0], filter(lambda t: t[1] == 3, enumerate(lengths)))
   1.106  
   1.107  # Map from qualifiers to interval multiples. Here, weeks are defined as 7 days.
   1.108