todo-jsonl 0.1.1 → 0.1.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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/bin/todo.rb +43 -9
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4a389a0b7225f800d916b58f952227d7172f6df9fbeb94a832f8b35e8d6310b3
4
- data.tar.gz: 23f27f59ae81ac5b1aca3d8b5234a8eaeb84141eb08d53e713a72032c9a004f0
3
+ metadata.gz: 0bfdc7f1aa08b2e153cb2db14f20487511c3dd4064b5f11164d5f6f503b65ba2
4
+ data.tar.gz: 6cc8401c245972537c76589ed4cab56b712006216bf1a442269ccb5aa2961cf0
5
5
  SHA512:
6
- metadata.gz: 11d560696887b3ec7269992d0965586b26e167283b9612a1505ebe2d8797163e4ef83cf01f7364ade432af9e292ee65b00dde3681553cd5d2511bf18928ec0ea
7
- data.tar.gz: f3ca3d8c038f6efe379af9d9536781493018743686a956adaf1cbe18362838ed7585a0462c7f60da20b7a914be041535cbc9030c29fe7249fe4c3b8818e2d70e
6
+ metadata.gz: 434b78f9f7f72bfbf127d57e24ab1a48558495e2f79a807554ddfe49197ea20174c68e09ea705215a222ac1acfbcc5114a719dfc301aa96f4f6a5969848c88f4
7
+ data.tar.gz: 99a3bf80d303e66da13b92a6fa95ec5a31db4623f2fbe9a28f8a7b2b623e858312b397777cb6d297fe2b8e7f96e9f218a961bf6c5606194240c1aa26ec568c08
@@ -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,17 +93,19 @@ 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
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
98
- * repl enter readevalprint loop mode
108
+ * repl enter read-eval-print loop mode
99
109
  * help this help screen
100
110
 
101
111
  With list command the following pre-defined regex patterns can be also used:
@@ -103,7 +113,7 @@ def usage
103
113
 
104
114
  Legend:
105
115
  #{STATES.select { |k, v| k != 'default' }.map { |k, v| "#{k} #{v}" }.join(', ') }, priority #{PRIORITY_FLAG}
106
- USAGE
116
+ USAGE
107
117
  end
108
118
 
109
119
  def load_tasks(item_to_check = nil)
@@ -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
@@ -254,7 +284,7 @@ end
254
284
  def read(arguments)
255
285
  begin
256
286
  action = arguments.first
257
- args = arguments[1..-1]
287
+ args = arguments[1..-1] || []
258
288
  case action
259
289
  when 'add'
260
290
  add(args.join(' ')) unless args.nil? || args.empty?
@@ -264,16 +294,20 @@ def read(arguments)
264
294
  args.length == 1 ? change_state(args.first.to_i, 'done') : list(nil, [':done'])
265
295
  when 'block'
266
296
  args.length == 1 ? change_state(args.first.to_i, 'blocked') : list(nil, [':blocked'])
297
+ when 'reset'
298
+ args.length == 1 ? change_state(args.first.to_i, 'new') : list(nil, [':new'])
267
299
  when 'prio'
268
300
  set_priority(args.first.to_i) if args.length == 1
301
+ when 'due'
302
+ due_date(args.first.to_i, (args[1..-1] || []).join(' ')) unless args.length < 1
269
303
  when 'append'
270
- append(args.first.to_i, args[1..-1].join(' ')) unless args.length < 1
304
+ append(args.first.to_i, args[1..-1].join(' ')) unless args.length < 2
271
305
  when 'rename'
272
- rename(args.first.to_i, args[1..-1].join(' ')) unless args.length < 1
306
+ rename(args.first.to_i, args[1..-1].join(' ')) unless args.length < 2
273
307
  when 'del'
274
308
  delete(args.first.to_i) if args.length == 1
275
309
  when 'note'
276
- add_note(args.first.to_i, args[1..-1].join(' ')) unless args.length < 1
310
+ add_note(args.first.to_i, args[1..-1].join(' ')) unless args.length < 2
277
311
  when 'delnote'
278
312
  delete_note(args.first.to_i) if args.length == 1
279
313
  when 'list'
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.1
4
+ version: 0.1.6
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-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: