doing 1.0.52 → 1.0.53

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ab98c4f6aa3c2c5d3ccdb29a7b5f78a5f8adc67d12e9628e81b53316a10bc66c
4
- data.tar.gz: dbe47b1b6b15d3d067a34f77b51b5f44b6137bd6f3cd89eccf4dd1909681ad32
3
+ metadata.gz: f55781d1fff1b59e4f2b495bc93235006e9b72aaa5ad51b0faeb55e332006570
4
+ data.tar.gz: b113d0e0ddf72bd2b56de7121414ec4cdc2ad5dfc9ced9f45d3f1ccb82381639
5
5
  SHA512:
6
- metadata.gz: 31b94d0107fae62ca3f8b791173d3ea36be2ba8a09f6a4c27f1c75ac9f75a3840f83d0ce13eb11ddcaee05d305e35d5f15acd4d285936cf673e34d320b0db8d5
7
- data.tar.gz: 48e17f344c27e38c82272906f082ee78dbb7be36fcc66b76de1c784ad2ab845ff54398c73624a83eaa883f5780264eb026c4a9b6443f60af7bbb55e06d5e1bb7
6
+ metadata.gz: cf665e041da4ac7ef3d6ce676620db8e055df2d72e963e84635b8af28267c36e90882409df824aa041df11177ff96b67f721512b0ce32931bcef6c36b54dc7e7
7
+ data.tar.gz: 4450964dfdda9b69d1a0f41429e7780a6726bb81875773b090a2de346fd751e777a52f890228ac100e9d0d82354b682f74c391971f3e6785386e80d911d18759
data/README.md CHANGED
@@ -17,6 +17,7 @@ _If you're one of the rare people like me who find this useful, feel free to [bu
17
17
  - [Changelog](#changelog)
18
18
 
19
19
  <!-- end toc -->
20
+ <!--README-->
20
21
 
21
22
  ## What and why
22
23
 
@@ -413,6 +414,8 @@ When used with `doing done`, `--back` and `--took` allow time intervals to be ac
413
414
 
414
415
  All of these commands accept a `-e` argument. This opens your command line editor (as defined in the environment variable `$EDITOR`). Add your entry, save the temp file, and close it. The new entry is added. Anything after the first line is included as a note on the entry.
415
416
 
417
+ `doing again` (or `doing resume`) will duplicate the last @done entry (most recently completed) with a new start date (and without the @done tag). To resume the last entry matching specific tags, use `--tag=TAG`. You can specify multiple tags by separating with a comma. Multiple tags are combined with 'AND' by default (all tags must exist on the entry to match), but you can use `--bool=` to set it to 'OR' or 'NOT'. By default the new entry will be added to the same section as the matching entry, but you can specify a section with `--in=SECTION`.
418
+
416
419
  `doing meanwhile` is a special command for creating and finishing tasks that may have other entries come before they're complete. When you create an entry with `doing meanwhile [entry text]`, it will automatically complete the last _@meanwhile_ item (dated _@done_ tag) and add the _@meanwhile_ tag to the new item. This allows time tracking on a more general basis, and still lets you keep track of the smaller things you do while working on an overarching project. The `meanwhile` command accepts `--back [time]` and will backdate the _@done_ tag and start date of the new task at the same time. Running `meanwhile` with no arguments will simply complete the last _@meanwhile_ task.
417
420
 
418
421
  See `doing help meanwhile` for more options.
@@ -438,9 +441,9 @@ You can finish the last entry containing a specific tag or combination of tags u
438
441
 
439
442
  doing finish --tag=work,project1
440
443
 
441
- You can change the boolean using `--tag_bool=OR` (last entry containing any of the specified tags) or `--tag_bool=NOT` (last entry containing none of the tags).
444
+ You can change the boolean using `--bool=OR` (last entry containing any of the specified tags) or `--bool=NOT` (last entry containing none of the tags).
442
445
 
443
- You can also include a `--no-date` switch to add `@done` without a finish date, meaning no time is tracked for the task. `doing cancel` is an alias for this. Like `finish`, `cancel` accepts a count to act on the last X entries, as well as `--archive` and `--section` options.
446
+ You can also include a `--no-date` switch to add `@done` without a finish date, meaning no time is tracked for the task. `doing cancel` is an alias for this. Like `finish`, `cancel` accepts a count to act on the last X entries, as well as `--archive` and `--section` options. `cancel` also accepts the `--tag` and `--bool` flags for tag filtering.
444
447
 
445
448
 
446
449
  ##### Tagging and Autotagging
@@ -621,7 +624,9 @@ Please try not to email me directly about GitHub projects.
621
624
 
622
625
  Feel free to [poke around](http://github.com/ttscoff/doing/), I'll try to add more comments in the future (and retroactively).
623
626
 
624
- {% donate doing now sending coffee money to Brett. %}
627
+ <!--END README-->
628
+
629
+ PayPal link: [paypal.me/ttscoff](https://paypal.me/ttscoff)
625
630
 
626
631
  ## Changelog
627
632
 
data/bin/doing CHANGED
@@ -36,23 +36,20 @@ default_command :recent
36
36
  # sort_help :manually
37
37
 
38
38
  desc 'Output notes if included in the template'
39
- default_value true
40
- switch [:notes], :default_value => true, :negatable => true
39
+ switch [:notes], default_value: true, negatable: true
41
40
 
42
41
  desc 'Send results report to STDOUT instead of STDERR'
43
- default_value false
44
- switch [:stdout], :default_value => false, :negatable => false
42
+ switch [:stdout], default_value: false, negatable: false
45
43
 
46
44
  desc 'Exclude auto tags and default tags'
47
- switch [:x, :noauto], :default_value => false
45
+ switch [:x, :noauto], default_value: false
48
46
 
49
47
  desc 'Use a specific configuration file'
50
- default_value false
51
48
  flag [:config_file]
52
49
 
53
50
 
54
51
  # desc 'Wrap notes at X chars (0 for no wrap)'
55
- # flag [:w, :wrapwidth], :must_match => /^\d+$/, :type => Integer
52
+ # flag [:w, :wrapwidth], must_match: /^\d+$/, type: Integer
56
53
 
57
54
  desc 'Specify a different doing_file'
58
55
  flag [:f, :doing_file]
@@ -62,7 +59,7 @@ arg_name 'entry'
62
59
  command [:now, :next] do |c|
63
60
  c.desc 'Section'
64
61
  c.arg_name 'section_name'
65
- c.flag [:s, :section], :default_value => wwid.current_section
62
+ c.flag [:s, :section], default_value: wwid.current_section
66
63
 
67
64
  c.desc "Edit entry with #{ENV['EDITOR']}"
68
65
  c.switch [:e, :editor]
@@ -71,7 +68,7 @@ command [:now, :next] do |c|
71
68
  c.flag [:b, :back]
72
69
 
73
70
  c.desc 'Timed entry, marks last entry in section as @done'
74
- c.switch [:f, :finish_last], :negatable => false, :default_value => false
71
+ c.switch [:f, :finish_last], negatable: false, default_value: false
75
72
 
76
73
  c.desc 'Note'
77
74
  c.arg_name 'note_text'
@@ -100,7 +97,7 @@ command [:now, :next] do |c|
100
97
  if input
101
98
  title, note = wwid.format_input(input)
102
99
  note.push(options[:n]) if options[:n]
103
- wwid.add_item(title.cap_first, section, {:note => note, :back => date, :timed => options[:f]})
100
+ wwid.add_item(title.cap_first, section, {note: note, back: date, timed: options[:f]})
104
101
  wwid.write(wwid.doing_file)
105
102
  else
106
103
  raise "No content"
@@ -109,12 +106,12 @@ command [:now, :next] do |c|
109
106
  if args.length > 0
110
107
  title, note = wwid.format_input(args.join(" "))
111
108
  note.push(options[:n]) if options[:n]
112
- wwid.add_item(title.cap_first, section, {:note => note, :back => date, :timed => options[:f]})
109
+ wwid.add_item(title.cap_first, section, {note: note, back: date, timed: options[:f]})
113
110
  wwid.write(wwid.doing_file)
114
111
  elsif STDIN.stat.size > 0
115
112
  title, note = wwid.format_input(STDIN.read)
116
113
  note.push(options[:n]) if options[:n]
117
- wwid.add_item(title.cap_first, section, {:note => note, :back => date, :timed => options[:f]})
114
+ wwid.add_item(title.cap_first, section, {note: note, back: date, timed: options[:f]})
118
115
  wwid.write(wwid.doing_file)
119
116
  else
120
117
  raise "You must provide content when creating a new entry"
@@ -133,13 +130,13 @@ arg_name 'note_text'
133
130
  command :note do |c|
134
131
  c.desc 'Section'
135
132
  c.arg_name 'section_name'
136
- c.flag [:s, :section], :default_value => "All"
133
+ c.flag [:s, :section], default_value: "All"
137
134
 
138
135
  c.desc "Edit entry with #{ENV['EDITOR']}"
139
- c.switch [:e, :editor], :negatable => false, :default_value => false
136
+ c.switch [:e, :editor], negatable: false, default_value: false
140
137
 
141
138
  c.desc "Replace/Remove last entry's note (default append)"
142
- c.switch [:r, :remove], :negatable => false, :default_value => false
139
+ c.switch [:r, :remove], negatable: false, default_value: false
143
140
 
144
141
  c.action do |global_options,options,args|
145
142
  section = wwid.guess_section(options[:s]) || options[:s].cap_first
@@ -192,13 +189,13 @@ arg_name 'entry'
192
189
  command :meanwhile do |c|
193
190
  c.desc 'Section'
194
191
  c.arg_name 'section_name'
195
- c.flag [:s, :section], :default_value => wwid.current_section
192
+ c.flag [:s, :section], default_value: wwid.current_section
196
193
 
197
194
  c.desc "Edit entry with #{ENV['EDITOR']}"
198
195
  c.switch [:e, :editor]
199
196
 
200
197
  c.desc "Archive previous @meanwhile entry"
201
- c.switch [:a, :archive], :default_value => false
198
+ c.switch [:a, :archive], default_value: false
202
199
 
203
200
  c.desc 'Backdate start date for new entry to date string [4pm|20m|2h|yesterday noon]'
204
201
  c.flag [:b, :back]
@@ -233,7 +230,7 @@ command :meanwhile do |c|
233
230
  input = false unless input && input.length > 0
234
231
 
235
232
  note = options[:n] ? options[:n] : false
236
- wwid.stop_start('meanwhile', {:new_item => input, :back => date, :section => section, :archive => options[:a], :note => note})
233
+ wwid.stop_start('meanwhile', {new_item: input, back: date, section: section, archive: options[:a], note: note})
237
234
  wwid.write(wwid.doing_file)
238
235
  end
239
236
  end
@@ -296,7 +293,7 @@ command :later do |c|
296
293
  if input
297
294
  title, note = wwid.format_input(input)
298
295
  note.push(options[:n]) if options[:n]
299
- wwid.add_item(title.cap_first, "Later", {:note => note, :back => date})
296
+ wwid.add_item(title.cap_first, "Later", {note: note, back: date})
300
297
  wwid.write(wwid.doing_file)
301
298
  else
302
299
  raise "No content"
@@ -305,12 +302,12 @@ command :later do |c|
305
302
  if args.length > 0
306
303
  title, note = wwid.format_input(args.join(" "))
307
304
  note.push(options[:n]) if options[:n]
308
- wwid.add_item(title.cap_first, "Later", {:note => note, :back => date})
305
+ wwid.add_item(title.cap_first, "Later", {note: note, back: date})
309
306
  wwid.write(wwid.doing_file)
310
307
  elsif STDIN.stat.size > 0
311
308
  title, note = wwid.format_input(STDIN.read)
312
309
  note.push(options[:n]) if options[:n]
313
- wwid.add_item(title.cap_first, "Later", {:note => note, :back => date})
310
+ wwid.add_item(title.cap_first, "Later", {note: note, back: date})
314
311
  wwid.write(wwid.doing_file)
315
312
  else
316
313
  raise "You must provide content when creating a new entry"
@@ -323,13 +320,13 @@ desc 'Add a completed item with @done(date). No argument finishes last entry.'
323
320
  arg_name 'entry'
324
321
  command [:done, :did] do |c|
325
322
  c.desc 'Remove @done tag'
326
- c.switch [:r, :remove], :negatable => false, :default_value => false
323
+ c.switch [:r, :remove], negatable: false, default_value: false
327
324
 
328
325
  c.desc 'Include date'
329
- c.switch [:date], :negatable => true, :default_value => true
326
+ c.switch [:date], negatable: true, default_value: true
330
327
 
331
328
  c.desc 'Immediately archive the entry'
332
- c.switch [:a, :archive], :negatable => false, :default_value => false
329
+ c.switch [:a, :archive], negatable: false, default_value: false
333
330
 
334
331
  c.desc 'Set finish date to specific date/time (natural langauge parsed, e.g. --at=1:30pm). If used, ignores --back. Used with --took, backdates start date'
335
332
  c.flag [:at]
@@ -341,7 +338,7 @@ command [:done, :did] do |c|
341
338
  c.flag [:t, :took]
342
339
 
343
340
  c.desc 'Section'
344
- c.flag [:s, :section], :default_value => wwid.current_section
341
+ c.flag [:s, :section], default_value: wwid.current_section
345
342
 
346
343
  c.desc "Edit entry with #{ENV['EDITOR']}"
347
344
  c.switch [:e, :editor]
@@ -390,16 +387,16 @@ command [:done, :did] do |c|
390
387
  title, note = wwid.format_input(input)
391
388
  title += " @done#{donedate}"
392
389
  section = "Archive" if options[:a]
393
- wwid.add_item(title.cap_first, section.cap_first, {:note => note, :back => date})
390
+ wwid.add_item(title.cap_first, section.cap_first, {note: note, back: date})
394
391
  wwid.write(wwid.doing_file)
395
392
  else
396
393
  raise "No content"
397
394
  end
398
395
  elsif args.length == 0 && STDIN.stat.size == 0
399
396
  if options[:r]
400
- wwid.tag_last({:tags => ["done"], :count => 1, :section => section, :remove => true })
397
+ wwid.tag_last({tags: ["done"], count: 1, section: section, remove: true })
401
398
  else
402
- wwid.tag_last({:tags => ["done"], :count => 1, :section => section, :archive => options[:a], :back => finish_date, :date => options[:date]})
399
+ wwid.tag_last({tags: ["done"], count: 1, section: section, archive: options[:a], back: finish_date, date: options[:date]})
403
400
  end
404
401
  else
405
402
  if args.length > 0
@@ -407,13 +404,13 @@ command [:done, :did] do |c|
407
404
  title.chomp!
408
405
  title += " @done#{donedate}"
409
406
  section = "Archive" if options[:a]
410
- wwid.add_item(title.cap_first, section.cap_first, {:note => note, :back => date})
407
+ wwid.add_item(title.cap_first, section.cap_first, {note: note, back: date})
411
408
  wwid.write(wwid.doing_file)
412
409
  elsif STDIN.stat.size > 0
413
410
  title, note = wwid.format_input(STDIN.read)
414
411
  title += " @done#{donedate}"
415
412
  section = options[:a] ? "Archive" : section
416
- wwid.add_item(title.cap_first, section.cap_first, {:note => note, :back => date})
413
+ wwid.add_item(title.cap_first, section.cap_first, {note: note, back: date})
417
414
  wwid.write(wwid.doing_file)
418
415
  else
419
416
  raise "You must provide content when creating a new entry"
@@ -427,20 +424,34 @@ long_desc 'Adds @done tag without datestamp so no elapsed time is recorded. Alia
427
424
  arg_name 'count'
428
425
  command :cancel do |c|
429
426
  c.desc 'Archive entries'
430
- c.switch [:a, :archive], :negatable => false, :default_value => false
427
+ c.switch [:a, :archive], negatable: false, default_value: false
431
428
 
432
429
  c.desc 'Section'
433
- c.flag [:s, :section], :default_value => wwid.current_section
430
+ c.flag [:s, :section], default_value: wwid.current_section
431
+
432
+ c.desc 'Cancel the last X entries containing TAG. Separate multiple tags with comma (--tag=tag2,tag2)'
433
+ c.flag [:tag]
434
+
435
+ c.desc 'Boolean (AND|OR|NOT) with which to combine multiple tag filters'
436
+ c.flag [:bool], must_match: /^(and|or|not)$/i, default_value: 'AND'
437
+
434
438
 
435
439
  c.action do |global_options,options,args|
436
440
 
437
441
  section = wwid.guess_section(options[:s]) || options[:s].cap_first
438
442
 
443
+ if options[:tag].nil?
444
+ tags = []
445
+ else
446
+ tags = options[:tag].split(/ *, */).map {|t| t.strip.sub(/^@/, '') }
447
+ options[:bool] = options[:bool] =~ /^(and|or|not)$/i ? options[:bool].upcase : 'AND'
448
+ end
449
+
439
450
  if args.length > 1
440
451
  raise "Only one argument allowed"
441
452
  elsif args.length == 0 || args[0] =~ /\d+/
442
453
  count = args[0] ? args[0].to_i : 1
443
- wwid.tag_last({:tags => ["done"], :count => count, :section => section, :archive => options[:a], :sequential => false, :date => false })
454
+ wwid.tag_last({tags: ["done"], count: count, section: section, archive: options[:a], sequential: false, date: false, tag: tags, tag_bool: options[:bool] })
444
455
  else
445
456
  raise "Invalid argument (specify number of recent items to mark @done)"
446
457
  end
@@ -452,7 +463,7 @@ long_desc 'Marks the last X entries with a @done tag and current date. Does not
452
463
  arg_name 'count'
453
464
  command :finish do |c|
454
465
  c.desc 'Include date'
455
- c.switch [:date], :negatable => true, :default_value => true
466
+ c.switch [:date], negatable: true, default_value: true
456
467
 
457
468
  c.desc 'Backdate completed date to date string [4pm|20m|2h|yesterday noon]'
458
469
  c.flag [:b, :back]
@@ -464,16 +475,16 @@ command :finish do |c|
464
475
  c.flag [:tag]
465
476
 
466
477
  c.desc 'Boolean (AND|OR|NOT) with which to combine multiple tag filters'
467
- c.flag [:tag_bool], default_value: 'AND'
478
+ c.flag [:bool], must_match: /^(and|or|not)$/i, default_value: 'AND'
468
479
 
469
480
  c.desc 'Auto-generate finish dates from next entry\'s start time. Automatically generate completion dates 1 minute before next start date. --auto overrides the --date and --back parameters.'
470
- c.switch [:auto], :negatable => false, :default_value => false
481
+ c.switch [:auto], negatable: false, default_value: false
471
482
 
472
483
  c.desc 'Archive entries'
473
- c.switch [:a, :archive], :negatable => false, :default_value => false
484
+ c.switch [:a, :archive], negatable: false, default_value: false
474
485
 
475
486
  c.desc 'Section'
476
- c.flag [:s, :section], :default_value => wwid.current_section
487
+ c.flag [:s, :section], default_value: wwid.current_section
477
488
 
478
489
  c.action do |global_options,options,args|
479
490
 
@@ -494,21 +505,17 @@ command :finish do |c|
494
505
  end
495
506
 
496
507
  if options[:tag].nil?
497
- options[:tag] = []
508
+ tags = []
498
509
  else
499
- options[:tag] = options[:tag].split(/,/).map {|tag| tag.strip.sub(/^@/, '') }
500
- if options[:tag_bool] =~ /^(and|or|not)$/i
501
- options[:tag_bool] = options[:tag_bool].upcase
502
- else
503
- options[:tag_bool] = 'AND'
504
- end
510
+ tags = options[:tag].split(/ *, */).map {|t| t.strip.sub(/^@/, '') }
511
+ options[:bool] = options[:bool] =~ /^(and|or|not)$/i ? options[:bool].upcase : 'AND'
505
512
  end
506
513
 
507
514
  if args.length > 1
508
515
  raise "Only one argument allowed"
509
516
  elsif args.length == 0 || args[0] =~ /\d+/
510
517
  count = args[0] ? args[0].to_i : 1
511
- wwid.tag_last({ tags: ["done"],count: count,section: section,archive: options[:a],sequential: options[:auto],date: options[:date], back: date, tag: options[:tag], tag_bool: options[:tag_bool] })
518
+ wwid.tag_last({ tags: ["done"],count: count,section: section,archive: options[:a],sequential: options[:auto],date: options[:date], back: date, tag: options[:tag], tag_bool: options[:bool] })
512
519
  else
513
520
  raise "Invalid argument (specify number of recent items to mark @done)"
514
521
  end
@@ -519,14 +526,24 @@ desc 'Repeat last entry as new entry'
519
526
  arg_name 'section'
520
527
  command [:again, :resume] do |c|
521
528
  c.desc 'Section'
522
- c.flag [:s, :section], :default_value => "All"
529
+ c.flag [:s, :section], default_value: "All"
530
+
531
+ c.desc 'Add new entry to section (default: same section as repeated entry)'
532
+ c.flag [:in]
533
+
534
+ c.desc 'Repeat last entry matching tags. Combine multiple tags with a comma.'
535
+ c.flag [:tag]
536
+
537
+ c.desc 'Boolean used to combine multiple tags'
538
+ c.flag [:bool], must_match: /^(and|or|not)$/i, default_value: 'ALL'
523
539
 
524
540
  c.desc 'Note'
525
541
  c.arg_name 'note_text'
526
542
  c.flag [:n, :note]
527
543
 
528
544
  c.action do |global_options, options, args|
529
- wwid.restart_last({ section: options[:s], note: options[:n] })
545
+ tags = options[:tag].nil? ? [] : options[:tag].split(/ *, */).map {|t| t.sub(/^@/, '').strip }
546
+ wwid.restart_last({ section: options[:s], note: options[:n], tag: tags, tag_bool: options[:bool], in: options[:in] })
530
547
  end
531
548
  end
532
549
 
@@ -534,19 +551,19 @@ desc 'Tag last entry'
534
551
  arg_name 'tag1 [tag2...]'
535
552
  command :tag do |c|
536
553
  c.desc 'Section'
537
- c.flag [:s, :section], :default_value => "All"
554
+ c.flag [:s, :section], default_value: 'All'
538
555
 
539
556
  c.desc 'How many recent entries to tag (0 for all)'
540
- c.flag [:c, :count], :default_value => 1
557
+ c.flag [:c, :count], default_value: 1
541
558
 
542
559
  c.desc 'Include current date/time with tag'
543
- c.switch [:d, :date], :negatable => false, :default_value => false
560
+ c.switch [:d, :date], negatable: false, default_value: false
544
561
 
545
562
  c.desc 'Remove given tag(s)'
546
- c.switch [:r, :remove], :negatable => false, :default_value => false
563
+ c.switch [:r, :remove], negatable: false, default_value: false
547
564
 
548
565
  c.desc 'Autotag entries based on autotag configuration in ~/.doingrc'
549
- c.switch [:a, :autotag], :negatable => false, :default_value => false
566
+ c.switch [:a, :autotag], negatable: false, default_value: false
550
567
 
551
568
  c.action do |global_options,options,args|
552
569
  if args.length == 0 && !options[:a]
@@ -587,7 +604,7 @@ command :tag do |c|
587
604
  end
588
605
  end
589
606
 
590
- wwid.tag_last({:tags => tags, :count => count, :section => section, :date => options[:date], :remove => options[:r], :autotag => options[:a]})
607
+ wwid.tag_last({tags: tags, count: count, section: section, date: options[:date], remove: options[:r], autotag: options[:a]})
591
608
  end
592
609
  end
593
610
  end
@@ -595,15 +612,15 @@ end
595
612
  desc 'Mark last entry as highlighted'
596
613
  command [:mark, :flag] do |c|
597
614
  c.desc 'Section'
598
- c.flag [:s, :section], :default_value => wwid.current_section
615
+ c.flag [:s, :section], default_value: wwid.current_section
599
616
 
600
617
  c.desc 'Remove mark'
601
- c.switch [:r, :remove], :negatable => false, :default_value => false
618
+ c.switch [:r, :remove], negatable: false, default_value: false
602
619
 
603
620
 
604
621
  c.action do |global_options,options,args|
605
622
  mark = wwid.config['marker_tag'] || "flagged"
606
- wwid.tag_last({:tags => [mark], :section => options[:s], :remove => options[:r]})
623
+ wwid.tag_last({tags: [mark], section: options[:s], remove: options[:r]})
607
624
  end
608
625
  end
609
626
 
@@ -611,17 +628,20 @@ desc 'List all entries'
611
628
  long_desc 'The argument can be a section name, @tag(s) or both. "pick" or "choose" as an argument will offer a section menu.'
612
629
  arg_name '[section|@tags]'
613
630
  command :show do |c|
631
+ c.desc 'Tag filter, combine multiple tags with a comma. Added for compatibility with other commands.'
632
+ c.flag [:tag]
633
+
614
634
  c.desc 'Tag boolean (AND,OR,NONE)'
615
- c.flag [:b, :bool], :default_value => "OR"
635
+ c.flag [:b, :bool], must_match: /^(and|or|not)$/i, default_value: 'OR'
616
636
 
617
637
  c.desc 'Max count to show'
618
- c.flag [:c, :count], :default_value => 0
638
+ c.flag [:c, :count], default_value: 0
619
639
 
620
640
  c.desc 'Age (oldest/newest)'
621
- c.flag [:a, :age], :default_value => 'newest'
641
+ c.flag [:a, :age], default_value: 'newest'
622
642
 
623
643
  c.desc 'Sort order (asc/desc)'
624
- c.flag [:s, :sort], :default_value => 'asc'
644
+ c.flag [:s, :sort], default_value: 'asc'
625
645
 
626
646
  c.desc %{
627
647
  Date range to show, or a single day to filter date on.
@@ -631,20 +651,20 @@ command :show do |c|
631
651
  c.flag [:f, :from]
632
652
 
633
653
  c.desc 'Show time intervals on @done tasks'
634
- c.switch [:t, :times], :default_value => true
654
+ c.switch [:t, :times], default_value: true
635
655
 
636
656
  c.desc 'Show intervals with totals at the end of output'
637
- c.switch [:totals], :default_value => false, :negatable => true
657
+ c.switch [:totals], default_value: false, negatable: true
638
658
 
639
659
  c.desc 'Sort tags by (name|time)'
640
660
  default = 'time'
641
661
  if wwid.config.has_key?('tag_sort')
642
662
  default = wwid.config['tag_sort']
643
663
  end
644
- c.flag [:tag_sort], :default_value => default
664
+ c.flag [:tag_sort], default_value: default
645
665
 
646
666
  c.desc 'Only show items with recorded time intervals'
647
- c.switch [:only_timed], :default_value => false, :negatable => false
667
+ c.switch [:only_timed], default_value: false, negatable: false
648
668
 
649
669
  c.desc 'Output to export format (csv|html|json)'
650
670
  c.flag [:o, :output]
@@ -681,6 +701,8 @@ command :show do |c|
681
701
  section = wwid.current_section
682
702
  end
683
703
 
704
+ tags.concat(options[:tag].split(/ *, */).map {|t| t.sub(/^@/, '').strip }) if options[:tag]
705
+
684
706
  unless tags.empty?
685
707
  tag_filter = {
686
708
  'tags' => tags,
@@ -699,14 +721,14 @@ command :show do |c|
699
721
  finish = false
700
722
  end
701
723
  exit_now! "Unrecognized date string" unless start
702
- dates = [start,finish]
724
+ dates = [start, finish]
703
725
  end
704
726
 
705
727
  options[:t] = true if options[:totals]
706
728
 
707
729
  options[:sort_tags] = options[:tag_sort] =~ /^n/i
708
730
 
709
- puts wwid.list_section({:section => section, :date_filter => dates, :count => options[:c].to_i, :tag_filter => tag_filter, :age => options[:a], :order => options[:s], :output => options[:output], :times => options[:t], :totals => options[:totals], :sort_tags => options[:sort_tags], :highlight => true, :only_timed => options[:only_timed]})
731
+ puts wwid.list_section({section: section, date_filter: dates, count: options[:c].to_i, tag_filter: tag_filter, age: options[:a], order: options[:s], output: options[:output], times: options[:t], totals: options[:totals], sort_tags: options[:sort_tags], highlight: true, only_timed: options[:only_timed]})
710
732
 
711
733
  end
712
734
  end
@@ -721,26 +743,26 @@ EODESC
721
743
  arg_name 'search_pattern'
722
744
  command [:grep, :search] do |c|
723
745
  c.desc 'Section'
724
- c.flag [:s, :section], :default_value => "All"
746
+ c.flag [:s, :section], default_value: "All"
725
747
 
726
748
  c.desc 'Output to export format (csv|html|json)'
727
749
  c.flag [:o, :output]
728
750
 
729
751
  c.desc 'Show time intervals on @done tasks'
730
- c.switch [:t, :times], :default_value => true
752
+ c.switch [:t, :times], default_value: true
731
753
 
732
754
  c.desc 'Show intervals with totals at the end of output'
733
- c.switch [:totals], :default_value => false, :negatable => true
755
+ c.switch [:totals], default_value: false, negatable: true
734
756
 
735
757
  c.desc 'Sort tags by (name|time)'
736
758
  default = 'time'
737
759
  if wwid.config.has_key?('tag_sort')
738
760
  default = wwid.config['tag_sort']
739
761
  end
740
- c.flag [:tag_sort], :default_value => default
762
+ c.flag [:tag_sort], default_value: default
741
763
 
742
764
  c.desc 'Only show items with recorded time intervals'
743
- c.switch [:only_timed], :default_value => false, :negatable => false
765
+ c.switch [:only_timed], default_value: false, negatable: false
744
766
 
745
767
  c.action do |global_options,options,args|
746
768
 
@@ -749,7 +771,7 @@ command [:grep, :search] do |c|
749
771
  options[:t] = true if options[:totals]
750
772
  options[:sort_tags] = options[:tag_sort] =~ /^n/i
751
773
 
752
- puts wwid.list_section({:search => args.join(' '), :section => section, :output => options[:output], :times => options[:t], :highlight => true, :totals => options[:totals], :only_timed => options[:only_timed], :sort_tags => options[:sort_tags]})
774
+ puts wwid.list_section({search: args.join(' '), section: section, output: options[:output], times: options[:t], highlight: true, totals: options[:totals], only_timed: options[:only_timed], sort_tags: options[:sort_tags]})
753
775
 
754
776
  end
755
777
  end
@@ -759,20 +781,20 @@ default_value 10
759
781
  arg_name 'count'
760
782
  command :recent do |c|
761
783
  c.desc 'Section'
762
- c.flag [:s, :section], :default_value => "All"
784
+ c.flag [:s, :section], default_value: "All"
763
785
 
764
786
  c.desc 'Show time intervals on @done tasks'
765
- c.switch [:t, :times], :default_value => true
787
+ c.switch [:t, :times], default_value: true
766
788
 
767
789
  c.desc 'Show intervals with totals at the end of output'
768
- c.switch [:totals], :default_value => false, :negatable => true
790
+ c.switch [:totals], default_value: false, negatable: true
769
791
 
770
792
  c.desc 'Sort tags by (name|time)'
771
793
  default = 'time'
772
794
  if wwid.config.has_key?('tag_sort')
773
795
  default = wwid.config['tag_sort']
774
796
  end
775
- c.flag [:tag_sort], :default_value => default
797
+ c.flag [:tag_sort], default_value: default
776
798
 
777
799
  c.action do |global_options,options,args|
778
800
 
@@ -787,7 +809,7 @@ command :recent do |c|
787
809
  options[:t] = true if options[:totals]
788
810
  options[:sort_tags] = options[:tag_sort] =~ /^n/i
789
811
 
790
- puts wwid.recent(count,section.cap_first,{ :times => options[:t], :totals => options[:totals], :sort_tags => options[:sort_tags] })
812
+ puts wwid.recent(count,section.cap_first,{ times: options[:t], totals: options[:totals], sort_tags: options[:sort_tags] })
791
813
 
792
814
  end
793
815
  end
@@ -797,20 +819,20 @@ desc 'List entries from today'
797
819
  command :today do |c|
798
820
  c.desc 'Specify a section'
799
821
  c.arg_name 'section_name'
800
- c.flag [:s, :section], :default_value => 'All'
822
+ c.flag [:s, :section], default_value: 'All'
801
823
 
802
824
  c.desc 'Show time intervals on @done tasks'
803
- c.switch [:t, :times], :default_value => true
825
+ c.switch [:t, :times], default_value: true
804
826
 
805
827
  c.desc 'Show time totals at the end of output'
806
- c.switch [:totals], :default_value => false, :negatable => true
828
+ c.switch [:totals], default_value: false, negatable: true
807
829
 
808
830
  c.desc 'Sort tags by (name|time)'
809
831
  default = 'time'
810
832
  if wwid.config.has_key?('tag_sort')
811
833
  default = wwid.config['tag_sort']
812
834
  end
813
- c.flag [:tag_sort], :default_value => default
835
+ c.flag [:tag_sort], default_value: default
814
836
 
815
837
  c.desc 'Output to export format (csv|html|json)'
816
838
  c.flag [:o, :output]
@@ -820,7 +842,7 @@ command :today do |c|
820
842
  options[:t] = true if options[:totals]
821
843
  options[:sort_tags] = options[:tag_sort] =~ /^n/i
822
844
 
823
- puts wwid.today(options[:t],options[:output],{:totals => options[:totals], :section => options[:s], :sort_tags => options[:sort_tags]}).chomp
845
+ puts wwid.today(options[:t], options[:output], {totals: options[:totals], section: options[:s], sort_tags: options[:sort_tags]}).chomp
824
846
 
825
847
  end
826
848
  end
@@ -831,25 +853,26 @@ arg_name 'date_string'
831
853
  command :on do |c|
832
854
  c.desc 'Section'
833
855
  c.arg_name 'section_name'
834
- c.flag [:s, :section], :default_value => 'All'
856
+ c.flag [:s, :section], default_value: 'All'
835
857
 
836
858
  c.desc 'Show time intervals on @done tasks'
837
- c.switch [:t, :times], :default_value => true
859
+ c.switch [:t, :times], default_value: true
838
860
 
839
861
  c.desc 'Show time totals at the end of output'
840
- c.switch [:totals], :default_value => false, :negatable => true
862
+ c.switch [:totals], default_value: false, negatable: true
841
863
 
842
864
  c.desc 'Sort tags by (name|time)'
843
865
  default = 'time'
844
866
  if wwid.config.has_key?('tag_sort')
845
867
  default = wwid.config['tag_sort']
846
868
  end
847
- c.flag [:tag_sort], :default_value => default
869
+ c.flag [:tag_sort], default_value: default
848
870
 
849
871
  c.desc 'Output to export format (csv|html|json)'
850
872
  c.flag [:o, :output]
851
873
 
852
874
  c.action do |global_options,options,args|
875
+ exit_now! "Missing date argument" if args.empty?
853
876
 
854
877
  date_string = args.join(" ")
855
878
 
@@ -871,7 +894,7 @@ command :on do |c|
871
894
  options[:t] = true if options[:totals]
872
895
  options[:sort_tags] = options[:tag_sort] =~ /^n/i
873
896
 
874
- puts wwid.list_date([start, finish], options[:s], options[:t], options[:output], {:totals => options[:totals], :sort_tags => options[:sort_tags]}).chomp
897
+ puts wwid.list_date([start, finish], options[:s], options[:t], options[:output], {totals: options[:totals], sort_tags: options[:sort_tags]}).chomp
875
898
 
876
899
  end
877
900
  end
@@ -880,27 +903,27 @@ desc 'List entries from yesterday'
880
903
  command :yesterday do |c|
881
904
  c.desc 'Specify a section'
882
905
  c.arg_name 'section_name'
883
- c.flag [:s, :section], :default_value => 'All'
906
+ c.flag [:s, :section], default_value: 'All'
884
907
 
885
908
  c.desc 'Output to export format (csv|html|json)'
886
909
  c.flag [:o, :output]
887
910
 
888
911
  c.desc 'Show time intervals on @done tasks'
889
- c.switch [:t, :times], :default_value => true
912
+ c.switch [:t, :times], default_value: true
890
913
 
891
914
  c.desc 'Show time totals at the end of output'
892
- c.switch [:totals], :default_value => false, :negatable => true
915
+ c.switch [:totals], default_value: false, negatable: true
893
916
 
894
917
  c.desc 'Sort tags by (name|time)'
895
918
  default = 'time'
896
919
  if wwid.config.has_key?('tag_sort')
897
920
  default = wwid.config['tag_sort']
898
921
  end
899
- c.flag [:tag_sort], :default_value => default
922
+ c.flag [:tag_sort], default_value: default
900
923
 
901
924
  c.action do |global_options, options,args|
902
925
  options[:sort_tags] = options[:tag_sort] =~ /^n/i
903
- puts wwid.yesterday(options[:s],options[:t],options[:o],{:totals => options[:totals], :sort_tags => options[:sort_tags]}).chomp
926
+ puts wwid.yesterday(options[:s], options[:t], options[:o],{ totals: options[:totals], sort_tags: options[:sort_tags] }).chomp
904
927
 
905
928
  end
906
929
  end
@@ -918,7 +941,7 @@ end
918
941
  desc 'List sections'
919
942
  command :sections do |c|
920
943
  c.desc 'List in single column'
921
- c.switch [:c, :column], :default_value => false
944
+ c.switch [:c, :column], default_value: false
922
945
 
923
946
  c.action do |global_options,options,args|
924
947
  joiner = options[:c] ? "\n" : "\t"
@@ -930,7 +953,7 @@ desc 'Select a section to display from a menu'
930
953
  command :choose do |c|
931
954
  c.action do |global_options,options,args|
932
955
  section = wwid.choose_section
933
- puts wwid.list_section({:section => section.cap_first, :count => 0})
956
+ puts wwid.list_section({ section: section.cap_first, count: 0 })
934
957
  end
935
958
  end
936
959
 
@@ -972,26 +995,29 @@ command :view do |c|
972
995
  c.flag [:s, :section]
973
996
 
974
997
  c.desc 'Count to display (override view settings)'
975
- c.flag [:c, :count], :must_match => /^\d+$/, :type => Integer
998
+ c.flag [:c, :count], must_match: /^\d+$/, type: Integer
976
999
 
977
1000
  c.desc 'Output to export format (csv|html|json)'
978
1001
  c.flag [:o, :output]
979
1002
 
980
1003
  c.desc 'Show time intervals on @done tasks'
981
- c.switch [:t, :times], :default_value => true
1004
+ c.switch [:t, :times], default_value: true
982
1005
 
983
1006
  c.desc 'Show intervals with totals at the end of output'
984
- c.switch [:totals], :default_value => false, :negatable => true
1007
+ c.switch [:totals], default_value: false, negatable: true
1008
+
1009
+ c.desc 'Include colors in output'
1010
+ c.switch [:color], default_value: true, negatable: true
985
1011
 
986
1012
  c.desc 'Sort tags by (name|time)'
987
1013
  default = 'time'
988
1014
  if wwid.config.has_key?('tag_sort')
989
1015
  default = wwid.config['tag_sort']
990
1016
  end
991
- c.flag [:tag_sort], :default_value => default
1017
+ c.flag [:tag_sort], default_value: default
992
1018
 
993
1019
  c.desc 'Only show items with recorded time intervals'
994
- c.switch [:only_timed], :default_value => false, :negatable => true
1020
+ c.switch [:only_timed], default_value: false, negatable: true
995
1021
 
996
1022
  c.action do |global_options,options,args|
997
1023
  if args.empty?
@@ -1018,7 +1044,7 @@ command :view do |c|
1018
1044
  tag_filter = false
1019
1045
  if view.has_key?('tags')
1020
1046
  unless view['tags'].nil? || view['tags'].empty?
1021
- tag_filter = {'tags' => [], 'bool' => "OR"}
1047
+ tag_filter = {'tags' => [], 'bool' => 'OR'}
1022
1048
  if view['tags'].class == Array
1023
1049
  tag_filter['tags'] = view['tags'].map{|tag| tag.strip }
1024
1050
  else
@@ -1039,7 +1065,7 @@ command :view do |c|
1039
1065
  options[:output].downcase! if options[:output]
1040
1066
  options[:sort_tags] = options[:tag_sort] =~ /^n/i
1041
1067
 
1042
- puts wwid.list_section({:section => section, :count => count, :template => template, :format => format, :order => order, :tag_filter => tag_filter, :output => options[:o], :tags_color => tags_color, :times => options[:t], :highlight => true, :totals => options[:totals], :only_timed => only_timed, :sort_tags => options[:sort_tags] })
1068
+ puts wwid.list_section({section: section, count: count, template: template, format: format, order: order, tag_filter: tag_filter, output: options[:o], tags_color: tags_color, times: options[:t], highlight: options[:color], totals: options[:totals], only_timed: only_timed, sort_tags: options[:sort_tags] })
1043
1069
  else
1044
1070
  if title.class == FalseClass
1045
1071
  exit_now! "Cancelled"
@@ -1053,7 +1079,7 @@ end
1053
1079
  desc 'List available custom views'
1054
1080
  command :views do |c|
1055
1081
  c.desc 'List in single column'
1056
- c.switch [:c, :column], :default_value => false
1082
+ c.switch [:c, :column], default_value: false
1057
1083
 
1058
1084
  c.action do |global_options,options,args|
1059
1085
  joiner = options[:c] ? "\n" : "\t"
@@ -1061,18 +1087,21 @@ command :views do |c|
1061
1087
  end
1062
1088
  end
1063
1089
 
1064
- desc 'Move entries in between sections'
1090
+ desc 'Move entries between sections'
1065
1091
  arg_name 'section'
1066
1092
  default_value wwid.current_section
1067
1093
  command :archive do |c|
1068
1094
  c.desc 'Count to keep (ignored if archiving by tag)'
1069
- c.flag [:k, :keep], :default_value => 5, :must_match => /^\d+$/, :type => Integer
1095
+ c.flag [:k, :keep], default_value: 5, must_match: /^\d+$/, type: Integer
1070
1096
 
1071
1097
  c.desc 'Move entries to'
1072
- c.flag [:t, :to], :default_value => "Archive"
1098
+ c.flag [:t, :to], default_value: 'Archive'
1099
+
1100
+ c.desc 'Tag filter, combine multiple tags with a comma. Added for compatibility with other commands.'
1101
+ c.flag [:tag]
1073
1102
 
1074
1103
  c.desc 'Tag boolean'
1075
- c.flag [:b, :bool], :default_value => "AND"
1104
+ c.flag [:b, :bool], must_match: /(and|or|not)/i, default_value: 'AND'
1076
1105
 
1077
1106
  c.action do |global_options,options,args|
1078
1107
  if args.length > 0
@@ -1081,13 +1110,16 @@ command :archive do |c|
1081
1110
  tags = args.map {|t| t.sub(/^@/,'').strip }
1082
1111
  else
1083
1112
  section = args[0].cap_first
1084
- tags = args.length > 1 ? args[1..-1].map {|t| t.sub(/^@/,'').strip } : nil
1113
+ tags = args.length > 1 ? args[1..-1].map {|t| t.sub(/^@/, '').strip } : nil
1085
1114
  end
1086
1115
  else
1087
1116
  section = wwid.current_section
1088
- tags = nil
1117
+ tags = []
1089
1118
  end
1090
- wwid.archive(section,options[:k],options[:t],tags,options[:b])
1119
+
1120
+ tags.concat(options[:tag].split(/ *, */).map {|t| t.sub(/^@/, '').strip }) if options[:tag]
1121
+
1122
+ wwid.archive(section, options[:k], options[:t], tags, options[:b])
1091
1123
  end
1092
1124
  end
1093
1125
 
@@ -1103,7 +1135,7 @@ if `uname` =~ /Darwin/
1103
1135
  c.flag [:b]
1104
1136
  end
1105
1137
  c.desc 'open with $EDITOR'
1106
- c.switch [:e], :negatable => false
1138
+ c.switch [:e], negatable: false
1107
1139
 
1108
1140
  c.action do |global_options,options,args|
1109
1141
  params = options.dup
@@ -1140,7 +1172,7 @@ end
1140
1172
  desc 'Edit the configuration file'
1141
1173
  command :config do |c|
1142
1174
  c.desc 'Editor to use'
1143
- c.flag [:e, :editor], :default_value => nil
1175
+ c.flag [:e, :editor], default_value: nil
1144
1176
 
1145
1177
  if `uname` =~ /Darwins/
1146
1178
  c.desc 'Application to use'
@@ -1178,7 +1210,7 @@ end
1178
1210
  desc 'Undo the last change to the doing_file'
1179
1211
  command :undo do |c|
1180
1212
  c.desc 'Specify alternate doing file'
1181
- c.flag [:f, :file], :default_value => wwid.doing_file
1213
+ c.flag [:f, :file], default_value: wwid.doing_file
1182
1214
 
1183
1215
  c.action do |global_options,options,args|
1184
1216
  file = options[:f] || wwid.doing_file
@@ -1190,7 +1222,7 @@ end
1190
1222
  pre do |global,command,options,args|
1191
1223
  if global[:config_file]
1192
1224
  wwid.config_file = global[:config_file]
1193
- wwid.configure({:ignore_local => true})
1225
+ wwid.configure({ignore_local: true})
1194
1226
  # wwid.results.push("Override config file #{wwid.config_file}")
1195
1227
  end
1196
1228
 
data/lib/doing/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Doing
2
- VERSION = '1.0.52'
2
+ VERSION = '1.0.53'
3
3
  end
data/lib/doing/wwid.rb CHANGED
@@ -3,6 +3,44 @@
3
3
  require 'deep_merge'
4
4
  require 'open3'
5
5
 
6
+ ##
7
+ ## @brief Hash helpers
8
+ ##
9
+ class Hash
10
+ def has_tags?(tags, bool = 'AND')
11
+ item = self
12
+ case bool
13
+ when 'AND'
14
+ result = true
15
+ tags.each do |tag|
16
+ unless item['title'] =~ /@#{tag}/
17
+ result = false
18
+ break
19
+ end
20
+ end
21
+ result
22
+ when 'NOT'
23
+ result = true
24
+ tags.each do |tag|
25
+ if item['title'] =~ /@#{tag}/
26
+ result = false
27
+ break
28
+ end
29
+ end
30
+ result
31
+ else
32
+ result = false
33
+ tags.each do |tag|
34
+ if item['title'] =~ /@#{tag}/
35
+ result = true
36
+ break
37
+ end
38
+ end
39
+ result
40
+ end
41
+ end
42
+ end
43
+
6
44
  ##
7
45
  ## @brief String helpers
8
46
  ##
@@ -637,6 +675,8 @@ class WWID
637
675
  def restart_last(opt = {})
638
676
  opt[:section] ||= 'all'
639
677
  opt[:note] ||= []
678
+ opt[:tag] ||= []
679
+ opt[:tag_bool] ||= 'AND'
640
680
 
641
681
  last = last_entry(opt)
642
682
  if last.nil?
@@ -645,8 +685,9 @@ class WWID
645
685
  end
646
686
  # Remove @done tag
647
687
  title = last['title'].sub(/\s*@done(\(.*?\))?/, '').chomp
688
+ section = opt[:in].nil? ? last['section'] : guess_section(opt[:in])
648
689
  @auto_tag = false
649
- add_item(title, last['section'], { note: opt[:note], back: opt[:date], timed: true })
690
+ add_item(title, section, { note: opt[:note], back: opt[:date], timed: true })
650
691
  write(@doing_file)
651
692
  end
652
693
 
@@ -656,6 +697,8 @@ class WWID
656
697
  ## @param opt (Hash) Additional Options
657
698
  ##
658
699
  def last_entry(opt = {})
700
+ opt[:tag] ||= []
701
+ opt[:tag_bool] ||= 'AND'
659
702
  opt[:section] ||= @current_section
660
703
 
661
704
  sec_arr = []
@@ -682,6 +725,8 @@ class WWID
682
725
  all_items.concat(@content[section]['items'].dup) if @content.key?(section)
683
726
  end
684
727
 
728
+ all_items.select! { |item| item.has_tags?(opt[:tag], opt[:tag_bool]) } if !opt[:tag].nil? && opt[:tag].length.positive?
729
+
685
730
  all_items.max_by { |item| item['date'] }
686
731
  end
687
732
 
@@ -735,39 +780,7 @@ class WWID
735
780
  items.map! do |item|
736
781
  break if index == count
737
782
 
738
- tag_match = if opt[:tag].length.positive?
739
- case opt[:tag_bool]
740
- when 'AND'
741
- result = true
742
- opt[:tag].each do |tag|
743
- unless item['title'] =~ /@#{tag}/
744
- result = false
745
- break
746
- end
747
- end
748
- result
749
- when 'NOT'
750
- result = true
751
- opt[:tag].each do |tag|
752
- if item['title'] =~ /@#{tag}/
753
- result = false
754
- break
755
- end
756
- end
757
- result
758
- else
759
- result = false
760
- opt[:tag].each do |tag|
761
- if item['title'] =~ /@#{tag}/
762
- result = true
763
- break
764
- end
765
- end
766
- result
767
- end
768
- else
769
- true
770
- end
783
+ tag_match = !opt[:tag].nil? && opt[:tag].length.positive? ? item.has_tags?(opt[:tag], opt[:tag_bool]) : true
771
784
 
772
785
  if tag_match
773
786
  if opt[:autotag]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: doing
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.52
4
+ version: 1.0.53
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra