doing 2.1.22 → 2.1.23

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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/.yardoc/checksums +13 -11
  3. data/.yardoc/object_types +0 -0
  4. data/.yardoc/objects/root.dat +0 -0
  5. data/CHANGELOG.md +18 -10
  6. data/Gemfile.lock +1 -1
  7. data/README.md +1 -1
  8. data/bin/doing +134 -27
  9. data/docs/doc/Array.html +10 -5
  10. data/docs/doc/BooleanTermParser/Clause.html +1 -1
  11. data/docs/doc/BooleanTermParser/Operator.html +1 -1
  12. data/docs/doc/BooleanTermParser/Query.html +1 -1
  13. data/docs/doc/BooleanTermParser/QueryParser.html +1 -1
  14. data/docs/doc/BooleanTermParser/QueryTransformer.html +1 -1
  15. data/docs/doc/BooleanTermParser.html +1 -1
  16. data/docs/doc/Doing/Color.html +1 -1
  17. data/docs/doc/Doing/Completion.html +1 -1
  18. data/docs/doc/Doing/Configuration.html +3 -3
  19. data/docs/doc/Doing/Errors/DoingNoTraceError.html +1 -1
  20. data/docs/doc/Doing/Errors/DoingRuntimeError.html +1 -1
  21. data/docs/doc/Doing/Errors/DoingStandardError.html +1 -1
  22. data/docs/doc/Doing/Errors/EmptyInput.html +1 -1
  23. data/docs/doc/Doing/Errors/NoResults.html +1 -1
  24. data/docs/doc/Doing/Errors/PluginException.html +1 -1
  25. data/docs/doc/Doing/Errors/UserCancelled.html +1 -1
  26. data/docs/doc/Doing/Errors/WrongCommand.html +1 -1
  27. data/docs/doc/Doing/Errors.html +1 -1
  28. data/docs/doc/Doing/Hooks.html +1 -1
  29. data/docs/doc/Doing/Item.html +1 -1
  30. data/docs/doc/Doing/Items.html +1 -1
  31. data/docs/doc/Doing/LogAdapter.html +1 -1
  32. data/docs/doc/Doing/Note.html +1 -1
  33. data/docs/doc/Doing/Pager.html +1 -1
  34. data/docs/doc/Doing/Plugins.html +1 -1
  35. data/docs/doc/Doing/Prompt.html +1 -1
  36. data/docs/doc/Doing/Section.html +1 -1
  37. data/docs/doc/Doing/TemplateString.html +2 -2
  38. data/docs/doc/Doing/Types.html +201 -0
  39. data/docs/doc/Doing/Util/Backup.html +1 -1
  40. data/docs/doc/Doing/Util.html +2 -5
  41. data/docs/doc/Doing/WWID.html +1 -1
  42. data/docs/doc/Doing.html +2 -2
  43. data/docs/doc/GLI/Commands/Help.html +185 -0
  44. data/docs/doc/GLI/Commands/MarkdownDocumentListener.html +1 -1
  45. data/docs/doc/GLI/Commands.html +5 -3
  46. data/docs/doc/GLI.html +4 -2
  47. data/docs/doc/Hash.html +3 -11
  48. data/docs/doc/Numeric.html +1 -1
  49. data/docs/doc/PhraseParser/Operator.html +1 -1
  50. data/docs/doc/PhraseParser/PhraseClause.html +1 -1
  51. data/docs/doc/PhraseParser/Query.html +1 -1
  52. data/docs/doc/PhraseParser/QueryParser.html +1 -1
  53. data/docs/doc/PhraseParser/QueryTransformer.html +1 -1
  54. data/docs/doc/PhraseParser/TermClause.html +1 -1
  55. data/docs/doc/PhraseParser.html +1 -1
  56. data/docs/doc/Status.html +1 -1
  57. data/docs/doc/String.html +40 -10
  58. data/docs/doc/Symbol.html +1 -1
  59. data/docs/doc/Time.html +1 -1
  60. data/docs/doc/_index.html +16 -9
  61. data/docs/doc/class_list.html +1 -1
  62. data/docs/doc/file.README.html +2 -2
  63. data/docs/doc/index.html +2 -2
  64. data/docs/doc/method_list.html +160 -144
  65. data/docs/doc/top-level-namespace.html +1 -1
  66. data/docs/index.md +1 -1
  67. data/doing.rdoc +148 -4
  68. data/lib/completion/_doing.zsh +15 -15
  69. data/lib/completion/doing.bash +29 -18
  70. data/lib/completion/doing.fish +21 -1
  71. data/lib/doing/array.rb +2 -2
  72. data/lib/doing/changelog/change.rb +115 -0
  73. data/lib/doing/changelog/changes.rb +73 -0
  74. data/lib/doing/changelog/entry.rb +21 -0
  75. data/lib/doing/changelog/version.rb +97 -0
  76. data/lib/doing/changelog.rb +6 -0
  77. data/lib/doing/configuration.rb +15 -7
  78. data/lib/doing/hash.rb +3 -2
  79. data/lib/doing/help_monkey_patch.rb +31 -0
  80. data/lib/doing/hooks.rb +5 -1
  81. data/lib/doing/item.rb +10 -25
  82. data/lib/doing/plugins/export/template_export.rb +1 -1
  83. data/lib/doing/string.rb +19 -10
  84. data/lib/doing/string_chronify.rb +1 -1
  85. data/lib/doing/types.rb +2 -0
  86. data/lib/doing/util.rb +2 -1
  87. data/lib/doing/version.rb +1 -1
  88. data/lib/doing/wwid.rb +22 -19
  89. data/lib/doing.rb +1 -0
  90. data/lib/helpers/threaded_tests.rb +14 -1
  91. metadata +10 -2
@@ -139,7 +139,7 @@ complete -xc doing -n '__fish_doing_needs_command' -a 'again resume' -d Repeat\
139
139
  complete -xc doing -n '__fish_doing_needs_command' -a 'archive move' -d Move\ entries\ between\ sections
140
140
  complete -xc doing -n '__fish_doing_needs_command' -a 'autotag' -d Autotag\ last\ entry\ or\ filtered\ entries
141
141
  complete -xc doing -n '__fish_doing_needs_command' -a 'cancel' -d End\ last\ X\ entries\ with\ no\ time\ tracked
142
- complete -xc doing -n '__fish_doing_needs_command' -a 'changelog changes' -d List\ recent\ changes\ in\ Doing
142
+ complete -xc doing -n '__fish_doing_needs_command' -a 'changes changelog' -d List\ recent\ changes\ in\ Doing
143
143
  complete -xc doing -n '__fish_doing_needs_command' -a 'choose' -d Select\ a\ section\ to\ display\ from\ a\ menu
144
144
  complete -xc doing -n '__fish_doing_needs_command' -a 'colors' -d List\ available\ color\ variables\ for\ configuration\ templates\ and\ views
145
145
  complete -xc doing -n '__fish_doing_needs_command' -a 'completion' -d Generate\ shell\ completion\ scripts
@@ -220,6 +220,9 @@ complete -c doing -l tag -f -r -n '__fish_doing_using_command cancel' -d Cancel
220
220
  complete -c doing -l unfinished -s u -f -n '__fish_doing_using_command cancel' -d Cancel\ last\ entry
221
221
  complete -c doing -l val -f -r -n '__fish_doing_using_command cancel' -d Perform\ a\ tag\ value\ query
222
222
  complete -c doing -l exact -s x -f -n '__fish_doing_using_command cancel' -d Force\ exact\ search\ string\ matching
223
+ complete -c doing -l all -s a -f -n '__fish_doing_using_command changes changelog' -d Display\ all\ versions
224
+ complete -c doing -l lookup -s l -f -r -n '__fish_doing_using_command changes changelog' -d Look\ up\ a\ specific\ version
225
+ complete -c doing -l search -s s -f -r -n '__fish_doing_using_command changes changelog' -d Show\ changelogs\ matching\ search\ terms
223
226
  complete -c doing -l file -s f -f -r -n '__fish_doing_using_command completion' -d File\ to\ write\ output\ to
224
227
  complete -c doing -l type -s t -f -r -n '__fish_doing_using_command completion' -d Shell\ to\ generate\ for
225
228
  complete -c doing -l dump -s d -f -n '__fish_doing_using_command config' -d DEPRECATED
@@ -257,6 +260,7 @@ complete -c doing -l after -f -r -n '__fish_doing_using_command grep search' -d
257
260
  complete -c doing -l before -f -r -n '__fish_doing_using_command grep search' -d Search\ entries\ older\ than\ date
258
261
  complete -c doing -l bool -f -r -n '__fish_doing_using_command grep search' -d Combine\ multiple\ tags\ or\ value\ queries\ using\ AND
259
262
  complete -c doing -l case -f -r -n '__fish_doing_using_command grep search' -d Case\ sensitivity\ for\ search\ string\ matching\ \[\(c\)ase-sensitive
263
+ complete -c doing -l config_template -f -r -n '__fish_doing_using_command grep search' -d Output\ using\ a\ template\ from\ configuration
260
264
  complete -c doing -l delete -s d -f -n '__fish_doing_using_command grep search' -d Delete\ matching\ entries
261
265
  complete -c doing -l duration -f -n '__fish_doing_using_command grep search' -d Show\ elapsed\ time\ on\ entries\ without\ @done\ tag
262
266
  complete -c doing -l editor -s e -f -n '__fish_doing_using_command grep search' -d Edit\ matching\ entries\ with\ vim
@@ -269,6 +273,7 @@ complete -c doing -l only_timed -f -n '__fish_doing_using_command grep search'
269
273
  complete -c doing -l section -s s -f -r -n '__fish_doing_using_command grep search' -d Section
270
274
  complete -c doing -l times -s t -f -n '__fish_doing_using_command grep search' -d Show\ time\ intervals\ on\ @done\ tasks
271
275
  complete -c doing -l tag_sort -f -r -n '__fish_doing_using_command grep search' -d Sort\ tags\ by
276
+ complete -c doing -l template -f -r -n '__fish_doing_using_command grep search' -d Override\ output\ format\ with\ a\ template\ string\ containing\ \%placeholders
272
277
  complete -c doing -l totals -f -n '__fish_doing_using_command grep search' -d Show\ intervals\ with\ totals\ at\ the\ end\ of\ output
273
278
  complete -c doing -l val -f -r -n '__fish_doing_using_command grep search' -d Perform\ a\ tag\ value\ query
274
279
  complete -c doing -l exact -s x -f -n '__fish_doing_using_command grep search' -d Force\ exact\ string\ matching
@@ -289,6 +294,7 @@ complete -c doing -l type -f -r -n '__fish_doing_using_command import' -d Impor
289
294
  complete -c doing -l exact -s x -f -n '__fish_doing_using_command import' -d Force\ exact\ search\ string\ matching
290
295
  complete -c doing -l bool -f -r -n '__fish_doing_using_command last' -d Tag\ boolean
291
296
  complete -c doing -l case -f -r -n '__fish_doing_using_command last' -d Case\ sensitivity\ for\ search\ string\ matching\ \[\(c\)ase-sensitive
297
+ complete -c doing -l config_template -f -r -n '__fish_doing_using_command last' -d Output\ using\ a\ template\ from\ configuration
292
298
  complete -c doing -l delete -s d -f -n '__fish_doing_using_command last' -d Delete\ the\ last\ entry
293
299
  complete -c doing -l duration -f -n '__fish_doing_using_command last' -d Show\ elapsed\ time\ if\ entry\ is\ not\ tagged\ @done
294
300
  complete -c doing -l editor -s e -f -n '__fish_doing_using_command last' -d Edit\ entry\ with\ vim
@@ -297,6 +303,7 @@ complete -c doing -l not -f -n '__fish_doing_using_command last' -d Show\ item
297
303
  complete -c doing -l section -s s -f -r -n '__fish_doing_using_command last' -d Specify\ a\ section
298
304
  complete -c doing -l search -f -r -n '__fish_doing_using_command last' -d Search\ filter
299
305
  complete -c doing -l tag -f -r -n '__fish_doing_using_command last' -d Tag\ filter
306
+ complete -c doing -l template -f -r -n '__fish_doing_using_command last' -d Override\ output\ format\ with\ a\ template\ string\ containing\ \%placeholders
300
307
  complete -c doing -l val -f -r -n '__fish_doing_using_command last' -d Perform\ a\ tag\ value\ query
301
308
  complete -c doing -l exact -s x -f -n '__fish_doing_using_command last' -d Force\ exact\ search\ string\ matching
302
309
  complete -c doing -l ask -f -n '__fish_doing_using_command later' -d Prompt\ for\ note\ via\ multi-line\ input
@@ -341,22 +348,26 @@ complete -c doing -l editor -s e -f -n '__fish_doing_using_command now next' -d
341
348
  complete -c doing -l finish_last -s f -f -n '__fish_doing_using_command now next' -d Timed\ entry
342
349
  complete -c doing -l note -s n -f -r -n '__fish_doing_using_command now next' -d Include\ a\ note
343
350
  complete -c doing -l section -s s -f -r -n '__fish_doing_using_command now next' -d Section
351
+ complete -c doing -l config_template -f -r -n '__fish_doing_using_command on' -d Output\ using\ a\ template\ from\ configuration
344
352
  complete -c doing -l duration -f -n '__fish_doing_using_command on' -d Show\ elapsed\ time\ on\ entries\ without\ @done\ tag
345
353
  complete -c doing -l output -s o -f -r -n '__fish_doing_using_command on' -d Output\ to\ export\ format
346
354
  complete -c doing -l section -s s -f -r -n '__fish_doing_using_command on' -d Section
347
355
  complete -c doing -l times -s t -f -n '__fish_doing_using_command on' -d Show\ time\ intervals\ on\ @done\ tasks
348
356
  complete -c doing -l tag_sort -f -r -n '__fish_doing_using_command on' -d Sort\ tags\ by
357
+ complete -c doing -l template -f -r -n '__fish_doing_using_command on' -d Override\ output\ format\ with\ a\ template\ string\ containing\ \%placeholders
349
358
  complete -c doing -l totals -f -n '__fish_doing_using_command on' -d Show\ time\ totals\ at\ the\ end\ of\ output
350
359
  complete -c doing -l app -s a -f -r -n '__fish_doing_using_command open' -d Open\ with\ app\ name
351
360
  complete -c doing -l bundle_id -s b -f -r -n '__fish_doing_using_command open' -d Open\ with\ app\ bundle\ id
352
361
  complete -c doing -l editor -s e -f -r -n '__fish_doing_using_command open' -d Open\ with\ editor\ command
353
362
  complete -c doing -l column -s c -f -n '__fish_doing_using_command plugins' -d List\ in\ single\ column\ for\ completion
354
363
  complete -c doing -l type -s t -f -r -n '__fish_doing_using_command plugins' -d List\ plugins\ of\ type
364
+ complete -c doing -l config_template -f -r -n '__fish_doing_using_command recent' -d Output\ using\ a\ template\ from\ configuration
355
365
  complete -c doing -l duration -f -n '__fish_doing_using_command recent' -d Show\ elapsed\ time\ on\ entries\ without\ @done\ tag
356
366
  complete -c doing -l interactive -s i -f -n '__fish_doing_using_command recent' -d Select\ from\ a\ menu\ of\ matching\ entries\ to\ perform\ additional\ operations
357
367
  complete -c doing -l section -s s -f -r -n '__fish_doing_using_command recent' -d Section
358
368
  complete -c doing -l times -s t -f -n '__fish_doing_using_command recent' -d Show\ time\ intervals\ on\ @done\ tasks
359
369
  complete -c doing -l tag_sort -f -r -n '__fish_doing_using_command recent' -d Sort\ tags\ by
370
+ complete -c doing -l template -f -r -n '__fish_doing_using_command recent' -d Override\ output\ format\ with\ a\ template\ string\ containing\ \%placeholders
360
371
  complete -c doing -l totals -f -n '__fish_doing_using_command recent' -d Show\ intervals\ with\ totals\ at\ the\ end\ of\ output
361
372
  complete -c doing -l bool -f -r -n '__fish_doing_using_command reset begin' -d Boolean
362
373
  complete -c doing -l case -f -r -n '__fish_doing_using_command reset begin' -d Case\ sensitivity\ for\ search\ string\ matching\ \[\(c\)ase-sensitive
@@ -409,6 +420,7 @@ complete -c doing -l bool -s b -f -r -n '__fish_doing_using_command show' -d Tag
409
420
  complete -c doing -l before -f -r -n '__fish_doing_using_command show' -d Show\ entries\ older\ than\ date
410
421
  complete -c doing -l count -s c -f -r -n '__fish_doing_using_command show' -d Max\ count\ to\ show
411
422
  complete -c doing -l case -f -r -n '__fish_doing_using_command show' -d Case\ sensitivity\ for\ search\ string\ matching\ \[\(c\)ase-sensitive
423
+ complete -c doing -l config_template -f -r -n '__fish_doing_using_command show' -d Output\ using\ a\ template\ from\ configuration
412
424
  complete -c doing -l duration -f -n '__fish_doing_using_command show' -d Show\ elapsed\ time\ on\ entries\ without\ @done\ tag
413
425
  complete -c doing -l from -f -r -n '__fish_doing_using_command show' -d Date\ range\ to\ show
414
426
  complete -c doing -l hilite -s h -f -n '__fish_doing_using_command show' -d Highlight\ search\ matches\ in\ output
@@ -423,14 +435,17 @@ complete -c doing -l times -s t -f -n '__fish_doing_using_command show' -d Show
423
435
  complete -c doing -l tag -f -r -n '__fish_doing_using_command show' -d Tag\ filter
424
436
  complete -c doing -l tag_order -f -r -n '__fish_doing_using_command show' -d Tag\ sort\ direction
425
437
  complete -c doing -l tag_sort -f -r -n '__fish_doing_using_command show' -d Sort\ tags\ by
438
+ complete -c doing -l template -f -r -n '__fish_doing_using_command show' -d Override\ output\ format\ with\ a\ template\ string\ containing\ \%placeholders
426
439
  complete -c doing -l totals -f -n '__fish_doing_using_command show' -d Show\ intervals\ with\ totals\ at\ the\ end\ of\ output
427
440
  complete -c doing -l val -f -r -n '__fish_doing_using_command show' -d Perform\ a\ tag\ value\ query
428
441
  complete -c doing -l exact -s x -f -n '__fish_doing_using_command show' -d Force\ exact\ search\ string\ matching
442
+ complete -c doing -l config_template -f -r -n '__fish_doing_using_command since' -d Output\ using\ a\ template\ from\ configuration
429
443
  complete -c doing -l duration -f -n '__fish_doing_using_command since' -d Show\ elapsed\ time\ on\ entries\ without\ @done\ tag
430
444
  complete -c doing -l output -s o -f -r -n '__fish_doing_using_command since' -d Output\ to\ export\ format
431
445
  complete -c doing -l section -s s -f -r -n '__fish_doing_using_command since' -d Section
432
446
  complete -c doing -l times -s t -f -n '__fish_doing_using_command since' -d Show\ time\ intervals\ on\ @done\ tasks
433
447
  complete -c doing -l tag_sort -f -r -n '__fish_doing_using_command since' -d Sort\ tags\ by
448
+ complete -c doing -l template -f -r -n '__fish_doing_using_command since' -d Override\ output\ format\ with\ a\ template\ string\ containing\ \%placeholders
434
449
  complete -c doing -l totals -f -n '__fish_doing_using_command since' -d Show\ time\ totals\ at\ the\ end\ of\ output
435
450
  complete -c doing -l autotag -s a -f -n '__fish_doing_using_command tag' -d Autotag\ entries\ based\ on\ autotag\ configuration\ in\ \~/
436
451
  complete -c doing -l bool -f -r -n '__fish_doing_using_command tag' -d Boolean
@@ -455,6 +470,7 @@ complete -c doing -l bool -f -r -n '__fish_doing_using_command tags' -d Boolean
455
470
  complete -c doing -l counts -s c -f -n '__fish_doing_using_command tags' -d Show\ count\ of\ occurrences
456
471
  complete -c doing -l case -f -r -n '__fish_doing_using_command tags' -d Case\ sensitivity\ for\ search\ string\ matching\ \[\(c\)ase-sensitive
457
472
  complete -c doing -l interactive -s i -f -n '__fish_doing_using_command tags' -d Select\ items\ to\ scan\ from\ a\ menu\ of\ matching\ entries
473
+ complete -c doing -l line -s l -f -n '__fish_doing_using_command tags' -d Output\ in\ a\ single\ line\ with\ @\ symbols
458
474
  complete -c doing -l not -f -n '__fish_doing_using_command tags' -d Get\ tags\ from\ items\ that\ \*don\'t\*\ match\ search/tag\ filters
459
475
  complete -c doing -l order -s o -f -r -n '__fish_doing_using_command tags' -d Sort\ order
460
476
  complete -c doing -l section -s s -f -r -n '__fish_doing_using_command tags' -d Section
@@ -469,12 +485,14 @@ complete -c doing -l path -s p -f -r -n '__fish_doing_using_command template' -d
469
485
  complete -c doing -l save -s s -f -n '__fish_doing_using_command template' -d Save\ template\ to\ file\ instead\ of\ STDOUT
470
486
  complete -c doing -l after -f -r -n '__fish_doing_using_command today' -d View\ entries\ after\ specified\ time
471
487
  complete -c doing -l before -f -r -n '__fish_doing_using_command today' -d View\ entries\ before\ specified\ time
488
+ complete -c doing -l config_template -f -r -n '__fish_doing_using_command today' -d Output\ using\ a\ template\ from\ configuration
472
489
  complete -c doing -l duration -f -n '__fish_doing_using_command today' -d Show\ elapsed\ time\ on\ entries\ without\ @done\ tag
473
490
  complete -c doing -l from -f -r -n '__fish_doing_using_command today' -d Time\ range\ to\ show\ \`doing\ today\ --from\ \"12pm\ to\ 4pm\"\`
474
491
  complete -c doing -l output -s o -f -r -n '__fish_doing_using_command today' -d Output\ to\ export\ format
475
492
  complete -c doing -l section -s s -f -r -n '__fish_doing_using_command today' -d Specify\ a\ section
476
493
  complete -c doing -l times -s t -f -n '__fish_doing_using_command today' -d Show\ time\ intervals\ on\ @done\ tasks
477
494
  complete -c doing -l tag_sort -f -r -n '__fish_doing_using_command today' -d Sort\ tags\ by
495
+ complete -c doing -l template -f -r -n '__fish_doing_using_command today' -d Override\ output\ format\ with\ a\ template\ string\ containing\ \%placeholders
478
496
  complete -c doing -l totals -f -n '__fish_doing_using_command today' -d Show\ time\ totals\ at\ the\ end\ of\ output
479
497
  complete -c doing -l file -s f -f -r -n '__fish_doing_using_command undo' -d Specify\ alternate\ doing\ file
480
498
  complete -c doing -l interactive -s i -f -n '__fish_doing_using_command undo' -d Select\ from\ recent\ backups
@@ -514,6 +532,7 @@ complete -c doing -l search -f -r -n '__fish_doing_using_command wiki' -d Searc
514
532
  complete -c doing -l tag -f -r -n '__fish_doing_using_command wiki' -d Tag\ filter
515
533
  complete -c doing -l after -f -r -n '__fish_doing_using_command yesterday' -d View\ entries\ after\ specified\ time
516
534
  complete -c doing -l before -f -r -n '__fish_doing_using_command yesterday' -d View\ entries\ before\ specified\ time
535
+ complete -c doing -l config_template -f -r -n '__fish_doing_using_command yesterday' -d Output\ using\ a\ template\ from\ configuration
517
536
  complete -c doing -l duration -f -n '__fish_doing_using_command yesterday' -d Show\ elapsed\ time\ on\ entries\ without\ @done\ tag
518
537
  complete -c doing -l from -f -r -n '__fish_doing_using_command yesterday' -d Time\ range\ to\ show
519
538
  complete -c doing -l output -s o -f -r -n '__fish_doing_using_command yesterday' -d Output\ to\ export\ format
@@ -521,6 +540,7 @@ complete -c doing -l section -s s -f -r -n '__fish_doing_using_command yesterday
521
540
  complete -c doing -l times -s t -f -n '__fish_doing_using_command yesterday' -d Show\ time\ intervals\ on\ @done\ tasks
522
541
  complete -c doing -l tag_order -f -r -n '__fish_doing_using_command yesterday' -d Tag\ sort\ direction
523
542
  complete -c doing -l tag_sort -f -r -n '__fish_doing_using_command yesterday' -d Sort\ tags\ by
543
+ complete -c doing -l template -f -r -n '__fish_doing_using_command yesterday' -d Override\ output\ format\ with\ a\ template\ string\ containing\ \%placeholders
524
544
  complete -c doing -l totals -f -n '__fish_doing_using_command yesterday' -d Show\ time\ totals\ at\ the\ end\ of\ output
525
545
  complete -f -c doing -s o -l output -x -n '__fish_doing_using_command grep search on select show since today view yesterday' -a '(__fish_doing_export_plugin)'
526
546
  complete -f -c doing -s b -l bool -x -n '__fish_doing_using_command again resume archive move autotag cancel finish grep search last mark flag note reset begin rotate show tag tags view wiki' -a 'and or not pattern'
data/lib/doing/array.rb CHANGED
@@ -19,8 +19,8 @@ module Doing
19
19
  # @return [Array] Array of @tags
20
20
  #
21
21
  # @example
22
- # ['one', '@two', 'three'].to_tags
23
- # # => ['@one', '@two', '@three']
22
+ # ['one', '@two', 'three'].to_tags
23
+ # # => ['@one', '@two', '@three']
24
24
  def to_tags
25
25
  map(&:add_at)
26
26
  end
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Doing
4
+ # A single version's entries
5
+ class Change
6
+ attr_reader :version, :content
7
+
8
+ attr_accessor :entries
9
+
10
+ def initialize(version, content)
11
+ @version = Version.new(version)
12
+ @content = content
13
+ parse_entries
14
+ end
15
+
16
+ def parse_entries
17
+ @entries = []
18
+ types = @content.scan(/(?<=\n|\A)#### (NEW|IMPROVED|FIXED)(.*?)(?=\n####|\Z)/m)
19
+ types.each do |type|
20
+ type[1].scan(/\s*- +(.*?)$/).each do |entry|
21
+ @entries << Entry.new(entry[0].strip, type[0])
22
+ end
23
+ end
24
+ end
25
+
26
+ def search_entries(search_string)
27
+ case_type = :ignore
28
+
29
+ matches = []
30
+
31
+ if search_string.is_rx?
32
+ matches = @entries.select { |e| e.string =~ search_string.to_rx(distance: 2, case_type: case_type) }
33
+ else
34
+ query = search_string.gsub(/(-)?--/, '\1]]').to_phrase_query
35
+
36
+ if query[:must].nil? && query[:must_not].nil?
37
+ query[:must] = query[:should]
38
+ query[:should] = []
39
+ end
40
+
41
+ @entries.each do |entry|
42
+ m = no_searches?(entry.string, query[:must_not])
43
+ m &&= all_searches?(entry.string, query[:must])
44
+ m &&= any_searches?(entry.string, query[:should])
45
+ matches << entry if m
46
+ end
47
+ end
48
+
49
+ @entries = matches.count.positive? ? matches : nil
50
+ end
51
+
52
+ def to_h
53
+ { version: @version, content: @content }
54
+ end
55
+
56
+ def to_s
57
+ out = ["### #{@version}"]
58
+ items = {
59
+ new: [],
60
+ improved: [],
61
+ fixed: [],
62
+ other: []
63
+ }
64
+ @entries.each do |e|
65
+ type = e.type.downcase.to_sym
66
+ if items.key?(type)
67
+ items[type] << e
68
+ else
69
+ items[:other] << e
70
+ end
71
+ end
72
+
73
+ items.each do |type, members|
74
+ if members.count.positive?
75
+ out << "#### #{type.to_s.capitalize}"
76
+ out << members.map(&:to_s).join("\n")
77
+ end
78
+ end
79
+
80
+ out.join("\n\n")
81
+ end
82
+
83
+ private
84
+
85
+ def all_searches?(text, searches)
86
+ return true if searches.nil? || searches.empty?
87
+
88
+ searches.each do |s|
89
+ rx = Regexp.new(s.wildcard_to_rx, true)
90
+ return false unless text =~ rx
91
+ end
92
+ true
93
+ end
94
+
95
+ def no_searches?(text, searches)
96
+ return true if searches.nil? || searches.empty?
97
+
98
+ searches.each do |s|
99
+ rx = Regexp.new(s.wildcard_to_rx, true)
100
+ return false if text =~ rx
101
+ end
102
+ true
103
+ end
104
+
105
+ def any_searches?(text, searches)
106
+ return true if searches.nil? || searches.empty?
107
+
108
+ searches.each do |s|
109
+ rx = Regexp.new(s.wildcard_to_rx, true)
110
+ return true if text =~ rx
111
+ end
112
+ false
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Doing
4
+ # A collection of Changes
5
+ class Changes
6
+ attr_reader :changes
7
+
8
+ def initialize(lookup: nil, search: nil)
9
+ changelog = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'CHANGELOG.md'))
10
+ raise 'Error locating changelog' unless File.exist?(changelog)
11
+
12
+ @content = IO.read(changelog)
13
+ parse_changes(lookup, search)
14
+ end
15
+
16
+ def latest
17
+ @changes[0].to_s.force_encoding('utf-8')
18
+ end
19
+
20
+ def to_s
21
+ @changes.map(&:to_s).join("\n\n").force_encoding('utf-8')
22
+ end
23
+
24
+ private
25
+
26
+ def parse_changes(lookup, search)
27
+ change_rx = /(?<=\n|\A)### (\d+\.\d+\.\d+(?:\w+)?)(.*?)(?=\n### |\Z)/m
28
+ @changes = @content.scan(change_rx).each_with_object([]) do |m, a|
29
+ next if m[0].nil? || m[1].nil?
30
+
31
+ a << Change.new(m[0], m[1].strip)
32
+ end
33
+
34
+ lookup(lookup) unless lookup.nil?
35
+ search(search) unless search.nil?
36
+ end
37
+
38
+ def lookup(lookup_version)
39
+ range = []
40
+
41
+ if lookup_version =~ /([\d.]+) *-+ *([\d.]+)/
42
+ m = Regexp.last_match
43
+ lookup("> #{m[1]}")
44
+ lookup("< #{m[2]}")
45
+ elsif lookup_version.scan(/[<>]/).count > 1
46
+ params = lookup_version.scan(/[<>] [\d.]+/)
47
+ params.each { |query| lookup(query) }
48
+ else
49
+ comp = case lookup_version
50
+ when /(<|prior|before|older)/
51
+ :older
52
+ when />|since|after|newer/
53
+ :newer
54
+ else
55
+ :equal
56
+ end
57
+ version = Version.new(lookup_version)
58
+
59
+ @changes.select! do |change|
60
+ change.version.compare(version, comp)
61
+ end
62
+ end
63
+ end
64
+
65
+ def search(query)
66
+ @changes.map do |c|
67
+ c.entries = c.search_entries(query)
68
+ end
69
+
70
+ @changes.delete_if { |c| c.nil? || c.entries.nil? }
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Doing
4
+ # An individual changelog item
5
+ class Entry
6
+ attr_reader :type, :string
7
+
8
+ def initialize(string, type)
9
+ @string = string
10
+ @type = type
11
+ end
12
+
13
+ def clean(string)
14
+ string.gsub(/\|/, '\|')
15
+ end
16
+
17
+ def to_s
18
+ "- #{clean(@string)}"
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Doing
4
+ # Semantic versioning
5
+ class Version
6
+ attr_reader :maj, :min, :patch
7
+
8
+ def initialize(string)
9
+ @maj, @min, @patch = version_to_a(string)
10
+ end
11
+
12
+ def version_to_a(string)
13
+ raise 'Version not a string' unless string.is_a?(String)
14
+
15
+ v = string.match(/(?<maj>\d+)(?:\.(?<min>[\d*?]+))?(?:\.(?<patch>[\d*?]+))?/)
16
+
17
+ raise 'Error parsing semantic version string' if v.nil?
18
+
19
+ maj = v['maj'].to_i
20
+ min = case v['min']
21
+ when /[*?]/
22
+ v['min'].sub(/(\d+)?[^\d]/, '\1\d+')
23
+ when /^[0-9]+$/
24
+ v['min'].to_i
25
+ end
26
+ pat = case v['patch']
27
+ when /[*?]/
28
+ v['patch'].sub(/(\d+)?[^\d]/, '\1\d+')
29
+ when /^[0-9]+$/
30
+ v['patch'].to_i
31
+ end
32
+ [maj, min, pat]
33
+ end
34
+
35
+ def wild?(val)
36
+ val.is_a?(String)
37
+ end
38
+
39
+
40
+ def compare(other, comp)
41
+ case comp
42
+ when :older
43
+ if @maj <= other.maj
44
+ if @maj < other.maj
45
+ true
46
+ elsif @maj == other.maj && (other.min.nil? || @min < other.min)
47
+ true
48
+ elsif @maj == other.maj && @min == other.min
49
+ other.patch.nil? ? false : @patch < other.patch
50
+ else
51
+ false
52
+ end
53
+ else
54
+ false
55
+ end
56
+ when :newer
57
+ if @maj >= other.maj
58
+ if @maj > other.maj
59
+ true
60
+ elsif @maj == other.maj && (other.min.nil? || @min > other.min)
61
+ true
62
+ elsif @maj == other.maj && @min == other.min
63
+ other.patch.nil? || @patch >= other.patch
64
+ else
65
+ false
66
+ end
67
+ else
68
+ false
69
+ end
70
+ when :equal
71
+ if @maj == other.maj
72
+ if other.min.nil?
73
+ true
74
+ elsif wild?(other.min)
75
+ @min.to_s =~ /^#{other.min}/ ? true : false
76
+ else
77
+ if @min == other.min
78
+ if other.patch.nil?
79
+ true
80
+ elsif wild?(other.patch)
81
+ @patch.to_s =~ /^#{other.patch}/ ? true : false
82
+ else
83
+ @patch == other.patch
84
+ end
85
+ else
86
+ false
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ def to_s
94
+ "#{@maj}.#{@min || 0}.#{@patch || 0}"
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'changelog/version'
4
+ require_relative 'changelog/entry'
5
+ require_relative 'changelog/change'
6
+ require_relative 'changelog/changes'
@@ -190,7 +190,7 @@ module Doing
190
190
  ## matched, first match wins)
191
191
  ## @return [Array] ordered array of resolved keys
192
192
  ##
193
- def resolve_key_path(keypath, create: false)
193
+ def resolve_key_path(keypath, create: false, distance: 2)
194
194
  cfg = @settings
195
195
  real_path = []
196
196
  unless keypath =~ /^[.*]?$/
@@ -198,16 +198,24 @@ module Doing
198
198
  while paths.length.positive? && !cfg.nil?
199
199
  path = paths.shift
200
200
  new_cfg = nil
201
- cfg.each do |key, val|
202
- next unless key =~ path.to_rx(distance: 4)
203
201
 
204
- real_path << key
205
- new_cfg = val
206
- break
202
+ if cfg.is_a?(Hash)
203
+ matches = cfg.select { |key, val| key =~ path.to_rx(distance: distance) }
204
+ if matches.count.positive?
205
+ shortest = matches.keys.group_by(&:length).min.last[0]
206
+ real_path << shortest
207
+ new_cfg = matches[shortest]
208
+ end
209
+ else
210
+ new_cfg = cfg
207
211
  end
208
212
 
209
213
  if new_cfg.nil?
210
- return nil unless create
214
+ if distance < 5 && !create
215
+ return resolve_key_path(keypath, create: false, distance: distance + 1)
216
+ else
217
+ return nil unless create
218
+ end
211
219
 
212
220
  resolved = real_path.count.positive? ? "Resolved #{real_path.join('->')}, but " : ''
213
221
  Doing.logger.log_now(:warn, "#{resolved}#{path} is unknown")
data/lib/doing/hash.rb CHANGED
@@ -48,8 +48,9 @@ module Doing
48
48
 
49
49
  # Set a nested hash value using an array
50
50
  #
51
- # @example `{}.deep_set(['one', 'two'], 'value')`
52
- # @example `=> { 'one' => { 'two' => 'value' } }
51
+ # @example
52
+ # {}.deep_set(['one', 'two'], 'value')
53
+ # # => { 'one' => { 'two' => 'value' } }
53
54
  #
54
55
  # @param path [Array] key path
55
56
  # @param value The value
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GLI
4
+ module Commands
5
+ # Help Command Monkeypatch for paginated output
6
+ class Help < Command
7
+ def show_help(global_options,options,arguments,out,error)
8
+ Doing::Pager.paginate = true
9
+
10
+ command_finder = HelpModules::CommandFinder.new(@app,arguments,error)
11
+ if options[:c]
12
+ help_output = HelpModules::HelpCompletionFormat.new(@app,command_finder,arguments).format
13
+ out.puts help_output unless help_output.nil?
14
+ elsif arguments.empty? || options[:c]
15
+ Doing::Pager.page HelpModules::GlobalHelpFormat.new(@app,@sorter,@text_wrapping_class).format
16
+ else
17
+ name = arguments.shift
18
+ command = command_finder.find_command(name)
19
+ unless command.nil?
20
+ Doing::Pager.page HelpModules::CommandHelpFormat.new(
21
+ command,
22
+ @app,
23
+ @sorter,
24
+ @synopsis_formatter_class,
25
+ @text_wrapping_class).format
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
data/lib/doing/hooks.rb CHANGED
@@ -23,7 +23,11 @@ module Doing
23
23
 
24
24
  # register hook(s) to be called later, public API
25
25
  def self.register(event, priority: DEFAULT_PRIORITY, &block)
26
- register_one(event, priority_value(priority), &block)
26
+ if event.is_a?(Array)
27
+ event.each { |ev| register_one(ev, priority_value(priority), &block) }
28
+ else
29
+ register_one(event, priority_value(priority), &block)
30
+ end
27
31
  end
28
32
 
29
33
  # Ensure the priority is a Fixnum
data/lib/doing/item.rb CHANGED
@@ -125,11 +125,11 @@ module Doing
125
125
  return true if same_time?(item_b)
126
126
 
127
127
  start_a = date
128
- interval = interval
129
- end_a = interval ? start_a + interval.to_i : start_a
128
+ a_interval = interval
129
+ end_a = a_interval ? start_a + a_interval.to_i : start_a
130
130
  start_b = item_b.date
131
- interval = item_b.interval
132
- end_b = interval ? start_b + interval.to_i : start_b
131
+ b_interval = item_b.interval
132
+ end_b = b_interval ? start_b + b_interval.to_i : start_b
133
133
  (start_a >= start_b && start_a <= end_b) || (end_a >= start_b && end_a <= end_b) || (start_a < start_b && end_a > end_b)
134
134
  end
135
135
 
@@ -216,8 +216,8 @@ module Doing
216
216
  ##
217
217
  def tags?(tags, bool = :and, negate: false)
218
218
  if bool == :pattern
219
- tags = tags.join(' ') if tags.is_a?(Array)
220
- matches = tag_pattern?(tags.gsub(/ *, */, ' '))
219
+ tags = tags.to_tags.tags_to_array.join(' ')
220
+ matches = tag_pattern?(tags)
221
221
 
222
222
  return negate ? !matches : matches
223
223
  end
@@ -283,7 +283,7 @@ module Doing
283
283
  new_title = @title.gsub(rx) { |m| yellow(m) }
284
284
  new_note.add(@note.to_s.gsub(rx) { |m| yellow(m) })
285
285
  else
286
- query = to_phrase_query(search.strip)
286
+ query = search.strip.to_phrase_query
287
287
 
288
288
  if query[:must].nil? && query[:must_not].nil?
289
289
  query[:must] = query[:should]
@@ -319,7 +319,7 @@ module Doing
319
319
  if search.is_rx? || matching == :fuzzy
320
320
  matches = @title + @note.to_s =~ search.to_rx(distance: distance, case_type: case_type)
321
321
  else
322
- query = to_phrase_query(search.strip)
322
+ query = search.strip.to_phrase_query
323
323
 
324
324
  if query[:must].nil? && query[:must_not].nil?
325
325
  query[:must] = query[:should]
@@ -612,29 +612,14 @@ module Doing
612
612
  end
613
613
  end
614
614
 
615
- def to_query(query)
616
- parser = BooleanTermParser::QueryParser.new
617
- transformer = BooleanTermParser::QueryTransformer.new
618
- parse_tree = parser.parse(query)
619
- transformer.apply(parse_tree).to_elasticsearch
620
- end
621
-
622
- def to_phrase_query(query)
623
- parser = PhraseParser::QueryParser.new
624
- transformer = PhraseParser::QueryTransformer.new
625
- parse_tree = parser.parse(query)
626
- transformer.apply(parse_tree).to_elasticsearch
627
- end
628
-
629
615
  def tag_pattern?(tags)
630
- query = to_query(tags)
616
+ query = tags.to_query
631
617
 
632
618
  no_tags?(query[:must_not]) && all_tags?(query[:must]) && any_tags?(query[:should])
633
619
  end
634
620
 
635
621
  def split_tags(tags)
636
- tags = tags.to_tags if tags.is_a? String
637
- tags.map(&:remove_at)
622
+ tags.to_tags.tags_to_array
638
623
  end
639
624
  end
640
625
  end
@@ -125,7 +125,7 @@ module Doing
125
125
 
126
126
  output.gsub!(/\\%/, '%')
127
127
 
128
- output.highlight_search!(opt[:search]) if opt[:search] && !opt[:not] && opt[:hilite]
128
+ output.highlight_search!(opt[:search]) if opt[:template] =~ /^temp/ && opt[:search] && !opt[:not] && opt[:hilite]
129
129
 
130
130
  out += "#{output}\n"
131
131
  end