tudu 0.0.5 → 0.0.6
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.
- checksums.yaml +7 -0
- data/.rubocop.yml +0 -4
- data/Gemfile +0 -4
- data/Rakefile +1 -1
- data/bin/tudu +2 -0
- data/lib/task.rb +33 -0
- data/lib/tasks.rb +66 -135
- data/lib/tudu/version.rb +1 -1
- data/lib/tudu_core.rb +23 -19
- data/lib/tudu_dsl.rb +11 -11
- data/lib/tudu_file_keys.rb +17 -0
- data/lib/tudu_paths.rb +37 -0
- data/lib/tudu_templates.rb +38 -0
- data/spec/tasks_spec.rb +160 -158
- data/spec/tudu_core_spec.rb +51 -46
- data/spec/tudu_dsl_spec.rb +4 -3
- data/tudu.gemspec +28 -27
- metadata +56 -25
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5d854c851707b6c6e42759565ec28691f91de494
|
4
|
+
data.tar.gz: 318deac04bd2ad49d539a954320befbc7b9f0852
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d00bf36e7a0b77347a0edff5cea73990034f1a5dda492eaefe196c620d87c161266c651b62ee6a5d28d486c80ee45bca6d58f7bdd6921c5189aa55ab65ea5fe3
|
7
|
+
data.tar.gz: c3100a1d47e957d0ea42778022e6d7d00b590eff9c6e120979b40d01c7eee2f38ec759350611a54696d773ab9377e29d85e22a872dab264556bc429ba18336c4
|
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
data/bin/tudu
CHANGED
data/lib/task.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Tudu
|
4
|
+
# = Tudu::Task
|
5
|
+
class Task
|
6
|
+
# == task type [todo, doing, done]
|
7
|
+
attr_accessor :type
|
8
|
+
# == task name [uniq]
|
9
|
+
attr_accessor :name
|
10
|
+
|
11
|
+
# == init task with setting task type and task name.
|
12
|
+
def initialize(type, name)
|
13
|
+
@type, @name = type, name
|
14
|
+
end
|
15
|
+
|
16
|
+
def todo?
|
17
|
+
@type == 'todos'
|
18
|
+
end
|
19
|
+
|
20
|
+
def doing?
|
21
|
+
@type == 'doings'
|
22
|
+
end
|
23
|
+
|
24
|
+
def done?
|
25
|
+
@type == 'dones'
|
26
|
+
end
|
27
|
+
|
28
|
+
def ==(other)
|
29
|
+
return true if name == other.name && type == other.type
|
30
|
+
false
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/tasks.rb
CHANGED
@@ -1,85 +1,11 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require 'task'
|
3
|
+
require 'tudu_file_keys'
|
2
4
|
|
5
|
+
# rubocop:disable ClassLength
|
3
6
|
module Tudu
|
4
7
|
# = Tudu::Tasks
|
5
8
|
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
9
|
class << self
|
84
10
|
# == add task to todos
|
85
11
|
# === Params
|
@@ -90,7 +16,9 @@ module Tudu
|
|
90
16
|
puts "#{task_name} is already exists."
|
91
17
|
next
|
92
18
|
end
|
93
|
-
File.open(TUDU_TODOS_FILE_PATH, 'a:UTF-8')
|
19
|
+
File.open(TuduPaths::TUDU_TODOS_FILE_PATH, 'a:UTF-8') do |f|
|
20
|
+
f.puts task_name
|
21
|
+
end
|
94
22
|
puts "complete add todo '#{task_name}' to tudu/todos"
|
95
23
|
end
|
96
24
|
end
|
@@ -113,7 +41,7 @@ module Tudu
|
|
113
41
|
return if when_choose_no_task?(task, task_name)
|
114
42
|
return unless when_choose_type_is_todo?(task, task_name)
|
115
43
|
remove task_name
|
116
|
-
|
44
|
+
write_doing(task_name)
|
117
45
|
puts "complete add doings '#{task_name}'"
|
118
46
|
end
|
119
47
|
|
@@ -128,22 +56,22 @@ module Tudu
|
|
128
56
|
# == get todos type tasks.
|
129
57
|
# === Returns
|
130
58
|
# return Array[Tasks]
|
131
|
-
def
|
132
|
-
get_tasks(TUDU_TODOS_FILE)
|
59
|
+
def todos
|
60
|
+
get_tasks(TuduPaths::TUDU_TODOS_FILE)
|
133
61
|
end
|
134
62
|
|
135
63
|
# == get doings type tasks.
|
136
64
|
# === Returns
|
137
65
|
# return Array[Tasks]
|
138
|
-
def
|
139
|
-
get_tasks(TUDU_DOINGS_FILE)
|
66
|
+
def doings
|
67
|
+
get_tasks(TuduPaths::TUDU_DOINGS_FILE)
|
140
68
|
end
|
141
69
|
|
142
70
|
# == get dones type tasks.
|
143
71
|
# === Returns
|
144
72
|
# return Array[Tasks]
|
145
|
-
def
|
146
|
-
get_tasks(TUDU_DONES_FILE)
|
73
|
+
def dones
|
74
|
+
get_tasks(TuduPaths::TUDU_DONES_FILE)
|
147
75
|
end
|
148
76
|
|
149
77
|
# == get each type tasks.
|
@@ -152,7 +80,7 @@ module Tudu
|
|
152
80
|
# === Returns
|
153
81
|
# return Array[Tasks]
|
154
82
|
def get_tasks(type = nil)
|
155
|
-
type.nil? ?
|
83
|
+
type.nil? ? all_tasks : get_each_tasks(type)
|
156
84
|
end
|
157
85
|
|
158
86
|
# == get each type tasks from file.
|
@@ -161,7 +89,7 @@ module Tudu
|
|
161
89
|
# === Returns
|
162
90
|
# return Array[String]
|
163
91
|
def get_tasks_from_file(file_name)
|
164
|
-
File.read("./#{TUDU_DIR}/#{file_name}").split("\n")
|
92
|
+
File.read("./#{TuduPaths::TUDU_DIR}/#{file_name}").split("\n")
|
165
93
|
end
|
166
94
|
|
167
95
|
# == filter tasklist by search_word.
|
@@ -172,7 +100,7 @@ module Tudu
|
|
172
100
|
# return filterd task list
|
173
101
|
def filter_tasks(tasks, search_word)
|
174
102
|
return tasks if search_word.nil?
|
175
|
-
tasks.select { |task|task.name.match
|
103
|
+
tasks.select { |task|task.name.match(/.*#{search_word}.*/) }
|
176
104
|
end
|
177
105
|
|
178
106
|
# == find task from all tasks.
|
@@ -190,8 +118,8 @@ module Tudu
|
|
190
118
|
# return progress
|
191
119
|
def progress
|
192
120
|
total_count = get_tasks.size
|
193
|
-
dones_count =
|
194
|
-
percent = total_count == 0 ? 0 : (dones_count
|
121
|
+
dones_count = dones.size
|
122
|
+
percent = total_count == 0 ? 0 : percentage(dones_count, total_count)
|
195
123
|
prefix = "#{dones_count}/#{total_count}|"
|
196
124
|
done_bar = '=' * (percent / 10)
|
197
125
|
rest_bar = ' ' * (10 - (percent / 10))
|
@@ -202,32 +130,38 @@ module Tudu
|
|
202
130
|
|
203
131
|
private
|
204
132
|
|
133
|
+
def percentage(base, total)
|
134
|
+
(base.to_f / total.to_f * 100).round
|
135
|
+
end
|
136
|
+
|
205
137
|
def get_first_todo_name_if_nil_or_empty(task_name)
|
206
|
-
task_name.nil? || task_name.empty? ?
|
138
|
+
task_name.nil? || task_name.empty? ? todos.first.name : task_name
|
207
139
|
end
|
208
140
|
|
209
141
|
def get_each_tasks(type)
|
210
142
|
tasks = []
|
211
|
-
get_tasks_from_file(type).each { |task|tasks <<
|
143
|
+
get_tasks_from_file(type).each { |task|tasks << Task.new(type, task) }
|
212
144
|
tasks
|
213
145
|
end
|
214
146
|
|
215
|
-
def
|
147
|
+
def all_tasks
|
216
148
|
tasks = []
|
217
|
-
TASK_FILES.each_value
|
149
|
+
TuduPaths::TASK_FILES.each_value do |each_type|
|
150
|
+
tasks += get_each_tasks(each_type)
|
151
|
+
end
|
218
152
|
tasks
|
219
153
|
end
|
220
154
|
|
221
|
-
def
|
155
|
+
def include_task?(tasks, task_name)
|
222
156
|
tasks.include? task_name
|
223
157
|
end
|
224
158
|
|
225
159
|
def remove_each_task(task_name)
|
226
160
|
can_find = false
|
227
|
-
TASK_FILES.each_value do |rf|
|
161
|
+
TuduPaths::TASK_FILES.each_value do |rf|
|
228
162
|
tasks = get_tasks_from_file(rf)
|
229
|
-
next unless
|
230
|
-
remove_task(tasks, task_name, "./#{TUDU_DIR}/#{rf}")
|
163
|
+
next unless include_task?(tasks, task_name)
|
164
|
+
remove_task(tasks, task_name, "./#{TuduPaths::TUDU_DIR}/#{rf}")
|
231
165
|
can_find = true
|
232
166
|
break
|
233
167
|
end
|
@@ -242,13 +176,13 @@ module Tudu
|
|
242
176
|
end
|
243
177
|
|
244
178
|
def when_choose_no_todos?
|
245
|
-
return false unless
|
179
|
+
return false unless todos.size == 0
|
246
180
|
puts 'todos is empty.'
|
247
181
|
true
|
248
182
|
end
|
249
183
|
|
250
184
|
def when_choose_no_doings?
|
251
|
-
return true if
|
185
|
+
return true if doings.size == 0
|
252
186
|
puts 'todos is empty.'
|
253
187
|
false
|
254
188
|
end
|
@@ -261,59 +195,56 @@ module Tudu
|
|
261
195
|
|
262
196
|
def when_choose_type_is_todo?(task, task_name)
|
263
197
|
return true if task.todo?
|
264
|
-
puts "#{task_name} is not exists in todos. #{task_name} in #{task.type}"
|
198
|
+
puts "#{task_name} is not exists in todos. #{task_name} in #{task.type}" # rubocop:disable LineLength
|
265
199
|
false
|
266
200
|
end
|
267
201
|
|
268
202
|
def doings_to_dones
|
269
|
-
|
270
|
-
if
|
203
|
+
tmp_doings = doings
|
204
|
+
if tmp_doings.size == 0
|
271
205
|
puts 'there is no doing task.before done, you must choose task.'
|
272
206
|
return false
|
273
207
|
end
|
274
|
-
|
275
|
-
|
208
|
+
write_doing('')
|
209
|
+
write_done(tmp_doings.first.name)
|
276
210
|
true
|
277
211
|
end
|
278
212
|
|
213
|
+
def write_doing(text)
|
214
|
+
File.open(TuduPaths::TUDU_DOINGS_FILE_PATH, 'w:UTF-8') do |f|
|
215
|
+
if text.empty?
|
216
|
+
f.print(text)
|
217
|
+
else
|
218
|
+
f.puts text
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
def write_done(text)
|
224
|
+
File.open(TuduPaths::TUDU_DONES_FILE_PATH, 'a:UTF-8') do |f|
|
225
|
+
f.puts text
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
279
229
|
def todos_to_doings
|
280
|
-
|
281
|
-
return if finish?(
|
282
|
-
deleted_todos =
|
230
|
+
tmp_todos = todos
|
231
|
+
return if finish?(tmp_todos)
|
232
|
+
deleted_todos = tmp_todos.dup
|
283
233
|
deleted_todos.delete_at 0
|
284
|
-
File.open(TUDU_TODOS_FILE_PATH, 'w:UTF-8') do |f|
|
234
|
+
File.open(TuduPaths::TUDU_TODOS_FILE_PATH, 'w:UTF-8') do |f|
|
285
235
|
deleted_todos.each { |task|f.puts task.name }
|
286
236
|
end
|
287
|
-
File.open(TUDU_DOINGS_FILE_PATH, 'w:UTF-8')
|
237
|
+
File.open(TuduPaths::TUDU_DOINGS_FILE_PATH, 'w:UTF-8') do |f|
|
238
|
+
f.puts tmp_todos.first.name
|
239
|
+
end
|
288
240
|
end
|
289
241
|
|
290
|
-
def finish?(
|
291
|
-
return false unless
|
292
|
-
puts 'All Tasks Finish!!' if
|
242
|
+
def finish?(tmp_todos)
|
243
|
+
return false unless tmp_todos.size == 0
|
244
|
+
puts 'All Tasks Finish!!' if doings.size == 0
|
293
245
|
true
|
294
246
|
end
|
295
247
|
end
|
296
|
-
|
297
|
-
# == init task with setting task type and task name.
|
298
|
-
def initialize(type, name)
|
299
|
-
@type, @name = type, name
|
300
|
-
end
|
301
|
-
|
302
|
-
def todo?
|
303
|
-
@type == 'todos'
|
304
|
-
end
|
305
|
-
|
306
|
-
def doing?
|
307
|
-
@type == 'doings'
|
308
|
-
end
|
309
|
-
|
310
|
-
def done?
|
311
|
-
@type == 'dones'
|
312
|
-
end
|
313
|
-
|
314
|
-
def ==(other)
|
315
|
-
return true if name == other.name && type == other.type
|
316
|
-
false
|
317
|
-
end
|
318
248
|
end
|
319
249
|
end
|
250
|
+
# rubocop:enable ClassLength
|
data/lib/tudu/version.rb
CHANGED
data/lib/tudu_core.rb
CHANGED
@@ -2,15 +2,19 @@
|
|
2
2
|
require 'tudu/version'
|
3
3
|
require 'tasks'
|
4
4
|
require 'highline'
|
5
|
+
require 'tudu_file_keys'
|
6
|
+
require 'tudu_paths'
|
5
7
|
|
6
8
|
module Tudu
|
7
9
|
# Tudu::Core
|
8
10
|
class Core
|
9
11
|
# == generate files [Tudufile, todos, doings, dones]
|
10
12
|
def init
|
11
|
-
Dir.mkdir
|
12
|
-
|
13
|
-
File.open("./tudu/#{
|
13
|
+
Dir.mkdir TuduPaths::TUDU_DIR unless File.exist? TuduPaths::TUDU_DIR
|
14
|
+
TuduFileKeys::TUDU_KEYS.each do |key|
|
15
|
+
File.open("./tudu/#{TuduPaths::INIT_FILES[key]}", 'w:UTF-8') do |f|
|
16
|
+
f.print Templates::INIT_FILES_TEMPLATE[key]
|
17
|
+
end
|
14
18
|
end
|
15
19
|
end
|
16
20
|
|
@@ -18,28 +22,28 @@ module Tudu
|
|
18
22
|
# === Params
|
19
23
|
#- task_names : add task name list
|
20
24
|
def add(*task_names)
|
21
|
-
|
25
|
+
Tasks.add(*task_names)
|
22
26
|
end
|
23
27
|
|
24
28
|
# == remove task to todo
|
25
29
|
# === Params
|
26
30
|
#- task_names : remove task name list
|
27
31
|
def remove(*task_names)
|
28
|
-
|
32
|
+
Tasks.remove(*task_names)
|
29
33
|
end
|
30
34
|
|
31
35
|
# == choose todo => doing task
|
32
36
|
# === Params
|
33
37
|
#- task_name : target task name
|
34
38
|
def choose(task_name)
|
35
|
-
|
39
|
+
Tasks.choose task_name
|
36
40
|
end
|
37
41
|
|
38
42
|
# == doing to done
|
39
43
|
#- if doings size == 0, nothing todo.
|
40
44
|
#- after move doing to done, next todo move to doing.
|
41
45
|
def done
|
42
|
-
|
46
|
+
Tasks.done
|
43
47
|
end
|
44
48
|
|
45
49
|
# == search tasks
|
@@ -47,12 +51,12 @@ module Tudu
|
|
47
51
|
#- search_word : search word. enable regexp.
|
48
52
|
#- options : options.
|
49
53
|
def tasks(search_word, options)
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
categorise(options,
|
55
|
-
|
54
|
+
todo_s = todos search_word
|
55
|
+
doing_s = doings search_word
|
56
|
+
done_s = dones search_word
|
57
|
+
todo_s, doing_s, done_s = coloring(options, todo_s, doing_s, done_s)
|
58
|
+
categorise(options, todo_s, doing_s, done_s)
|
59
|
+
todo_s + doing_s + done_s
|
56
60
|
end
|
57
61
|
|
58
62
|
# == search todos
|
@@ -80,7 +84,7 @@ module Tudu
|
|
80
84
|
# === Returns
|
81
85
|
# return progress
|
82
86
|
def progress
|
83
|
-
|
87
|
+
Tasks.progress
|
84
88
|
end
|
85
89
|
|
86
90
|
alias_method :now, :doings
|
@@ -104,23 +108,23 @@ module Tudu
|
|
104
108
|
end
|
105
109
|
|
106
110
|
def colored?(options)
|
107
|
-
|
111
|
+
options && options[:color]
|
108
112
|
end
|
109
113
|
|
110
114
|
def categorised?(options)
|
111
|
-
|
115
|
+
options && options[:category]
|
112
116
|
end
|
113
117
|
|
114
118
|
def todos_task(search_word)
|
115
|
-
|
119
|
+
Tasks.filter_tasks(Tasks.todos, search_word)
|
116
120
|
end
|
117
121
|
|
118
122
|
def doings_task(search_word)
|
119
|
-
|
123
|
+
Tasks.filter_tasks(Tasks.doings, search_word)
|
120
124
|
end
|
121
125
|
|
122
126
|
def dones_task(search_word)
|
123
|
-
|
127
|
+
Tasks.filter_tasks(Tasks.dones, search_word)
|
124
128
|
end
|
125
129
|
end
|
126
130
|
end
|