# HG changeset patch # User Paul Boddie # Date 1512254793 -3600 # Node ID a580c8ccae7346d0c9b7898c1ae6b4803d1acc20 # Parent 89bd11dc92d3b9c4c8547a0227285b14fbb1055f Fixed PositionSelector initialisation for BYSETPOS qualifiers. Fixed missing qualifier information in introduced frequency selectors. Fixed selector ordering. diff -r 89bd11dc92d3 -r a580c8ccae73 vRecurrence.py --- a/vRecurrence.py Sat Dec 02 22:18:51 2017 +0100 +++ b/vRecurrence.py Sat Dec 02 23:46:33 2017 +0100 @@ -304,7 +304,7 @@ for selector in selectors: if isinstance(selector, PositionSelector): - selector.level = max_level + selector.set_level(max_level) selectors.sort(key=selector_sort_key) return selectors @@ -313,21 +313,25 @@ "Produce a sort key for 'selector'." + # Make DTSTART sort later than COUNT. + + if selector.qualifier == "COUNT": + sublevel = 0 + elif selector.qualifier == "DTSTART": + sublevel = 1 + # Make BYSETPOS sort earlier than the enumeration it modifies. + + elif selector.qualifier == "BYSETPOS": + sublevel = 2 + # Other BY... qualifiers sort earlier than selectors at the same resolution # even though such things as "FREQ=HOURLY;BYHOUR=10" do not make much sense. - if not selector.qualifier.startswith("BY"): - sublevel = 2 - elif selector.qualifier != "BYSETPOS": - sublevel = 1 - - # Make DTSTART sort later than COUNT. - - elif selector.qualifier == "DTSTART": - sublevel = 1 + elif selector.qualifier.startswith("BY"): + sublevel = 3 else: - sublevel = 0 + sublevel = 4 return (selector.level, sublevel) @@ -458,8 +462,7 @@ results. Qualifiers are accumulated in order to define a selection. Datetime values - occurring between qualifiers or at the same resolution as qualifiers are - ignored. + occurring at the same resolution as qualifiers are ignored. Any remaining datetime values are introduced as enumerators, provided that they do not conflict with qualifiers. For example, specific day values @@ -549,7 +552,7 @@ """ if isinstance(from_sel, Enum) and level > 0: - repeat = Pattern(level - 1, {"interval" : 1}, None) + repeat = Pattern(level - 1, {"interval" : 1}, freq_levels[level - 1]) l.append(repeat) def get_multiple(qualifier): @@ -1042,7 +1045,14 @@ def __init__(self, level, args, qualifier, selecting=None, first=False): Selector.__init__(self, level, args, qualifier, selecting, first) - self.step = scale(1, level) + if level is not None: + self.set_level(level) + else: + self.step = None + + def set_level(self, level): + self.level = level + self.step = scale(1, self.level) def materialise_items(self, context, start, end, inclusive=False): return PositionIterator(self, context, start, end, inclusive, self.step,