teambition/rrule-go

Changing DTStart not changing iterator

Closed this issue · 5 comments

Hi, Thank you for this. It's been really helpful for us.

One issue I've noticed was that changing the DTStart for an rrule set does not change the actual values generated by the iterator. For example,

package main

import (
    "log"
    "github.com/teambition/rrule-go"
)

func main() {
    log.SetFlags(0)
    ogr := []string{"DTSTART;TZID=America/Los_Angeles:20181115T000000", "RRULE:FREQ=DAILY;INTERVAL=1;WKST=SU;UNTIL=20181118T235959"}
    set, err := rrule.StrSliceToRRuleSet(ogr)
    if err != nil {
	log.Fatalln(err)
    }

    log.Println("Original Recurrence: ", ogr)
    for _, t := range set.All() {
	log.Println(t)
    }

    set.DTStart(set.GetDTStart().AddDate(0, 0, 1))

    log.Println("New Recurrence: ", set.Recurrence())

    for _, t := range set.All() {
	log.Println(t)
    }

    ns, err := rrule.StrSliceToRRuleSet(set.Recurrence())
    if err != nil {
	log.Fatalln(err)
    }

    log.Println("Reparsed Recurrence: ", ns.Recurrence())

    for _, t := range ns.All() {
	log.Println(t)
    }
}

This prints out the following,

Original Recurrence:  [DTSTART;TZID=America/Los_Angeles:20181115T000000 RRULE:FREQ=DAILY;INTERVAL=1;WKST=SU;UNTIL=20181118T235959]
2018-11-15 00:00:00 -0800 PST
2018-11-16 00:00:00 -0800 PST
2018-11-17 00:00:00 -0800 PST
2018-11-18 00:00:00 -0800 PST
New Recurrence:  [DTSTART:TZID=America/Los_Angeles:20181116T000000 RRULE:FREQ=DAILY;INTERVAL=1;WKST=SU;UNTIL=20181118T235959Z]
2018-11-15 00:00:00 -0800 PST
2018-11-16 00:00:00 -0800 PST
2018-11-17 00:00:00 -0800 PST
2018-11-18 00:00:00 -0800 PST
Reparsed Recurrence:  [DTSTART:TZID=America/Los_Angeles:20181116T000000 RRULE:FREQ=DAILY;INTERVAL=1;WKST=SU;UNTIL=20181118T235959Z]
2018-11-16 00:00:00 -0800 PST
2018-11-17 00:00:00 -0800 PST
2018-11-18 00:00:00 -0800 PST

As you can see changing the DTStart changed the recurrence but did not have any impact on the iterator. If this is the expected behaviour, it should be documented. If not I am more than happen to try and fix this.

I can't comment to what the expected functionality is, but I think you can get what you want by using the After method instead.

Something like:

ns.After(time.Now(), false)

and iterating over it that way.

All I am saying is that setting DTStart has changed the output of the Recurrence function but didn't really update the actual rrule set.

I am saying third should be the expected output and the second output is wrong.

And After does not return the same output for more complex rules.

Sorry I reviewed the code again and saw my mistake. I agree that what you are proposing should be the output.

The code actually doesn't use the DTStart to do anything.

Shall I send a PR correcting it?