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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/bin/todo.rb +40 -9
  3. metadata +3 -28
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 266e5f102d3397fcbe41fe5af932ca7e3245b3bca0f0c022eba7a08d42e58909
4
- data.tar.gz: bd8425b2e83ec7dd8bea45e2e54adebc9e4aaf11e554b850d5dc6d3679dcb845
3
+ metadata.gz: 751d24c27a1e18c59b1a0cd828a8ab8c6dd9f60b15956731101cd2518db9fd1c
4
+ data.tar.gz: 8d5968af9ac740a09b39fb8962861caa1150ba047435d4992441c750857c508c
5
5
  SHA512:
6
- metadata.gz: 478c00716781148b1fd9736dea4afbae040dd817ec5562f31db23eaa8d3069af2210f8e023ab52460723099f98e28cb87ed4694e82fdfd29c8e3a2c74f465a68
7
- data.tar.gz: dcc56754c7a74b86e03411440ef9c8b5a703069dfb4e85b23a9b169a3727207ffe64caadcb74bc8c1ac2e7237ecbbd5e8389ff8eac1a26fc6f21a79539590603
6
+ metadata.gz: 745240133b49e0d37ccecb25813088e5f75f024151e9e01c3d1993ce8f852cb3d70ee83b79140c2e2dcdae6251246f4eb5d73ad55cd8e439f4e01113e0c99914
7
+ data.tar.gz: a9a94cb1f444ca22e69f3c6c3f9a78f42a57f1f61e83e43e6f12655fe854b00d5cf5d2ff95acd0b367c6c2ec87c02724196e305392a2793f9a1ec235ec97ed1c
@@ -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> <text> delete all notes from task
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 readevalprint loop mode
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
- USAGE
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
- puts "#{num.to_s.rjust(4, ' ')}:#{priority_flag}#{display_state} #{title}"
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 < 1
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 < 1
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 < 1
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.0
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-09-15 00:00:00.000000000 Z
11
+ date: 2020-10-02 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: |2
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