From 5d28dac9b2e1d153f33551b968ab4c92cfce23ce Mon Sep 17 00:00:00 2001 From: Quey-Liang Kao Date: Mon, 14 Aug 2017 14:41:40 +0800 Subject: Implement the "an" feature: Adding notes to todos This patch introduce a new attribute of a todo item, which is "Notes", of type []string. The following enhancing patches will contain the listing, removing and editing features. --- todolist/parser_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'todolist/parser_test.go') diff --git a/todolist/parser_test.go b/todolist/parser_test.go index 476edaa..9412bdf 100644 --- a/todolist/parser_test.go +++ b/todolist/parser_test.go @@ -74,6 +74,18 @@ func TestParseContexts(t *testing.T) { } } +func TestParseNotes(t *testing.T) { + parser := &Parser{} + todo := parser.ParseNewTodo("add search engine survey") + + if parser.ParseNotes(todo, "an 1 www.google.com") != "add" { + t.Error("Expected Notes to be added") + } + if todo.Notes[0] != "www.google.com" { + t.Error("Expected note 1 to be 'www.google.com' but got", todo.Notes[0]) + } +} + func TestDueToday(t *testing.T) { assert := assert.New(t) parser := &Parser{} -- cgit v1.3 From c4d6dbdb100bb66db9b184c653617c47a63e91ca Mon Sep 17 00:00:00 2001 From: Quey-Liang Kao Date: Mon, 14 Aug 2017 16:12:53 +0800 Subject: Implement the "dn" feature: Deleteing notes --- todo.go | 4 +++- todolist/parser.go | 17 +++++++++++++++++ todolist/parser_test.go | 7 +++++++ 3 files changed, 27 insertions(+), 1 deletion(-) (limited to 'todolist/parser_test.go') diff --git a/todo.go b/todo.go index e48eda2..9619bdb 100644 --- a/todo.go +++ b/todo.go @@ -127,6 +127,8 @@ func usage() { fmt.Println("\tAdds notes \"check http://this.web.site\" to the todo with id 12\n") yellow.Println("\ttodo ln 12") fmt.Println("\tLists notes of the todo with id 12\n") + yellow.Println("\ttodo dn 12 3") + fmt.Println("\tDeletes the 3rd note of the todo with id 12\n") blueBold.Println("\nGarbage Collection") yellow.Println("\ttodo gc") @@ -159,7 +161,7 @@ func routeInput(command string, input string) { app.EditTodo(input) case "ex", "expand": app.ExpandTodo(input) - case "an", "ln": + case "an", "ln", "dn": app.ManipulateNotes(input) case "gc": app.GarbageCollect() diff --git a/todolist/parser.go b/todolist/parser.go index 1c3b7f8..3883454 100644 --- a/todolist/parser.go +++ b/todolist/parser.go @@ -90,12 +90,29 @@ func (p *Parser) ParseNotes(todo *Todo, input string) string { case "an": todo.Notes = append(todo.Notes, matches[2]) return "add" + case "ln": groups := map[string][]*Todo{} groups[""] = append(groups[""], todo) formatter := NewFormatter(&GroupedTodos{Groups: groups}) formatter.PrintNotes() return "list" + + case "dn": + rmid, err := strconv.Atoi(matches[2]) + if err != nil { + fmt.Println("wrong note id") + return "" + } + + for id, _ := range todo.Notes { + if id == rmid { + todo.Notes = append(todo.Notes[:rmid], todo.Notes[rmid+1:]...) + return "delete" + } + } + fmt.Println("Could not found note id") + return "" } fmt.Println("Could not match command or id") diff --git a/todolist/parser_test.go b/todolist/parser_test.go index 9412bdf..e5c7007 100644 --- a/todolist/parser_test.go +++ b/todolist/parser_test.go @@ -84,6 +84,13 @@ func TestParseNotes(t *testing.T) { if todo.Notes[0] != "www.google.com" { t.Error("Expected note 1 to be 'www.google.com' but got", todo.Notes[0]) } + + if parser.ParseNotes(todo, "dn 1 0") != "delete" { + t.Error("Expected Notes to be deleted") + } + if len(todo.Notes) != 0 { + t.Error("Expected no note") + } } func TestDueToday(t *testing.T) { -- cgit v1.3 From 7c24f39a0fc8bb07dc9db4f5fecd3468705b1e37 Mon Sep 17 00:00:00 2001 From: Quey-Liang Kao Date: Mon, 14 Aug 2017 16:34:33 +0800 Subject: Implement the "en" feature: Editting notes --- todo.go | 4 +++- todolist/parser.go | 30 ++++++++++++++++++++++++++++-- todolist/parser_test.go | 7 +++++++ 3 files changed, 38 insertions(+), 3 deletions(-) (limited to 'todolist/parser_test.go') diff --git a/todo.go b/todo.go index 9619bdb..cda6cc3 100644 --- a/todo.go +++ b/todo.go @@ -129,6 +129,8 @@ func usage() { fmt.Println("\tLists notes of the todo with id 12\n") yellow.Println("\ttodo dn 12 3") fmt.Println("\tDeletes the 3rd note of the todo with id 12\n") + yellow.Println("\ttodo en 12 3 check http://that.web.site") + fmt.Println("\tEditing the 3rd note of the todo with id 12 to \"http://that.web.site\" \n") blueBold.Println("\nGarbage Collection") yellow.Println("\ttodo gc") @@ -161,7 +163,7 @@ func routeInput(command string, input string) { app.EditTodo(input) case "ex", "expand": app.ExpandTodo(input) - case "an", "ln", "dn": + case "an", "ln", "dn", "en": app.ManipulateNotes(input) case "gc": app.GarbageCollect() diff --git a/todolist/parser.go b/todolist/parser.go index 3883454..42af133 100644 --- a/todolist/parser.go +++ b/todolist/parser.go @@ -99,9 +99,8 @@ func (p *Parser) ParseNotes(todo *Todo, input string) string { return "list" case "dn": - rmid, err := strconv.Atoi(matches[2]) + rmid, err := p.getNoteID(matches[2]) if err != nil { - fmt.Println("wrong note id") return "" } @@ -113,12 +112,39 @@ func (p *Parser) ParseNotes(todo *Todo, input string) string { } fmt.Println("Could not found note id") return "" + + case "en": + r1, _ := regexp.Compile(`(\d)+\s+(.*)?`) + tail := r1.FindStringSubmatch(matches[2]) + edid, err := p.getNoteID(tail[1]) + if err != nil { + return "" + } + + for id, _ := range todo.Notes { + if id == edid { + todo.Notes[id] = tail[2] + return "edit" + } + } + + fmt.Println("Could not found note id") + return "" } fmt.Println("Could not match command or id") return "" } +func (p *Parser) getNoteID(input string) (int, error) { + ret, err := strconv.Atoi(input) + if err != nil { + fmt.Println("wrong note id") + return -1, err + } + return ret, nil +} + func (p *Parser) hasDue(input string) bool { r1, _ := regexp.Compile(`due \w+$`) r2, _ := regexp.Compile(`due \w+ \d+$`) diff --git a/todolist/parser_test.go b/todolist/parser_test.go index e5c7007..2c4fd25 100644 --- a/todolist/parser_test.go +++ b/todolist/parser_test.go @@ -85,6 +85,13 @@ func TestParseNotes(t *testing.T) { t.Error("Expected note 1 to be 'www.google.com' but got", todo.Notes[0]) } + if parser.ParseNotes(todo, "en 1 0 www.duckduckgo.com") != "edit" { + t.Error("Expected Notes to be editted") + } + if todo.Notes[0] != "www.duckduckgo.com" { + t.Error("Expected note 1 to be 'www.duckduckgo.com' but got", todo.Notes[0]) + } + if parser.ParseNotes(todo, "dn 1 0") != "delete" { t.Error("Expected Notes to be deleted") } -- cgit v1.3