diff options
| author | Grant Ammons <gammons@gmail.com> | 2016-05-03 15:02:24 -0400 |
|---|---|---|
| committer | Grant Ammons <gammons@gmail.com> | 2016-05-03 15:02:24 -0400 |
| commit | 017ddfd50eec98e4ee8dd42a1dac800cdb674171 (patch) | |
| tree | db289ebcb7b0aaf4c1e24370a066072688c68724 | |
| parent | 82dbd4a62ac62d97a61386696d992e3400167d97 (diff) | |
Make everything a pointer, add archive completed fn
| -rw-r--r-- | todo.go | 2 | ||||
| -rw-r--r-- | todolist/app.go | 11 | ||||
| -rw-r--r-- | todolist/date_filter.go | 34 | ||||
| -rw-r--r-- | todolist/date_filter_test.go | 34 | ||||
| -rw-r--r-- | todolist/file_store.go | 18 | ||||
| -rw-r--r-- | todolist/file_store_test.go | 2 | ||||
| -rw-r--r-- | todolist/filter.go | 24 | ||||
| -rw-r--r-- | todolist/formatter.go | 2 | ||||
| -rw-r--r-- | todolist/grouper.go | 14 | ||||
| -rw-r--r-- | todolist/store.go | 2 | ||||
| -rw-r--r-- | todolist/util.go | 2 |
11 files changed, 78 insertions, 67 deletions
@@ -112,5 +112,7 @@ func routeInput(command string, input string) { app.ArchiveTodo(input) case command == "uar" || command == "unarchive": app.UnarchiveTodo(input) + case command == "ac": + app.ArchiveCompleted() } } diff --git a/todolist/app.go b/todolist/app.go index af1b367..67acf12 100644 --- a/todolist/app.go +++ b/todolist/app.go @@ -80,6 +80,15 @@ func (a *App) UnarchiveTodo(input string) { } } +func (a *App) ArchiveCompleted() { + for _, todo := range a.TodoStore.Todos() { + if todo.Completed { + todo.Archived = true + } + } + a.TodoStore.Save() +} + func (a *App) ListTodos(input string) { filtered := NewFilter(a.TodoStore.Todos()).Filter(input) grouped := a.getGroups(input, filtered) @@ -99,7 +108,7 @@ func (a *App) getId(input string) int { } } -func (a *App) getGroups(input string, todos []Todo) *GroupedTodos { +func (a *App) getGroups(input string, todos []*Todo) *GroupedTodos { grouper := &Grouper{} contextRegex, _ := regexp.Compile(`by c.*$`) projectRegex, _ := regexp.Compile(`by p.*$`) diff --git a/todolist/date_filter.go b/todolist/date_filter.go index baf2b5a..f027dd9 100644 --- a/todolist/date_filter.go +++ b/todolist/date_filter.go @@ -8,14 +8,14 @@ import ( ) type DateFilter struct { - Todos []Todo + Todos []*Todo } -func NewDateFilter(todos []Todo) *DateFilter { +func NewDateFilter(todos []*Todo) *DateFilter { return &DateFilter{Todos: todos} } -func (f *DateFilter) FilterDate(input string) []Todo { +func (f *DateFilter) FilterDate(input string) []*Todo { r, _ := regexp.Compile(`due .*$`) match := r.FindString(input) switch { @@ -49,8 +49,8 @@ func (f *DateFilter) FilterDate(input string) []Todo { return f.Todos } -func (f *DateFilter) filterAgenda(pivot time.Time) []Todo { - var ret []Todo +func (f *DateFilter) filterAgenda(pivot time.Time) []*Todo { + var ret []*Todo for _, todo := range f.Todos { dueTime, _ := time.Parse("2006-01-02", todo.Due) @@ -61,8 +61,8 @@ func (f *DateFilter) filterAgenda(pivot time.Time) []Todo { return ret } -func (f *DateFilter) filterToday(pivot time.Time) []Todo { - var ret []Todo +func (f *DateFilter) filterToday(pivot time.Time) []*Todo { + var ret []*Todo for _, todo := range f.Todos { if todo.Due == pivot.Format("2006-01-02") { ret = append(ret, todo) @@ -71,8 +71,8 @@ func (f *DateFilter) filterToday(pivot time.Time) []Todo { return ret } -func (f *DateFilter) filterDay(pivot time.Time, day time.Weekday) []Todo { - var ret []Todo +func (f *DateFilter) filterDay(pivot time.Time, day time.Weekday) []*Todo { + var ret []*Todo filtered := f.filterThisWeek(pivot) for _, todo := range filtered { dueTime, _ := time.Parse("2006-01-02", todo.Due) @@ -84,8 +84,8 @@ func (f *DateFilter) filterDay(pivot time.Time, day time.Weekday) []Todo { return ret } -func (f *DateFilter) filterTomorrow(pivot time.Time) []Todo { - var ret []Todo +func (f *DateFilter) filterTomorrow(pivot time.Time) []*Todo { + var ret []*Todo pivot = pivot.AddDate(0, 0, 1) for _, todo := range f.Todos { if todo.Due == pivot.Format("2006-01-02") { @@ -95,8 +95,8 @@ func (f *DateFilter) filterTomorrow(pivot time.Time) []Todo { return ret } -func (f *DateFilter) filterThisWeek(pivot time.Time) []Todo { - var ret []Todo +func (f *DateFilter) filterThisWeek(pivot time.Time) []*Todo { + var ret []*Todo begin := f.findSunday(pivot) end := begin.AddDate(0, 0, 7) @@ -110,8 +110,8 @@ func (f *DateFilter) filterThisWeek(pivot time.Time) []Todo { return ret } -func (f *DateFilter) filterNextWeek(pivot time.Time) []Todo { - var ret []Todo +func (f *DateFilter) filterNextWeek(pivot time.Time) []*Todo { + var ret []*Todo begin := f.findSunday(pivot).AddDate(0, 0, 7) end := begin.AddDate(0, 0, 7) @@ -125,8 +125,8 @@ func (f *DateFilter) filterNextWeek(pivot time.Time) []Todo { return ret } -func (f *DateFilter) filterOverdue(pivot time.Time) []Todo { - var ret []Todo +func (f *DateFilter) filterOverdue(pivot time.Time) []*Todo { + var ret []*Todo pivotDate := pivot.Format("2006-01-02") diff --git a/todolist/date_filter_test.go b/todolist/date_filter_test.go index cbcc103..e8855d5 100644 --- a/todolist/date_filter_test.go +++ b/todolist/date_filter_test.go @@ -11,9 +11,9 @@ import ( func TestFilterToday(t *testing.T) { assert := assert.New(t) - var todos []Todo - todayTodo := Todo{Id: 1, Subject: "one", Due: time.Now().Format("2006-01-02")} - tomorrowTodo := Todo{Id: 2, Subject: "two", Due: time.Now().AddDate(0, 0, 1).Format("2006-01-02")} + var todos []*Todo + todayTodo := &Todo{Id: 1, Subject: "one", Due: time.Now().Format("2006-01-02")} + tomorrowTodo := &Todo{Id: 2, Subject: "two", Due: time.Now().AddDate(0, 0, 1).Format("2006-01-02")} todos = append(todos, todayTodo) todos = append(todos, tomorrowTodo) @@ -27,9 +27,9 @@ func TestFilterToday(t *testing.T) { func TestFilterTomorrow(t *testing.T) { assert := assert.New(t) - var todos []Todo - todayTodo := Todo{Id: 1, Subject: "one", Due: time.Now().Format("2006-01-02")} - tomorrowTodo := Todo{Id: 2, Subject: "two", Due: time.Now().AddDate(0, 0, 1).Format("2006-01-02")} + var todos []*Todo + todayTodo := &Todo{Id: 1, Subject: "one", Due: time.Now().Format("2006-01-02")} + tomorrowTodo := &Todo{Id: 2, Subject: "two", Due: time.Now().AddDate(0, 0, 1).Format("2006-01-02")} todos = append(todos, todayTodo) todos = append(todos, tomorrowTodo) @@ -43,10 +43,10 @@ func TestFilterTomorrow(t *testing.T) { func TestFilterThisWeek(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")} + 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) @@ -61,10 +61,10 @@ func TestFilterThisWeek(t *testing.T) { func TestFilterOverdue(t *testing.T) { assert := assert.New(t) - var todos []Todo - lastWeekTodo := Todo{Id: 1, Subject: "one", Due: time.Now().AddDate(0, 0, -7).Format("2006-01-02")} - todayTodo := Todo{Id: 2, Subject: "two", Due: now.BeginningOfDay().Format("2006-01-02")} - tomorrowTodo := Todo{Id: 3, Subject: "three", Due: time.Now().AddDate(0, 0, 1).Format("2006-01-02")} + var todos []*Todo + lastWeekTodo := &Todo{Id: 1, Subject: "one", Due: time.Now().AddDate(0, 0, -7).Format("2006-01-02")} + todayTodo := &Todo{Id: 2, Subject: "two", Due: now.BeginningOfDay().Format("2006-01-02")} + tomorrowTodo := &Todo{Id: 3, Subject: "three", Due: time.Now().AddDate(0, 0, 1).Format("2006-01-02")} todos = append(todos, lastWeekTodo) todos = append(todos, todayTodo) @@ -80,9 +80,9 @@ func TestFilterOverdue(t *testing.T) { func TestFilterDay(t *testing.T) { assert := assert.New(t) - var todos []Todo - mondayTodo := Todo{Id: 1, Subject: "one", Due: now.Monday().Format("2006-01-02")} - tuesdayTodo := Todo{Id: 2, Subject: "two", Due: now.Monday().AddDate(0, 0, 1).Format("2006-01-02")} + var todos []*Todo + mondayTodo := &Todo{Id: 1, Subject: "one", Due: now.Monday().Format("2006-01-02")} + tuesdayTodo := &Todo{Id: 2, Subject: "two", Due: now.Monday().AddDate(0, 0, 1).Format("2006-01-02")} todos = append(todos, mondayTodo) todos = append(todos, tuesdayTodo) diff --git a/todolist/file_store.go b/todolist/file_store.go index 4556e6c..c7c23c7 100644 --- a/todolist/file_store.go +++ b/todolist/file_store.go @@ -11,7 +11,7 @@ import ( type FileStore struct { FileLocation string - Data []Todo + Data []*Todo } func NewFileStore() *FileStore { @@ -21,13 +21,13 @@ func NewFileStore() *FileStore { func (f *FileStore) Add(todo *Todo) { todo.Id = f.NextId() - f.Data = append(f.Data, *todo) + f.Data = append(f.Data, todo) } func (f *FileStore) FindById(id int) *Todo { for _, todo := range f.Data { if todo.Id == id { - return &todo + return todo } } return nil @@ -48,28 +48,28 @@ func (f *FileStore) Complete(id int) { todo := f.FindById(id) todo.Completed = true f.Delete(id) - f.Data = append(f.Data, *todo) + f.Data = append(f.Data, todo) } func (f *FileStore) Uncomplete(id int) { todo := f.FindById(id) todo.Completed = false f.Delete(id) - f.Data = append(f.Data, *todo) + f.Data = append(f.Data, todo) } func (f *FileStore) Archive(id int) { todo := f.FindById(id) todo.Archived = true f.Delete(id) - f.Data = append(f.Data, *todo) + f.Data = append(f.Data, todo) } func (f *FileStore) Unarchive(id int) { todo := f.FindById(id) todo.Archived = false f.Delete(id) - f.Data = append(f.Data, *todo) + f.Data = append(f.Data, todo) } func (f *FileStore) IndexOf(todoToFind *Todo) int { @@ -102,7 +102,7 @@ func (f *FileStore) Save() { } } -type ByDate []Todo +type ByDate []*Todo func (a ByDate) Len() int { return len(a) } func (a ByDate) Swap(i, j int) { a[i], a[j] = a[j], a[i] } @@ -112,7 +112,7 @@ func (a ByDate) Less(i, j int) bool { return t1Due.Before(t2Due) } -func (f *FileStore) Todos() []Todo { +func (f *FileStore) Todos() []*Todo { sort.Sort(ByDate(f.Data)) return f.Data } diff --git a/todolist/file_store_test.go b/todolist/file_store_test.go index 8bffa56..a83863b 100644 --- a/todolist/file_store_test.go +++ b/todolist/file_store_test.go @@ -33,7 +33,7 @@ func TestIndexOf(t *testing.T) { store.Load() assert.Equal(-1, store.IndexOf(todo)) - assert.Equal(0, store.IndexOf(&store.Data[0])) + assert.Equal(0, store.IndexOf(store.Data[0])) } func TestDelete(t *testing.T) { diff --git a/todolist/filter.go b/todolist/filter.go index 73aa2b4..2b25109 100644 --- a/todolist/filter.go +++ b/todolist/filter.go @@ -3,14 +3,14 @@ package todolist import "regexp" type TodoFilter struct { - Todos []Todo + Todos []*Todo } -func NewFilter(todos []Todo) *TodoFilter { +func NewFilter(todos []*Todo) *TodoFilter { return &TodoFilter{Todos: todos} } -func (f *TodoFilter) Filter(input string) []Todo { +func (f *TodoFilter) Filter(input string) []*Todo { f.Todos = f.filterArchived(input) f.Todos = f.filterProjects(input) f.Todos = f.filterContexts(input) @@ -29,7 +29,7 @@ func (t *TodoFilter) isFilteringByContexts(input string) bool { return len(parser.Contexts(input)) > 0 } -func (f *TodoFilter) filterArchived(input string) []Todo { +func (f *TodoFilter) filterArchived(input string) []*Todo { r, _ := regexp.Compile(`l archived$`) if r.MatchString(input) { return f.getArchived() @@ -38,13 +38,13 @@ func (f *TodoFilter) filterArchived(input string) []Todo { } } -func (f *TodoFilter) filterProjects(input string) []Todo { +func (f *TodoFilter) filterProjects(input string) []*Todo { if !f.isFilteringByProjects(input) { return f.Todos } parser := &Parser{} projects := parser.Projects(input) - var ret []Todo + var ret []*Todo for _, todo := range f.Todos { for _, todoProject := range todo.Projects { @@ -58,13 +58,13 @@ func (f *TodoFilter) filterProjects(input string) []Todo { return ret } -func (f *TodoFilter) filterContexts(input string) []Todo { +func (f *TodoFilter) filterContexts(input string) []*Todo { if !f.isFilteringByContexts(input) { return f.Todos } parser := &Parser{} contexts := parser.Contexts(input) - var ret []Todo + var ret []*Todo for _, todo := range f.Todos { for _, todoContext := range todo.Contexts { @@ -78,8 +78,8 @@ func (f *TodoFilter) filterContexts(input string) []Todo { return ret } -func (f *TodoFilter) getArchived() []Todo { - var ret []Todo +func (f *TodoFilter) getArchived() []*Todo { + var ret []*Todo for _, todo := range f.Todos { if todo.Archived == true { ret = append(ret, todo) @@ -88,8 +88,8 @@ func (f *TodoFilter) getArchived() []Todo { return ret } -func (f *TodoFilter) getUnarchived() []Todo { - var ret []Todo +func (f *TodoFilter) getUnarchived() []*Todo { + var ret []*Todo for _, todo := range f.Todos { if todo.Archived == false { ret = append(ret, todo) diff --git a/todolist/formatter.go b/todolist/formatter.go index 60517f1..294b883 100644 --- a/todolist/formatter.go +++ b/todolist/formatter.go @@ -37,7 +37,7 @@ func (f *Formatter) Print() { f.Writer.Flush() } -func (f *Formatter) printTodo(todo Todo) { +func (f *Formatter) printTodo(todo *Todo) { yellow := color.New(color.FgYellow).SprintFunc() fmt.Fprintf(f.Writer, " \t%s\t%s\t%s\t%s\t\n", yellow(strconv.Itoa(todo.Id)), diff --git a/todolist/grouper.go b/todolist/grouper.go index 2d13391..b70ef39 100644 --- a/todolist/grouper.go +++ b/todolist/grouper.go @@ -3,11 +3,11 @@ package todolist type Grouper struct{} type GroupedTodos struct { - Groups map[string][]Todo + Groups map[string][]*Todo } -func (g *Grouper) GroupByContext(todos []Todo) *GroupedTodos { - groups := map[string][]Todo{} +func (g *Grouper) GroupByContext(todos []*Todo) *GroupedTodos { + groups := map[string][]*Todo{} allContexts := []string{} @@ -27,8 +27,8 @@ func (g *Grouper) GroupByContext(todos []Todo) *GroupedTodos { return &GroupedTodos{Groups: groups} } -func (g *Grouper) GroupByProject(todos []Todo) *GroupedTodos { - groups := map[string][]Todo{} +func (g *Grouper) GroupByProject(todos []*Todo) *GroupedTodos { + groups := map[string][]*Todo{} allProjects := []string{} @@ -47,8 +47,8 @@ func (g *Grouper) GroupByProject(todos []Todo) *GroupedTodos { return &GroupedTodos{Groups: groups} } -func (g *Grouper) GroupByNothing(todos []Todo) *GroupedTodos { - groups := map[string][]Todo{} +func (g *Grouper) GroupByNothing(todos []*Todo) *GroupedTodos { + groups := map[string][]*Todo{} groups["all"] = todos return &GroupedTodos{Groups: groups} } diff --git a/todolist/store.go b/todolist/store.go index d535036..6892f58 100644 --- a/todolist/store.go +++ b/todolist/store.go @@ -3,7 +3,7 @@ package todolist type Store interface { Load() Save() - Todos() []Todo + Todos() []*Todo Add(t *Todo) Delete(id int) diff --git a/todolist/util.go b/todolist/util.go index 4f5371d..bbed216 100644 --- a/todolist/util.go +++ b/todolist/util.go @@ -15,7 +15,7 @@ func AddIfNotThere(arr []string, items []string) []string { return arr } -func AddTodoIfNotThere(arr []Todo, item Todo) []Todo { +func AddTodoIfNotThere(arr []*Todo, item *Todo) []*Todo { there := false for _, arrItem := range arr { if item.Id == arrItem.Id { |
