tudu 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +22 -0
- data/README.md +196 -0
- data/Rakefile +1 -0
- data/bin/tudu +71 -0
- data/lib/task.rb +281 -0
- data/lib/tasks.rb +281 -0
- data/lib/tudu/version.rb +3 -0
- data/lib/tudu_core.rb +74 -0
- data/lib/tudu_dsl.rb +41 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/task_spec.rb +762 -0
- data/spec/tudu_core_spec.rb +574 -0
- data/spec/tudu_dsl_spec.rb +120 -0
- data/tudu.gemspec +27 -0
- metadata +124 -0
@@ -0,0 +1,574 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
require "tudu_core"
|
4
|
+
|
5
|
+
describe Tudu::Core do
|
6
|
+
context :init do
|
7
|
+
cases = [
|
8
|
+
{
|
9
|
+
case_no: 1,
|
10
|
+
case_title: "valid case",
|
11
|
+
expected_files: [
|
12
|
+
Tudu::Tasks::TUDU_FILE,
|
13
|
+
Tudu::Tasks::TUDU_TODOS_FILE,
|
14
|
+
Tudu::Tasks::TUDU_DOINGS_FILE,
|
15
|
+
Tudu::Tasks::TUDU_DONES_FILE
|
16
|
+
],
|
17
|
+
expected_contents: [
|
18
|
+
Tudu::Tasks::TUDU_FILE_TEMPLATE,
|
19
|
+
Tudu::Tasks::TUDU_TODOS_FILE_TEMPLATE,
|
20
|
+
Tudu::Tasks::TUDU_DOINGS_FILE_TEMPLATE,
|
21
|
+
Tudu::Tasks::TUDU_DONES_FILE_TEMPLATE
|
22
|
+
],
|
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_core = Tudu::Core.new
|
33
|
+
|
34
|
+
# -- when --
|
35
|
+
tudu_core.init
|
36
|
+
|
37
|
+
# -- then --
|
38
|
+
c[:expected_files].each_with_index do |f, index|
|
39
|
+
actual = File.open("./tudu/#{f}") {|f|f.read}
|
40
|
+
expect(actual).to eq(c[:expected_contents][index])
|
41
|
+
end
|
42
|
+
ensure
|
43
|
+
case_after c
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def case_before(c)
|
48
|
+
# implement each case before
|
49
|
+
end
|
50
|
+
|
51
|
+
def case_after(c)
|
52
|
+
return unless File.exists? "./tudu"
|
53
|
+
FileUtils.rm_rf("./tudu")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context :add do
|
59
|
+
cases = [
|
60
|
+
{
|
61
|
+
case_no: 1,
|
62
|
+
case_title: "single add",
|
63
|
+
task_names1: "task_name",
|
64
|
+
task_names2: nil,
|
65
|
+
task_names3: nil,
|
66
|
+
expected: ["task_name"]
|
67
|
+
},
|
68
|
+
{
|
69
|
+
case_no: 2,
|
70
|
+
case_title: "nil add",
|
71
|
+
task_names1: nil,
|
72
|
+
task_names2: nil,
|
73
|
+
task_names3: nil,
|
74
|
+
expected: []
|
75
|
+
},
|
76
|
+
{
|
77
|
+
case_no: 3,
|
78
|
+
case_title: "multi add",
|
79
|
+
task_names1: "task_name1",
|
80
|
+
task_names2: "task_name2",
|
81
|
+
task_names3: "task_name3",
|
82
|
+
expected: ["task_name1","task_name2","task_name3"]
|
83
|
+
},
|
84
|
+
{
|
85
|
+
case_no: 4,
|
86
|
+
case_title: "duplicate add",
|
87
|
+
task_names1: "task_name1",
|
88
|
+
task_names2: "task_name1",
|
89
|
+
task_names3: nil,
|
90
|
+
expected: ["task_name1"]
|
91
|
+
},
|
92
|
+
]
|
93
|
+
|
94
|
+
cases.each do |c|
|
95
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
96
|
+
begin
|
97
|
+
case_before c
|
98
|
+
|
99
|
+
# -- given --
|
100
|
+
tudu_core = Tudu::Core.new
|
101
|
+
tudu_core.init
|
102
|
+
|
103
|
+
# -- when --
|
104
|
+
actual = tudu_core.add c[:task_names1], c[:task_names2], c[:task_names3]
|
105
|
+
|
106
|
+
# -- then --
|
107
|
+
actual = File.read("./tudu/todos").split("\n")
|
108
|
+
expect(actual).to eq(c[:expected])
|
109
|
+
ensure
|
110
|
+
case_after c
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def case_before(c)
|
115
|
+
# implement each case before
|
116
|
+
end
|
117
|
+
|
118
|
+
def case_after(c)
|
119
|
+
return unless File.exists? "./tudu"
|
120
|
+
FileUtils.rm_rf("./tudu")
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
context :remove do
|
126
|
+
cases = [
|
127
|
+
{
|
128
|
+
case_no: 1,
|
129
|
+
case_title: "single remove",
|
130
|
+
task_names1: "task_name",
|
131
|
+
task_names2: nil,
|
132
|
+
task_names3: nil,
|
133
|
+
},
|
134
|
+
{
|
135
|
+
case_no: 2,
|
136
|
+
case_title: "multi remove",
|
137
|
+
task_names1: "task_name1",
|
138
|
+
task_names2: "task_name2",
|
139
|
+
task_names3: "task_name3",
|
140
|
+
},
|
141
|
+
{
|
142
|
+
case_no: 3,
|
143
|
+
case_title: "not remove",
|
144
|
+
task_names1: "invalid name",
|
145
|
+
task_names2: nil,
|
146
|
+
task_names3: nil,
|
147
|
+
},
|
148
|
+
# TODO: add doing, done mix case. after implements choose, done method
|
149
|
+
]
|
150
|
+
|
151
|
+
cases.each do |c|
|
152
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
153
|
+
begin
|
154
|
+
case_before c
|
155
|
+
|
156
|
+
# -- given --
|
157
|
+
tudu_core = Tudu::Core.new
|
158
|
+
tudu_core.init
|
159
|
+
tudu_core.add c[:task_names1], c[:task_names2], c[:task_names3]
|
160
|
+
|
161
|
+
# -- when --
|
162
|
+
tudu_core.remove c[:task_names1], c[:task_names2], c[:task_names3]
|
163
|
+
|
164
|
+
# -- then --
|
165
|
+
[c[:task_names1], c[:task_names2], c[:task_names3]].each do |e|
|
166
|
+
actual = false
|
167
|
+
["./tudu/todos", "./tudu/doings", "./tudu/dones"].each do |f|
|
168
|
+
actual = true if File.read(f).split("\n").include?(e)
|
169
|
+
end
|
170
|
+
expect(actual).to be_false
|
171
|
+
end
|
172
|
+
ensure
|
173
|
+
case_after c
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
def case_before(c)
|
178
|
+
# implement each case before
|
179
|
+
end
|
180
|
+
|
181
|
+
def case_after(c)
|
182
|
+
return unless File.exists? "./tudu"
|
183
|
+
FileUtils.rm_rf("./tudu")
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
context :tasks do
|
189
|
+
cases = [
|
190
|
+
{
|
191
|
+
case_no: 1,
|
192
|
+
case_title: "[todos, dosings, dones] all tasks",
|
193
|
+
task_names1: "task_name1",
|
194
|
+
task_names2: "task_name2",
|
195
|
+
task_names3: "task_name3",
|
196
|
+
search_word: nil,
|
197
|
+
expected: ["task_name1", "task_name2", "task_name3"]
|
198
|
+
},
|
199
|
+
{
|
200
|
+
case_no: 2,
|
201
|
+
case_title: "[todos, dosings, dones] search specific tasks",
|
202
|
+
task_names1: "task_name1",
|
203
|
+
task_names2: "task_name2",
|
204
|
+
task_names3: "task_name3",
|
205
|
+
search_word: "task_name1",
|
206
|
+
expected: ["task_name1"]
|
207
|
+
},
|
208
|
+
{
|
209
|
+
case_no: 3,
|
210
|
+
case_title: "[todos, dosings, dones] search specific tasks by regexp",
|
211
|
+
task_names1: "task_name1_1",
|
212
|
+
task_names2: "task_name2_1",
|
213
|
+
task_names3: "task_name2_2",
|
214
|
+
task_names4: "task_name3_1",
|
215
|
+
search_word: "task_name2_",
|
216
|
+
expected: ["task_name2_1", "task_name2_2"]
|
217
|
+
},
|
218
|
+
# TODO: add doing, done mix case. after implements choose, done method
|
219
|
+
]
|
220
|
+
|
221
|
+
cases.each do |c|
|
222
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
223
|
+
begin
|
224
|
+
case_before c
|
225
|
+
|
226
|
+
# -- given --
|
227
|
+
tudu_core = Tudu::Core.new
|
228
|
+
tudu_core.init
|
229
|
+
tudu_core.add c[:task_names1], c[:task_names2], c[:task_names3], c[:task_names4]
|
230
|
+
|
231
|
+
# -- when --
|
232
|
+
actual = tudu_core.tasks c[:search_word]
|
233
|
+
|
234
|
+
# -- then --
|
235
|
+
expect(actual).to eq(c[:expected])
|
236
|
+
ensure
|
237
|
+
case_after c
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
def case_before(c)
|
242
|
+
# implement each case before
|
243
|
+
end
|
244
|
+
|
245
|
+
def case_after(c)
|
246
|
+
return unless File.exists? "./tudu"
|
247
|
+
FileUtils.rm_rf("./tudu")
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
context :todos do
|
253
|
+
cases = [
|
254
|
+
{
|
255
|
+
case_no: 1,
|
256
|
+
case_title: "todos all tasks",
|
257
|
+
task_names1: "task_name1",
|
258
|
+
task_names2: "task_name2",
|
259
|
+
task_names3: "task_name3",
|
260
|
+
choose: true,
|
261
|
+
choose_name: "task_name1",
|
262
|
+
search_word: nil,
|
263
|
+
expected: ["task_name2", "task_name3"]
|
264
|
+
},
|
265
|
+
{
|
266
|
+
case_no: 2,
|
267
|
+
case_title: "todos search specific tasks",
|
268
|
+
task_names1: "task_name1",
|
269
|
+
task_names2: "task_name2",
|
270
|
+
task_names3: "task_name3",
|
271
|
+
choose: true,
|
272
|
+
choose_name: "task_name1",
|
273
|
+
search_word: "task_name3",
|
274
|
+
expected: ["task_name3"]
|
275
|
+
},
|
276
|
+
{
|
277
|
+
case_no: 3,
|
278
|
+
case_title: "todos search specific tasks by regexp",
|
279
|
+
task_names1: "task_name1_1",
|
280
|
+
task_names2: "task_name2_1",
|
281
|
+
task_names3: "task_name2_2",
|
282
|
+
task_names4: "task_name3_1",
|
283
|
+
choose: true,
|
284
|
+
choose_name: "task_name1_1",
|
285
|
+
search_word: "task_name2_",
|
286
|
+
expected: ["task_name2_1", "task_name2_2"]
|
287
|
+
},
|
288
|
+
]
|
289
|
+
|
290
|
+
cases.each do |c|
|
291
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
292
|
+
begin
|
293
|
+
case_before c
|
294
|
+
|
295
|
+
# -- given --
|
296
|
+
tudu_core = Tudu::Core.new
|
297
|
+
tudu_core.init
|
298
|
+
tudu_core.add c[:task_names1], c[:task_names2], c[:task_names3], c[:task_names4]
|
299
|
+
tudu_core.choose(c[:choose_name]) if c[:choose]
|
300
|
+
|
301
|
+
# -- when --
|
302
|
+
actual = tudu_core.todos c[:search_word]
|
303
|
+
|
304
|
+
# -- then --
|
305
|
+
expect(actual).to eq(c[:expected])
|
306
|
+
ensure
|
307
|
+
case_after c
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
def case_before(c)
|
312
|
+
# implement each case before
|
313
|
+
end
|
314
|
+
|
315
|
+
def case_after(c)
|
316
|
+
# implement each case after
|
317
|
+
return unless File.exists? "./tudu"
|
318
|
+
FileUtils.rm_rf("./tudu")
|
319
|
+
end
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
context :doings do
|
324
|
+
cases = [
|
325
|
+
{
|
326
|
+
case_no: 1,
|
327
|
+
case_title: "doings all tasks",
|
328
|
+
task_names1: "task_name1",
|
329
|
+
task_names2: "task_name2",
|
330
|
+
task_names3: "task_name3",
|
331
|
+
choose: true,
|
332
|
+
choose_name: "task_name1",
|
333
|
+
search_word: nil,
|
334
|
+
expected: ["task_name1"]
|
335
|
+
},
|
336
|
+
{
|
337
|
+
case_no: 2,
|
338
|
+
case_title: "doings search specific tasks",
|
339
|
+
task_names1: "task_name1",
|
340
|
+
task_names2: "task_name2",
|
341
|
+
task_names3: "task_name3",
|
342
|
+
choose: true,
|
343
|
+
choose_name: "task_name1",
|
344
|
+
search_word: nil,
|
345
|
+
expected: ["task_name1"]
|
346
|
+
},
|
347
|
+
{
|
348
|
+
case_no: 3,
|
349
|
+
case_title: "doings search specific tasks by regexp",
|
350
|
+
task_names1: "task_name1_1",
|
351
|
+
task_names2: "task_name2_1",
|
352
|
+
task_names3: "task_name2_2",
|
353
|
+
task_names4: "task_name3_1",
|
354
|
+
choose: true,
|
355
|
+
choose_name: "task_name1_1",
|
356
|
+
search_word: "task_name1_",
|
357
|
+
expected: ["task_name1_1"]
|
358
|
+
},
|
359
|
+
]
|
360
|
+
|
361
|
+
cases.each do |c|
|
362
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
363
|
+
begin
|
364
|
+
case_before c
|
365
|
+
|
366
|
+
# -- given --
|
367
|
+
tudu_core = Tudu::Core.new
|
368
|
+
tudu_core.init
|
369
|
+
tudu_core.add c[:task_names1], c[:task_names2], c[:task_names3], c[:task_names4]
|
370
|
+
tudu_core.choose(c[:choose_name]) if c[:choose]
|
371
|
+
|
372
|
+
# -- when --
|
373
|
+
actual = tudu_core.doings c[:search_word]
|
374
|
+
|
375
|
+
# -- then --
|
376
|
+
expect(actual).to eq(c[:expected])
|
377
|
+
ensure
|
378
|
+
case_after c
|
379
|
+
end
|
380
|
+
end
|
381
|
+
|
382
|
+
def case_before(c)
|
383
|
+
# implement each case before
|
384
|
+
end
|
385
|
+
|
386
|
+
def case_after(c)
|
387
|
+
# implement each case after
|
388
|
+
return unless File.exists? "./tudu"
|
389
|
+
FileUtils.rm_rf("./tudu")
|
390
|
+
end
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
394
|
+
context :dones do
|
395
|
+
cases = [
|
396
|
+
{
|
397
|
+
case_no: 1,
|
398
|
+
case_title: "doings all tasks",
|
399
|
+
task_names1: "task_name1",
|
400
|
+
task_names2: "task_name2",
|
401
|
+
task_names3: "task_name3",
|
402
|
+
choose_names: ["task_name1", "task_name2"],
|
403
|
+
done_names: ["task_name1"],
|
404
|
+
search_word: nil,
|
405
|
+
expected: ["task_name1"]
|
406
|
+
},
|
407
|
+
{
|
408
|
+
case_no: 2,
|
409
|
+
case_title: "doings search specific tasks",
|
410
|
+
task_names1: "task_name1_1",
|
411
|
+
task_names2: "task_name1_2",
|
412
|
+
task_names3: "task_name2_1",
|
413
|
+
choose_names: ["task_name1_1", "task_name1_2", "task_name2_1"],
|
414
|
+
done_names: ["task_name1_1", "task_name1_2", "task_name2_1"],
|
415
|
+
search_word: "task_name1_",
|
416
|
+
expected: ["task_name1_1", "task_name1_2"]
|
417
|
+
},
|
418
|
+
]
|
419
|
+
|
420
|
+
cases.each do |c|
|
421
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
422
|
+
begin
|
423
|
+
case_before c
|
424
|
+
|
425
|
+
# -- given --
|
426
|
+
tudu_core = Tudu::Core.new
|
427
|
+
tudu_core.init
|
428
|
+
tudu_core.add c[:task_names1], c[:task_names2], c[:task_names3], c[:task_names4]
|
429
|
+
c[:choose_names].each do |e|
|
430
|
+
tudu_core.choose e
|
431
|
+
tudu_core.done if c[:done_names].include? e
|
432
|
+
end
|
433
|
+
|
434
|
+
# -- when --
|
435
|
+
actual = tudu_core.dones c[:search_word]
|
436
|
+
|
437
|
+
# -- then --
|
438
|
+
expect(actual).to eq(c[:expected])
|
439
|
+
ensure
|
440
|
+
case_after c
|
441
|
+
end
|
442
|
+
end
|
443
|
+
|
444
|
+
def case_before(c)
|
445
|
+
# implement each case before
|
446
|
+
end
|
447
|
+
|
448
|
+
def case_after(c)
|
449
|
+
# implement each case after
|
450
|
+
return unless File.exists? "./tudu"
|
451
|
+
FileUtils.rm_rf("./tudu")
|
452
|
+
end
|
453
|
+
end
|
454
|
+
end
|
455
|
+
|
456
|
+
context :choose do
|
457
|
+
cases = [
|
458
|
+
{
|
459
|
+
case_no: 1,
|
460
|
+
case_title: "choose task",
|
461
|
+
task_names1: "task_name1",
|
462
|
+
task_names2: "task_name2",
|
463
|
+
task_names3: "task_name3",
|
464
|
+
choose: "task_name1",
|
465
|
+
expected_todos: "task_name2\ntask_name3\n",
|
466
|
+
expected_doings: "task_name1\n"
|
467
|
+
},
|
468
|
+
# doingにデータがあるケース
|
469
|
+
# すでにdoingのケース
|
470
|
+
# すでにdoneのケース
|
471
|
+
# 存在しないケース
|
472
|
+
]
|
473
|
+
|
474
|
+
cases.each do |c|
|
475
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
476
|
+
begin
|
477
|
+
case_before c
|
478
|
+
|
479
|
+
# -- given --
|
480
|
+
tudu_core = Tudu::Core.new
|
481
|
+
tudu_core.init
|
482
|
+
tudu_core.add c[:task_names1], c[:task_names2], c[:task_names3]
|
483
|
+
|
484
|
+
# -- when --
|
485
|
+
tudu_core.choose c[:choose]
|
486
|
+
|
487
|
+
# -- then --
|
488
|
+
actual_doings = File.read("./tudu/#{Tudu::Tasks::TUDU_DOINGS_FILE}")
|
489
|
+
expect(actual_doings).to eq(c[:expected_doings])
|
490
|
+
actual_todos = File.read("./tudu/#{Tudu::Tasks::TUDU_TODOS_FILE}")
|
491
|
+
expect(actual_todos).to eq(c[:expected_todos])
|
492
|
+
ensure
|
493
|
+
case_after c
|
494
|
+
end
|
495
|
+
end
|
496
|
+
|
497
|
+
def case_before(c)
|
498
|
+
# implement each case before
|
499
|
+
end
|
500
|
+
|
501
|
+
def case_after(c)
|
502
|
+
# implement each case after
|
503
|
+
return unless File.exists? "./tudu"
|
504
|
+
FileUtils.rm_rf("./tudu")
|
505
|
+
end
|
506
|
+
end
|
507
|
+
end
|
508
|
+
|
509
|
+
context :done do
|
510
|
+
cases = [
|
511
|
+
{
|
512
|
+
case_no: 1,
|
513
|
+
case_title: "one doing to done, shift todo to doing",
|
514
|
+
task_names1: "task_name1",
|
515
|
+
task_names2: "task_name2",
|
516
|
+
task_names3: "task_name3",
|
517
|
+
choose: "task_name1",
|
518
|
+
expected_doings: "task_name2\n",
|
519
|
+
expected_done: "task_name1\n"
|
520
|
+
},
|
521
|
+
{
|
522
|
+
case_no: 2,
|
523
|
+
case_title: "one doing to done, not shift todo to doing",
|
524
|
+
task_names1: "task_name1",
|
525
|
+
choose: "task_name1",
|
526
|
+
expected_doings: "",
|
527
|
+
expected_done: "task_name1\n"
|
528
|
+
},
|
529
|
+
{
|
530
|
+
case_no: 3,
|
531
|
+
case_title: "no doing",
|
532
|
+
task_names1: "task_name1",
|
533
|
+
choose: "",
|
534
|
+
expected_doings: "",
|
535
|
+
expected_done: ""
|
536
|
+
},
|
537
|
+
]
|
538
|
+
|
539
|
+
cases.each do |c|
|
540
|
+
it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
|
541
|
+
begin
|
542
|
+
case_before c
|
543
|
+
|
544
|
+
# -- given --
|
545
|
+
tudu_core = Tudu::Core.new
|
546
|
+
tudu_core.init
|
547
|
+
tudu_core.add c[:task_names1], c[:task_names2], c[:task_names3]
|
548
|
+
tudu_core.choose c[:choose]
|
549
|
+
|
550
|
+
# -- when --
|
551
|
+
tudu_core.done
|
552
|
+
|
553
|
+
# -- then --
|
554
|
+
actual_doings = File.read(Tudu::Tasks::TUDU_DOINGS_FILE_PATH)
|
555
|
+
expect(actual_doings).to eq(c[:expected_doings])
|
556
|
+
actual_dones = File.read(Tudu::Tasks::TUDU_DONES_FILE_PATH)
|
557
|
+
expect(actual_dones).to eq(c[:expected_done])
|
558
|
+
ensure
|
559
|
+
case_after c
|
560
|
+
end
|
561
|
+
end
|
562
|
+
|
563
|
+
def case_before(c)
|
564
|
+
# implement each case before
|
565
|
+
end
|
566
|
+
|
567
|
+
def case_after(c)
|
568
|
+
# implement each case after
|
569
|
+
return unless File.exists? "./tudu"
|
570
|
+
FileUtils.rm_rf("./tudu")
|
571
|
+
end
|
572
|
+
end
|
573
|
+
end
|
574
|
+
end
|