doing 2.1.13 → 2.1.14

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 (77) hide show
  1. checksums.yaml +4 -4
  2. data/.yardoc/checksums +5 -5
  3. data/.yardoc/object_types +0 -0
  4. data/.yardoc/objects/root.dat +0 -0
  5. data/CHANGELOG.md +14 -0
  6. data/Gemfile.lock +7 -1
  7. data/README.md +1 -1
  8. data/bin/doing +91 -28
  9. data/docs/doc/Array.html +1 -1
  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 +1 -1
  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 +117 -13
  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 +35 -1
  36. data/docs/doc/Doing/Section.html +1 -1
  37. data/docs/doc/Doing/TemplateString.html +1 -1
  38. data/docs/doc/Doing/Util/Backup.html +1 -1
  39. data/docs/doc/Doing/Util.html +1 -1
  40. data/docs/doc/Doing/WWID.html +7 -5
  41. data/docs/doc/Doing.html +2 -2
  42. data/docs/doc/GLI/Commands/MarkdownDocumentListener.html +1 -1
  43. data/docs/doc/GLI/Commands.html +1 -1
  44. data/docs/doc/GLI.html +1 -1
  45. data/docs/doc/Hash.html +1 -1
  46. data/docs/doc/PhraseParser/Operator.html +1 -1
  47. data/docs/doc/PhraseParser/PhraseClause.html +1 -1
  48. data/docs/doc/PhraseParser/Query.html +1 -1
  49. data/docs/doc/PhraseParser/QueryParser.html +1 -1
  50. data/docs/doc/PhraseParser/QueryTransformer.html +1 -1
  51. data/docs/doc/PhraseParser/TermClause.html +1 -1
  52. data/docs/doc/PhraseParser.html +1 -1
  53. data/docs/doc/Status.html +1 -1
  54. data/docs/doc/String.html +1 -1
  55. data/docs/doc/Symbol.html +1 -1
  56. data/docs/doc/Time.html +1 -1
  57. data/docs/doc/_index.html +1 -1
  58. data/docs/doc/file.README.html +2 -2
  59. data/docs/doc/index.html +2 -2
  60. data/docs/doc/method_list.html +206 -198
  61. data/docs/doc/top-level-namespace.html +1 -1
  62. data/docs/index.md +1 -1
  63. data/doing.gemspec +1 -0
  64. data/doing.rdoc +41 -4
  65. data/lib/completion/_doing.zsh +11 -11
  66. data/lib/completion/doing.bash +15 -15
  67. data/lib/completion/doing.fish +10 -3
  68. data/lib/doing/item.rb +25 -0
  69. data/lib/doing/plugins/import/calendar_import.rb +13 -1
  70. data/lib/doing/plugins/import/doing_import.rb +12 -1
  71. data/lib/doing/plugins/import/timing_import.rb +13 -1
  72. data/lib/doing/prompt.rb +13 -1
  73. data/lib/doing/time.rb +2 -2
  74. data/lib/doing/version.rb +1 -1
  75. data/lib/doing/wwid.rb +10 -5
  76. data/lib/doing.rb +1 -0
  77. metadata +21 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c12d0846431cd0468f217f3e1e9b80bcb9a86038fbee7ff057c1db8ad6c56bb3
4
- data.tar.gz: a144f25b2798825ad042d690e21c1a798b83e06e49480c92be7acea752d37e48
3
+ metadata.gz: 83151006df40e5509447d601aad17f68c0652923cd4444759568bdc510f809d8
4
+ data.tar.gz: 66cbfb07d1038a5ffa327911039d55aab88695f831735a7f78969ad1f216e3b7
5
5
  SHA512:
6
- metadata.gz: 66f76cd0588f4dca848c94313051bcb39bc776c4679b8bd9a648887dd764dcc3232d45e18bb260edb7500e3c398aef8a02216a11ce5a593b8822f89267c92214
7
- data.tar.gz: bc852708998d6e670fe72c882f2e254f64bbec487cd56b659e75220bdd5a5c75b5495d1a9b4a734d56825a00563b1b3052bdcd2c4a93761479a2bbe9a2eb397d
6
+ metadata.gz: 59bc1165eeab6e6e8e838e81afb226d978878c813627239b909b89a989a20e9318af5ec43d06b90558ad0ed7f4b6f0061f9ed5a96840e1d8a2e2cae5eb471045
7
+ data.tar.gz: 651ded056737cfab0e8ccae8885f8972fbf1a166315fc0b1952911d4884cd3ed8791f8dedaa3400f94c60c199d229bc409223c1426ed35ef3af55906cb8a3925
data/.yardoc/checksums CHANGED
@@ -1,20 +1,20 @@
1
1
  lib/doing/hash.rb c2960de9603dcf90be85ce423d9430de27f4f893
2
- lib/doing/item.rb 54cea2275eaa19a9285e358c51f8630a558730ee
2
+ lib/doing/item.rb be85c6274e7bb07f4dfd00f9d4fe3b93ee3d816c
3
3
  lib/doing/note.rb bbadd9e34e6dc43a2af1110a5107f46c39d2547f
4
- lib/doing/time.rb 4411af636082d3abf6f6402a7d6c9038d96a9ead
4
+ lib/doing/time.rb 6e79c48949e48b8896b18b1856f179d04fd936f9
5
5
  lib/doing/util.rb 33ad79455893213a0f2993edec0e158526657f09
6
- lib/doing/wwid.rb a6e14548e14219d46a6fdc1c9c9accb5f4277654
6
+ lib/doing/wwid.rb 5f3cedc2d4ac8761e869db9d9cc63e0ecfca9681
7
7
  lib/doing/array.rb a17004c4811d239932254f9ed94a6eb10456c8e8
8
8
  lib/doing/hooks.rb acf6e0615ccf1949f84915c979297845242c1205
9
9
  lib/doing/items.rb 8cda7caaef10645893267262f5eee681e35046ce
10
10
  lib/doing/pager.rb b58e478b0cb8d400ddb97988ba741e3a127b53c3
11
11
  lib/doing/colors.rb 9a628d48c821313c502deedc5b61a046a2bf79ef
12
12
  lib/doing/errors.rb af07e482a5389924edc2337749c81cda501098f0
13
- lib/doing/prompt.rb a78b6f4488fe58b5653ce541a88d24559661459c
13
+ lib/doing/prompt.rb 075dc22031e0f1cd5b2a8dd4cb6e6c3b3dfd2c36
14
14
  lib/doing/string.rb 7cbe3e0bd136c52f7b12d4d6133afe20fe204be2
15
15
  lib/doing/symbol.rb 309799458a1bc715c2707307c9a62ab26086275e
16
16
  lib/doing/section.rb 206e119cf818f1e76798753e611180fe77bc299a
17
- lib/doing/version.rb d2b8ae34e7fd7354adae5386fe3ed84c88e5dc88
17
+ lib/doing/version.rb 9a591fb642591742cb202b30af1f46f206220021
18
18
  lib/doing/cli_status.rb dbedd454c4cbbd0fed9ef30120f6ec85d18b9356
19
19
  lib/doing/completion.rb c658e7dc7898fb022a21b2bd77bedb958ca3b067
20
20
  lib/doing/log_adapter.rb 6cf0c9a405d17449643e54d35a04897b1da44eaf
data/.yardoc/object_types CHANGED
Binary file
Binary file
data/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ### 2.1.14
2
+
3
+ #### NEW
4
+
5
+ - All commands that accept --note now accept --ask, which requests input via readline after creating the note. Multiple lines are allowed, hit return twice to end editing. Works alongside --note and --editor
6
+
7
+ #### IMPROVED
8
+
9
+ - Implement --search and --from filtering for import plugins
10
+ - UTC format date strings in select menus for consistency (was relative date formatting)
11
+ - Don't populate the fzf search with --search, it's already filtered. Separated --query from --search if you do want to populate the query string in addition to --search filtering
12
+ - When showing relative dates, don't include the year if the date is the previous year but a later month than the current month (less than a year old)
13
+ - When using --editor while adding an entry, include any note specified on the command line or via --ask for further editing
14
+
1
15
  ### 2.1.13
2
16
 
3
17
  #### NEW
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- doing (2.1.13)
4
+ doing (2.1.14)
5
5
  chronic (~> 0.10, >= 0.10.2)
6
6
  deep_merge (~> 1.2, >= 1.2.1)
7
7
  gli (~> 2.19, >= 2.19.2)
@@ -12,6 +12,7 @@ PATH
12
12
  tty-link (~> 0.1, >= 0.1.1)
13
13
  tty-markdown (~> 0.7, >= 0.7.0)
14
14
  tty-progressbar (~> 0.18, >= 0.18.2)
15
+ tty-reader (~> 0.9, >= 0.9.0)
15
16
  tty-which (~> 0.5, >= 0.5.0)
16
17
 
17
18
  GEM
@@ -131,6 +132,10 @@ GEM
131
132
  tty-cursor (~> 0.7)
132
133
  tty-screen (~> 0.8)
133
134
  unicode-display_width (>= 1.6, < 3.0)
135
+ tty-reader (0.9.0)
136
+ tty-cursor (~> 0.7)
137
+ tty-screen (~> 0.8)
138
+ wisper (~> 2.0)
134
139
  tty-screen (0.8.1)
135
140
  tty-spinner (0.9.3)
136
141
  tty-cursor (~> 0.7)
@@ -139,6 +144,7 @@ GEM
139
144
  concurrent-ruby (~> 1.0)
140
145
  unicode-display_width (2.1.0)
141
146
  unicode_utils (1.4.0)
147
+ wisper (2.0.1)
142
148
  yard (0.9.26)
143
149
  zeitwerk (2.5.1)
144
150
 
data/README.md CHANGED
@@ -6,7 +6,7 @@ _If you're one of the rare people like me who find this useful, feel free to [bu
6
6
 
7
7
  <!--README-->
8
8
 
9
- The current version of `doing` is <!--VER-->2.1.12<!--END VER-->.
9
+ The current version of `doing` is <!--VER-->2.1.13<!--END VER-->.
10
10
 
11
11
  Find all of the documentation in the [doing wiki](https://github.com/ttscoff/doing/wiki).
12
12
 
data/bin/doing CHANGED
@@ -70,6 +70,12 @@ if settings.dig('plugins', 'command_path')
70
70
  commands_from File.expand_path(settings.dig('plugins', 'command_path'))
71
71
  end
72
72
 
73
+ class TagArray < Array; end
74
+
75
+ accept TagArray do |value|
76
+ value.gsub(/[, ]+/, ' ').split(' ').map { |tag| tag.sub(/^@/, '')}.map(&:strip)
77
+ end
78
+
73
79
  program_desc 'A CLI for a What Was I Doing system'
74
80
  program_long_desc %(Doing uses a TaskPaper-like formatting to keep a plain text
75
81
  record of what you've been doing, complete with tag-based time tracking. The
@@ -139,7 +145,7 @@ command %i[again resume] do |c|
139
145
 
140
146
  c.desc 'Repeat last entry matching tags. Combine multiple tags with a comma. Wildcards allowed (*, ?)'
141
147
  c.arg_name 'TAG'
142
- c.flag [:tag]
148
+ c.flag [:tag], type: TagArray
143
149
 
144
150
  c.desc 'Repeat last entry matching search. Surround with
145
151
  slashes for regex (e.g. "/query/"), start with a single quote for exact match ("\'query").'
@@ -170,16 +176,19 @@ command %i[again resume] do |c|
170
176
  c.desc "Edit duplicated entry with #{Doing::Util.default_editor} before adding"
171
177
  c.switch %i[e editor], negatable: false, default_value: false
172
178
 
173
- c.desc 'Note'
179
+ c.desc 'Add a note'
174
180
  c.arg_name 'TEXT'
175
181
  c.flag %i[n note]
176
182
 
183
+ c.desc 'Prompt for note via multi-line input'
184
+ c.switch %i[ask], negatable: false, default_value: false
185
+
177
186
  c.desc 'Select item to resume from a menu of matching entries'
178
187
  c.switch %i[i interactive], negatable: false, default_value: false
179
188
 
180
189
  c.action do |_global_options, options, _args|
181
190
  options[:fuzzy] = false
182
- tags = options[:tag].nil? ? [] : options[:tag].to_tags
191
+ tags = options[:tag].nil? ? [] : options[:tag]
183
192
 
184
193
  options[:case] = options[:case].normalize_case
185
194
 
@@ -189,6 +198,11 @@ command %i[again resume] do |c|
189
198
  options[:search] = search
190
199
  end
191
200
 
201
+ note = Doing::Note.new(options[:note])
202
+ note.add(Doing::Prompt.request_lines(prompt: 'Add a note')) if options[:ask]
203
+
204
+ options[:note] = note
205
+
192
206
  opts = options.dup
193
207
 
194
208
  opts[:tag] = tags
@@ -216,7 +230,7 @@ command :cancel do |c|
216
230
 
217
231
  c.desc 'Cancel the last X entries containing TAG. Separate multiple tags with comma (--tag=tag1,tag2). Wildcards allowed (*, ?)'
218
232
  c.arg_name 'TAG'
219
- c.flag [:tag]
233
+ c.flag [:tag], type: TagArray
220
234
 
221
235
  c.desc 'Boolean (AND|OR|NOT) with which to combine multiple tag filters. Use PATTERN to parse + and - as booleans'
222
236
  c.arg_name 'BOOLEAN'
@@ -260,7 +274,7 @@ command :cancel do |c|
260
274
  if options[:tag].nil?
261
275
  tags = []
262
276
  else
263
- tags = options[:tag].to_tags
277
+ tags = options[:tag]
264
278
  end
265
279
 
266
280
  raise InvalidArgument, 'Only one argument allowed' if args.length > 1
@@ -349,6 +363,9 @@ command %i[done did] do |c|
349
363
  c.arg_name 'TEXT'
350
364
  c.flag %i[n note]
351
365
 
366
+ c.desc 'Prompt for note via multi-line input'
367
+ c.switch %i[ask], negatable: false, default_value: false
368
+
352
369
  c.desc 'Finish last entry not already marked @done'
353
370
  c.switch %i[u unfinished], negatable: false, default_value: false
354
371
 
@@ -395,6 +412,7 @@ command %i[done did] do |c|
395
412
 
396
413
  note = Doing::Note.new
397
414
  note.add(options[:note]) if options[:note]
415
+ note.add(Doing::Prompt.request_lines(prompt: 'Add a note')) if options[:ask]
398
416
 
399
417
  if options[:editor]
400
418
  raise MissingEditor, 'No EDITOR variable defined in environment' if Doing::Util.default_editor.nil?
@@ -539,7 +557,7 @@ command :finish do |c|
539
557
  c.desc 'Finish the last X entries containing TAG.
540
558
  Separate multiple tags with comma (--tag=tag1,tag2), combine with --bool. Wildcards allowed (*, ?).'
541
559
  c.arg_name 'TAG'
542
- c.flag [:tag]
560
+ c.flag [:tag], type: TagArray
543
561
 
544
562
  c.desc 'Finish the last X entries matching search filter, surround with slashes for regex (e.g. "/query.*/"), start with single quote for exact match ("\'query")'
545
563
  c.arg_name 'QUERY'
@@ -618,7 +636,7 @@ command :finish do |c|
618
636
  if options[:tag].nil?
619
637
  tags = []
620
638
  else
621
- tags = options[:tag].to_tags
639
+ tags = options[:tag]
622
640
  end
623
641
 
624
642
  raise InvalidArgument, 'Only one argument allowed' if args.length > 1
@@ -681,6 +699,9 @@ command :later do |c|
681
699
  c.arg_name 'TEXT'
682
700
  c.flag %i[n note]
683
701
 
702
+ c.desc 'Prompt for note via multi-line input'
703
+ c.switch %i[ask], negatable: false, default_value: false
704
+
684
705
  c.action do |_global_options, options, args|
685
706
  if options[:back]
686
707
  date = options[:back].chronify(guess: :begin)
@@ -689,11 +710,16 @@ command :later do |c|
689
710
  date = Time.now
690
711
  end
691
712
 
713
+ ask_note = options[:ask] ? Doing::Prompt.request_lines(prompt: 'Add a note') : ''
714
+
692
715
  if options[:editor] || (args.empty? && $stdin.stat.size.zero?)
693
716
  raise MissingEditor, 'No EDITOR variable defined in environment' if Doing::Util.default_editor.nil?
694
717
 
695
718
  input += date.strftime('%F %R | ')
696
719
  input += args.empty? ? '' : args.join(' ')
720
+ input += "\n#{options[:note]}" if options[:note]
721
+ input += "\n#{ask_note}" unless ask_note.empty?
722
+
697
723
  input = wwid.fork_editor(input).strip
698
724
  raise EmptyInput, 'No content' unless input && !input.empty?
699
725
 
@@ -706,6 +732,7 @@ command :later do |c|
706
732
  d, title, note = wwid.format_input(args.join(' '))
707
733
  date = d.nil? ? date : d
708
734
  note.add(options[:note]) if options[:note]
735
+ note.add(ask_note) unless ask_note.empty?
709
736
  wwid.add_item(title.cap_first, 'Later', { note: note, back: date })
710
737
  wwid.write(wwid.doing_file)
711
738
  elsif $stdin.stat.size.positive?
@@ -715,6 +742,7 @@ command :later do |c|
715
742
  date = d
716
743
  end
717
744
  note.add(options[:note]) if options[:note]
745
+ note.add(ask_note) unless ask_note.empty?
718
746
  wwid.add_item(title.cap_first, 'Later', { note: note, back: date })
719
747
  wwid.write(wwid.doing_file)
720
748
  else
@@ -754,7 +782,7 @@ command %i[mark flag] do |c|
754
782
  c.desc 'Flag the last entry containing TAG.
755
783
  Separate multiple tags with comma (--tag=tag1,tag2), combine with --bool. Wildcards allowed (*, ?).'
756
784
  c.arg_name 'TAG'
757
- c.flag [:tag]
785
+ c.flag [:tag], type: TagArray
758
786
 
759
787
  c.desc 'Flag the last entry matching search filter, surround with slashes for regex (e.g. "/query.*/"), start with single quote for exact match ("\'query")'
760
788
  c.arg_name 'QUERY'
@@ -799,7 +827,7 @@ command %i[mark flag] do |c|
799
827
  if options[:tag].nil?
800
828
  search_tags = []
801
829
  else
802
- search_tags = options[:tag].to_tags
830
+ search_tags = options[:tag]
803
831
  end
804
832
 
805
833
  if options[:interactive]
@@ -881,6 +909,9 @@ command :meanwhile do |c|
881
909
  c.arg_name 'TEXT'
882
910
  c.flag %i[n note]
883
911
 
912
+ c.desc 'Prompt for note via multi-line input'
913
+ c.switch %i[ask], negatable: false, default_value: false
914
+
884
915
  c.action do |_global_options, options, args|
885
916
  if options[:back]
886
917
  date = options[:back].chronify(guess: :begin)
@@ -897,10 +928,15 @@ command :meanwhile do |c|
897
928
  end
898
929
  input = ''
899
930
 
931
+ ask_note = options[:ask] ? Doing::Prompt.request_lines(prompt: 'Add a note') : []
932
+
900
933
  if options[:editor]
901
934
  raise MissingEditor, 'No EDITOR variable defined in environment' if Doing::Util.default_editor.nil?
902
935
  input += date.strftime('%F %R | ')
903
936
  input += args.join(' ') unless args.empty?
937
+ input += "\n#{options[:note]}" if options[:note]
938
+ input += "\n#{ask_note}" unless ask_note.empty?
939
+
904
940
  input = wwid.fork_editor(input).strip
905
941
  elsif !args.empty?
906
942
  input = args.join(' ')
@@ -919,10 +955,9 @@ command :meanwhile do |c|
919
955
  note = []
920
956
  end
921
957
 
922
- if options[:note]
923
- note.push(options[:note])
924
- elsif note.empty?
925
- note = nil
958
+ unless options[:editor]
959
+ note.add(options[:note]) if options[:note]
960
+ note.add(ask_note) unless ask_note.empty?
926
961
  end
927
962
 
928
963
  wwid.stop_start('meanwhile', { new_item: input, back: date, section: section, archive: options[:archive], note: note })
@@ -958,7 +993,7 @@ command :note do |c|
958
993
 
959
994
  c.desc 'Add/remove note from last entry matching tag. Wildcards allowed (*, ?)'
960
995
  c.arg_name 'TAG'
961
- c.flag [:tag]
996
+ c.flag [:tag], type: TagArray
962
997
 
963
998
  c.desc 'Add/remove note from last entry matching search filter, surround with slashes for regex (e.g. "/query.*/"), start with single quote for exact match ("\'query")'
964
999
  c.arg_name 'QUERY'
@@ -988,6 +1023,9 @@ command :note do |c|
988
1023
  c.desc 'Select item for new note from a menu of matching entries'
989
1024
  c.switch %i[i interactive], negatable: false, default_value: false
990
1025
 
1026
+ c.desc 'Prompt for note via multi-line input'
1027
+ c.switch %i[ask], negatable: false, default_value: false
1028
+
991
1029
  c.action do |_global_options, options, args|
992
1030
  options[:fuzzy] = false
993
1031
  if options[:section]
@@ -1014,8 +1052,9 @@ command :note do |c|
1014
1052
 
1015
1053
  last_note = last_entry.note || Doing::Note.new
1016
1054
  new_note = Doing::Note.new
1055
+ ask_note = options[:ask] ? Doing::Prompt.request_lines(prompt: 'Add a note') : ''
1017
1056
 
1018
- if options[:editor] || (args.empty? && $stdin.stat.size.zero? && !options[:remove])
1057
+ if options[:editor] || (args.empty? && $stdin.stat.size.zero? && !options[:remove] && !options[:ask])
1019
1058
  raise MissingEditor, 'No EDITOR variable defined in environment' if Doing::Util.default_editor.nil?
1020
1059
 
1021
1060
  input = !args.empty? ? args.join(' ') : ''
@@ -1026,7 +1065,9 @@ command :note do |c|
1026
1065
  prev_input = last_entry.note || Doing::Note.new
1027
1066
  end
1028
1067
 
1068
+
1029
1069
  input = prev_input.add(input)
1070
+ input.add(ask_note) unless ask_note.empty?
1030
1071
 
1031
1072
  input = wwid.fork_editor(prev_input.strip_lines.join("\n"), message: nil).strip
1032
1073
  note = input
@@ -1037,9 +1078,12 @@ command :note do |c|
1037
1078
  elsif $stdin.stat.size.positive?
1038
1079
  new_note.add($stdin.read.strip)
1039
1080
  else
1040
- raise EmptyInput, 'You must provide content when adding a note' unless options[:remove]
1081
+ raise EmptyInput, 'You must provide content when adding a note' unless options[:remove] || !ask_note.empty?
1082
+
1041
1083
  end
1042
1084
 
1085
+ new_note.add(ask_note) unless ask_note.empty?
1086
+
1043
1087
  if last_note.equal?(new_note)
1044
1088
  Doing.logger.debug('Skipped:', 'No note change')
1045
1089
  else
@@ -1085,6 +1129,9 @@ command %i[now next] do |c|
1085
1129
  c.arg_name 'TEXT'
1086
1130
  c.flag %i[n note]
1087
1131
 
1132
+ c.desc 'Prompt for note via multi-line input'
1133
+ c.switch %i[ask], negatable: false, default_value: false
1134
+
1088
1135
  # c.desc "Edit entry with specified app"
1089
1136
  # c.arg_name 'editor_app'
1090
1137
  # # c.flag [:a, :app]
@@ -1104,23 +1151,28 @@ command %i[now next] do |c|
1104
1151
  options[:section] = settings['current_section']
1105
1152
  end
1106
1153
 
1154
+ ask_note = options[:ask] ? Doing::Prompt.request_lines(prompt: 'Add a note') : ''
1155
+
1107
1156
  if options[:editor] || (args.empty? && $stdin.stat.size.zero?)
1108
1157
  raise MissingEditor, 'No EDITOR variable defined in environment' if Doing::Util.default_editor.nil?
1109
1158
 
1110
1159
  input = date.strftime('%F %R | ')
1111
1160
  input += args.join(' ') unless args.empty?
1161
+ input += "\n#{options[:note]}" if options[:note]
1162
+ input += "\n#{ask_note}" unless ask_note.empty?
1112
1163
  input = wwid.fork_editor(input).strip
1113
1164
 
1114
1165
  raise EmptyInput, 'No content' if input.empty?
1115
1166
 
1116
1167
  date, title, note = wwid.format_input(input)
1117
- note.add(options[:note]) if options[:note]
1168
+
1118
1169
  wwid.add_item(title.cap_first, section, { note: note, back: date, timed: options[:finish_last] })
1119
1170
  wwid.write(wwid.doing_file)
1120
1171
  elsif args.length.positive?
1121
1172
  d, title, note = wwid.format_input(args.join(' '))
1122
1173
  date = d.nil? ? date : d
1123
1174
  note.add(options[:note]) if options[:note]
1175
+ note.add(ask_note) unless ask_note.empty?
1124
1176
  wwid.add_item(title.cap_first, section, { note: note, back: date, timed: options[:finish_last] })
1125
1177
  wwid.write(wwid.doing_file)
1126
1178
  elsif $stdin.stat.size.positive?
@@ -1131,6 +1183,7 @@ command %i[now next] do |c|
1131
1183
  date = d
1132
1184
  end
1133
1185
  note.add(options[:note]) if options[:note]
1186
+ note.add(ask_note) unless ask_note.empty?
1134
1187
  wwid.add_item(title.cap_first, section, { note: note, back: date, timed: options[:finish_last] })
1135
1188
  wwid.write(wwid.doing_file)
1136
1189
  else
@@ -1283,7 +1336,11 @@ command :select do |c|
1283
1336
 
1284
1337
  c.desc 'Initial search query for filtering. Matching is fuzzy. For exact matching, start query with a single quote, e.g. `--query "\'search"'
1285
1338
  c.arg_name 'QUERY'
1286
- c.flag %i[q query search]
1339
+ c.flag %i[q query]
1340
+
1341
+ c.desc 'Select from entries matching search filter, surround with slashes for regex (e.g. "/query.*/"), start with single quote for exact match ("\'query")'
1342
+ c.arg_name 'QUERY'
1343
+ c.flag [:search]
1287
1344
 
1288
1345
  c.desc 'Perform a tag value query ("@done > two hours ago" or "@progress < 50"). May be used multiple times, combined with --bool'
1289
1346
  c.arg_name 'QUERY'
@@ -1421,7 +1478,7 @@ command :tag do |c|
1421
1478
  c.desc 'Tag the last X entries containing TAG.
1422
1479
  Separate multiple tags with comma (--tag=tag1,tag2), combine with --bool. Wildcards allowed (*, ?).'
1423
1480
  c.arg_name 'TAG'
1424
- c.flag [:tag]
1481
+ c.flag [:tag], type: TagArray
1425
1482
 
1426
1483
  c.desc 'Tag entries matching search filter, surround with slashes for regex (e.g. "/query.*/"), start with single quote for exact match ("\'query")'
1427
1484
  c.arg_name 'QUERY'
@@ -1467,7 +1524,7 @@ command :tag do |c|
1467
1524
  if options[:tag].nil?
1468
1525
  search_tags = []
1469
1526
  else
1470
- search_tags = options[:tag].to_tags
1527
+ search_tags = options[:tag]
1471
1528
  end
1472
1529
 
1473
1530
  if options[:autotag]
@@ -1688,7 +1745,7 @@ command :last do |c|
1688
1745
 
1689
1746
  c.desc 'Tag filter, combine multiple tags with a comma. Wildcards allowed (*, ?)'
1690
1747
  c.arg_name 'TAG'
1691
- c.flag [:tag]
1748
+ c.flag [:tag], type: TagArray
1692
1749
 
1693
1750
  c.desc 'Tag boolean (AND|OR|NOT). Use PATTERN to parse + and - as booleans'
1694
1751
  c.arg_name 'BOOLEAN'
@@ -1725,7 +1782,7 @@ command :last do |c|
1725
1782
  if options[:tag].nil?
1726
1783
  options[:tag] = []
1727
1784
  else
1728
- options[:tag] = options[:tag].to_tags
1785
+ options[:tag] = options[:tag]
1729
1786
  options[:bool] = options[:bool].normalize_bool
1730
1787
  end
1731
1788
 
@@ -1855,7 +1912,7 @@ command :show do |c|
1855
1912
 
1856
1913
  c.desc 'Tag filter, combine multiple tags with a comma. Use `--tag pick` for a menu of available tags. Wildcards allowed (*, ?). Added for compatibility with other commands'
1857
1914
  c.arg_name 'TAG'
1858
- c.flag [:tag]
1915
+ c.flag [:tag], type: TagArray
1859
1916
 
1860
1917
  c.desc 'Perform a tag value query ("@done > two hours ago" or "@progress < 50"). May be used multiple times, combined with --bool'
1861
1918
  c.arg_name 'QUERY'
@@ -1988,7 +2045,7 @@ command :show do |c|
1988
2045
  section ||= 'All'
1989
2046
  end
1990
2047
 
1991
- tags.concat(options[:tag].to_tags) if options[:tag]
2048
+ tags.concat(options[:tag]) if options[:tag]
1992
2049
 
1993
2050
  options[:times] = true if options[:totals]
1994
2051
 
@@ -3004,7 +3061,7 @@ command %i[archive move] do |c|
3004
3061
 
3005
3062
  c.desc 'Tag filter, combine multiple tags with a comma. Wildcards allowed (*, ?). Added for compatibility with other commands'
3006
3063
  c.arg_name 'TAG'
3007
- c.flag [:tag]
3064
+ c.flag [:tag], type: TagArray
3008
3065
 
3009
3066
  c.desc 'Tag boolean (AND|OR|NOT). Use PATTERN to parse + and - as booleans'
3010
3067
  c.arg_name 'BOOLEAN'
@@ -3053,7 +3110,7 @@ command %i[archive move] do |c|
3053
3110
 
3054
3111
  raise InvalidArgument, '--keep and --count can not be used together' if options[:keep] && options[:count]
3055
3112
 
3056
- tags.concat(options[:tag].to_tags) if options[:tag]
3113
+ tags.concat(options[:tag]) if options[:tag]
3057
3114
 
3058
3115
  search = nil
3059
3116
 
@@ -3113,7 +3170,7 @@ command :import do |c|
3113
3170
 
3114
3171
  c.desc 'Tag all imported entries'
3115
3172
  c.arg_name 'TAGS'
3116
- c.flag :tag
3173
+ c.flag %i[t tag]
3117
3174
 
3118
3175
  c.desc 'Autotag entries'
3119
3176
  c.switch :autotag, negatable: true, default_value: true
@@ -3148,6 +3205,12 @@ command :import do |c|
3148
3205
  options[:section] = wwid.guess_section(options[:section]) || options[:section].cap_first
3149
3206
  end
3150
3207
 
3208
+ if options[:search]
3209
+ search = options[:search]
3210
+ search.sub!(/^'?/, "'") if options[:exact]
3211
+ options[:search] = search
3212
+ end
3213
+
3151
3214
  if options[:from]
3152
3215
  date_string = options[:from]
3153
3216
  if date_string =~ / (to|through|thru|(un)?til|-+) /
@@ -3156,7 +3219,7 @@ command :import do |c|
3156
3219
  finish = dates[2].chronify(guess: :end)
3157
3220
  else
3158
3221
  start = date_string.chronify(guess: :begin)
3159
- finish = false
3222
+ finish = date_string.chronify(guess: :end)
3160
3223
  end
3161
3224
  raise InvalidTimeExpression, 'Unrecognized date string' unless start
3162
3225
  dates = [start, finish]
data/docs/doc/Array.html CHANGED
@@ -540,7 +540,7 @@ with</p>
540
540
  </div>
541
541
 
542
542
  <div id="footer">
543
- Generated on Fri Jan 14 21:59:14 2022 by
543
+ Generated on Sat Jan 15 17:27:48 2022 by
544
544
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
545
545
  0.9.26 (ruby-3.0.1).
546
546
  </div>
@@ -283,7 +283,7 @@
283
283
  </div>
284
284
 
285
285
  <div id="footer">
286
- Generated on Fri Jan 14 21:59:14 2022 by
286
+ Generated on Sat Jan 15 17:27:48 2022 by
287
287
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
288
288
  0.9.26 (ruby-3.0.1).
289
289
  </div>
@@ -162,7 +162,7 @@
162
162
  </div>
163
163
 
164
164
  <div id="footer">
165
- Generated on Fri Jan 14 21:59:14 2022 by
165
+ Generated on Sat Jan 15 17:27:48 2022 by
166
166
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
167
167
  0.9.26 (ruby-3.0.1).
168
168
  </div>
@@ -407,7 +407,7 @@
407
407
  </div>
408
408
 
409
409
  <div id="footer">
410
- Generated on Fri Jan 14 21:59:14 2022 by
410
+ Generated on Sat Jan 15 17:27:48 2022 by
411
411
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
412
412
  0.9.26 (ruby-3.0.1).
413
413
  </div>
@@ -125,7 +125,7 @@ parser. In order to do that, a new &quot;clause&quot; node is added to the parse
125
125
  </div>
126
126
 
127
127
  <div id="footer">
128
- Generated on Fri Jan 14 21:59:14 2022 by
128
+ Generated on Sat Jan 15 17:27:48 2022 by
129
129
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
130
130
  0.9.26 (ruby-3.0.1).
131
131
  </div>
@@ -114,7 +114,7 @@
114
114
  </div>
115
115
 
116
116
  <div id="footer">
117
- Generated on Fri Jan 14 21:59:14 2022 by
117
+ Generated on Sat Jan 15 17:27:48 2022 by
118
118
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
119
119
  0.9.26 (ruby-3.0.1).
120
120
  </div>
@@ -105,7 +105,7 @@
105
105
  </div>
106
106
 
107
107
  <div id="footer">
108
- Generated on Fri Jan 14 21:59:14 2022 by
108
+ Generated on Sat Jan 15 17:27:48 2022 by
109
109
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
110
110
  0.9.26 (ruby-3.0.1).
111
111
  </div>
@@ -508,7 +508,7 @@ ANSI-sequences are stripped from the string.</p>
508
508
  </div>
509
509
 
510
510
  <div id="footer">
511
- Generated on Fri Jan 14 21:59:13 2022 by
511
+ Generated on Sat Jan 15 17:27:48 2022 by
512
512
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
513
513
  0.9.26 (ruby-3.0.1).
514
514
  </div>
@@ -206,7 +206,7 @@ stdout</p>
206
206
  </div>
207
207
 
208
208
  <div id="footer">
209
- Generated on Fri Jan 14 21:59:14 2022 by
209
+ Generated on Sat Jan 15 17:27:48 2022 by
210
210
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
211
211
  0.9.26 (ruby-3.0.1).
212
212
  </div>
@@ -1101,7 +1101,7 @@ matched, first match wins)</p>
1101
1101
  </div>
1102
1102
 
1103
1103
  <div id="footer">
1104
- Generated on Fri Jan 14 21:59:14 2022 by
1104
+ Generated on Sat Jan 15 17:27:48 2022 by
1105
1105
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
1106
1106
  0.9.26 (ruby-3.0.1).
1107
1107
  </div>
@@ -176,7 +176,7 @@
176
176
  </div>
177
177
 
178
178
  <div id="footer">
179
- Generated on Fri Jan 14 21:59:14 2022 by
179
+ Generated on Sat Jan 15 17:27:48 2022 by
180
180
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
181
181
  0.9.26 (ruby-3.0.1).
182
182
  </div>
@@ -176,7 +176,7 @@
176
176
  </div>
177
177
 
178
178
  <div id="footer">
179
- Generated on Fri Jan 14 21:59:14 2022 by
179
+ Generated on Sat Jan 15 17:27:48 2022 by
180
180
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
181
181
  0.9.26 (ruby-3.0.1).
182
182
  </div>
@@ -176,7 +176,7 @@
176
176
  </div>
177
177
 
178
178
  <div id="footer">
179
- Generated on Fri Jan 14 21:59:14 2022 by
179
+ Generated on Sat Jan 15 17:27:48 2022 by
180
180
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
181
181
  0.9.26 (ruby-3.0.1).
182
182
  </div>
@@ -176,7 +176,7 @@
176
176
  </div>
177
177
 
178
178
  <div id="footer">
179
- Generated on Fri Jan 14 21:59:14 2022 by
179
+ Generated on Sat Jan 15 17:27:48 2022 by
180
180
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
181
181
  0.9.26 (ruby-3.0.1).
182
182
  </div>