From ef5c57e907f3acc6b854136612f6633164c93555 Mon Sep 17 00:00:00 2001 From: wangjohn Date: Tue, 13 Mar 2018 12:24:10 -0700 Subject: [PATCH 1/5] Create rrule.Set.String() method. --- rruleset.go | 19 +++++++++++++++++++ rruleset_test.go | 27 +++++++++++++++++++++++++++ str.go | 8 ++++++-- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/rruleset.go b/rruleset.go index 294753d..ed2e75d 100644 --- a/rruleset.go +++ b/rruleset.go @@ -1,7 +1,9 @@ package rrule import ( + "fmt" "sort" + "strings" "time" ) @@ -13,6 +15,23 @@ type Set struct { exdate []time.Time } +func (set *Set) String() string { + res := []string{} + for _, o := range set.rrule { + res = append(res, fmt.Sprintf("RRULE:%v", o.String())) + } + for _, o := range set.rdate { + res = append(res, fmt.Sprintf("RDATE:%v", o.Format(strformat))) + } + for _, o := range set.exrule { + res = append(res, fmt.Sprintf("EXRULE:%v", o.String())) + } + for _, o := range set.exdate { + res = append(res, fmt.Sprintf("EXDATE:%v", o.Format(strformat))) + } + return strings.Join(res, "\n") +} + // RRule include the given rrule instance in the recurrence set generation. func (set *Set) RRule(rrule *RRule) { set.rrule = append(set.rrule, rrule) diff --git a/rruleset_test.go b/rruleset_test.go index 7c58a28..0676347 100644 --- a/rruleset_test.go +++ b/rruleset_test.go @@ -22,6 +22,33 @@ func TestSet(t *testing.T) { } } +func TestSetString(t *testing.T) { + set := Set{} + r, _ := NewRRule(ROption{Freq: YEARLY, Count: 1, Byweekday: []Weekday{TU}, + Dtstart: time.Date(1997, 9, 2, 9, 0, 0, 0, time.UTC)}) + set.RRule(r) + r, _ = NewRRule(ROption{Freq: YEARLY, Count: 3, Byweekday: []Weekday{TH}, + Dtstart: time.Date(1997, 9, 2, 9, 0, 0, 0, time.UTC)}) + set.ExRule(r) + set.ExDate(time.Date(1997, 9, 4, 9, 0, 0, 0, time.UTC)) + set.ExDate(time.Date(1997, 9, 11, 9, 0, 0, 0, time.UTC)) + set.ExDate(time.Date(1997, 9, 18, 9, 0, 0, 0, time.UTC)) + set.RDate(time.Date(1997, 9, 4, 9, 0, 0, 0, time.UTC)) + set.RDate(time.Date(1997, 9, 9, 9, 0, 0, 0, time.UTC)) + + want := `RRULE:FREQ=YEARLY;DTSTART=19970902T090000Z;COUNT=1;BYDAY=TU +RDATE:19970904T090000Z +RDATE:19970909T090000Z +EXRULE:FREQ=YEARLY;DTSTART=19970902T090000Z;COUNT=3;BYDAY=TH +EXDATE:19970904T090000Z +EXDATE:19970911T090000Z +EXDATE:19970918T090000Z` + value := set.String() + if want != value { + t.Errorf("get %v, want %v", value, want) + } +} + func TestSetDate(t *testing.T) { set := Set{} r, _ := NewRRule(ROption{Freq: YEARLY, Count: 1, Byweekday: []Weekday{TU}, diff --git a/str.go b/str.go index 32256e8..ce5e3e3 100644 --- a/str.go +++ b/str.go @@ -8,12 +8,16 @@ import ( "time" ) +const ( + strformat = "20060102T150405Z" +) + func timeToStr(time time.Time) string { - return time.UTC().Format("20060102T150405Z") + return time.UTC().Format(strformat) } func strToTime(str string) (time.Time, error) { - return time.Parse("20060102T150405Z", str) + return time.Parse(strformat, str) } func (f Frequency) String() string { From fcfd0bab640824cb8f8dfdce6d315f2e6e225d36 Mon Sep 17 00:00:00 2001 From: wangjohn Date: Tue, 13 Mar 2018 13:35:24 -0700 Subject: [PATCH 2/5] Include recurrences for ruleset as well as string representation. --- rruleset.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rruleset.go b/rruleset.go index ed2e75d..db58320 100644 --- a/rruleset.go +++ b/rruleset.go @@ -16,6 +16,11 @@ type Set struct { } func (set *Set) String() string { + res := set.Recurrences() + return strings.Join(res, "\n") +} + +func (set *Set) Recurrences() []string { res := []string{} for _, o := range set.rrule { res = append(res, fmt.Sprintf("RRULE:%v", o.String())) @@ -29,7 +34,7 @@ func (set *Set) String() string { for _, o := range set.exdate { res = append(res, fmt.Sprintf("EXDATE:%v", o.Format(strformat))) } - return strings.Join(res, "\n") + return res } // RRule include the given rrule instance in the recurrence set generation. From f31e0ad1eb837dc7636ad63de532be618a21e8f1 Mon Sep 17 00:00:00 2001 From: wangjohn Date: Tue, 13 Mar 2018 13:40:06 -0700 Subject: [PATCH 3/5] Add test for recurrences --- rruleset_test.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/rruleset_test.go b/rruleset_test.go index 0676347..b934c03 100644 --- a/rruleset_test.go +++ b/rruleset_test.go @@ -49,6 +49,21 @@ EXDATE:19970918T090000Z` } } +func TestSetRecurrences(t *testing.T) { + set := Set{} + r, _ := NewRRule(ROption{Freq: YEARLY, Count: 1, Byweekday: []Weekday{TU}, + Dtstart: time.Date(1997, 9, 2, 9, 0, 0, 0, time.UTC)}) + set.RRule(r) + value := set.Recurrences() + if len(value) != 1 { + t.Errorf("Wrong length for recurrence got=%v want=%v", len(value), 1) + } + want := "RRULE:FREQ=YEARLY;DTSTART=19970902T090000Z;COUNT=1;BYDAY=TU" + if value[0] != want { + t.Errorf("get %v, want %v", value[0], want) + } +} + func TestSetDate(t *testing.T) { set := Set{} r, _ := NewRRule(ROption{Freq: YEARLY, Count: 1, Byweekday: []Weekday{TU}, From e4233f29f810c14e34d1e97eaf28158cc00499f4 Mon Sep 17 00:00:00 2001 From: wangjohn Date: Fri, 16 Mar 2018 23:27:16 -0700 Subject: [PATCH 4/5] Fixes to improve String() function for sets --- rruleset.go | 22 ++++++++-------------- str.go | 5 +++++ 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/rruleset.go b/rruleset.go index db58320..a10e466 100644 --- a/rruleset.go +++ b/rruleset.go @@ -3,7 +3,6 @@ package rrule import ( "fmt" "sort" - "strings" "time" ) @@ -15,24 +14,19 @@ type Set struct { exdate []time.Time } -func (set *Set) String() string { - res := set.Recurrences() - return strings.Join(res, "\n") -} - func (set *Set) Recurrences() []string { res := []string{} - for _, o := range set.rrule { - res = append(res, fmt.Sprintf("RRULE:%v", o.String())) + for _, item := range set.rrule { + res = append(res, fmt.Sprintf("RRULE:%s", item)) } - for _, o := range set.rdate { - res = append(res, fmt.Sprintf("RDATE:%v", o.Format(strformat))) + for _, item := range set.rdate { + res = append(res, fmt.Sprintf("RDATE:%s", timeToStr(item))) } - for _, o := range set.exrule { - res = append(res, fmt.Sprintf("EXRULE:%v", o.String())) + for _, item := range set.exrule { + res = append(res, fmt.Sprintf("EXRULE:%s", item)) } - for _, o := range set.exdate { - res = append(res, fmt.Sprintf("EXDATE:%v", o.Format(strformat))) + for _, item := range set.exdate { + res = append(res, fmt.Sprintf("EXDATE:%s", timeToStr(item))) } return res } diff --git a/str.go b/str.go index ce5e3e3..e50df7d 100644 --- a/str.go +++ b/str.go @@ -204,6 +204,11 @@ func (r *RRule) String() string { return r.OrigOptions.String() } +func (set *Set) String() string { + res := set.Recurrences() + return strings.Join(res, "\n") +} + // StrToRRule converts string to RRule func StrToRRule(rfcString string) (*RRule, error) { option, e := StrToROption(rfcString) From b4f2fd18852b61f66f5ed6357cca97794dec07f8 Mon Sep 17 00:00:00 2001 From: wangjohn Date: Wed, 18 Apr 2018 17:06:11 -0700 Subject: [PATCH 5/5] Rename Set.Recurrences to Set.Reccurence and add a comment. --- rruleset.go | 3 ++- rruleset_test.go | 4 ++-- str.go | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/rruleset.go b/rruleset.go index a10e466..1580d00 100644 --- a/rruleset.go +++ b/rruleset.go @@ -14,7 +14,8 @@ type Set struct { exdate []time.Time } -func (set *Set) Recurrences() []string { +// Recurrence returns a slice of all the recurrence rules for a set +func (set *Set) Recurrence() []string { res := []string{} for _, item := range set.rrule { res = append(res, fmt.Sprintf("RRULE:%s", item)) diff --git a/rruleset_test.go b/rruleset_test.go index b934c03..edab211 100644 --- a/rruleset_test.go +++ b/rruleset_test.go @@ -49,12 +49,12 @@ EXDATE:19970918T090000Z` } } -func TestSetRecurrences(t *testing.T) { +func TestSetRecurrence(t *testing.T) { set := Set{} r, _ := NewRRule(ROption{Freq: YEARLY, Count: 1, Byweekday: []Weekday{TU}, Dtstart: time.Date(1997, 9, 2, 9, 0, 0, 0, time.UTC)}) set.RRule(r) - value := set.Recurrences() + value := set.Recurrence() if len(value) != 1 { t.Errorf("Wrong length for recurrence got=%v want=%v", len(value), 1) } diff --git a/str.go b/str.go index e50df7d..e43b6dc 100644 --- a/str.go +++ b/str.go @@ -205,7 +205,7 @@ func (r *RRule) String() string { } func (set *Set) String() string { - res := set.Recurrences() + res := set.Recurrence() return strings.Join(res, "\n") }