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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/bin/todo.rb +54 -11
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 39c4196d7a61cdddc60d741fd7f872748fee16e6dfac6b0005ad9d790927a6b0
4
- data.tar.gz: ee8ca459774e1df288db13e31cc9883cadb6d5cfabbccb68f4f5174d57e9c35b
3
+ metadata.gz: 7aab10deef9e956db5b18eaed5938749e225e3fdb99764c119fabe7bfa16969f
4
+ data.tar.gz: 682cf59b330c12e2276e350dba4112e34a56edbf0274276eabb12be81c3b406d
5
5
  SHA512:
6
- metadata.gz: b84db7afa428f64e5028be1e06da854d26c233c0ae85d95df0d7a47f4f645392fd5289580f9342d39642e895e902c84f6896d80747c6f91466a9b614b19d724b
7
- data.tar.gz: 8ce70a368b56dc5df598188e23e0406224258ccfc8066630c0cab7829c0651fba188eb03066e4545eef9e371089c796ef39be1bf110be485b92509d7ef79e69c
6
+ metadata.gz: 9f4e3193f34df98c4cc50b86722246724cb31dd3d54d754435db5d80a0ac0300a026d5e09c479061a1f8fd65f40773dff5d175184078c573c1d102344a5dd7f7
7
+ data.tar.gz: 824d0796aa292733ef672d2998377975b3b55a43021224213fa9b78af52fb3dc96842db1d7c00dfe727d6ea593d2bfb694e4072234932d5aff1a53919d48a615
@@ -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> <text> delete all notes from task
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
- puts "#{num.to_s.rjust(4, ' ')}:#{priority_flag}#{display_state} #{title}"
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
- add(args.join(' ')) unless args.nil? || args.empty?
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
- set_priority(args.first.to_i) if args.length == 1
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
- append(args.first.to_i, args[1..-1].join(' ')) unless args.length < 1
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
- rename(args.first.to_i, args[1..-1].join(' ')) unless args.length < 1
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
- delete(args.first.to_i) if args.length == 1
313
+ raise action + ' command requires exactly one parameter' if args.length != 1
314
+ delete(args.first.to_i)
275
315
  when 'note'
276
- add_note(args.first.to_i, args[1..-1].join(' ')) unless args.length < 1
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
- delete_note(args.first.to_i) if args.length == 1
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
- show(args.first.to_i) if args.length == 1
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.2
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-09-15 00:00:00.000000000 Z
11
+ date: 2020-10-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: