todo-jsonl 0.1.2 → 0.1.7
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 +4 -4
- data/bin/todo.rb +54 -11
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7aab10deef9e956db5b18eaed5938749e225e3fdb99764c119fabe7bfa16969f
|
4
|
+
data.tar.gz: 682cf59b330c12e2276e350dba4112e34a56edbf0274276eabb12be81c3b406d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f4e3193f34df98c4cc50b86722246724cb31dd3d54d754435db5d80a0ac0300a026d5e09c479061a1f8fd65f40773dff5d175184078c573c1d102344a5dd7f7
|
7
|
+
data.tar.gz: 824d0796aa292733ef672d2998377975b3b55a43021224213fa9b78af52fb3dc96842db1d7c00dfe727d6ea593d2bfb694e4072234932d5aff1a53919d48a615
|
data/bin/todo.rb
CHANGED
@@ -25,6 +25,7 @@
|
|
25
25
|
# SOFTWARE.
|
26
26
|
|
27
27
|
require 'json'
|
28
|
+
require 'date'
|
28
29
|
|
29
30
|
DATE_FORMAT = '%Y-%m-%d'
|
30
31
|
|
@@ -72,6 +73,13 @@ QUERIES = {
|
|
72
73
|
':all' => 'state=\w+'
|
73
74
|
}
|
74
75
|
|
76
|
+
TODAY = DateTime.now
|
77
|
+
|
78
|
+
DUE_DATE_DAYS = ['today', 'tomorrow']
|
79
|
+
(2..6).each do |day|
|
80
|
+
DUE_DATE_DAYS.push((TODAY.to_date + day).strftime('%A').downcase)
|
81
|
+
end
|
82
|
+
|
75
83
|
PRIORITY_FLAG = '*'
|
76
84
|
|
77
85
|
TODO_FILE = "#{ENV['HOME']}/todo.jsonl"
|
@@ -85,13 +93,15 @@ def usage
|
|
85
93
|
* start <tasknumber> mark task as started
|
86
94
|
* done <tasknumber> mark task as completed
|
87
95
|
* block <tasknumber> mark task as blocked
|
96
|
+
* reset <tasknumber> reset task to new state
|
88
97
|
* prio <tasknumber> toggle high priority flag
|
98
|
+
* due <tasknumber> <date> set due date (in YYYY-MM-DD format)
|
89
99
|
|
90
100
|
* append <tasknumber> <text> append text to task title
|
91
101
|
* rename <tasknumber> <text> rename task
|
92
102
|
* del <tasknumber> delete task
|
93
103
|
* note <tasknumber> <text> add note to task
|
94
|
-
* delnote <tasknumber>
|
104
|
+
* delnote <tasknumber> delete all notes from task
|
95
105
|
|
96
106
|
* list <regex> [regex...] list tasks (only active tasks by default)
|
97
107
|
* show <tasknumber> show all task details
|
@@ -183,6 +193,14 @@ def set_priority(item)
|
|
183
193
|
list(tasks)
|
184
194
|
end
|
185
195
|
|
196
|
+
def due_date(item, date = '')
|
197
|
+
tasks = load_tasks(item)
|
198
|
+
tasks[item][:due] = date.nil? || date.empty? ? nil : Date.parse(date).strftime(DATE_FORMAT)
|
199
|
+
tasks[item][:modified] = Time.now.strftime(DATE_FORMAT)
|
200
|
+
write_tasks(tasks)
|
201
|
+
list(tasks)
|
202
|
+
end
|
203
|
+
|
186
204
|
def list(tasks = nil, patterns = nil)
|
187
205
|
items = {}
|
188
206
|
tasks = tasks || load_tasks
|
@@ -196,7 +214,7 @@ def list(tasks = nil, patterns = nil)
|
|
196
214
|
items[num] = task if match
|
197
215
|
end
|
198
216
|
items = items.sort_by do |num, task|
|
199
|
-
[task[:priority] ? 0 : 1, ORDER[task[:state] || 'default'], num]
|
217
|
+
[task[:priority] && task[:state] != 'done' ? 0 : 1, ORDER[task[:state] || 'default'], task[:due] || 'n/a', num]
|
200
218
|
end
|
201
219
|
items.each do |num, task|
|
202
220
|
state = task[:state] || 'default'
|
@@ -204,7 +222,19 @@ def list(tasks = nil, patterns = nil)
|
|
204
222
|
display_state = colorize(STATES[state], color)
|
205
223
|
title = task[:title].gsub(/@\w+/) { |tag| colorize(tag, :cyan) }
|
206
224
|
priority_flag = task[:priority] ? colorize(PRIORITY_FLAG, :red) : ' '
|
207
|
-
|
225
|
+
due_date = ''
|
226
|
+
if task[:due] && state != 'done'
|
227
|
+
date_diff = (Date.parse(task[:due]) - TODAY.to_date).to_i
|
228
|
+
if date_diff < 0
|
229
|
+
due_date = colorize("(#{date_diff.abs}d overdue)", :red)
|
230
|
+
elsif date_diff == 0 || date_diff == 1
|
231
|
+
due_date = colorize("(#{DUE_DATE_DAYS[date_diff]})", :yellow)
|
232
|
+
else
|
233
|
+
due_date = colorize("(#{DUE_DATE_DAYS[date_diff] || task[:due]})", :magenta) if date_diff > 1
|
234
|
+
end
|
235
|
+
due_date = ' ' + due_date
|
236
|
+
end
|
237
|
+
puts "#{num.to_s.rjust(4, ' ')}:#{priority_flag}#{display_state} #{title}#{due_date}"
|
208
238
|
end
|
209
239
|
puts 'No todos found' if items.empty?
|
210
240
|
end
|
@@ -257,29 +287,42 @@ def read(arguments)
|
|
257
287
|
args = arguments[1..-1] || []
|
258
288
|
case action
|
259
289
|
when 'add'
|
260
|
-
|
290
|
+
raise action + ' command requires at least one parameter' if args.nil? || args.empty?
|
291
|
+
add(args.join(' '))
|
261
292
|
when 'start'
|
262
293
|
args.length == 1 ? change_state(args.first.to_i, 'started') : list(nil, [':started'])
|
263
294
|
when 'done'
|
264
295
|
args.length == 1 ? change_state(args.first.to_i, 'done') : list(nil, [':done'])
|
265
296
|
when 'block'
|
266
297
|
args.length == 1 ? change_state(args.first.to_i, 'blocked') : list(nil, [':blocked'])
|
298
|
+
when 'reset'
|
299
|
+
args.length == 1 ? change_state(args.first.to_i, 'new') : list(nil, [':new'])
|
267
300
|
when 'prio'
|
268
|
-
|
301
|
+
raise action + ' command requires exactly one parameter' if args.length != 1
|
302
|
+
set_priority(args.first.to_i)
|
303
|
+
when 'due'
|
304
|
+
raise action + ' command requires at least one parameter' if args.length < 1
|
305
|
+
due_date(args.first.to_i, (args[1..-1] || []).join(' '))
|
269
306
|
when 'append'
|
270
|
-
|
307
|
+
raise action + ' command requires at least two parameters' if args.length < 2
|
308
|
+
append(args.first.to_i, args[1..-1].join(' '))
|
271
309
|
when 'rename'
|
272
|
-
|
310
|
+
raise action + ' command requires at least two parameters' if args.length < 2
|
311
|
+
rename(args.first.to_i, args[1..-1].join(' '))
|
273
312
|
when 'del'
|
274
|
-
|
313
|
+
raise action + ' command requires exactly one parameter' if args.length != 1
|
314
|
+
delete(args.first.to_i)
|
275
315
|
when 'note'
|
276
|
-
|
316
|
+
raise action + ' command requires at least two parameters' if args.length < 2
|
317
|
+
add_note(args.first.to_i, args[1..-1].join(' '))
|
277
318
|
when 'delnote'
|
278
|
-
|
319
|
+
raise action + ' command requires exactly one parameter' if args.length != 1
|
320
|
+
delete_note(args.first.to_i)
|
279
321
|
when 'list'
|
280
322
|
list(nil, args)
|
281
323
|
when 'show'
|
282
|
-
|
324
|
+
raise action + ' command requires exactly one parameter' if args.length != 1
|
325
|
+
show(args.first.to_i)
|
283
326
|
when 'help'
|
284
327
|
puts usage
|
285
328
|
when 'repl'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: todo-jsonl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gabor Bata
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-10-05 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|