todo-jsonl 0.1.0 → 0.1.5
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 +40 -9
- metadata +3 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 751d24c27a1e18c59b1a0cd828a8ab8c6dd9f60b15956731101cd2518db9fd1c
|
4
|
+
data.tar.gz: 8d5968af9ac740a09b39fb8962861caa1150ba047435d4992441c750857c508c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 745240133b49e0d37ccecb25813088e5f75f024151e9e01c3d1993ce8f852cb3d70ee83b79140c2e2dcdae6251246f4eb5d73ad55cd8e439f4e01113e0c99914
|
7
|
+
data.tar.gz: a9a94cb1f444ca22e69f3c6c3f9a78f42a57f1f61e83e43e6f12655fe854b00d5cf5d2ff95acd0b367c6c2ec87c02724196e305392a2793f9a1ec235ec97ed1c
|
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"
|
@@ -86,16 +94,17 @@ def usage
|
|
86
94
|
* done <tasknumber> mark task as completed
|
87
95
|
* block <tasknumber> mark task as blocked
|
88
96
|
* prio <tasknumber> toggle high priority flag
|
97
|
+
* due <tasknumber> <date> set due date
|
89
98
|
|
90
99
|
* append <tasknumber> <text> append text to task title
|
91
100
|
* rename <tasknumber> <text> rename task
|
92
101
|
* del <tasknumber> delete task
|
93
102
|
* note <tasknumber> <text> add note to task
|
94
|
-
* delnote <tasknumber>
|
103
|
+
* delnote <tasknumber> delete all notes from task
|
95
104
|
|
96
105
|
* list <regex> [regex...] list tasks (only active tasks by default)
|
97
106
|
* show <tasknumber> show all task details
|
98
|
-
* repl enter read
|
107
|
+
* repl enter read-eval-print loop mode
|
99
108
|
* help this help screen
|
100
109
|
|
101
110
|
With list command the following pre-defined regex patterns can be also used:
|
@@ -103,7 +112,7 @@ def usage
|
|
103
112
|
|
104
113
|
Legend:
|
105
114
|
#{STATES.select { |k, v| k != 'default' }.map { |k, v| "#{k} #{v}" }.join(', ') }, priority #{PRIORITY_FLAG}
|
106
|
-
|
115
|
+
USAGE
|
107
116
|
end
|
108
117
|
|
109
118
|
def load_tasks(item_to_check = nil)
|
@@ -183,6 +192,14 @@ def set_priority(item)
|
|
183
192
|
list(tasks)
|
184
193
|
end
|
185
194
|
|
195
|
+
def due_date(item, date = '')
|
196
|
+
tasks = load_tasks(item)
|
197
|
+
tasks[item][:due] = date.nil? || date.empty? ? nil : Date.parse(date).strftime(DATE_FORMAT)
|
198
|
+
tasks[item][:modified] = Time.now.strftime(DATE_FORMAT)
|
199
|
+
write_tasks(tasks)
|
200
|
+
list(tasks)
|
201
|
+
end
|
202
|
+
|
186
203
|
def list(tasks = nil, patterns = nil)
|
187
204
|
items = {}
|
188
205
|
tasks = tasks || load_tasks
|
@@ -196,7 +213,7 @@ def list(tasks = nil, patterns = nil)
|
|
196
213
|
items[num] = task if match
|
197
214
|
end
|
198
215
|
items = items.sort_by do |num, task|
|
199
|
-
[task[:priority] ? 0 : 1, ORDER[task[:state] || 'default'], num]
|
216
|
+
[task[:priority] ? 0 : 1, ORDER[task[:state] || 'default'], task[:due] || 'n/a', num]
|
200
217
|
end
|
201
218
|
items.each do |num, task|
|
202
219
|
state = task[:state] || 'default'
|
@@ -204,7 +221,19 @@ def list(tasks = nil, patterns = nil)
|
|
204
221
|
display_state = colorize(STATES[state], color)
|
205
222
|
title = task[:title].gsub(/@\w+/) { |tag| colorize(tag, :cyan) }
|
206
223
|
priority_flag = task[:priority] ? colorize(PRIORITY_FLAG, :red) : ' '
|
207
|
-
|
224
|
+
due_date = ''
|
225
|
+
if task[:due] && state != 'done'
|
226
|
+
date_diff = (Date.parse(task[:due]) - TODAY.to_date).to_i
|
227
|
+
if date_diff < 0
|
228
|
+
due_date = colorize("(#{date_diff.abs}d overdue)", :red)
|
229
|
+
elsif date_diff == 0 || date_diff == 1
|
230
|
+
due_date = colorize("(#{DUE_DATE_DAYS[date_diff]})", :yellow)
|
231
|
+
else
|
232
|
+
due_date = colorize("(#{DUE_DATE_DAYS[date_diff] || task[:due]})", :magenta) if date_diff > 1
|
233
|
+
end
|
234
|
+
due_date = ' ' + due_date
|
235
|
+
end
|
236
|
+
puts "#{num.to_s.rjust(4, ' ')}:#{priority_flag}#{display_state} #{title}#{due_date}"
|
208
237
|
end
|
209
238
|
puts 'No todos found' if items.empty?
|
210
239
|
end
|
@@ -254,7 +283,7 @@ end
|
|
254
283
|
def read(arguments)
|
255
284
|
begin
|
256
285
|
action = arguments.first
|
257
|
-
args = arguments[1..-1]
|
286
|
+
args = arguments[1..-1] || []
|
258
287
|
case action
|
259
288
|
when 'add'
|
260
289
|
add(args.join(' ')) unless args.nil? || args.empty?
|
@@ -266,14 +295,16 @@ def read(arguments)
|
|
266
295
|
args.length == 1 ? change_state(args.first.to_i, 'blocked') : list(nil, [':blocked'])
|
267
296
|
when 'prio'
|
268
297
|
set_priority(args.first.to_i) if args.length == 1
|
298
|
+
when 'due'
|
299
|
+
due_date(args.first.to_i, (args[1..-1] || []).join(' ')) unless args.length < 1
|
269
300
|
when 'append'
|
270
|
-
append(args.first.to_i, args[1..-1].join(' ')) unless args.length <
|
301
|
+
append(args.first.to_i, args[1..-1].join(' ')) unless args.length < 2
|
271
302
|
when 'rename'
|
272
|
-
rename(args.first.to_i, args[1..-1].join(' ')) unless args.length <
|
303
|
+
rename(args.first.to_i, args[1..-1].join(' ')) unless args.length < 2
|
273
304
|
when 'del'
|
274
305
|
delete(args.first.to_i) if args.length == 1
|
275
306
|
when 'note'
|
276
|
-
add_note(args.first.to_i, args[1..-1].join(' ')) unless args.length <
|
307
|
+
add_note(args.first.to_i, args[1..-1].join(' ')) unless args.length < 2
|
277
308
|
when 'delnote'
|
278
309
|
delete_note(args.first.to_i) if args.length == 1
|
279
310
|
when 'list'
|
metadata
CHANGED
@@ -1,41 +1,16 @@
|
|
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.5
|
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-02 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description:
|
14
|
-
Usage: todo <command> <arguments>
|
15
|
-
|
16
|
-
Commands:
|
17
|
-
* add <text> add new task
|
18
|
-
* start <tasknumber> mark task as started
|
19
|
-
* done <tasknumber> mark task as completed
|
20
|
-
* block <tasknumber> mark task as blocked
|
21
|
-
* prio <tasknumber> toggle high priority flag
|
22
|
-
|
23
|
-
* append <tasknumber> <text> append text to task title
|
24
|
-
* rename <tasknumber> <text> rename task
|
25
|
-
* del <tasknumber> delete task
|
26
|
-
* note <tasknumber> <text> add note to task
|
27
|
-
* delnote <tasknumber> <text> delete all notes from task
|
28
|
-
|
29
|
-
* list <regex> [regex...] list tasks (only active tasks by default)
|
30
|
-
* show <tasknumber> show all task details
|
31
|
-
* repl enter read–eval–print loop mode
|
32
|
-
* help this help screen
|
33
|
-
|
34
|
-
With list command the following pre-defined regex patterns can be also used:
|
35
|
-
:active, :done, :blocked, :started, :new, :all
|
36
|
-
|
37
|
-
Legend:
|
38
|
-
new [ ], done [x], started [>], blocked [!], priority *
|
13
|
+
description:
|
39
14
|
email:
|
40
15
|
executables:
|
41
16
|
- todo.rb
|