todo-void 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/t +3 -1
- data/interactors/status_changes_interactor.rb +20 -13
- data/interactors/todo_interactor.rb +2 -16
- data/lib/todo_list.rb +20 -4
- data/lib/todo_list_view.rb +4 -0
- data/lib/todo_store.rb +27 -8
- data/lib/todo_void.rb +37 -16
- metadata +51 -2
data/bin/t
CHANGED
@@ -1,23 +1,30 @@
|
|
1
1
|
class StatusChangesInteractor
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
class ConflictingIdsError < StandardError
|
3
|
+
attr_reader :conflicting_todos
|
4
|
+
|
5
|
+
def initialize(conflicting_todos)
|
6
|
+
@conflicting_todos = conflicting_todos
|
7
|
+
end
|
5
8
|
end
|
6
9
|
|
7
|
-
def
|
8
|
-
|
10
|
+
def initialize(store = TodoStore.new)
|
11
|
+
@store = store
|
12
|
+
@list = @store.todos
|
9
13
|
end
|
10
14
|
|
11
|
-
def
|
12
|
-
change_todo_status(hash,
|
15
|
+
def change_status(hash, status)
|
16
|
+
change_todo_status(hash, status)
|
13
17
|
end
|
14
18
|
|
15
19
|
private
|
16
20
|
def change_todo_status(hash, status)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
21
|
+
todos = @list.find(hash).to_array
|
22
|
+
|
23
|
+
if todos.length > 1
|
24
|
+
raise ConflictingIdsError.new(todos)
|
25
|
+
elsif todos.length == 1
|
26
|
+
todos[0].status = status
|
27
|
+
@store.update(todos[0])
|
28
|
+
end
|
22
29
|
end
|
23
|
-
end
|
30
|
+
end
|
@@ -3,27 +3,13 @@ require_relative '../lib/todo_store'
|
|
3
3
|
class TodoInteractor
|
4
4
|
def initialize(store = TodoStore.new)
|
5
5
|
@store = store
|
6
|
-
@list = @store.read
|
7
6
|
end
|
8
7
|
|
9
8
|
def add_todo(description)
|
10
|
-
@
|
11
|
-
save_list
|
12
|
-
end
|
13
|
-
|
14
|
-
def delete_todo(hash)
|
15
|
-
@list.remove(hash)
|
16
|
-
save_list
|
9
|
+
@store.save(Todo.new(description))
|
17
10
|
end
|
18
11
|
|
19
12
|
def list_all
|
20
|
-
todos
|
21
|
-
@list.todo.each do |id, todo| todos << todo end
|
22
|
-
todos
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
def save_list
|
27
|
-
@store.save(@list)
|
13
|
+
@store.todos.to_array
|
28
14
|
end
|
29
15
|
end
|
data/lib/todo_list.rb
CHANGED
@@ -10,13 +10,29 @@ class TodoList
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def find(search)
|
13
|
+
list = TodoList.new
|
13
14
|
@todo.each do |id, todo|
|
14
|
-
|
15
|
+
list.add todo if /^#{search}/.match id
|
15
16
|
end
|
16
|
-
|
17
|
+
list
|
17
18
|
end
|
18
19
|
|
19
|
-
def
|
20
|
-
@todo.
|
20
|
+
def length
|
21
|
+
@todo.length
|
22
|
+
end
|
23
|
+
|
24
|
+
def empty?
|
25
|
+
@todo.length == 0
|
26
|
+
end
|
27
|
+
|
28
|
+
def update(todo)
|
29
|
+
@todo.delete(todo.id)
|
30
|
+
@todo[todo.id] = todo
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_array
|
34
|
+
todos = []
|
35
|
+
@todo.each do |id, todo| todos << todo end
|
36
|
+
todos
|
21
37
|
end
|
22
38
|
end
|
data/lib/todo_list_view.rb
CHANGED
data/lib/todo_store.rb
CHANGED
@@ -3,7 +3,26 @@ require_relative './todo'
|
|
3
3
|
require 'fileutils'
|
4
4
|
|
5
5
|
class TodoStore
|
6
|
-
def
|
6
|
+
def initialize
|
7
|
+
read
|
8
|
+
end
|
9
|
+
|
10
|
+
def todos
|
11
|
+
@list
|
12
|
+
end
|
13
|
+
|
14
|
+
def update(todo)
|
15
|
+
@list.update(todo)
|
16
|
+
write
|
17
|
+
end
|
18
|
+
|
19
|
+
def save(todo)
|
20
|
+
@list.add(todo)
|
21
|
+
write
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def read
|
7
26
|
todo_list = TodoList.new
|
8
27
|
|
9
28
|
FileUtils.touch(todo_file)
|
@@ -17,20 +36,20 @@ class TodoStore
|
|
17
36
|
todo_list.add todo
|
18
37
|
end
|
19
38
|
|
20
|
-
todo_list
|
39
|
+
@list = todo_list
|
21
40
|
end
|
22
41
|
|
23
|
-
def
|
24
|
-
|
25
|
-
|
42
|
+
def write
|
43
|
+
serialized_todos = ""
|
44
|
+
|
45
|
+
todos = @list.todo
|
26
46
|
todos.each do |id, todo|
|
27
|
-
|
47
|
+
serialized_todos += "#{todo.status}||#{todo.description}\n"
|
28
48
|
end
|
29
49
|
|
30
|
-
File.
|
50
|
+
File.open(todo_file, "w") {|f| f.write serialized_todos }
|
31
51
|
end
|
32
52
|
|
33
|
-
private
|
34
53
|
def todo_file
|
35
54
|
Dir.home + '/.todos'
|
36
55
|
end
|
data/lib/todo_void.rb
CHANGED
@@ -1,26 +1,47 @@
|
|
1
|
+
require 'require_relative'
|
1
2
|
require_relative '../interactors/todo_interactor.rb'
|
2
3
|
require_relative '../interactors/status_changes_interactor.rb'
|
4
|
+
require_relative './todo_list_view'
|
3
5
|
|
4
6
|
class TodoVoid
|
5
|
-
def
|
6
|
-
|
7
|
+
def initialize(args=[])
|
8
|
+
@args = args
|
9
|
+
@output = ""
|
10
|
+
end
|
7
11
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
def execute
|
13
|
+
if flag?('-d')
|
14
|
+
change_status(:deleted)
|
15
|
+
elsif flag?('-f')
|
16
|
+
change_status(:finished)
|
17
|
+
elsif flag?('-s')
|
18
|
+
change_status(:started)
|
19
|
+
elsif flag?('--help')
|
20
|
+
@output = "Help:\nt 'Mowing the lawn' in order to create a todo\n-f ID to finish a todo\n-d ID to delete a todo"
|
21
|
+
elsif @args[0]
|
22
|
+
TodoInteractor.new.add_todo(@args[0])
|
18
23
|
else
|
19
|
-
require_relative './todo_list_view.rb'
|
20
24
|
todos = TodoInteractor.new.list_all
|
21
|
-
|
22
|
-
|
25
|
+
@output = TodoListView.render(todos)
|
26
|
+
end
|
27
|
+
@output
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
def flag?(flag)
|
32
|
+
@args[0] == flag
|
33
|
+
end
|
34
|
+
|
35
|
+
def hash
|
36
|
+
@args[1]
|
37
|
+
end
|
38
|
+
|
39
|
+
def change_status(status)
|
40
|
+
begin
|
41
|
+
StatusChangesInteractor.new.change_status(hash, status)
|
42
|
+
rescue StatusChangesInteractor::ConflictingIdsError => e
|
43
|
+
@output += "Conflicting part of an id provided please be more specific:\n"
|
44
|
+
@output += TodoListView.render(e.conflicting_todos)
|
23
45
|
end
|
24
|
-
output
|
25
46
|
end
|
26
47
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: todo-void
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -27,6 +27,54 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: cucumber
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: pry
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
30
78
|
description: A simple app to manage todos
|
31
79
|
email: robert@rocu.de
|
32
80
|
executables:
|
@@ -44,7 +92,8 @@ files:
|
|
44
92
|
- interactors/status_changes_interactor.rb
|
45
93
|
- interactors/todo_interactor.rb
|
46
94
|
homepage: http://rubygems.org/gems/todo-void
|
47
|
-
licenses:
|
95
|
+
licenses:
|
96
|
+
- MIT
|
48
97
|
post_install_message:
|
49
98
|
rdoc_options: []
|
50
99
|
require_paths:
|