doing 2.1.94 → 2.1.99

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 (122) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.md +1 -1
  5. data/bin/commands/done.rb +8 -4
  6. data/bin/commands/finish.rb +1 -1
  7. data/bin/commands/reset.rb +3 -3
  8. data/docs/doc/Array.html +2 -2
  9. data/docs/doc/BooleanTermParser/Clause.html +2 -2
  10. data/docs/doc/BooleanTermParser/Operator.html +2 -2
  11. data/docs/doc/BooleanTermParser/Query.html +2 -2
  12. data/docs/doc/BooleanTermParser/QueryParser.html +2 -2
  13. data/docs/doc/BooleanTermParser/QueryTransformer.html +2 -2
  14. data/docs/doc/BooleanTermParser.html +2 -2
  15. data/docs/doc/Doing/ArrayCleanup.html +2 -2
  16. data/docs/doc/Doing/ArrayNestedHash.html +2 -2
  17. data/docs/doc/Doing/ArrayTags.html +2 -2
  18. data/docs/doc/Doing/ByDayExport.html +2 -2
  19. data/docs/doc/Doing/CSVExport.html +2 -2
  20. data/docs/doc/Doing/CalendarImport.html +2 -2
  21. data/docs/doc/Doing/Change.html +2 -2
  22. data/docs/doc/Doing/Changes.html +2 -2
  23. data/docs/doc/Doing/ChronifyArray.html +2 -2
  24. data/docs/doc/Doing/ChronifyNumeric.html +2 -2
  25. data/docs/doc/Doing/ChronifyString.html +2 -2
  26. data/docs/doc/Doing/Color.html +2 -2
  27. data/docs/doc/Doing/Completion/BashCompletions.html +2 -2
  28. data/docs/doc/Doing/Completion/FigCompletions.html +2 -2
  29. data/docs/doc/Doing/Completion/FishCompletions.html +2 -2
  30. data/docs/doc/Doing/Completion/StringUtils.html +2 -2
  31. data/docs/doc/Doing/Completion/ZshCompletions.html +2 -2
  32. data/docs/doc/Doing/Completion.html +2 -2
  33. data/docs/doc/Doing/Configuration.html +2 -2
  34. data/docs/doc/Doing/DayOneRenderer.html +2 -2
  35. data/docs/doc/Doing/DayoneExport.html +2 -2
  36. data/docs/doc/Doing/DoingExport.html +2 -2
  37. data/docs/doc/Doing/DoingImport.html +2 -2
  38. data/docs/doc/Doing/Entry.html +2 -2
  39. data/docs/doc/Doing/Errors/DoingNoTraceError.html +2 -2
  40. data/docs/doc/Doing/Errors/DoingRuntimeError.html +2 -2
  41. data/docs/doc/Doing/Errors/DoingStandardError.html +2 -2
  42. data/docs/doc/Doing/Errors/EmptyInput.html +2 -2
  43. data/docs/doc/Doing/Errors/HistoryLimitError.html +2 -2
  44. data/docs/doc/Doing/Errors/InvalidPlugin.html +2 -2
  45. data/docs/doc/Doing/Errors/MissingBackupFile.html +2 -2
  46. data/docs/doc/Doing/Errors/NoResults.html +2 -2
  47. data/docs/doc/Doing/Errors/PluginException.html +2 -2
  48. data/docs/doc/Doing/Errors/UserCancelled.html +2 -2
  49. data/docs/doc/Doing/Errors/WrongCommand.html +2 -2
  50. data/docs/doc/Doing/Errors.html +2 -2
  51. data/docs/doc/Doing/HTMLExport.html +2 -2
  52. data/docs/doc/Doing/Hooks.html +2 -2
  53. data/docs/doc/Doing/Item.html +2 -2
  54. data/docs/doc/Doing/ItemDates.html +2 -2
  55. data/docs/doc/Doing/ItemQuery.html +2 -2
  56. data/docs/doc/Doing/ItemState.html +2 -2
  57. data/docs/doc/Doing/ItemTags.html +2 -2
  58. data/docs/doc/Doing/Items.html +2 -2
  59. data/docs/doc/Doing/JSONExport.html +2 -2
  60. data/docs/doc/Doing/JSONImport.html +2 -2
  61. data/docs/doc/Doing/Logger.html +2 -2
  62. data/docs/doc/Doing/MarkdownExport.html +2 -2
  63. data/docs/doc/Doing/Note.html +2 -2
  64. data/docs/doc/Doing/Pager.html +2 -2
  65. data/docs/doc/Doing/Plugins.html +2 -2
  66. data/docs/doc/Doing/Prompt.html +2 -2
  67. data/docs/doc/Doing/PromptChoose.html +2 -2
  68. data/docs/doc/Doing/PromptFZF.html +2 -2
  69. data/docs/doc/Doing/PromptInput.html +2 -2
  70. data/docs/doc/Doing/PromptSTD.html +2 -2
  71. data/docs/doc/Doing/PromptYN.html +2 -2
  72. data/docs/doc/Doing/Section.html +2 -2
  73. data/docs/doc/Doing/StringHighlight.html +2 -2
  74. data/docs/doc/Doing/StringNormalize.html +2 -2
  75. data/docs/doc/Doing/StringQuery.html +2 -2
  76. data/docs/doc/Doing/StringTags.html +2 -2
  77. data/docs/doc/Doing/StringTransform.html +2 -2
  78. data/docs/doc/Doing/StringTruncate.html +2 -2
  79. data/docs/doc/Doing/StringURL.html +2 -2
  80. data/docs/doc/Doing/SymbolNormalize.html +2 -2
  81. data/docs/doc/Doing/TaskPaperExport.html +2 -2
  82. data/docs/doc/Doing/TemplateExport.html +2 -2
  83. data/docs/doc/Doing/TemplateString.html +2 -2
  84. data/docs/doc/Doing/TimingImport.html +2 -2
  85. data/docs/doc/Doing/Types.html +2 -2
  86. data/docs/doc/Doing/Util/Backup.html +2 -2
  87. data/docs/doc/Doing/Util.html +2 -2
  88. data/docs/doc/Doing/Version.html +2 -2
  89. data/docs/doc/Doing/WWID.html +2 -2
  90. data/docs/doc/Doing.html +3 -3
  91. data/docs/doc/FalseClass.html +2 -2
  92. data/docs/doc/GLI/Commands/Help.html +2 -2
  93. data/docs/doc/GLI/Commands/MarkdownDocumentListener.html +2 -2
  94. data/docs/doc/GLI/Commands.html +2 -2
  95. data/docs/doc/GLI.html +2 -2
  96. data/docs/doc/Hash.html +2 -2
  97. data/docs/doc/Numeric.html +2 -2
  98. data/docs/doc/Object.html +2 -2
  99. data/docs/doc/PhraseParser/Operator.html +2 -2
  100. data/docs/doc/PhraseParser/PhraseClause.html +2 -2
  101. data/docs/doc/PhraseParser/Query.html +2 -2
  102. data/docs/doc/PhraseParser/QueryParser.html +2 -2
  103. data/docs/doc/PhraseParser/QueryTransformer.html +2 -2
  104. data/docs/doc/PhraseParser/TermClause.html +2 -2
  105. data/docs/doc/PhraseParser.html +2 -2
  106. data/docs/doc/Status.html +2 -2
  107. data/docs/doc/String.html +2 -2
  108. data/docs/doc/Symbol.html +2 -2
  109. data/docs/doc/Time.html +2 -2
  110. data/docs/doc/TrueClass.html +2 -2
  111. data/docs/doc/_index.html +2 -2
  112. data/docs/doc/file.README.html +3 -3
  113. data/docs/doc/index.html +3 -3
  114. data/docs/doc/top-level-namespace.html +2 -2
  115. data/doing.rdoc +1 -1
  116. data/lib/doing/chronify/string.rb +3 -3
  117. data/lib/doing/prompt/input.rb +8 -4
  118. data/lib/doing/prompt/yn.rb +2 -2
  119. data/lib/doing/version.rb +1 -1
  120. data/lib/doing/wwid/timers.rb +20 -10
  121. data/lib/doing.rb +7 -1
  122. metadata +1 -1
@@ -753,9 +753,9 @@
753
753
  </div>
754
754
 
755
755
  <div id="footer">
756
- Generated on Fri Feb 13 07:19:09 2026 by
756
+ Generated on Sat Mar 21 04:13:33 2026 by
757
757
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
758
- 0.9.38 (ruby-3.4.4).
758
+ 0.9.38 (ruby-4.0.1).
759
759
  </div>
760
760
 
761
761
  </div>
@@ -107,9 +107,9 @@
107
107
  </div>
108
108
 
109
109
  <div id="footer">
110
- Generated on Fri Feb 13 07:19:09 2026 by
110
+ Generated on Sat Mar 21 04:13:32 2026 by
111
111
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
112
- 0.9.38 (ruby-3.4.4).
112
+ 0.9.38 (ruby-4.0.1).
113
113
  </div>
114
114
 
115
115
  </div>
data/docs/doc/GLI.html CHANGED
@@ -107,9 +107,9 @@
107
107
  </div>
108
108
 
109
109
  <div id="footer">
110
- Generated on Fri Feb 13 07:19:09 2026 by
110
+ Generated on Sat Mar 21 04:13:32 2026 by
111
111
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
112
- 0.9.38 (ruby-3.4.4).
112
+ 0.9.38 (ruby-4.0.1).
113
113
  </div>
114
114
 
115
115
  </div>
data/docs/doc/Hash.html CHANGED
@@ -1000,9 +1000,9 @@ keys are symbols</p>
1000
1000
  </div>
1001
1001
 
1002
1002
  <div id="footer">
1003
- Generated on Fri Feb 13 07:19:09 2026 by
1003
+ Generated on Sat Mar 21 04:13:33 2026 by
1004
1004
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
1005
- 0.9.38 (ruby-3.4.4).
1005
+ 0.9.38 (ruby-4.0.1).
1006
1006
  </div>
1007
1007
 
1008
1008
  </div>
@@ -214,9 +214,9 @@
214
214
  </div>
215
215
 
216
216
  <div id="footer">
217
- Generated on Fri Feb 13 07:19:09 2026 by
217
+ Generated on Sat Mar 21 04:13:32 2026 by
218
218
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
219
- 0.9.38 (ruby-3.4.4).
219
+ 0.9.38 (ruby-4.0.1).
220
220
  </div>
221
221
 
222
222
  </div>
data/docs/doc/Object.html CHANGED
@@ -193,9 +193,9 @@ has content</p>
193
193
  </div>
194
194
 
195
195
  <div id="footer">
196
- Generated on Fri Feb 13 07:19:09 2026 by
196
+ Generated on Sat Mar 21 04:13:32 2026 by
197
197
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
198
- 0.9.38 (ruby-3.4.4).
198
+ 0.9.38 (ruby-4.0.1).
199
199
  </div>
200
200
 
201
201
  </div>
@@ -172,9 +172,9 @@
172
172
  </div>
173
173
 
174
174
  <div id="footer">
175
- Generated on Fri Feb 13 07:19:09 2026 by
175
+ Generated on Sat Mar 21 04:13:33 2026 by
176
176
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
177
- 0.9.38 (ruby-3.4.4).
177
+ 0.9.38 (ruby-4.0.1).
178
178
  </div>
179
179
 
180
180
  </div>
@@ -293,9 +293,9 @@
293
293
  </div>
294
294
 
295
295
  <div id="footer">
296
- Generated on Fri Feb 13 07:19:09 2026 by
296
+ Generated on Sat Mar 21 04:13:33 2026 by
297
297
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
298
- 0.9.38 (ruby-3.4.4).
298
+ 0.9.38 (ruby-4.0.1).
299
299
  </div>
300
300
 
301
301
  </div>
@@ -485,9 +485,9 @@
485
485
  </div>
486
486
 
487
487
  <div id="footer">
488
- Generated on Fri Feb 13 07:19:09 2026 by
488
+ Generated on Sat Mar 21 04:13:33 2026 by
489
489
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
490
- 0.9.38 (ruby-3.4.4).
490
+ 0.9.38 (ruby-4.0.1).
491
491
  </div>
492
492
 
493
493
  </div>
@@ -142,9 +142,9 @@ A phrase clause generates an Elasticsearch match_phrase query.</p>
142
142
  </div>
143
143
 
144
144
  <div id="footer">
145
- Generated on Fri Feb 13 07:19:09 2026 by
145
+ Generated on Sat Mar 21 04:13:33 2026 by
146
146
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
147
- 0.9.38 (ruby-3.4.4).
147
+ 0.9.38 (ruby-4.0.1).
148
148
  </div>
149
149
 
150
150
  </div>
@@ -124,9 +124,9 @@
124
124
  </div>
125
125
 
126
126
  <div id="footer">
127
- Generated on Fri Feb 13 07:19:09 2026 by
127
+ Generated on Sat Mar 21 04:13:33 2026 by
128
128
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
129
- 0.9.38 (ruby-3.4.4).
129
+ 0.9.38 (ruby-4.0.1).
130
130
  </div>
131
131
 
132
132
  </div>
@@ -293,9 +293,9 @@
293
293
  </div>
294
294
 
295
295
  <div id="footer">
296
- Generated on Fri Feb 13 07:19:09 2026 by
296
+ Generated on Sat Mar 21 04:13:33 2026 by
297
297
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
298
- 0.9.38 (ruby-3.4.4).
298
+ 0.9.38 (ruby-4.0.1).
299
299
  </div>
300
300
 
301
301
  </div>
@@ -105,9 +105,9 @@
105
105
  </div>
106
106
 
107
107
  <div id="footer">
108
- Generated on Fri Feb 13 07:19:08 2026 by
108
+ Generated on Sat Mar 21 04:13:32 2026 by
109
109
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
110
- 0.9.38 (ruby-3.4.4).
110
+ 0.9.38 (ruby-4.0.1).
111
111
  </div>
112
112
 
113
113
  </div>
data/docs/doc/Status.html CHANGED
@@ -316,9 +316,9 @@
316
316
  </div>
317
317
 
318
318
  <div id="footer">
319
- Generated on Fri Feb 13 07:19:08 2026 by
319
+ Generated on Sat Mar 21 04:13:32 2026 by
320
320
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
321
- 0.9.38 (ruby-3.4.4).
321
+ 0.9.38 (ruby-4.0.1).
322
322
  </div>
323
323
 
324
324
  </div>
data/docs/doc/String.html CHANGED
@@ -725,9 +725,9 @@ be recognized, e.g. %greensomething still finds
725
725
  </div>
726
726
 
727
727
  <div id="footer">
728
- Generated on Fri Feb 13 07:19:09 2026 by
728
+ Generated on Sat Mar 21 04:13:33 2026 by
729
729
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
730
- 0.9.38 (ruby-3.4.4).
730
+ 0.9.38 (ruby-4.0.1).
731
731
  </div>
732
732
 
733
733
  </div>
data/docs/doc/Symbol.html CHANGED
@@ -127,9 +127,9 @@
127
127
  </div>
128
128
 
129
129
  <div id="footer">
130
- Generated on Fri Feb 13 07:19:09 2026 by
130
+ Generated on Sat Mar 21 04:13:33 2026 by
131
131
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
132
- 0.9.38 (ruby-3.4.4).
132
+ 0.9.38 (ruby-4.0.1).
133
133
  </div>
134
134
 
135
135
  </div>
data/docs/doc/Time.html CHANGED
@@ -411,9 +411,9 @@ entries get month/day/year/time</p>
411
411
  </div>
412
412
 
413
413
  <div id="footer">
414
- Generated on Fri Feb 13 07:19:09 2026 by
414
+ Generated on Sat Mar 21 04:13:33 2026 by
415
415
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
416
- 0.9.38 (ruby-3.4.4).
416
+ 0.9.38 (ruby-4.0.1).
417
417
  </div>
418
418
 
419
419
  </div>
@@ -235,9 +235,9 @@ has content</p>
235
235
  </div>
236
236
 
237
237
  <div id="footer">
238
- Generated on Fri Feb 13 07:19:09 2026 by
238
+ Generated on Sat Mar 21 04:13:33 2026 by
239
239
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
240
- 0.9.38 (ruby-3.4.4).
240
+ 0.9.38 (ruby-4.0.1).
241
241
  </div>
242
242
 
243
243
  </div>
data/docs/doc/_index.html CHANGED
@@ -961,9 +961,9 @@
961
961
  </div>
962
962
 
963
963
  <div id="footer">
964
- Generated on Fri Feb 13 07:19:08 2026 by
964
+ Generated on Sat Mar 21 04:13:32 2026 by
965
965
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
966
- 0.9.38 (ruby-3.4.4).
966
+ 0.9.38 (ruby-4.0.1).
967
967
  </div>
968
968
 
969
969
  </div>
@@ -71,7 +71,7 @@ you&#39;ve done.</strong></p>
71
71
 
72
72
  <!--README-->
73
73
 
74
- <p>The current version of <code>doing</code> is &lt;!--VER--&gt;2.1.93&lt;!--END VER--&gt;.</p>
74
+ <p>The current version of <code>doing</code> is &lt;!--VER--&gt;2.1.94&lt;!--END VER--&gt;.</p>
75
75
 
76
76
  <p>Find all of the documentation in the <a href="https://github.com/ttscoff/doing/wiki">doing wiki</a>.</p>
77
77
 
@@ -153,9 +153,9 @@ with changes. Please target the <code>develop</code> branch with pull requests.<
153
153
  </div></div>
154
154
 
155
155
  <div id="footer">
156
- Generated on Fri Feb 13 07:19:08 2026 by
156
+ Generated on Sat Mar 21 04:13:32 2026 by
157
157
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
158
- 0.9.38 (ruby-3.4.4).
158
+ 0.9.38 (ruby-4.0.1).
159
159
  </div>
160
160
 
161
161
  </div>
data/docs/doc/index.html CHANGED
@@ -71,7 +71,7 @@ you&#39;ve done.</strong></p>
71
71
 
72
72
  <!--README-->
73
73
 
74
- <p>The current version of <code>doing</code> is &lt;!--VER--&gt;2.1.93&lt;!--END VER--&gt;.</p>
74
+ <p>The current version of <code>doing</code> is &lt;!--VER--&gt;2.1.94&lt;!--END VER--&gt;.</p>
75
75
 
76
76
  <p>Find all of the documentation in the <a href="https://github.com/ttscoff/doing/wiki">doing wiki</a>.</p>
77
77
 
@@ -153,9 +153,9 @@ with changes. Please target the <code>develop</code> branch with pull requests.<
153
153
  </div></div>
154
154
 
155
155
  <div id="footer">
156
- Generated on Fri Feb 13 07:19:08 2026 by
156
+ Generated on Sat Mar 21 04:13:32 2026 by
157
157
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
158
- 0.9.38 (ruby-3.4.4).
158
+ 0.9.38 (ruby-4.0.1).
159
159
  </div>
160
160
 
161
161
  </div>
@@ -216,9 +216,9 @@
216
216
  </div>
217
217
 
218
218
  <div id="footer">
219
- Generated on Fri Feb 13 07:19:08 2026 by
219
+ Generated on Sat Mar 21 04:13:32 2026 by
220
220
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
221
- 0.9.38 (ruby-3.4.4).
221
+ 0.9.38 (ruby-4.0.1).
222
222
  </div>
223
223
 
224
224
  </div>
data/doing.rdoc CHANGED
@@ -5,7 +5,7 @@ record of what you've been doing, complete with tag-based time tracking. The
5
5
  command line tool allows you to add entries, annotate with tags and notes, and
6
6
  view your entries with myriad options, with a focus on a "natural" language syntax.
7
7
 
8
- v2.1.94
8
+ v2.1.99
9
9
 
10
10
  === Global Options
11
11
  === --config_file arg
@@ -178,7 +178,7 @@ module Doing
178
178
  ## "mon 3pm to mon 5pm".split_date_range
179
179
  ##
180
180
  def split_date_range
181
- time_rx = /^(\d{1,2}(:\d{1,2})?( *(am|pm))?|midnight|noon)$/
181
+ time_rx = /^(\d{1,2}(:\d{1,2})?( *(am|pm))?|midnight|noon)$/i
182
182
  range_rx = / (to|through|thru|(?:un)?til|-+) /
183
183
 
184
184
  date_string = dup
@@ -191,8 +191,8 @@ module Doing
191
191
  dates = date_string.split(range_rx)
192
192
 
193
193
  if dates[0].strip =~ time_rx && dates[-1].strip =~ time_rx
194
- start = dates[0].strip
195
- finish = dates[-1].strip
194
+ start = dates[0].strip.sub(/^today +/i, '')
195
+ finish = dates[-1].strip.sub(/^today +/i, '')
196
196
  else
197
197
  start = dates[0].chronify(guess: :begin, future: false)
198
198
  finish = dates[-1].chronify(guess: inclusive ? :end : :begin, future: true)
@@ -17,9 +17,10 @@ module Doing
17
17
  ## @deprecated Use {#read_line} instead
18
18
  ##
19
19
  def enter_text(prompt, default_response: '')
20
- $stdin.reopen('/dev/tty')
21
20
  return default_response if @default_answer
22
21
 
22
+ $stdin.reopen('/dev/tty')
23
+
23
24
  print "#{Color.yellow(prompt).sub(/:?$/, ':')} #{Color.reset}"
24
25
  $stdin.gets.strip
25
26
  end
@@ -39,9 +40,10 @@ module Doing
39
40
  ## @return [String] User input string
40
41
  ##
41
42
  def read_line(prompt: 'Enter text', completions: [], default_response: '')
42
- $stdin.reopen('/dev/tty')
43
43
  return default_response if @default_answer
44
44
 
45
+ $stdin.reopen('/dev/tty')
46
+
45
47
  unless completions.empty?
46
48
  completions.sort!
47
49
  comp = proc { |s| completions.grep(/^#{Regexp.escape(s)}/) }
@@ -71,9 +73,10 @@ module Doing
71
73
  ## @return [String] Multi-line result, joined with newlines
72
74
  ##
73
75
  def read_lines(prompt: 'Enter text', completions: [], default_response: '')
74
- $stdin.reopen('/dev/tty')
75
76
  return default_response if @default_answer
76
77
 
78
+ $stdin.reopen('/dev/tty')
79
+
77
80
  completions.sort!
78
81
  comp = proc { |s| completions.grep(/^#{Regexp.escape(s)}/) }
79
82
  Readline.completion_append_character = ' '
@@ -111,9 +114,10 @@ module Doing
111
114
  ##
112
115
  ## @deprecated Use {#read_lines} instead
113
116
  def request_lines(prompt: 'Enter text', default_response: '')
114
- $stdin.reopen('/dev/tty')
115
117
  return default_response if @default_answer
116
118
 
119
+ $stdin.reopen('/dev/tty')
120
+
117
121
  ask_note = []
118
122
  reader = TTY::Reader.new(interrupt: -> { raise Errors::UserCancelled }, track_history: false)
119
123
  puts "#{Color.boldgreen(prompt.sub(/:?$/,
@@ -16,8 +16,6 @@ module Doing
16
16
  def yn(question, default_response: false)
17
17
  return @force_answer == :yes unless @force_answer.nil?
18
18
 
19
- $stdin.reopen('/dev/tty')
20
-
21
19
  default = if default_response.is_a?(String)
22
20
  default_response =~ /y/i ? true : false
23
21
  else
@@ -30,6 +28,8 @@ module Doing
30
28
  # if this isn't an interactive shell, answer default
31
29
  return default unless $stdout.isatty
32
30
 
31
+ $stdin.reopen('/dev/tty')
32
+
33
33
  # clear the buffer
34
34
  ARGV.length&.times do
35
35
  ARGV.shift
data/lib/doing/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Doing
4
- VERSION = '2.1.94'
4
+ VERSION = '2.1.99'
5
5
  end
@@ -143,14 +143,25 @@ EOTAIL
143
143
  output.push(line)
144
144
  end
145
145
 
146
+ total_content = "┃ #{' ' * (max - 6)}total: #{total.time_string(format: :hm)}"
147
+ total_content += " (total budgets left #{budget_fmt.call(budgets_total)})" if budgets_total.positive?
148
+ total_content += ' ┃'
149
+ max_line_len = (output + [total_content]).map(&:length).max
150
+
151
+ pad_line = lambda do |line|
152
+ pad = max_line_len - line.length
153
+ pad.positive? ? "#{line[0..-3]} #{' ' * pad}┃" : line
154
+ end
155
+ output = output.map { |l| pad_line.call(l) }
156
+
146
157
  header = '┏━━ Tag Totals '
147
- (max - 2).times { header += '━' }
158
+ [(max_line_len - 16), 0].max.times { header += '━' }
148
159
  header += '┓'
149
160
  footer = '┗'
150
- (max + 12).times { footer += '━' }
161
+ [(max_line_len - 2), 0].max.times { footer += '━' }
151
162
  footer += '┛'
152
163
  divider = '┣'
153
- (max + 12).times { divider += '━' }
164
+ [(max_line_len - 2), 0].max.times { divider += '━' }
154
165
  divider += '┫'
155
166
  output = output.empty? ? '' : "\n#{header}\n#{output.join("\n")}"
156
167
  output += "\n#{divider}"
@@ -159,13 +170,12 @@ EOTAIL
159
170
  spacer += ' '
160
171
  end
161
172
  total_time = total.time_string(format: :hm)
162
- total = "┃ #{spacer}total: "
163
- total += total_time
164
- if budgets_total.positive?
165
- total += " (total budgets left #{budget_fmt.call(budgets_total)})"
166
- end
167
- total += ' ┃'
168
- output += "\n#{total}"
173
+ total_line = "┃ #{spacer}total: "
174
+ total_line += total_time
175
+ total_line += " (total budgets left #{budget_fmt.call(budgets_total)})" if budgets_total.positive?
176
+ total_line += ' ┃'
177
+ total_line = pad_line.call(total_line)
178
+ output += "\n#{total_line}"
169
179
  output += "\n#{footer}"
170
180
  output
171
181
  else
data/lib/doing.rb CHANGED
@@ -9,7 +9,13 @@ require 'tempfile'
9
9
  require 'zlib'
10
10
  require 'base64'
11
11
  require 'plist'
12
- require 'readline'
12
+ begin
13
+ require 'readline'
14
+ rescue LoadError
15
+ # Ruby 4 builds may not ship native readline; use stdlib Reline API-compatible fallback.
16
+ require 'reline'
17
+ Readline = Reline unless defined?(Readline)
18
+ end
13
19
  require 'haml'
14
20
  require 'json'
15
21
  require 'logger'
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: 2.1.94
4
+ version: 2.1.99
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra