todo-void 0.0.4 → 0.1pre
Sign up to get free protection for your applications and to get access to all the features.
- data/interactors/status_changes_interactor.rb +4 -1
- data/interactors/todo_interactor.rb +9 -1
- data/lib/todo.rb +8 -1
- data/lib/todo_filter.rb +35 -0
- data/lib/todo_list_view.rb +6 -27
- data/lib/todo_store.rb +16 -20
- metadata +5 -4
@@ -1,3 +1,5 @@
|
|
1
|
+
require_relative '../lib/todo_filter'
|
2
|
+
|
1
3
|
class StatusChangesInteractor
|
2
4
|
class StatusChangesInteractor::NoTodoWithIdError < StandardError ; end
|
3
5
|
class ConflictingIdsError < StandardError
|
@@ -20,7 +22,8 @@ class StatusChangesInteractor
|
|
20
22
|
private
|
21
23
|
def change_todo_status(hash, status)
|
22
24
|
todos = @list.find(hash).to_array
|
23
|
-
|
25
|
+
todos = TodoFilter.new(todos).with_status([:finished, :started, :pending]).recent.execute
|
26
|
+
|
24
27
|
case todos.length
|
25
28
|
when 0
|
26
29
|
raise StatusChangesInteractor::NoTodoWithIdError
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative '../lib/todo_store'
|
2
|
+
require_relative '../lib/todo_filter'
|
2
3
|
|
3
4
|
class TodoInteractor
|
4
5
|
def initialize(store = TodoStore.new)
|
@@ -10,6 +11,13 @@ class TodoInteractor
|
|
10
11
|
end
|
11
12
|
|
12
13
|
def list_all
|
13
|
-
@store.todos.to_array
|
14
|
+
todos = @store.todos.to_array
|
15
|
+
filter_todos(todos)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def filter_todos(todos)
|
20
|
+
filter = TodoFilter.new(todos)
|
21
|
+
filter.with_status([:started, :pending, :finished]).recent.execute
|
14
22
|
end
|
15
23
|
end
|
data/lib/todo.rb
CHANGED
@@ -2,7 +2,7 @@ require 'openssl'
|
|
2
2
|
|
3
3
|
class Todo
|
4
4
|
attr_reader :description
|
5
|
-
attr_accessor :status
|
5
|
+
attr_accessor :status, :finished_at
|
6
6
|
|
7
7
|
def initialize(description)
|
8
8
|
@description = description
|
@@ -14,4 +14,11 @@ class Todo
|
|
14
14
|
description_hash = description_hash.hexdigest
|
15
15
|
description_hash.slice(0..5)
|
16
16
|
end
|
17
|
+
|
18
|
+
def status=(status)
|
19
|
+
@status = status
|
20
|
+
if status == :finished && finished_at.nil?
|
21
|
+
@finished_at = Time.now
|
22
|
+
end
|
23
|
+
end
|
17
24
|
end
|
data/lib/todo_filter.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
class TodoFilter
|
2
|
+
def initialize(todos)
|
3
|
+
@todos = todos.dup
|
4
|
+
@todos.reject! { |todo| todo.status == :deleted }
|
5
|
+
end
|
6
|
+
|
7
|
+
def with_status(statuses)
|
8
|
+
result = []
|
9
|
+
statuses.each do |status|
|
10
|
+
todos_with_status(status).each do |todo|
|
11
|
+
result << todo
|
12
|
+
end
|
13
|
+
end
|
14
|
+
@todos = result
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def recent
|
19
|
+
@todos.reject! do |todo|
|
20
|
+
todo.status == :finished &&
|
21
|
+
todo.finished_at < (Time.now - 86400)
|
22
|
+
end
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
def execute
|
27
|
+
@todos
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def todos_with_status(status)
|
33
|
+
@todos.reject { |todo| todo.status != status }
|
34
|
+
end
|
35
|
+
end
|
data/lib/todo_list_view.rb
CHANGED
@@ -2,33 +2,12 @@ require_relative "../lib/todo_view"
|
|
2
2
|
|
3
3
|
class TodoListView
|
4
4
|
def self.render(todos)
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
def render
|
13
|
-
@output = ""
|
14
|
-
render_todo_by_status(:started)
|
15
|
-
render_todo_by_status(:pending)
|
16
|
-
render_todo_by_status(:finished)
|
17
|
-
@output
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
def render_todo_by_status(status)
|
22
|
-
todos_by_status(status).each { |todo| render_todo(todo) }
|
23
|
-
end
|
24
|
-
|
25
|
-
def todos_by_status(status)
|
26
|
-
@todos.reject {|todo| todo.status != status}
|
27
|
-
end
|
28
|
-
|
29
|
-
def render_todo(todos)
|
30
|
-
@output += TodoView.new(todos).render
|
31
|
-
@output += "\n"
|
5
|
+
output = ""
|
6
|
+
todos.each do |todo|
|
7
|
+
output += TodoView.new(todo).render
|
8
|
+
output += "\n"
|
9
|
+
end
|
10
|
+
output
|
32
11
|
end
|
33
12
|
end
|
34
13
|
|
data/lib/todo_store.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require_relative "./todo_list"
|
2
2
|
require_relative './todo'
|
3
3
|
require 'fileutils'
|
4
|
+
require 'csv'
|
4
5
|
|
5
6
|
class TodoStore
|
6
7
|
def initialize
|
@@ -23,31 +24,26 @@ class TodoStore
|
|
23
24
|
|
24
25
|
private
|
25
26
|
def read
|
26
|
-
|
27
|
-
|
27
|
+
@list = TodoList.new
|
28
|
+
|
28
29
|
FileUtils.touch(todo_file)
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
todo.status =
|
36
|
-
|
30
|
+
data = CSV.read(todo_file)
|
31
|
+
data.each do |raw_todo|
|
32
|
+
todo = Todo.new raw_todo[0]
|
33
|
+
unless raw_todo[2].nil?
|
34
|
+
todo.finished_at = DateTime.parse(raw_todo[2]).to_time
|
35
|
+
end
|
36
|
+
todo.status = raw_todo[1].to_sym
|
37
|
+
@list.add todo
|
37
38
|
end
|
38
|
-
|
39
|
-
@list = todo_list
|
40
39
|
end
|
41
|
-
|
40
|
+
|
42
41
|
def write
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
serialized_todos += "#{todo.status}||#{todo.description}\n"
|
42
|
+
CSV.open(todo_file, "w") do |csv|
|
43
|
+
@list.to_array.each do |task|
|
44
|
+
csv << [task.description, task.status, task.finished_at]
|
45
|
+
end
|
48
46
|
end
|
49
|
-
|
50
|
-
File.open(todo_file, "w") {|f| f.write serialized_todos }
|
51
47
|
end
|
52
48
|
|
53
49
|
def todo_file
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: todo-void
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.1pre
|
5
|
+
prerelease: 3
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Robert Curth
|
@@ -99,6 +99,7 @@ extensions: []
|
|
99
99
|
extra_rdoc_files: []
|
100
100
|
files:
|
101
101
|
- lib/todo.rb
|
102
|
+
- lib/todo_filter.rb
|
102
103
|
- lib/todo_list.rb
|
103
104
|
- lib/todo_list_view.rb
|
104
105
|
- lib/todo_store.rb
|
@@ -123,9 +124,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
123
124
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
125
|
none: false
|
125
126
|
requirements:
|
126
|
-
- - ! '
|
127
|
+
- - ! '>'
|
127
128
|
- !ruby/object:Gem::Version
|
128
|
-
version:
|
129
|
+
version: 1.3.1
|
129
130
|
requirements: []
|
130
131
|
rubyforge_project:
|
131
132
|
rubygems_version: 1.8.24
|