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.
- checksums.yaml +4 -4
- data/bin/todo.rb +43 -9
- 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: 0bfdc7f1aa08b2e153cb2db14f20487511c3dd4064b5f11164d5f6f503b65ba2
|
4
|
+
data.tar.gz: 6cc8401c245972537c76589ed4cab56b712006216bf1a442269ccb5aa2961cf0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 434b78f9f7f72bfbf127d57e24ab1a48558495e2f79a807554ddfe49197ea20174c68e09ea705215a222ac1acfbcc5114a719dfc301aa96f4f6a5969848c88f4
|
7
|
+
data.tar.gz: 99a3bf80d303e66da13b92a6fa95ec5a31db4623f2fbe9a28f8a7b2b623e858312b397777cb6d297fe2b8e7f96e9f218a961bf6c5606194240c1aa26ec568c08
|
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,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>
|
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 read
|
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
|
-
|
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
|
-
|
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 <
|
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 <
|
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 <
|
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.
|
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-
|
11
|
+
date: 2020-10-04 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|