tudu 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/tasks.rb ADDED
@@ -0,0 +1,281 @@
1
+ # encoding: utf-8
2
+
3
+ module Tudu
4
+ #= Tudu::Tasks
5
+ class Tasks
6
+ #== Tudufile key
7
+ TUDU_FILE_KEY = :tudufile
8
+ #== todo key
9
+ TUDU_TODO_KEY = :todo
10
+ #== doing key
11
+ TUDU_DOING_KEY = :doing
12
+ #== done key
13
+ TUDU_DONE_KEY = :done
14
+ #== file's key
15
+ TUDU_KEYS = [TUDU_FILE_KEY, TUDU_TODO_KEY, TUDU_DOING_KEY, TUDU_DONE_KEY]
16
+
17
+ #== Tudufile file name
18
+ TUDU_FILE = "Tudufile"
19
+ #== Tudufile file name
20
+ TUDU_DIR = "tudu"
21
+ #== todo file name
22
+ TUDU_TODOS_FILE = "todos"
23
+ #== todo file path
24
+ TUDU_TODOS_FILE_PATH = "./#{TUDU_DIR}/#{TUDU_TODOS_FILE}"
25
+ #== doing file name
26
+ TUDU_DOINGS_FILE = "doings"
27
+ #== doing file path
28
+ TUDU_DOINGS_FILE_PATH = "./#{TUDU_DIR}/#{TUDU_DOINGS_FILE}"
29
+ #== done file name
30
+ TUDU_DONES_FILE = "dones"
31
+ #== done file path
32
+ TUDU_DONES_FILE_PATH = "./#{TUDU_DIR}/#{TUDU_DONES_FILE}"
33
+ #== file names
34
+ INIT_FILES = {
35
+ TUDU_FILE_KEY => TUDU_FILE,
36
+ TUDU_TODO_KEY => TUDU_TODOS_FILE,
37
+ TUDU_DOING_KEY => TUDU_DOINGS_FILE,
38
+ TUDU_DONE_KEY => TUDU_DONES_FILE
39
+ }
40
+ #== task file names
41
+ TASK_FILES = {
42
+ TUDU_TODO_KEY => TUDU_TODOS_FILE,
43
+ TUDU_DOING_KEY => TUDU_DOINGS_FILE,
44
+ TUDU_DONE_KEY => TUDU_DONES_FILE
45
+ }
46
+
47
+ #== Tudufile file template
48
+ TUDU_FILE_TEMPLATE =<<-EOS
49
+ # encoding: utf-8
50
+
51
+ # !!!!!!! in tudu ver 0.0.1 this file not using !!!!!!!
52
+
53
+ # if you want to use notification, set target type. default => :none
54
+ # you can set :none, :mail
55
+ # target_type :mail
56
+
57
+ # if you want to use notification, set targets. default => []
58
+ # if you choose target_type none, you must not set targets.
59
+ # if you choose mail, you must set target email addresses.
60
+ # targets ["target1@abcdefg", "target2@abcdefg"]
61
+ EOS
62
+
63
+ #== todo file template
64
+ TUDU_TODOS_FILE_TEMPLATE = ""
65
+ #== doing file template
66
+ TUDU_DOINGS_FILE_TEMPLATE = ""
67
+ #== done file template
68
+ TUDU_DONES_FILE_TEMPLATE = ""
69
+
70
+ #== template files
71
+ INIT_FILES_TEMPLATE = {
72
+ TUDU_FILE_KEY => TUDU_FILE_TEMPLATE,
73
+ TUDU_TODO_KEY => TUDU_TODOS_FILE_TEMPLATE,
74
+ TUDU_DOING_KEY => TUDU_DOINGS_FILE_TEMPLATE,
75
+ TUDU_DONE_KEY => TUDU_DONES_FILE_TEMPLATE
76
+ }
77
+
78
+ #== task type [todo, doing, done]
79
+ attr_accessor :type
80
+ #== task name [uniq]
81
+ attr_accessor :name
82
+
83
+ class << self
84
+ #== add task to todos
85
+ #=== Params
86
+ #- task_names : add task name list
87
+ def add(*task_names)
88
+ task_names.each do |task_name|
89
+ if find_tasks(task_name)
90
+ puts "#{task_name} is already exists."
91
+ next
92
+ end
93
+ File.open(TUDU_TODOS_FILE_PATH, "a:UTF-8") {|f|f.puts task_name}
94
+ puts "complete add todo '#{task_name}' to tudu/todos"
95
+ end
96
+ end
97
+
98
+ #== remove task to todo
99
+ #=== Params
100
+ #- task_names : remove task name list
101
+ def remove(*task_names)
102
+ task_names.each do |task_name|
103
+ can_find = false
104
+ TASK_FILES.each_value do |rf|
105
+ tasks = get_tasks_from_file(rf)
106
+ next unless has_task?(tasks, task_name)
107
+ remove_task(tasks, task_name, "./#{TUDU_DIR}/#{rf}")
108
+ can_find = true
109
+ break
110
+ end
111
+ puts "no such todo '#{task_name}'" unless can_find
112
+ end
113
+ end
114
+
115
+ #== choose todo => doing task
116
+ #=== Params
117
+ #- task_name : target task name
118
+ def choose(task_name)
119
+ if get_doings.size > 0
120
+ puts "before choose, you must done current doings."
121
+ return
122
+ end
123
+
124
+ task = find_tasks(task_name)
125
+
126
+ if task.nil?
127
+ puts "#{task_name} not exists"
128
+ return
129
+ end
130
+
131
+ unless task.todo?
132
+ puts "#{task_name} is not exists in todos. #{task_name} in #{task.type}"
133
+ return
134
+ end
135
+
136
+ remove task_name
137
+ File.open(TUDU_DOINGS_FILE_PATH, "w:UTF-8") {|f|f.puts task_name}
138
+ puts "complete add doings '#{task_name}'"
139
+ end
140
+
141
+ #== doing to done
142
+ #- if doings size == 0, nothing todo.
143
+ #- after move doing to done, next todo move to doing.
144
+ def done
145
+ return unless doings_to_dones
146
+ todos_to_doings
147
+ end
148
+
149
+ #== get todos type tasks.
150
+ #=== Returns
151
+ # return Array[Tasks]
152
+ def get_todos
153
+ get_tasks(TUDU_TODOS_FILE)
154
+ end
155
+
156
+ #== get doings type tasks.
157
+ #=== Returns
158
+ # return Array[Tasks]
159
+ def get_doings
160
+ get_tasks(TUDU_DOINGS_FILE)
161
+ end
162
+
163
+ #== get dones type tasks.
164
+ #=== Returns
165
+ # return Array[Tasks]
166
+ def get_dones
167
+ get_tasks(TUDU_DONES_FILE)
168
+ end
169
+
170
+ #== get each type tasks.
171
+ #=== Params
172
+ #- type : task type.if use nil, you can get all types task.
173
+ #=== Returns
174
+ # return Array[Tasks]
175
+ def get_tasks(type = nil)
176
+ type.nil? ? get_all_tasks : get_each_tasks(type)
177
+ end
178
+
179
+ #== get each type tasks from file.
180
+ #=== Params
181
+ #- type : task type.
182
+ #=== Returns
183
+ # return Array[String]
184
+ def get_tasks_from_file(file_name)
185
+ File.read("./#{TUDU_DIR}/#{file_name}").split("\n")
186
+ end
187
+
188
+ #== filter tasklist by search_word.
189
+ #=== Params
190
+ #- tasks : task list.
191
+ #- search_word : filtering word.
192
+ #=== Returns
193
+ # return filterd task list
194
+ def filter_tasks(tasks, search_word)
195
+ return tasks if search_word.nil?
196
+ tasks.select {|task|task.name.match /.*#{search_word}.*/}
197
+ end
198
+
199
+ #== find task from all tasks.
200
+ #=== Params
201
+ #- task_name : task name.
202
+ #=== Returns
203
+ # return task
204
+ def find_tasks(task_name)
205
+ tasks = get_tasks
206
+ tasks.select {|task|task.name == task_name}.first
207
+ end
208
+
209
+ private
210
+ def get_each_tasks(type)
211
+ tasks = []
212
+ get_tasks_from_file(type).each {|task|tasks << Tasks.new(type, task)}
213
+ tasks
214
+ end
215
+
216
+ def get_all_tasks
217
+ tasks = []
218
+ TASK_FILES.each_value {|each_type|tasks += get_each_tasks(each_type)}
219
+ tasks
220
+ end
221
+
222
+ def has_task?(tasks, task_name)
223
+ tasks.include? task_name
224
+ end
225
+
226
+ def remove_task(tasks, task_name, file_path)
227
+ tasks.delete(task_name)
228
+ File.open(file_path, "w:UTF-8") {|wf|wf.puts tasks.join("\n")}
229
+ puts "complete remove todo '#{task_name}' from #{file_path}"
230
+ end
231
+
232
+ def doings_to_dones
233
+ _doings = get_doings
234
+ if _doings.size == 0
235
+ puts "there is no doing task.before done, you must choose task."
236
+ return false
237
+ end
238
+ File.open(TUDU_DOINGS_FILE_PATH, "w:UTF-8") {|f|f.print ""}
239
+ File.open(TUDU_DONES_FILE_PATH, "a:UTF-8") {|f|f.puts _doings.first.name}
240
+ true
241
+ end
242
+
243
+ def todos_to_doings
244
+ _todos = get_todos
245
+ return if _todos.size == 0
246
+ deleted_todos = _todos.dup
247
+ deleted_todos.delete_at 0
248
+ File.open(TUDU_TODOS_FILE_PATH, "w:UTF-8") do |f|
249
+ deleted_todos.each {|task|f.puts task.name}
250
+ end
251
+ File.open(TUDU_DOINGS_FILE_PATH, "w:UTF-8") {|f|f.puts _todos.first.name}
252
+ end
253
+ end
254
+
255
+ #== init task with setting task type and task name.
256
+ def initialize(type, name)
257
+ @type, @name = type, name
258
+ end
259
+
260
+ def todo?
261
+ @type == "todos"
262
+ end
263
+
264
+ def doing?
265
+ @type == "doings"
266
+ end
267
+
268
+ def done?
269
+ @type == "dones"
270
+ end
271
+
272
+ def ==(other)
273
+ if self.name == other.name
274
+ if self.type == other.type
275
+ return true
276
+ end
277
+ end
278
+ false
279
+ end
280
+ end
281
+ end
@@ -0,0 +1,3 @@
1
+ module Tudu
2
+ VERSION = "0.0.1"
3
+ end
data/lib/tudu_core.rb ADDED
@@ -0,0 +1,74 @@
1
+ # encoding: utf-8
2
+ require "tudu/version"
3
+ require "tasks"
4
+
5
+ module Tudu
6
+ # Tudu::Core
7
+ class Core
8
+ #== generate files [Tudufile, todos, doings, dones]
9
+ def init
10
+ Dir.mkdir Tudu::Tasks::TUDU_DIR unless File.exists? Tudu::Tasks::TUDU_DIR
11
+ Tudu::Tasks::TUDU_KEYS.each do |key|
12
+ File.open("./tudu/#{Tudu::Tasks::INIT_FILES[key]}", "w:UTF-8") {|f|f.print Tudu::Tasks::INIT_FILES_TEMPLATE[key]}
13
+ end
14
+ end
15
+
16
+ #== add task to todo
17
+ #=== Params
18
+ #- task_names : add task name list
19
+ def add(*task_names)
20
+ Tudu::Tasks.add *task_names
21
+ end
22
+
23
+ #== remove task to todo
24
+ #=== Params
25
+ #- task_names : remove task name list
26
+ def remove(*task_names)
27
+ Tudu::Tasks.remove *task_names
28
+ end
29
+
30
+ #== choose todo => doing task
31
+ #=== Params
32
+ #- task_name : target task name
33
+ def choose(task_name)
34
+ Tudu::Tasks.choose task_name
35
+ end
36
+
37
+ #== doing to done
38
+ #- if doings size == 0, nothing todo.
39
+ #- after move doing to done, next todo move to doing.
40
+ def done
41
+ Tudu::Tasks.done
42
+ end
43
+
44
+ #== search tasks
45
+ #=== Params
46
+ #- search_word : search word. enable regexp.
47
+ def tasks(search_word)
48
+ Tudu::Tasks.filter_tasks(Tudu::Tasks.get_tasks, search_word).map(&:name)
49
+ end
50
+
51
+ #== search todos
52
+ #=== Params
53
+ #- search_word : search word. enable regexp.
54
+ def todos(search_word)
55
+ Tudu::Tasks.filter_tasks(Tudu::Tasks.get_todos, search_word).map(&:name)
56
+ end
57
+
58
+ #== search doings
59
+ #=== Params
60
+ #- search_word : search word. enable regexp.
61
+ def doings(search_word)
62
+ Tudu::Tasks.filter_tasks(Tudu::Tasks.get_doings, search_word).map(&:name)
63
+ end
64
+
65
+ #== search dones
66
+ #=== Params
67
+ #- search_word : search word. enable regexp.
68
+ def dones(search_word)
69
+ Tudu::Tasks.filter_tasks(Tudu::Tasks.get_dones, search_word).map(&:name)
70
+ end
71
+
72
+ alias :now :doings
73
+ end
74
+ end
data/lib/tudu_dsl.rb ADDED
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+ require "tudu/version"
3
+
4
+ module Tudu
5
+ #= Tudu::Dsl
6
+ class Dsl
7
+ #== TARGET_TYPES
8
+ # notice target types
9
+ #=== types
10
+ #- none: no notice
11
+ #- mail: mail notice
12
+ TARGET_TYPES = {:none => :none, :mail => :mail}
13
+ #== notice target type
14
+ attr_accessor :_target_type
15
+ #== notice targets
16
+ attr_accessor :_targets
17
+
18
+ #== initialize Dsl
19
+ def initialize
20
+ @_target_type = TARGET_TYPES[:none]
21
+ @_targets = []
22
+ end
23
+
24
+ #== initialize Dsl
25
+ #=== Params
26
+ #- _target_type: target notice type
27
+ def target_type(_target_type)
28
+ return if _target_type.nil?
29
+ return unless _target_type.instance_of? String or _target_type.instance_of? Symbol
30
+ _target_type = _target_type.to_sym if _target_type.instance_of? String
31
+ return unless TARGET_TYPES.include? _target_type
32
+ @_target_type = _target_type
33
+ end
34
+
35
+ def targets(_targets)
36
+ return if _targets.nil?
37
+ return unless _targets.instance_of? Array
38
+ @_targets = _targets
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,7 @@
1
+ require "simplecov"
2
+ SimpleCov.start
3
+ RSpec.configure do |config|
4
+ config.treat_symbols_as_metadata_keys_with_true_values = true
5
+ config.run_all_when_everything_filtered = true
6
+ config.filter_run :focus
7
+ end
data/spec/task_spec.rb ADDED
@@ -0,0 +1,762 @@
1
+ # encoding: utf-8
2
+ require "spec_helper"
3
+ require "tudu_core"
4
+ require "tasks"
5
+
6
+ describe Tudu::Tasks do
7
+
8
+ context :todo? do
9
+ cases = [
10
+ {
11
+ case_no: 1,
12
+ case_title: "todo task",
13
+ name: "task_name",
14
+ type: "todos",
15
+ expected: true,
16
+ },
17
+ {
18
+ case_no: 2,
19
+ case_title: "not todo task",
20
+ name: "task_name",
21
+ type: "doings",
22
+ expected: false,
23
+ },
24
+ ]
25
+
26
+ cases.each do |c|
27
+ it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
28
+ begin
29
+ case_before c
30
+
31
+ # -- given --
32
+ tudu_task = Tudu::Tasks.new(c[:type], c[:name])
33
+
34
+ # -- when --
35
+ actual = tudu_task.todo?
36
+
37
+ # -- then --
38
+ ret = expect(actual).to eq(c[:expected])
39
+ ensure
40
+ case_after c
41
+ end
42
+ end
43
+
44
+ def case_before(c)
45
+ # implement each case before
46
+
47
+ end
48
+
49
+ def case_after(c)
50
+ # implement each case after
51
+ end
52
+ end
53
+ end
54
+
55
+ context :doing? do
56
+ cases = [
57
+ {
58
+ case_no: 1,
59
+ case_title: "doing task",
60
+ name: "task_name",
61
+ type: "doings",
62
+ expected: true,
63
+ },
64
+ {
65
+ case_no: 2,
66
+ case_title: "not doing task",
67
+ name: "task_name",
68
+ type: "todos",
69
+ expected: false,
70
+ },
71
+ ]
72
+
73
+ cases.each do |c|
74
+ it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
75
+ begin
76
+ case_before c
77
+
78
+ # -- given --
79
+ tudu_task = Tudu::Tasks.new(c[:type], c[:name])
80
+
81
+ # -- when --
82
+ actual = tudu_task.doing?
83
+
84
+ # -- then --
85
+ ret = expect(actual).to eq(c[:expected])
86
+ ensure
87
+ case_after c
88
+
89
+ end
90
+ end
91
+
92
+ def case_before(c)
93
+ # implement each case before
94
+
95
+ end
96
+
97
+ def case_after(c)
98
+ # implement each case after
99
+ end
100
+ end
101
+ end
102
+
103
+ context :done? do
104
+ cases = [
105
+ {
106
+ case_no: 1,
107
+ case_title: "done task",
108
+ name: "task_name",
109
+ type: "dones",
110
+ expected: true,
111
+ },
112
+ {
113
+ case_no: 2,
114
+ case_title: "not done task",
115
+ name: "task_name",
116
+ type: "doings",
117
+ expected: false,
118
+ },
119
+ ]
120
+
121
+ cases.each do |c|
122
+ it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
123
+ begin
124
+ case_before c
125
+
126
+ # -- given --
127
+ tudu_task = Tudu::Tasks.new(c[:type], c[:name])
128
+
129
+ # -- when --
130
+ actual = tudu_task.done?
131
+
132
+ # -- then --
133
+ ret = expect(actual).to eq(c[:expected])
134
+ ensure
135
+ case_after c
136
+ end
137
+ end
138
+
139
+ def case_before(c)
140
+ # implement each case before
141
+
142
+ end
143
+
144
+ def case_after(c)
145
+ # implement each case after
146
+ end
147
+ end
148
+ end
149
+
150
+
151
+ context :get_tasks_from_file do
152
+ cases = [
153
+ {
154
+ case_no: 1,
155
+ case_title: "get todos from file",
156
+ type: "todos",
157
+ texts: ["task1", "task2", "task3"],
158
+ expected: ["task1", "task2", "task3"],
159
+ },
160
+ {
161
+ case_no: 2,
162
+ case_title: "get doings from file",
163
+ type: "doings",
164
+ texts: ["task1", "task2", "task3"],
165
+ expected: ["task1", "task2", "task3"],
166
+ },
167
+ {
168
+ case_no: 3,
169
+ case_title: "get done from file",
170
+ type: "dones",
171
+ texts: ["task1", "task2", "task3"],
172
+ expected: ["task1", "task2", "task3"],
173
+ },
174
+ ]
175
+
176
+ cases.each do |c|
177
+ it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
178
+ begin
179
+ case_before c
180
+
181
+ # -- given --
182
+ # nothing
183
+
184
+ # -- when --
185
+ actual = Tudu::Tasks.get_tasks_from_file(c[:type])
186
+
187
+ # -- then --
188
+ ret = expect(actual).to eq(c[:expected])
189
+ ensure
190
+ case_after c
191
+ end
192
+ end
193
+
194
+ def case_before(c)
195
+ # implement each case before
196
+ Dir.mkdir("./#{Tudu::Tasks::TUDU_DIR}")
197
+ File.open("./#{Tudu::Tasks::TUDU_DIR}/#{c[:type]}", "w") {|f|f.puts c[:texts].join("\n")}
198
+ end
199
+
200
+ def case_after(c)
201
+ # implement each case after
202
+ return unless File.exists? Tudu::Tasks::TUDU_DIR
203
+ FileUtils.rm_rf(Tudu::Tasks::TUDU_DIR)
204
+ end
205
+ end
206
+ end
207
+
208
+ context :get_tasks do
209
+ cases = [
210
+ {
211
+ case_no: 1,
212
+ case_title: "get todos from file",
213
+ type: "todos",
214
+ texts: ["task1", "task2", "task3"],
215
+ expected: [
216
+ Tudu::Tasks.new("todos", "task1"),
217
+ Tudu::Tasks.new("todos", "task2"),
218
+ Tudu::Tasks.new("todos", "task3"),
219
+ ],
220
+ },
221
+ {
222
+ case_no: 2,
223
+ case_title: "get doings from file",
224
+ type: "doings",
225
+ texts: ["task1", "task2", "task3"],
226
+ expected: [
227
+ Tudu::Tasks.new("doings", "task1"),
228
+ Tudu::Tasks.new("doings", "task2"),
229
+ Tudu::Tasks.new("doings", "task3"),
230
+ ],
231
+ },
232
+ {
233
+ case_no: 3,
234
+ case_title: "get done from file",
235
+ type: "dones",
236
+ texts: ["task1", "task2", "task3"],
237
+ expected: [
238
+ Tudu::Tasks.new("dones", "task1"),
239
+ Tudu::Tasks.new("dones", "task2"),
240
+ Tudu::Tasks.new("dones", "task3"),
241
+ ],
242
+ },
243
+ ]
244
+
245
+ cases.each do |c|
246
+ it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
247
+ begin
248
+ case_before c
249
+
250
+ # -- given --
251
+ # nothing
252
+
253
+ # -- when --
254
+ actual = Tudu::Tasks.get_tasks(c[:type])
255
+
256
+ # -- then --
257
+ ret = expect(actual).to eq(c[:expected])
258
+ ensure
259
+ case_after c
260
+ end
261
+ end
262
+
263
+ def case_before(c)
264
+ # implement each case before
265
+ Dir.mkdir("./#{Tudu::Tasks::TUDU_DIR}")
266
+ File.open("./#{Tudu::Tasks::TUDU_DIR}/#{c[:type]}", "w") {|f|f.puts c[:texts].join("\n")}
267
+ end
268
+
269
+ def case_after(c)
270
+ # implement each case after
271
+ return unless File.exists? Tudu::Tasks::TUDU_DIR
272
+ FileUtils.rm_rf(Tudu::Tasks::TUDU_DIR)
273
+ end
274
+ end
275
+ end
276
+
277
+ context :get_todos do
278
+ cases = [
279
+ {
280
+ case_no: 1,
281
+ case_title: "get doings from file",
282
+ type: "doings",
283
+ texts: ["task1", "task2", "task3"],
284
+ expected: [
285
+ Tudu::Tasks.new("doings", "task1"),
286
+ Tudu::Tasks.new("doings", "task2"),
287
+ Tudu::Tasks.new("doings", "task3"),
288
+ ],
289
+ },
290
+ ]
291
+
292
+ cases.each do |c|
293
+ it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
294
+ begin
295
+ case_before c
296
+
297
+ # -- given --
298
+ # nothing
299
+
300
+ # -- when --
301
+ actual = Tudu::Tasks.get_doings
302
+
303
+ # -- then --
304
+ ret = expect(actual).to eq(c[:expected])
305
+ ensure
306
+ case_after c
307
+ end
308
+ end
309
+
310
+ def case_before(c)
311
+ # implement each case before
312
+ Dir.mkdir("./#{Tudu::Tasks::TUDU_DIR}")
313
+ File.open("./#{Tudu::Tasks::TUDU_DIR}/#{c[:type]}", "w") {|f|f.puts c[:texts].join("\n")}
314
+ end
315
+
316
+ def case_after(c)
317
+ # implement each case after
318
+ return unless File.exists? Tudu::Tasks::TUDU_DIR
319
+ FileUtils.rm_rf(Tudu::Tasks::TUDU_DIR)
320
+ end
321
+ end
322
+ end
323
+
324
+ context :get_dones do
325
+ cases = [
326
+ {
327
+ case_no: 1,
328
+ case_title: "get done from file",
329
+ type: "dones",
330
+ texts: ["task1", "task2", "task3"],
331
+ expected: [
332
+ Tudu::Tasks.new("dones", "task1"),
333
+ Tudu::Tasks.new("dones", "task2"),
334
+ Tudu::Tasks.new("dones", "task3"),
335
+ ],
336
+ },
337
+ ]
338
+
339
+ cases.each do |c|
340
+ it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
341
+ begin
342
+ case_before c
343
+
344
+ # -- given --
345
+ # nothing
346
+
347
+ # -- when --
348
+ actual = Tudu::Tasks.get_dones
349
+
350
+ # -- then --
351
+ ret = expect(actual).to eq(c[:expected])
352
+ ensure
353
+ case_after c
354
+ end
355
+ end
356
+
357
+ def case_before(c)
358
+ # implement each case before
359
+ Dir.mkdir("./#{Tudu::Tasks::TUDU_DIR}")
360
+ File.open("./#{Tudu::Tasks::TUDU_DIR}/#{c[:type]}", "w") {|f|f.puts c[:texts].join("\n")}
361
+ end
362
+
363
+ def case_after(c)
364
+ # implement each case after
365
+ return unless File.exists? Tudu::Tasks::TUDU_DIR
366
+ FileUtils.rm_rf(Tudu::Tasks::TUDU_DIR)
367
+ end
368
+ end
369
+ end
370
+
371
+ context :find_tasks do
372
+ cases = [
373
+ {
374
+ case_no: 1,
375
+ case_title: "find todos from tasks",
376
+ type: "todos",
377
+ texts: ["task1", "task2", "task3"],
378
+ search_name: "task1",
379
+ expected: Tudu::Tasks.new("todos", "task1")
380
+ },
381
+ {
382
+ case_no: 2,
383
+ case_title: "find doings from tasks",
384
+ type: "doings",
385
+ texts: ["task1", "task2", "task3"],
386
+ search_name: "task1",
387
+ expected: Tudu::Tasks.new("doings", "task1")
388
+ },
389
+ {
390
+ case_no: 3,
391
+ case_title: "find done from tasks",
392
+ type: "dones",
393
+ texts: ["task1", "task2", "task3"],
394
+ search_name: "task1",
395
+ expected: Tudu::Tasks.new("dones", "task1")
396
+ },
397
+ {
398
+ case_no: 4,
399
+ case_title: "not find",
400
+ type: "dones",
401
+ texts: ["task1", "task2", "task3"],
402
+ search_name: "task4",
403
+ expected: nil
404
+ },
405
+ ]
406
+
407
+ cases.each do |c|
408
+ it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
409
+ begin
410
+ case_before c
411
+
412
+ # -- given --
413
+ # nothing
414
+
415
+ # -- when --
416
+ actual = Tudu::Tasks.find_tasks c[:search_name]
417
+
418
+ # -- then --
419
+ ret = expect(actual).to eq(c[:expected])
420
+ ensure
421
+ case_after c
422
+ end
423
+ end
424
+
425
+ def case_before(c)
426
+ # implement each case before
427
+ Tudu::Core.new.init
428
+ Dir.mkdir(Tudu::Tasks::TUDU_DIR) unless File.exists?(Tudu::Tasks::TUDU_DIR)
429
+ File.open("./#{Tudu::Tasks::TUDU_DIR}/#{c[:type]}", "w") {|f|f.puts c[:texts].join("\n")}
430
+ end
431
+
432
+ def case_after(c)
433
+ # implement each case after
434
+ return unless File.exists? Tudu::Tasks::TUDU_DIR
435
+ FileUtils.rm_rf(Tudu::Tasks::TUDU_DIR)
436
+ end
437
+ end
438
+ end
439
+
440
+ context :choose do
441
+ cases = [
442
+ {
443
+ case_no: 1,
444
+ case_title: "choose task",
445
+ type: "todos",
446
+ texts: ["task1", "task2", "task3"],
447
+ choose: "task1",
448
+ expected: [
449
+ Tudu::Tasks.new("todos", "task2"),
450
+ Tudu::Tasks.new("todos", "task3"),
451
+ Tudu::Tasks.new("doings", "task1"),
452
+ ]
453
+ },
454
+ {
455
+ case_no: 2,
456
+ case_title: "aleady exists doing",
457
+ type: "doings",
458
+ texts: ["task1", "task2", "task3"],
459
+ choose: "task1",
460
+ expected: [
461
+ Tudu::Tasks.new("doings", "task1"),
462
+ Tudu::Tasks.new("doings", "task2"),
463
+ Tudu::Tasks.new("doings", "task3"),
464
+ ]
465
+ },
466
+ {
467
+ case_no: 3,
468
+ case_title: "not exists task",
469
+ type: "todos",
470
+ texts: ["task1", "task2", "task3"],
471
+ choose: "task4",
472
+ expected: [
473
+ Tudu::Tasks.new("todos", "task1"),
474
+ Tudu::Tasks.new("todos", "task2"),
475
+ Tudu::Tasks.new("todos", "task3"),
476
+ ]
477
+ },
478
+ {
479
+ case_no: 4,
480
+ case_title: "task exists, but dones",
481
+ type: "dones",
482
+ texts: ["task1", "task2", "task3"],
483
+ choose: "task1",
484
+ expected: [
485
+ Tudu::Tasks.new("dones", "task1"),
486
+ Tudu::Tasks.new("dones", "task2"),
487
+ Tudu::Tasks.new("dones", "task3"),
488
+ ]
489
+ },
490
+ ]
491
+
492
+ cases.each do |c|
493
+ it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
494
+ begin
495
+ case_before c
496
+
497
+ # -- given --
498
+ # nothing
499
+
500
+ # -- when --
501
+ Tudu::Tasks.choose c[:choose]
502
+
503
+ # -- then --
504
+ expect(Tudu::Tasks.get_tasks).to eq(c[:expected])
505
+ ensure
506
+ case_after c
507
+ end
508
+ end
509
+
510
+ def case_before(c)
511
+ # implement each case before
512
+ Tudu::Core.new.init
513
+ File.open("./#{Tudu::Tasks::TUDU_DIR}/#{c[:type]}", "w") {|f|f.puts c[:texts].join("\n")}
514
+ end
515
+
516
+ def case_after(c)
517
+ # implement each case after
518
+ return unless File.exists? Tudu::Tasks::TUDU_DIR
519
+ FileUtils.rm_rf(Tudu::Tasks::TUDU_DIR)
520
+ end
521
+ end
522
+ end
523
+
524
+ context :done do
525
+ cases = [
526
+ {
527
+ case_no: 1,
528
+ case_title: "one doing to done, shift todo to doing",
529
+ task_names: ["task1", "task2", "task3"],
530
+ choose: "task1",
531
+ expected: [
532
+ Tudu::Tasks.new("todos", "task3"),
533
+ Tudu::Tasks.new("doings", "task2"),
534
+ Tudu::Tasks.new("dones", "task1"),
535
+ ]
536
+ },
537
+ {
538
+ case_no: 2,
539
+ case_title: "one doing to done, not shift todo to doing",
540
+ task_names: ["task1"],
541
+ choose: "task1",
542
+ expected: [
543
+ Tudu::Tasks.new("dones", "task1"),
544
+ ]
545
+ },
546
+ {
547
+ case_no: 3,
548
+ case_title: "no doing",
549
+ task_names: ["task1"],
550
+ choose: "",
551
+ expected: [
552
+ Tudu::Tasks.new("todos", "task1"),
553
+ ]
554
+ },
555
+ ]
556
+
557
+ cases.each do |c|
558
+ it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
559
+ begin
560
+ case_before c
561
+
562
+ # -- given --
563
+ Tudu::Core.new.init
564
+ Tudu::Tasks.add *c[:task_names]
565
+ Tudu::Tasks.choose c[:choose]
566
+
567
+ # -- when --
568
+ Tudu::Tasks.done
569
+
570
+ # -- then --
571
+ expect(Tudu::Tasks.get_tasks).to eq(c[:expected])
572
+ ensure
573
+ case_after c
574
+ end
575
+ end
576
+
577
+ def case_before(c)
578
+ # implement each case before
579
+ end
580
+
581
+ def case_after(c)
582
+ # implement each case after
583
+ return unless File.exists? Tudu::Tasks::TUDU_DIR
584
+ FileUtils.rm_rf(Tudu::Tasks::TUDU_DIR)
585
+ end
586
+ end
587
+ end
588
+
589
+ context :add do
590
+ cases = [
591
+ {
592
+ case_no: 1,
593
+ case_title: "single add",
594
+ task_names1: "task_name",
595
+ task_names2: nil,
596
+ task_names3: nil,
597
+ expected: [
598
+ Tudu::Tasks.new("todos", "task_name")
599
+ ]
600
+ },
601
+ {
602
+ case_no: 2,
603
+ case_title: "nil add",
604
+ task_names1: nil,
605
+ task_names2: nil,
606
+ task_names3: nil,
607
+ expected: []
608
+ },
609
+ {
610
+ case_no: 3,
611
+ case_title: "multi add",
612
+ task_names1: "task_name1",
613
+ task_names2: "task_name2",
614
+ task_names3: "task_name3",
615
+ expected: [
616
+ Tudu::Tasks.new("todos", "task_name1"),
617
+ Tudu::Tasks.new("todos", "task_name2"),
618
+ Tudu::Tasks.new("todos", "task_name3")
619
+ ]
620
+ },
621
+ {
622
+ case_no: 4,
623
+ case_title: "duplicate add",
624
+ task_names1: "task_name1",
625
+ task_names2: "task_name1",
626
+ task_names3: nil,
627
+ expected: [
628
+ Tudu::Tasks.new("todos", "task_name1"),
629
+ ]
630
+ },
631
+ ]
632
+
633
+ cases.each do |c|
634
+ it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
635
+ begin
636
+ case_before c
637
+
638
+ # -- given --
639
+ Tudu::Core.new.init
640
+
641
+ # -- when --
642
+ actual = Tudu::Tasks.add c[:task_names1], c[:task_names2], c[:task_names3]
643
+
644
+ # -- then --
645
+ actual = Tudu::Tasks.get_todos
646
+ expect(actual).to eq(c[:expected])
647
+ ensure
648
+ case_after c
649
+ end
650
+ end
651
+
652
+ def case_before(c)
653
+ # implement each case before
654
+ end
655
+
656
+ def case_after(c)
657
+ return unless File.exists? Tudu::Tasks::TUDU_DIR
658
+ FileUtils.rm_rf(Tudu::Tasks::TUDU_DIR)
659
+ end
660
+ end
661
+ end
662
+
663
+
664
+ context :remove do
665
+ cases = [
666
+ {
667
+ case_no: 1,
668
+ case_title: "single remove",
669
+ add_tasks: ["task_name"],
670
+ remove_tasks: ["task_name"],
671
+ expected_tasks: [],
672
+ },
673
+ {
674
+ case_no: 2,
675
+ case_title: "multi remove",
676
+ add_tasks: ["task_name1", "task_name2", "task_name3"],
677
+ remove_tasks: ["task_name1", "task_name2", "task_name3"],
678
+ expected_tasks: [],
679
+ },
680
+ {
681
+ case_no: 3,
682
+ case_title: "not remove",
683
+ add_tasks: ["task_name"],
684
+ remove_tasks: ["invalid name"],
685
+ expected_tasks: [Tudu::Tasks.new("todos", "task_name")],
686
+ },
687
+ ]
688
+
689
+ cases.each do |c|
690
+ it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
691
+ begin
692
+ case_before c
693
+
694
+ # -- given --
695
+ Tudu::Core.new.init
696
+ Tudu::Tasks.add *c[:add_tasks]
697
+
698
+ # -- when --
699
+ Tudu::Tasks.remove *c[:remove_tasks]
700
+
701
+ # -- then --
702
+ actual = Tudu::Tasks.get_tasks
703
+ expect(actual).to eq(c[:expected_tasks])
704
+ ensure
705
+ case_after c
706
+ end
707
+ end
708
+
709
+ def case_before(c)
710
+ # implement each case before
711
+ end
712
+
713
+ def case_after(c)
714
+ return unless File.exists? Tudu::Tasks::TUDU_DIR
715
+ FileUtils.rm_rf(Tudu::Tasks::TUDU_DIR)
716
+ end
717
+ end
718
+ end
719
+
720
+ context :filter_tasks do
721
+ cases = [
722
+ {
723
+ case_no: 1,
724
+ case_title: "get todos from file",
725
+ tasks: [
726
+ Tudu::Tasks.new("doings", "task1_1"),
727
+ Tudu::Tasks.new("doings", "task1_2"),
728
+ Tudu::Tasks.new("doings", "task3"),
729
+ ],
730
+ filter_word: "task1_1",
731
+ expected: [Tudu::Tasks.new("doings", "task1_1")],
732
+ },
733
+ ]
734
+
735
+ cases.each do |c|
736
+ it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
737
+ begin
738
+ case_before c
739
+
740
+ # -- given --
741
+ # nothing
742
+
743
+ # -- when --
744
+ actual = Tudu::Tasks.filter_tasks(c[:tasks], c[:filter_word])
745
+
746
+ # -- then --
747
+ ret = expect(actual).to eq(c[:expected])
748
+ ensure
749
+ case_after c
750
+ end
751
+ end
752
+
753
+ def case_before(c)
754
+ # implement each case before
755
+ end
756
+
757
+ def case_after(c)
758
+ # implement each case after
759
+ end
760
+ end
761
+ end
762
+ end