doing 2.1.117 → 2.1.124

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 (121) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.md +2 -2
  5. data/bin/commands/budget.rb +1 -1
  6. data/docs/doc/Array.html +1 -1
  7. data/docs/doc/BooleanTermParser/Clause.html +1 -1
  8. data/docs/doc/BooleanTermParser/Operator.html +1 -1
  9. data/docs/doc/BooleanTermParser/Query.html +1 -1
  10. data/docs/doc/BooleanTermParser/QueryParser.html +1 -1
  11. data/docs/doc/BooleanTermParser/QueryTransformer.html +1 -1
  12. data/docs/doc/BooleanTermParser.html +1 -1
  13. data/docs/doc/Doing/ArrayCleanup.html +1 -1
  14. data/docs/doc/Doing/ArrayNestedHash.html +1 -1
  15. data/docs/doc/Doing/ArrayTags.html +1 -1
  16. data/docs/doc/Doing/ByDayExport.html +1 -1
  17. data/docs/doc/Doing/CSVExport.html +1 -1
  18. data/docs/doc/Doing/CalendarImport.html +1 -1
  19. data/docs/doc/Doing/Change.html +1 -1
  20. data/docs/doc/Doing/Changes.html +1 -1
  21. data/docs/doc/Doing/ChronifyArray.html +1 -1
  22. data/docs/doc/Doing/ChronifyNumeric.html +1 -1
  23. data/docs/doc/Doing/ChronifyString.html +1 -1
  24. data/docs/doc/Doing/Color.html +1 -1
  25. data/docs/doc/Doing/Completion/BashCompletions.html +1 -1
  26. data/docs/doc/Doing/Completion/FigCompletions.html +1 -1
  27. data/docs/doc/Doing/Completion/FishCompletions.html +1 -1
  28. data/docs/doc/Doing/Completion/StringUtils.html +1 -1
  29. data/docs/doc/Doing/Completion/ZshCompletions.html +1 -1
  30. data/docs/doc/Doing/Completion.html +1 -1
  31. data/docs/doc/Doing/Configuration.html +1 -1
  32. data/docs/doc/Doing/DayOneRenderer.html +1 -1
  33. data/docs/doc/Doing/DayoneExport.html +1 -1
  34. data/docs/doc/Doing/DoingExport.html +1 -1
  35. data/docs/doc/Doing/DoingImport.html +1 -1
  36. data/docs/doc/Doing/Entry.html +1 -1
  37. data/docs/doc/Doing/Errors/DoingNoTraceError.html +1 -1
  38. data/docs/doc/Doing/Errors/DoingRuntimeError.html +1 -1
  39. data/docs/doc/Doing/Errors/DoingStandardError.html +1 -1
  40. data/docs/doc/Doing/Errors/EmptyInput.html +1 -1
  41. data/docs/doc/Doing/Errors/HistoryLimitError.html +1 -1
  42. data/docs/doc/Doing/Errors/InvalidPlugin.html +1 -1
  43. data/docs/doc/Doing/Errors/MissingBackupFile.html +1 -1
  44. data/docs/doc/Doing/Errors/NoResults.html +1 -1
  45. data/docs/doc/Doing/Errors/PluginException.html +1 -1
  46. data/docs/doc/Doing/Errors/UserCancelled.html +1 -1
  47. data/docs/doc/Doing/Errors/WrongCommand.html +1 -1
  48. data/docs/doc/Doing/Errors.html +1 -1
  49. data/docs/doc/Doing/HTMLExport.html +1 -1
  50. data/docs/doc/Doing/Hooks.html +1 -1
  51. data/docs/doc/Doing/Item.html +1 -1
  52. data/docs/doc/Doing/ItemDates.html +1 -1
  53. data/docs/doc/Doing/ItemQuery.html +1 -1
  54. data/docs/doc/Doing/ItemState.html +1 -1
  55. data/docs/doc/Doing/ItemTags.html +1 -1
  56. data/docs/doc/Doing/Items.html +1 -1
  57. data/docs/doc/Doing/JSONExport.html +1 -1
  58. data/docs/doc/Doing/JSONImport.html +1 -1
  59. data/docs/doc/Doing/Logger.html +1 -1
  60. data/docs/doc/Doing/MarkdownExport.html +1 -1
  61. data/docs/doc/Doing/Note.html +1 -1
  62. data/docs/doc/Doing/Pager.html +1 -1
  63. data/docs/doc/Doing/Plugins.html +1 -1
  64. data/docs/doc/Doing/Prompt.html +1 -1
  65. data/docs/doc/Doing/PromptChoose.html +1 -1
  66. data/docs/doc/Doing/PromptFZF.html +1 -1
  67. data/docs/doc/Doing/PromptInput.html +1 -1
  68. data/docs/doc/Doing/PromptSTD.html +1 -1
  69. data/docs/doc/Doing/PromptYN.html +1 -1
  70. data/docs/doc/Doing/Section.html +1 -1
  71. data/docs/doc/Doing/StringHighlight.html +1 -1
  72. data/docs/doc/Doing/StringNormalize.html +1 -1
  73. data/docs/doc/Doing/StringQuery.html +1 -1
  74. data/docs/doc/Doing/StringTags.html +1 -1
  75. data/docs/doc/Doing/StringTransform.html +1 -1
  76. data/docs/doc/Doing/StringTruncate.html +1 -1
  77. data/docs/doc/Doing/StringURL.html +1 -1
  78. data/docs/doc/Doing/SymbolNormalize.html +1 -1
  79. data/docs/doc/Doing/TaskPaperExport.html +1 -1
  80. data/docs/doc/Doing/TemplateExport.html +1 -1
  81. data/docs/doc/Doing/TemplateString.html +1 -1
  82. data/docs/doc/Doing/TimingImport.html +1 -1
  83. data/docs/doc/Doing/Types.html +1 -1
  84. data/docs/doc/Doing/Util/Backup.html +1 -1
  85. data/docs/doc/Doing/Util.html +1 -1
  86. data/docs/doc/Doing/Version.html +1 -1
  87. data/docs/doc/Doing/WWID.html +1 -1
  88. data/docs/doc/Doing.html +2 -2
  89. data/docs/doc/FalseClass.html +1 -1
  90. data/docs/doc/GLI/Commands/Help.html +1 -1
  91. data/docs/doc/GLI/Commands/MarkdownDocumentListener.html +1 -1
  92. data/docs/doc/GLI/Commands.html +1 -1
  93. data/docs/doc/GLI.html +1 -1
  94. data/docs/doc/Hash.html +1 -1
  95. data/docs/doc/Numeric.html +1 -1
  96. data/docs/doc/Object.html +1 -1
  97. data/docs/doc/PhraseParser/Operator.html +1 -1
  98. data/docs/doc/PhraseParser/PhraseClause.html +1 -1
  99. data/docs/doc/PhraseParser/Query.html +1 -1
  100. data/docs/doc/PhraseParser/QueryParser.html +1 -1
  101. data/docs/doc/PhraseParser/QueryTransformer.html +1 -1
  102. data/docs/doc/PhraseParser/TermClause.html +1 -1
  103. data/docs/doc/PhraseParser.html +1 -1
  104. data/docs/doc/Status.html +1 -1
  105. data/docs/doc/String.html +1 -1
  106. data/docs/doc/Symbol.html +1 -1
  107. data/docs/doc/Time.html +1 -1
  108. data/docs/doc/TrueClass.html +1 -1
  109. data/docs/doc/_index.html +1 -1
  110. data/docs/doc/file.README.html +3 -3
  111. data/docs/doc/index.html +3 -3
  112. data/docs/doc/top-level-namespace.html +1 -1
  113. data/doing.rdoc +1 -1
  114. data/lib/doing/item/query.rb +2 -2
  115. data/lib/doing/plugins/export/byday.rb +1 -1
  116. data/lib/doing/string/transform.rb +16 -2
  117. data/lib/doing/template_string.rb +17 -8
  118. data/lib/doing/version.rb +1 -1
  119. data/lib/doing/wwid/display.rb +8 -5
  120. data/lib/doing/wwid/timers.rb +1 -1
  121. metadata +1 -1
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.117
8
+ v2.1.124
9
9
 
10
10
  === Global Options
11
11
  === --config_file arg
@@ -70,7 +70,7 @@ module Doing
70
70
  end
71
71
 
72
72
  def highlight_search(search, distance: nil, negate: false, case_type: nil)
73
- prefs = Doing.setting('search', {})
73
+ prefs = Doing.setting('search') || {}
74
74
  matching = prefs.fetch('matching', 'pattern').normalize_matching
75
75
  distance ||= prefs.fetch('distance', 3).to_i
76
76
  case_type ||= prefs.fetch('case', 'smart').normalize_case
@@ -109,7 +109,7 @@ module Doing
109
109
  ## @return [Boolean] matches search criteria
110
110
  ##
111
111
  def search(search, distance: nil, negate: false, case_type: nil)
112
- prefs = Doing.setting('search', {})
112
+ prefs = Doing.setting('search') || {}
113
113
  matching = prefs.fetch('matching', 'pattern').normalize_matching
114
114
  distance ||= prefs.fetch('distance', 3).to_i
115
115
  case_type ||= prefs.fetch('case', 'smart').normalize_case
@@ -46,7 +46,7 @@ module Doing
46
46
  end
47
47
  end
48
48
 
49
- budgets = Doing.setting('budgets', {}) || {}
49
+ budgets = Doing.setting('budgets') || {}
50
50
  budgets = budgets.transform_keys { |k| k.to_s.downcase }
51
51
  budgets_total = 0
52
52
 
@@ -53,6 +53,7 @@ module Doing
53
53
  note = Regexp.last_match(0)
54
54
  ''
55
55
  end
56
+ after.sub!(/[ \t]+\z/, '') unless note.empty?
56
57
 
57
58
  left_pad = ' ' * offset
58
59
  left_pad += indent
@@ -82,7 +83,20 @@ module Doing
82
83
  out.push(line.join(' '))
83
84
 
84
85
  last_color = ''
85
- out[0] = format("%-#{pad}s%s%s", out[0], last_color, after)
86
+ if pad_first && pad.positive?
87
+ out.map!.with_index do |l, idx|
88
+ suffix = idx.zero? ? "#{last_color}#{after}" : last_color
89
+ format("%-#{pad}s%s", l, suffix)
90
+ end
91
+ else
92
+ out[0] = format("%-#{pad}s%s%s", out[0], last_color, after)
93
+ end
94
+
95
+ suffix = if note.empty?
96
+ pad_first && pad.positive? ? '' : ' '
97
+ else
98
+ " #{note}".chomp
99
+ end
86
100
 
87
101
  out.map.with_index do |l, idx|
88
102
  if !pad_first && idx.zero?
@@ -90,7 +104,7 @@ module Doing
90
104
  else
91
105
  "#{left_pad}#{color}#{prefix}#{l}#{last_color}"
92
106
  end
93
- end.join("\n") + " #{note}".chomp
107
+ end.join("\n") + suffix
94
108
  # res.join("\n").strip + last_color + " #{note}".chomp
95
109
  end
96
110
 
@@ -167,10 +167,11 @@ module Doing
167
167
  line = l.gsub(/%/, '\%').strip.wrap(width, pad: pad, indent: indent, offset: 0, prefix: prefix,
168
168
  color: last_color, after: after, reset: reset, pad_first: true)
169
169
  line.highlight_tags!(tags_color, last_color: last_color) unless !tags_color || !tags_color.good?
170
- "#{line} "
170
+ pad.positive? ? line : "#{line} "
171
171
  end
172
172
  end.join("\n")
173
- "\n#{last_color}#{mark}#{outstring} "
173
+ suffix = pad.positive? ? '' : ' '
174
+ "\n#{last_color}#{mark}#{outstring}#{suffix}"
174
175
  else
175
176
  out = format("\n%s%s%s%#{pad}s%s", indent, prefix, last_color,
176
177
  value.join("\n#{indent}#{prefix}").gsub(/%/, '\%').sub(/\s*$/, ''), after)
@@ -209,12 +210,14 @@ module Doing
209
210
  natural = natural_placeholder_width(name, value)
210
211
  if width_token == '*'
211
212
  if block_placeholder?(name)
213
+ reserved_width += 1
212
214
  queues[name] << block_placeholder_width(terminal_width, token)
213
215
  else
216
+ reserved_width += visible_literal_width(token['prefix'].to_s)
214
217
  stretch_tokens << token
215
218
  end
216
219
  else
217
- reserved_width += reserved_placeholder_width(width_token, natural)
220
+ reserved_width += reserved_placeholder_width(name, width_token, natural)
218
221
  end
219
222
  end
220
223
 
@@ -240,7 +243,7 @@ module Doing
240
243
  end
241
244
 
242
245
  def natural_placeholder_width(name, value)
243
- # note placeholders are rendered on their own wrapped lines and should not
246
+ # Block placeholders are rendered on their own wrapped lines and should not
244
247
  # reserve horizontal width on the title line
245
248
  return 0 if block_placeholder?(name)
246
249
  return 0 unless value.good?
@@ -256,13 +259,19 @@ module Doing
256
259
  normalized.split("\n").map { |line| visible_literal_width(line) }.max || 0
257
260
  end
258
261
 
259
- def reserved_placeholder_width(width_token, natural_width)
262
+ def reserved_placeholder_width(name, width_token, natural_width)
263
+ return implicit_shortdate_width if name == 'shortdate' && (width_token.nil? || width_token.empty?)
260
264
  return natural_width if width_token.nil? || width_token.empty?
261
265
 
262
266
  minimum = width_token.to_i.abs
263
267
  [natural_width, minimum].max
264
268
  end
265
269
 
270
+ def implicit_shortdate_width
271
+ fmt_string = Doing.setting('shortdate_format.older', '%m/%d/%y %_I:%M%P', exact: true)
272
+ Date.today.strftime(fmt_string).length
273
+ end
274
+
266
275
  def block_placeholder?(name)
267
276
  %w[note idnote odnote].include?(name)
268
277
  end
@@ -296,6 +305,9 @@ module Doing
296
305
  end
297
306
 
298
307
  def detected_terminal_width
308
+ env_width = ENV['COLUMNS'].to_i
309
+ return env_width if env_width.positive?
310
+
299
311
  if $stdout.tty?
300
312
  begin
301
313
  require 'io/console'
@@ -310,9 +322,6 @@ module Doing
310
322
  tty_width = TTY::Screen.columns.to_i
311
323
  return tty_width if tty_width.positive?
312
324
 
313
- env_width = ENV['COLUMNS'].to_i
314
- return env_width if env_width.positive?
315
-
316
325
  80
317
326
  end
318
327
 
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.117'
4
+ VERSION = '2.1.124'
5
5
  end
@@ -380,18 +380,20 @@ module Doing
380
380
  placeholders = cfg['placeholders']
381
381
  return template unless placeholders.is_a?(Hash)
382
382
 
383
- apply_placeholder_widths(template, placeholders)
383
+ apply_placeholder_widths(template, placeholders, cfg['elements'])
384
384
  end
385
385
 
386
- def apply_placeholder_widths(template, placeholders)
386
+ def apply_placeholder_widths(template, placeholders, elements)
387
387
  keys = TEMPLATE_WIDTH_PLACEHOLDERS.map { |k| Regexp.escape(k) }.sort_by(&:length).reverse
388
388
  token_rx = /(?<!\\)%(?<width>\*|-?\d+)?(?:\^(?<mchar>.))?(?:(?<ichar>[ _t]|[^a-z0-9])(?<icount>\d+))?(?<prefix>.[ _t]?)?(?<name>#{keys.join('|')})/i
389
+ managed_elements = Array(elements).map(&:to_s)
389
390
 
390
391
  template.gsub(token_rx) do
391
392
  m = Regexp.last_match
392
393
  name = m['name']
393
394
 
394
- width = normalized_placeholder_width(placeholders[name] || placeholders[name.to_sym])
395
+ width = normalized_placeholder_width(placeholders[name] || placeholders[name.to_sym], m['width'],
396
+ managed_elements.include?(name))
395
397
  mchar = m['mchar'] ? "^#{m['mchar']}" : ''
396
398
  indent = m['ichar'] ? "#{m['ichar']}#{m['icount']}" : ''
397
399
  prefix = m['prefix'] || ''
@@ -400,10 +402,11 @@ module Doing
400
402
  end
401
403
  end
402
404
 
403
- def normalized_placeholder_width(config)
405
+ def normalized_placeholder_width(config, existing_width, managed)
404
406
  width = config['width'] || config[:width] if config.is_a?(Hash)
405
407
 
406
- return '' if width.nil?
408
+ return '' if width.nil? && managed
409
+ return existing_width.to_s if width.nil?
407
410
 
408
411
  case width.to_s
409
412
  when /^stretch$/i
@@ -19,7 +19,7 @@ module Doing
19
19
 
20
20
  timers_snapshot = totals[:tags] || {}
21
21
 
22
- budgets = Doing.setting('budgets', {}) || {}
22
+ budgets = Doing.setting('budgets') || {}
23
23
  budgets = budgets.transform_keys { |k| k.to_s.downcase }
24
24
  remaining_map = {}
25
25
  budgets_total = 0
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.117
4
+ version: 2.1.124
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra