aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--todo.go2
-rw-r--r--todolist/app.go11
-rw-r--r--todolist/date_filter.go34
-rw-r--r--todolist/date_filter_test.go34
-rw-r--r--todolist/file_store.go18
-rw-r--r--todolist/file_store_test.go2
-rw-r--r--todolist/filter.go24
-rw-r--r--todolist/formatter.go2
-rw-r--r--todolist/grouper.go14
-rw-r--r--todolist/store.go2
-rw-r--r--todolist/util.go2
11 files changed, 78 insertions, 67 deletions
diff --git a/todo.go b/todo.go
index 707ffd2..3b74943 100644
--- a/todo.go
+++ b/todo.go
@@ -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 {