From bd8acfdea25486e71e4f19ff0703ef59d5ba5dfa Mon Sep 17 00:00:00 2001 From: Stuart Skelton Date: Tue, 1 Aug 2017 12:43:30 +0100 Subject: Make the exact date take a filterOn parameter --- todolist/date_filter.go | 20 ++++++++++++-------- todolist/date_filter_test.go | 4 ++-- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/todolist/date_filter.go b/todolist/date_filter.go index cccd869..a43e3c8 100644 --- a/todolist/date_filter.go +++ b/todolist/date_filter.go @@ -14,6 +14,10 @@ func NewDateFilter(todos []*Todo) *DateFilter { return &DateFilter{Todos: todos, Location: time.Now().Location()} } +func filterOnDue(todo *Todo) string { + return todo.Due +} + func (f *DateFilter) FilterDate(input string) []*Todo { agendaRegex, _ := regexp.Compile(`agenda.*$`) if agendaRegex.MatchString(input) { @@ -24,9 +28,9 @@ func (f *DateFilter) FilterDate(input string) []*Todo { match := r.FindString(input) switch { case match == "due tod" || match == "due today": - return f.filterToday(bod(time.Now())) + return f.filterDueToday(bod(time.Now())) case match == "due tom" || match == "due tomorrow": - return f.filterTomorrow(bod(time.Now())) + return f.filterDueTomorrow(bod(time.Now())) case match == "due sun" || match == "due sunday": return f.filterDay(bod(time.Now()), time.Sunday) case match == "due mon" || match == "due monday": @@ -68,23 +72,23 @@ func (f *DateFilter) filterAgenda(pivot time.Time) []*Todo { return ret } -func (f *DateFilter) filterToExactDate(pivot time.Time) []*Todo { +func (f *DateFilter) filterToExactDate(pivot time.Time, filterOn func(*Todo) string) []*Todo { var ret []*Todo for _, todo := range f.Todos { - if todo.Due == pivot.Format("2006-01-02") { + if filterOn(todo) == pivot.Format("2006-01-02") { ret = append(ret, todo) } } return ret } -func (f *DateFilter) filterToday(pivot time.Time) []*Todo { - return f.filterToExactDate(pivot) +func (f *DateFilter) filterDueToday(pivot time.Time) []*Todo { + return f.filterToExactDate(pivot, filterOnDue) } -func (f *DateFilter) filterTomorrow(pivot time.Time) []*Todo { +func (f *DateFilter) filterDueTomorrow(pivot time.Time) []*Todo { pivot = pivot.AddDate(0, 0, 1) - return f.filterToExactDate(pivot) + return f.filterToExactDate(pivot, filterOnDue) } func (f *DateFilter) filterDay(pivot time.Time, day time.Weekday) []*Todo { diff --git a/todolist/date_filter_test.go b/todolist/date_filter_test.go index 6dd88f6..a89e27f 100644 --- a/todolist/date_filter_test.go +++ b/todolist/date_filter_test.go @@ -17,7 +17,7 @@ func TestFilterToday(t *testing.T) { todos = append(todos, tomorrowTodo) filter := NewDateFilter(todos) - filtered := filter.filterToday(time.Now()) + filtered := filter.filterDueToday(time.Now()) assert.Equal(1, len(filtered)) assert.Equal(1, filtered[0].Id) @@ -33,7 +33,7 @@ func TestFilterTomorrow(t *testing.T) { todos = append(todos, tomorrowTodo) filter := NewDateFilter(todos) - filtered := filter.filterTomorrow(time.Now()) + filtered := filter.filterDueTomorrow(time.Now()) assert.Equal(1, len(filtered)) assert.Equal(2, filtered[0].Id) -- cgit v1.3 From 650d53a6000a483e11da91b3466e1f57a96c3da0 Mon Sep 17 00:00:00 2001 From: Stuart Skelton Date: Tue, 1 Aug 2017 13:51:31 +0100 Subject: Added a filter for completed date --- todolist/date_filter.go | 34 ++++++++++++++++++++++++--- todolist/date_filter_test.go | 56 ++++++++++++++++++++++++++++++++++++++++++++ todolist/todo_item.go | 7 +++++- 3 files changed, 93 insertions(+), 4 deletions(-) diff --git a/todolist/date_filter.go b/todolist/date_filter.go index a43e3c8..b91bee3 100644 --- a/todolist/date_filter.go +++ b/todolist/date_filter.go @@ -18,12 +18,17 @@ func filterOnDue(todo *Todo) string { return todo.Due } +func filterOnCompletedDate(todo *Todo) string { + return todo.CompletedDateToDate() +} + func (f *DateFilter) FilterDate(input string) []*Todo { agendaRegex, _ := regexp.Compile(`agenda.*$`) if agendaRegex.MatchString(input) { return f.filterAgenda(bod(time.Now())) } + // filter due items r, _ := regexp.Compile(`due .*$`) match := r.FindString(input) switch { @@ -54,6 +59,17 @@ func (f *DateFilter) FilterDate(input string) []*Todo { case match == "overdue": return f.filterOverdue(bod(time.Now())) } + + // filter completed items + r, _ = regexp.Compile(`completed .*$`) + match = r.FindString(input) + switch { + case match == "completed tod" || match == "completed today": + return f.filterCompletedToday(bod(time.Now())) + case match == "completed this week": + return f.filterCompletedThisWeek(bod(time.Now())) + } + return f.Todos } @@ -91,6 +107,10 @@ func (f *DateFilter) filterDueTomorrow(pivot time.Time) []*Todo { return f.filterToExactDate(pivot, filterOnDue) } +func (f *DateFilter) filterCompletedToday(pivot time.Time) []*Todo { + return f.filterToExactDate(pivot, filterOnCompletedDate) +} + func (f *DateFilter) filterDay(pivot time.Time, day time.Weekday) []*Todo { var ret []*Todo filtered := f.filterThisWeek(pivot) @@ -104,11 +124,11 @@ func (f *DateFilter) filterDay(pivot time.Time, day time.Weekday) []*Todo { return ret } -func (f *DateFilter) filterBetweenDatesInclusive(begin, end time.Time) []*Todo { +func (f *DateFilter) filterBetweenDatesInclusive(begin, end time.Time, filterOn func(*Todo) string) []*Todo { var ret []*Todo for _, todo := range f.Todos { - dueTime, _ := time.ParseInLocation("2006-01-02", todo.Due, f.Location) + dueTime, _ := time.ParseInLocation("2006-01-02", filterOn(todo), f.Location) if (begin.Before(dueTime) || begin.Equal(dueTime)) && end.After(dueTime) { ret = append(ret, todo) } @@ -121,7 +141,15 @@ func (f *DateFilter) filterThisWeek(pivot time.Time) []*Todo { begin := bod(f.FindSunday(pivot)) end := begin.AddDate(0, 0, 7) - return f.filterBetweenDatesInclusive(begin, end) + return f.filterBetweenDatesInclusive(begin, end, filterOnDue) +} + +func (f *DateFilter) filterCompletedThisWeek(pivot time.Time) []*Todo { + + begin := bod(f.FindSunday(pivot)) + end := begin.AddDate(0, 0, 7) + + return f.filterBetweenDatesInclusive(begin, end, filterOnCompletedDate) } func (f *DateFilter) filterBetweenDatesExclusive(begin, end time.Time) []*Todo { diff --git a/todolist/date_filter_test.go b/todolist/date_filter_test.go index a89e27f..e2ac570 100644 --- a/todolist/date_filter_test.go +++ b/todolist/date_filter_test.go @@ -39,6 +39,38 @@ func TestFilterTomorrow(t *testing.T) { assert.Equal(2, filtered[0].Id) } +func TestFilterCompletedToday(t *testing.T) { + assert := assert.New(t) + + var todos []*Todo + todoNo1 := &Todo{Id: 1, Subject: "one", Due: time.Now().Format("2006-01-02")} + todoNo2 := &Todo{Id: 2, Subject: "two", Due: time.Now().Format("2006-01-02")} + + todos = append(todos, todoNo1) + todos = append(todos, todoNo2) + + filter := NewDateFilter(todos) + filtered := filter.filterCompletedToday(time.Now()) + + assert.Equal(0, len(filtered)) + + // now to complted one and see see what happens + todoNo1.Complete() + filtered = filter.filterCompletedToday(time.Now()) + + assert.Equal(1, len(filtered)) + assert.Equal(1, filtered[0].Id) + + // now to complted one and see see what happens + todoNo1.Uncomplete() + todoNo2.Complete() + filtered = filter.filterCompletedToday(time.Now()) + + assert.Equal(1, len(filtered)) + assert.Equal(2, filtered[0].Id) + +} + func TestFilterThisWeek(t *testing.T) { assert := assert.New(t) @@ -57,6 +89,30 @@ func TestFilterThisWeek(t *testing.T) { assert.Equal(2, filtered[0].Id) } +func TestFilterCompletedThisWeek(t *testing.T) { + assert := assert.New(t) + + var todos []*Todo + lastWeekTodo := &Todo{Id: 1, Subject: "two", Due: time.Now().AddDate(0, 0, -7).Format("2006-01-02")} + todayTodo := &Todo{Id: 2, Subject: "one", Due: time.Now().Format("2006-01-02")} + nextWeekTodo := &Todo{Id: 3, Subject: "two", Due: time.Now().AddDate(0, 0, 8).Format("2006-01-02")} + todos = append(todos, lastWeekTodo) + todos = append(todos, todayTodo) + todos = append(todos, nextWeekTodo) + + filter := NewDateFilter(todos) + filtered := filter.filterCompletedThisWeek(time.Now()) + + assert.Equal(0, len(filtered)) + + todayTodo.Complete() + filtered = filter.filterCompletedThisWeek(time.Now()) + + assert.Equal(1, len(filtered)) + assert.Equal(2, filtered[0].Id) + +} + func TestFilterOverdue(t *testing.T) { assert := assert.New(t) diff --git a/todolist/todo_item.go b/todolist/todo_item.go index 859e946..eecb409 100644 --- a/todolist/todo_item.go +++ b/todolist/todo_item.go @@ -43,4 +43,9 @@ func (t *Todo) Complete() { func (t *Todo) Uncomplete() { t.Completed = false t.CompletedDate = "" -} \ No newline at end of file +} + +func (t Todo) CompletedDateToDate() string { + parsedTime, _ := time.Parse(ISO8601_TIMESTAMP_FORMAT, t.CompletedDate) + return parsedTime.Format("2006-01-02") +} -- cgit v1.3 From 5c574eb14ea782a27ff17dd4bd484dcb3803aae1 Mon Sep 17 00:00:00 2001 From: Stuart Skelton Date: Tue, 1 Aug 2017 14:15:09 +0100 Subject: Updated the command line docs --- todo.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/todo.go b/todo.go index f9dcd6c..c099fc7 100644 --- a/todo.go +++ b/todo.go @@ -58,6 +58,14 @@ func usage() { yellow.Println("\ttodo agenda") fmt.Println("\tlists all todos where the due date is today or in the past\n") + fmt.Println(" todo l completed (tod|today|this week)") + cyan.Println(" Filtering by date:\n") + + yellow.Println("\ttodo l completed (tod|today)") + fmt.Println("\tlists all todos that were completed today\n") + yellow.Println("\ttodo l completed this week") + fmt.Println("\tlists all todos that were completed this week\n") + cyan.Println(" Grouping:") fmt.Println(" You can group todos by context or project.") yellow.Println("\ttodo l by c") -- cgit v1.3 From dcca10afbb9ae9c132bc7bef4f89630bdddc7e7f Mon Sep 17 00:00:00 2001 From: Stuart Skelton Date: Wed, 2 Aug 2017 19:33:40 +0100 Subject: Do not filter out archived when asked for completed --- todolist/filter.go | 7 +++++++ todolist/filter_test.go | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/todolist/filter.go b/todolist/filter.go index 8c2a7ad..dd61d11 100644 --- a/todolist/filter.go +++ b/todolist/filter.go @@ -31,6 +31,13 @@ func (t *TodoFilter) isFilteringByContexts(input string) bool { } func (f *TodoFilter) filterArchived(input string) []*Todo { + + // do not filter archived if want completed items + completedRegex, _ := regexp.Compile(`completed`) + if completedRegex.MatchString(input) { + return f.Todos + } + r, _ := regexp.Compile(`l archived$`) if r.MatchString(input) { return f.getArchived() diff --git a/todolist/filter_test.go b/todolist/filter_test.go index e4d3fed..c3bedbf 100644 --- a/todolist/filter_test.go +++ b/todolist/filter_test.go @@ -30,6 +30,19 @@ func TestFilterUnarchivedByDefault(t *testing.T) { assert.Equal(false, unarchived[0].Archived) } +func TestFilterShowArchivedWhenWeAskForCompleted(t *testing.T) { + assert := assert.New(t) + store := &FileStore{FileLocation: "todos.json"} + list := &TodoList{} + todos, _ := store.Load() + list.Load(todos) + filter := NewFilter(list.Todos()) + unarchived := filter.filterArchived("completed") + assert.Equal(2, len(unarchived)) + assert.Equal(false, unarchived[0].Archived) + assert.Equal(true, unarchived[1].Archived) +} + func TestGetArchived(t *testing.T) { assert := assert.New(t) store := &FileStore{FileLocation: "todos.json"} -- cgit v1.3 From 810399690f556f4c4eac53d041e1a86d91b890e6 Mon Sep 17 00:00:00 2001 From: Stuart Skelton Date: Wed, 2 Aug 2017 21:05:50 +0100 Subject: Remove some less useful comments. --- todolist/date_filter_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/todolist/date_filter_test.go b/todolist/date_filter_test.go index e2ac570..8078fb3 100644 --- a/todolist/date_filter_test.go +++ b/todolist/date_filter_test.go @@ -54,14 +54,12 @@ func TestFilterCompletedToday(t *testing.T) { assert.Equal(0, len(filtered)) - // now to complted one and see see what happens todoNo1.Complete() filtered = filter.filterCompletedToday(time.Now()) assert.Equal(1, len(filtered)) assert.Equal(1, filtered[0].Id) - // now to complted one and see see what happens todoNo1.Uncomplete() todoNo2.Complete() filtered = filter.filterCompletedToday(time.Now()) -- cgit v1.3