doing 2.1.58 → 2.1.62

Sign up to get free protection for your applications and to get access to all the features.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -0
  3. data/Gemfile.lock +2 -2
  4. data/README.md +1 -1
  5. data/bin/commands/done.rb +13 -4
  6. data/bin/commands/update.rb +37 -0
  7. data/bin/commands/view.rb +1 -1
  8. data/bin/doing +1 -1
  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/ArrayCleanup.html +1 -1
  17. data/docs/doc/Doing/ArrayNestedHash.html +1 -1
  18. data/docs/doc/Doing/ArrayTags.html +1 -1
  19. data/docs/doc/Doing/CSVExport.html +1 -1
  20. data/docs/doc/Doing/CalendarImport.html +1 -1
  21. data/docs/doc/Doing/Change.html +1 -1
  22. data/docs/doc/Doing/Changes.html +1 -1
  23. data/docs/doc/Doing/ChronifyArray.html +1 -1
  24. data/docs/doc/Doing/ChronifyNumeric.html +1 -1
  25. data/docs/doc/Doing/ChronifyString.html +1 -1
  26. data/docs/doc/Doing/Color.html +6 -1
  27. data/docs/doc/Doing/Completion/BashCompletions.html +1 -1
  28. data/docs/doc/Doing/Completion/FigCompletions.html +1 -1
  29. data/docs/doc/Doing/Completion/FishCompletions.html +1 -1
  30. data/docs/doc/Doing/Completion/StringUtils.html +65 -7
  31. data/docs/doc/Doing/Completion/ZshCompletions.html +1 -1
  32. data/docs/doc/Doing/Completion.html +1 -1
  33. data/docs/doc/Doing/Configuration.html +1 -1
  34. data/docs/doc/Doing/DayOneRenderer.html +1 -1
  35. data/docs/doc/Doing/DayoneExport.html +1 -1
  36. data/docs/doc/Doing/DoingExport.html +1 -1
  37. data/docs/doc/Doing/DoingImport.html +1 -1
  38. data/docs/doc/Doing/Entry.html +1 -1
  39. data/docs/doc/Doing/Errors/DoingNoTraceError.html +1 -1
  40. data/docs/doc/Doing/Errors/DoingRuntimeError.html +1 -1
  41. data/docs/doc/Doing/Errors/DoingStandardError.html +1 -1
  42. data/docs/doc/Doing/Errors/EmptyInput.html +1 -1
  43. data/docs/doc/Doing/Errors/HistoryLimitError.html +1 -1
  44. data/docs/doc/Doing/Errors/InvalidPlugin.html +1 -1
  45. data/docs/doc/Doing/Errors/MissingBackupFile.html +1 -1
  46. data/docs/doc/Doing/Errors/NoResults.html +1 -1
  47. data/docs/doc/Doing/Errors/PluginException.html +1 -1
  48. data/docs/doc/Doing/Errors/UserCancelled.html +1 -1
  49. data/docs/doc/Doing/Errors/WrongCommand.html +1 -1
  50. data/docs/doc/Doing/Errors.html +1 -1
  51. data/docs/doc/Doing/HTMLExport.html +1 -1
  52. data/docs/doc/Doing/Hooks.html +1 -1
  53. data/docs/doc/Doing/Item.html +2 -2
  54. data/docs/doc/Doing/ItemDates.html +1 -1
  55. data/docs/doc/Doing/ItemQuery.html +1 -1
  56. data/docs/doc/Doing/ItemState.html +1 -1
  57. data/docs/doc/Doing/ItemTags.html +1 -1
  58. data/docs/doc/Doing/Items.html +1 -1
  59. data/docs/doc/Doing/JSONExport.html +1 -1
  60. data/docs/doc/Doing/JSONImport.html +1 -1
  61. data/docs/doc/Doing/Logger.html +1 -1
  62. data/docs/doc/Doing/MarkdownExport.html +1 -1
  63. data/docs/doc/Doing/Note.html +1 -1
  64. data/docs/doc/Doing/Pager.html +1 -1
  65. data/docs/doc/Doing/Plugins.html +1 -1
  66. data/docs/doc/Doing/Prompt.html +2 -2
  67. data/docs/doc/Doing/PromptChoose.html +1 -1
  68. data/docs/doc/Doing/PromptFZF.html +1 -1
  69. data/docs/doc/Doing/PromptInput.html +1 -1
  70. data/docs/doc/Doing/PromptSTD.html +1 -1
  71. data/docs/doc/Doing/PromptYN.html +1 -1
  72. data/docs/doc/Doing/Section.html +1 -1
  73. data/docs/doc/Doing/StringHighlight.html +1 -1
  74. data/docs/doc/Doing/StringNormalize.html +1 -1
  75. data/docs/doc/Doing/StringQuery.html +61 -5
  76. data/docs/doc/Doing/StringTags.html +1 -1
  77. data/docs/doc/Doing/StringTransform.html +1 -1
  78. data/docs/doc/Doing/StringTruncate.html +1 -1
  79. data/docs/doc/Doing/StringURL.html +1 -1
  80. data/docs/doc/Doing/SymbolNormalize.html +1 -1
  81. data/docs/doc/Doing/TaskPaperExport.html +1 -1
  82. data/docs/doc/Doing/TemplateExport.html +2 -2
  83. data/docs/doc/Doing/TemplateString.html +3 -3
  84. data/docs/doc/Doing/TimingImport.html +1 -1
  85. data/docs/doc/Doing/Types.html +1 -1
  86. data/docs/doc/Doing/Util/Backup.html +1 -1
  87. data/docs/doc/Doing/Util.html +1 -1
  88. data/docs/doc/Doing/Version.html +1 -1
  89. data/docs/doc/Doing/WWID.html +2 -2
  90. data/docs/doc/Doing.html +2 -2
  91. data/docs/doc/FalseClass.html +1 -1
  92. data/docs/doc/GLI/Commands/Help.html +1 -1
  93. data/docs/doc/GLI/Commands/MarkdownDocumentListener.html +1 -1
  94. data/docs/doc/GLI/Commands.html +1 -1
  95. data/docs/doc/GLI.html +1 -1
  96. data/docs/doc/Hash.html +1 -1
  97. data/docs/doc/Numeric.html +1 -1
  98. data/docs/doc/Object.html +1 -1
  99. data/docs/doc/PhraseParser/Operator.html +1 -1
  100. data/docs/doc/PhraseParser/PhraseClause.html +1 -1
  101. data/docs/doc/PhraseParser/Query.html +1 -1
  102. data/docs/doc/PhraseParser/QueryParser.html +1 -1
  103. data/docs/doc/PhraseParser/QueryTransformer.html +1 -1
  104. data/docs/doc/PhraseParser/TermClause.html +1 -1
  105. data/docs/doc/PhraseParser.html +1 -1
  106. data/docs/doc/Status.html +1 -1
  107. data/docs/doc/String.html +65 -2
  108. data/docs/doc/Symbol.html +1 -1
  109. data/docs/doc/Time.html +1 -1
  110. data/docs/doc/TrueClass.html +1 -1
  111. data/docs/doc/_index.html +1 -1
  112. data/docs/doc/file.README.html +2 -2
  113. data/docs/doc/index.html +2 -2
  114. data/docs/doc/method_list.html +554 -546
  115. data/docs/doc/top-level-namespace.html +1 -1
  116. data/doing.rdoc +11 -1
  117. data/lib/completion/_doing.zsh +4 -0
  118. data/lib/completion/doing.bash +11 -0
  119. data/lib/completion/doing.fish +2 -0
  120. data/lib/completion/doing.ts +14 -0
  121. data/lib/doing/colors.rb +57 -0
  122. data/lib/doing/completion/completion_string.rb +11 -0
  123. data/lib/doing/string/highlight.rb +6 -7
  124. data/lib/doing/string/query.rb +10 -0
  125. data/lib/doing/version.rb +1 -1
  126. data/lib/doing/wwid/modify.rb +0 -1
  127. data/lib/doing/wwid/timers.rb +1 -156
  128. data/lib/templates/doing.css +2 -2
  129. metadata +3 -2
@@ -216,7 +216,7 @@
216
216
  </div>
217
217
 
218
218
  <div id="footer">
219
- Generated on Wed Jun 1 10:40:46 2022 by
219
+ Generated on Fri Jul 1 10:30:16 2022 by
220
220
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
221
221
  0.9.27 (ruby-3.0.1).
222
222
  </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.58
8
+ v2.1.62
9
9
 
10
10
  === Global Options
11
11
  === --config_file arg
@@ -3009,6 +3009,16 @@ Redo last undo. Note: you cannot undo a redo
3009
3009
 
3010
3010
 
3011
3011
 
3012
+ ==== Command: <tt>update </tt>
3013
+ Update doing to the latest version
3014
+
3015
+ Checks for the latest available version of doing and updates your local install if needed.
3016
+ ===== Options
3017
+ ===== -p|--pre|--beta
3018
+ Check for pre-release version
3019
+
3020
+
3021
+
3012
3022
  ==== Command: <tt>view VIEW_NAME</tt>
3013
3023
  Display a user-created view
3014
3024
 
@@ -52,6 +52,7 @@ function _doing() {
52
52
  'test:Test Stuff'
53
53
  'today:List entries from today'
54
54
  'undo:Undo the last X changes to the Doing file'
55
+ 'update:Update doing to the latest version'
55
56
  'view:Display a user-created view'
56
57
  'views:List available custom views'
57
58
  'wiki:Output a tag wiki'
@@ -200,6 +201,9 @@ function _doing() {
200
201
  undo)
201
202
  args=( {'(--file)-f','(-f)--file'}"[Specify alternate doing file]:PATH:" {'(--interactive)-i','(-i)--interactive'}"[Select from recent backups]" {'(--prune)-p','(-p)--prune'}"[Remove old backups]:COUNT:" {'(--redo)-r','(-r)--redo'}"[Redo last undo]" )
202
203
  ;;
204
+ update)
205
+ args=( "--beta[Check for pre-release version]" )
206
+ ;;
203
207
  view)
204
208
  args=( "--after[Show entries newer than date]:DATE_STRING:" "--age[Age]:AGE:" "--before[Show entries older than date]:DATE_STRING:" "--bool[Boolean used to combine multiple tags]:BOOLEAN:" {'(--count)-c','(-c)--count'}"[Count to display]:COUNT:" "--case[Case sensitivity for search string matching [(c)ase-sensitive]:TYPE:" "--color[Include colors in output]" "--config_template[Output using a template from configuration]:TEMPLATE_KEY:" "--duration[Show elapsed time on entries without @done tag]" "--from[Date range]:DATE_OR_RANGE:" {'(--hilite)-h','(-h)--hilite'}"[Highlight search matches in output]" {'(--interactive)-i','(-i)--interactive'}"[Select from a menu of matching entries to perform additional operations]" "--not[Show items that *don't* match search/tag filters]" {'(--output)-o','(-o)--output'}"[Output to export format]:FORMAT:" "--only_timed[Only show items with recorded time intervals]" {'(--section)-s','(-s)--section'}"[Section]:NAME:" "--search[Filter entries using a search query]:QUERY:" {'(--times)-t','(-t)--times'}"[Show time intervals on @done tasks]" "--tag[Filter entries by tag]:TAG:" "--tag_order[Tag sort direction]:DIRECTION:" "--tag_sort[Sort tags by]:KEY:" "--template[Override output format with a template string containing %placeholders]:TEMPLATE_STRING:" "--totals[Show intervals with totals at the end of output]" "--val[Perform a tag value query]:QUERY:" {'(--exact)-x','(-x)--exact'}"[Force exact search string matching]" )
205
209
  ;;
@@ -368,6 +368,16 @@ _doing_undo() {
368
368
  fi
369
369
  }
370
370
 
371
+ _doing_update() {
372
+
373
+ if [[ "$token" == --* ]]; then
374
+ COMPREPLY=( $( compgen -W '--beta' -- $token ) )
375
+ elif [[ "$token" == -* ]]; then
376
+ COMPREPLY=( $( compgen -W ' --beta' -- $token ) )
377
+
378
+ fi
379
+ }
380
+
371
381
  _doing_view() {
372
382
  OLD_IFS="$IFS"
373
383
  local token=${COMP_WORDS[$COMP_CWORD]}
@@ -466,6 +476,7 @@ _doing()
466
476
  elif [[ $last =~ (template) ]]; then _doing_template
467
477
  elif [[ $last =~ (today) ]]; then _doing_today
468
478
  elif [[ $last =~ (undo) ]]; then _doing_undo
479
+ elif [[ $last =~ (update) ]]; then _doing_update
469
480
  elif [[ $last =~ (view) ]]; then _doing_view
470
481
  elif [[ $last =~ (views) ]]; then _doing_views
471
482
  elif [[ $last =~ (wiki) ]]; then _doing_wiki
@@ -172,6 +172,7 @@ complete -xc doing -n '__fish_doing_needs_command' -a 'template' -d Output\ HTML
172
172
  complete -xc doing -n '__fish_doing_needs_command' -a 'test' -d Test\ Stuff
173
173
  complete -xc doing -n '__fish_doing_needs_command' -a 'today' -d List\ entries\ from\ today
174
174
  complete -xc doing -n '__fish_doing_needs_command' -a 'undo' -d Undo\ the\ last\ X\ changes\ to\ the\ Doing\ file
175
+ complete -xc doing -n '__fish_doing_needs_command' -a 'update' -d Update\ doing\ to\ the\ latest\ version
175
176
  complete -xc doing -n '__fish_doing_needs_command' -a 'view' -d Display\ a\ user-created\ view
176
177
  complete -xc doing -n '__fish_doing_needs_command' -a 'views' -d List\ available\ custom\ views
177
178
  complete -xc doing -n '__fish_doing_needs_command' -a 'wiki' -d Output\ a\ tag\ wiki
@@ -559,6 +560,7 @@ complete -c doing -l file -s f -f -r -n '__fish_doing_using_command undo' -d Spe
559
560
  complete -c doing -l interactive -s i -f -n '__fish_doing_using_command undo' -d Select\ from\ recent\ backups
560
561
  complete -c doing -l prune -s p -f -r -n '__fish_doing_using_command undo' -d Remove\ old\ backups
561
562
  complete -c doing -l redo -s r -f -n '__fish_doing_using_command undo' -d Redo\ last\ undo
563
+ complete -c doing -l beta -f -n '__fish_doing_using_command update' -d Check\ for\ pre-release\ version
562
564
  complete -c doing -l after -f -r -n '__fish_doing_using_command view' -d Show\ entries\ newer\ than\ date
563
565
  complete -c doing -l age -f -r -n '__fish_doing_using_command view' -d Age
564
566
  complete -c doing -l before -f -r -n '__fish_doing_using_command view' -d Show\ entries\ older\ than\ date
@@ -4463,6 +4463,20 @@ const completionSpec: Fig.Spec = {
4463
4463
 
4464
4464
  },
4465
4465
 
4466
+ {
4467
+ name: "update",
4468
+ description: "Update doing to the latest version",
4469
+ options: [
4470
+ {
4471
+ name: ["--beta"],
4472
+ description: "Check for pre-release version",
4473
+
4474
+ },
4475
+
4476
+ ],
4477
+
4478
+ },
4479
+
4466
4480
  {
4467
4481
  name: "view",
4468
4482
  description: "Display a user-created view",
data/lib/doing/colors.rb CHANGED
@@ -4,6 +4,7 @@
4
4
  module Doing
5
5
  # Terminal output color functions.
6
6
  module Color
7
+ ESCAPE_REGEX = /(?<=\[)(?:(?:(?:[349]|10)[0-9]|[0-9])?;?)+(?=m)/.freeze
7
8
  # All available color names. Available as methods and string extensions.
8
9
  #
9
10
  # @example Use a color as a method. Color reset will be added to end of string.
@@ -125,6 +126,62 @@ module Doing
125
126
  def normalize_color
126
127
  gsub(/_/, '').sub(/bright/i, 'bold').sub(/bgbold/, 'boldbg')
127
128
  end
129
+
130
+ # Get the calculated ANSI color at the end of the
131
+ # string
132
+ #
133
+ # @return ANSI escape sequence to match color
134
+ #
135
+ def last_color_code
136
+ m = scan(ESCAPE_REGEX)
137
+
138
+ em = ['0']
139
+ fg = nil
140
+ bg = nil
141
+ rgbf = nil
142
+ rgbb = nil
143
+
144
+ m.each do |c|
145
+ case c
146
+ when '0'
147
+ em = ['0']
148
+ fg, bg, rgbf, rgbb = nil
149
+ when /^[34]8/
150
+ case c
151
+ when /^3/
152
+ fg = nil
153
+ rgbf = c
154
+ when /^4/
155
+ bg = nil
156
+ rgbb = c
157
+ end
158
+ else
159
+ c.split(/;/).each do |i|
160
+ x = i.to_i
161
+ if x <= 9
162
+ em << x
163
+ elsif x >= 30 && x <= 39
164
+ rgbf = nil
165
+ fg = x
166
+ elsif x >= 40 && x <= 49
167
+ rgbb = nil
168
+ bg = x
169
+ elsif x >= 90 && x <= 97
170
+ rgbf = nil
171
+ fg = x
172
+ elsif x >= 100 && x <= 107
173
+ rgbb = nil
174
+ bg = x
175
+ end
176
+ end
177
+ end
178
+ end
179
+
180
+ escape = "\e[#{em.join(';')}m"
181
+ escape += "\e[#{rgbb}m" if rgbb
182
+ escape += "\e[#{rgbf}m" if rgbf
183
+ escape + "\e[#{[fg, bg].delete_if(&:nil?).join(';')}m"
184
+ end
128
185
  end
129
186
 
130
187
  class << self
@@ -1,10 +1,21 @@
1
1
  module Doing
2
2
  module Completion
3
3
  module StringUtils
4
+
5
+ ##
6
+ ## Get short description for command completion
7
+ ##
8
+ ## @return [String] Short description
9
+ ##
4
10
  def short_desc
5
11
  split(/[,.]/)[0].sub(/ \(.*?\)?$/, '').strip
6
12
  end
7
13
 
14
+ ##
15
+ ## Truncate string from left
16
+ ##
17
+ ## @param max The maximum number of characters
18
+ ##
8
19
  def ltrunc(max)
9
20
  if length > max
10
21
  sub(/^.*?(.{#{max - 3}})$/, '...\1')
@@ -17,14 +17,9 @@ module Doing
17
17
  ##
18
18
  def highlight_tags(color = 'yellow', last_color: nil)
19
19
  unless last_color
20
- escapes = scan(/(\e\[[\d;]+m)[^\e]+@/)
21
20
  color = color.split(' ') unless color.is_a?(Array)
22
21
  tag_color = color.each_with_object([]) { |c, arr| arr << Doing::Color.send(c) }.join('')
23
- last_color = if escapes.good?
24
- (escapes.count > 1 ? escapes[-2..-1] : [escapes[-1]]).map { |v| v[0] }.join('')
25
- else
26
- Doing::Color.default
27
- end
22
+ last_color = last_color_code
28
23
  end
29
24
  gsub(/(\s|m)(@[^ ("']+)/, "\\1#{tag_color}\\2#{last_color}")
30
25
  end
@@ -54,7 +49,11 @@ module Doing
54
49
  qs.concat(query[:should]) if query[:should]
55
50
  qs.each do |s|
56
51
  rx = Regexp.new(s.wildcard_to_rx, ignore_case(s, case_type))
57
- out.gsub!(rx) { |m| m.bgyellow.black }
52
+ out.gsub!(rx) do
53
+ m = Regexp.last_match
54
+ last = m.pre_match.last_color_code
55
+ "#{m[0].bgyellow.black}#{last}"
56
+ end
58
57
  end
59
58
  end
60
59
  out
@@ -85,6 +85,11 @@ module Doing
85
85
  Regexp.new(pattern, !case_sensitive)
86
86
  end
87
87
 
88
+ ##
89
+ ## Returns a phrase query (elastic search) representation of the object as a phrase parser.
90
+ ##
91
+ ## @return Phrase query representation of the object.
92
+ ##
88
93
  def to_phrase_query
89
94
  parser = PhraseParser::QueryParser.new
90
95
  transformer = PhraseParser::QueryTransformer.new
@@ -92,6 +97,11 @@ module Doing
92
97
  transformer.apply(parse_tree).to_elasticsearch
93
98
  end
94
99
 
100
+ ##
101
+ ## Returns a query (elastic search) representation of the object as a boolean term parser.
102
+ ##
103
+ ## @return Query representation of the object.
104
+ ##
95
105
  def to_query
96
106
  parser = BooleanTermParser::QueryParser.new
97
107
  transformer = BooleanTermParser::QueryTransformer.new
data/lib/doing/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Doing
2
- VERSION = '2.1.58'
2
+ VERSION = '2.1.62'
3
3
  end
@@ -159,7 +159,6 @@ module Doing
159
159
  write(@doing_file)
160
160
  end
161
161
 
162
-
163
162
  ##
164
163
  ## Tag the last entry or X entries
165
164
  ##
@@ -14,162 +14,7 @@ module Doing
14
14
  def tag_times(format: :text, sort_by: :time, sort_order: :asc)
15
15
  return '' if @timers.empty?
16
16
 
17
- max = @timers.keys.sort_by(&:length).reverse[0].length + 1
18
-
19
- total = @timers.delete('All')
20
-
21
- tags_data = @timers.delete_if { |_k, v| v.zero? }
22
- sorted_tags_data = if sort_by.normalize_tag_sort == :name
23
- tags_data.sort_by { |k, _v| k }
24
- else
25
- tags_data.sort_by { |_k, v| v }
26
- end
27
-
28
- sorted_tags_data.reverse! if sort_order.normalize_order == :asc
29
- case format
30
- when :html
31
-
32
- output = <<EOHEAD
33
- <table>
34
- <caption id="tagtotals">Tag Totals</caption>
35
- <colgroup>
36
- <col style="text-align:left;"/>
37
- <col style="text-align:left;"/>
38
- </colgroup>
39
- <thead>
40
- <tr>
41
- <th style="text-align:left;">project</th>
42
- <th style="text-align:left;">time</th>
43
- </tr>
44
- </thead>
45
- <tbody>
46
- EOHEAD
47
- sorted_tags_data.reverse.each do |k, v|
48
- if v.positive?
49
- output += "<tr><td style='text-align:left;'>#{k}</td><td style='text-align:left;'>#{v.time_string(format: :clock)}</td></tr>\n"
50
- end
51
- end
52
- tail = <<EOTAIL
53
- <tr>
54
- <td style="text-align:left;" colspan="2"></td>
55
- </tr>
56
- </tbody>
57
- <tfoot>
58
- <tr>
59
- <td style="text-align:left;"><strong>Total</strong></td>
60
- <td style="text-align:left;">#{total.time_string(format: :clock)}</td>
61
- </tr>
62
- </tfoot>
63
- </table>
64
- EOTAIL
65
- output + tail
66
- when :markdown
67
- pad = sorted_tags_data.map { |k, _| k }.group_by(&:size).max.last[0].length
68
- pad = 7 if pad < 7
69
- output = <<~EOHEADER
70
- | #{' ' * (pad - 7)}project | time |
71
- | #{'-' * (pad - 1)}: | :------- |
72
- EOHEADER
73
- sorted_tags_data.reverse.each do |k, v|
74
- if v.positive?
75
- output += "| #{' ' * (pad - k.length)}#{k} | #{v.time_string(format: :clock)} |\n"
76
- end
77
- end
78
- tail = '[Tag Totals]'
79
- output + tail
80
- when :json
81
- output = []
82
- sorted_tags_data.reverse.each do |k, v|
83
- output << {
84
- 'tag' => k,
85
- 'seconds' => v,
86
- 'formatted' => v.time_string(format: :clock)
87
- }
88
- end
89
- output
90
- when :human
91
- output = []
92
- sorted_tags_data.reverse.each do |k, v|
93
- spacer = ''
94
- (max - k.length).times do
95
- spacer += ' '
96
- end
97
- output.push("┃ #{spacer}#{k}:#{v.time_string(format: :hm)} ┃")
98
- end
99
-
100
- header = '┏━━ Tag Totals '
101
- (max - 2).times { header += '━' }
102
- header += '┓'
103
- footer = '┗'
104
- (max + 12).times { footer += '━' }
105
- footer += '┛'
106
- divider = '┣'
107
- (max + 12).times { divider += '━' }
108
- divider += '┫'
109
- output = output.empty? ? '' : "\n#{header}\n#{output.join("\n")}"
110
- output += "\n#{divider}"
111
- spacer = ''
112
- (max - 6).times do
113
- spacer += ' '
114
- end
115
- total_time = total.time_string(format: :hm)
116
- total = "┃ #{spacer}total: "
117
- total += total_time
118
- total += ' ┃'
119
- output += "\n#{total}"
120
- output += "\n#{footer}"
121
- output
122
- else
123
- output = []
124
- sorted_tags_data.reverse.each do |k, v|
125
- spacer = ''
126
- (max - k.length).times do
127
- spacer += ' '
128
- end
129
- output.push("#{k}:#{spacer}#{v.time_string(format: :clock)}")
130
- end
131
-
132
- output = output.empty? ? '' : "\n--- Tag Totals ---\n#{output.join("\n")}"
133
- output += "\n\nTotal tracked: #{total.time_string(format: :clock)}\n"
134
- output
135
- end
136
- end
137
-
138
- ##
139
- ## Gets the interval between entry's start
140
- ## date and @done date
141
- ##
142
- ## @param item [Item] The entry
143
- ## @param formatted [Boolean] Return human readable
144
- ## time (default seconds)
145
- ## @param record [Boolean] Add the interval to the
146
- ## total for each tag
147
- ##
148
- ## @return Interval in seconds, or [d, h, m] array if
149
- ## formatted is true. False if no end date or
150
- ## interval is 0
151
- ##
152
- def get_interval(item, formatted: true, record: true)
153
- if item.interval
154
- seconds = item.interval
155
- record_tag_times(item, seconds) if record
156
- return seconds.positive? ? seconds : false unless formatted
157
-
158
- return seconds.positive? ? seconds.time_string(format: :clock) : false
159
- end
160
-
161
- false
162
- end##
163
- ## Get total elapsed time for all tags in
164
- ## selection
165
- ##
166
- ## @param format [String] return format (html,
167
- ## json, or text)
168
- ## @param sort_by [Symbol] Sort by :name or :time
169
- ## @param sort_order [Symbol] The sort order (:asc or :desc)
170
- ##
171
- def tag_times(format: :text, sort_by: :time, sort_order: :asc)
172
- return '' if @timers.empty?
17
+ @timers.delete('meanwhile')
173
18
 
174
19
  max = @timers.keys.sort_by(&:length).reverse[0].length + 1
175
20
 
@@ -50,7 +50,7 @@ article > ul > li:hover {
50
50
  .date {
51
51
  color: #7d9ca2;
52
52
  font-size: 17px;
53
- padding: 15px 1ch 0 0;
53
+ padding: 3px 1ch 0 0;
54
54
  text-align: right;
55
55
  white-space: nowrap;
56
56
  transition: color .2s ease-in-out;
@@ -59,7 +59,7 @@ article > ul > li:hover {
59
59
  .entry {
60
60
  border-left: solid 1px #ccc;
61
61
  line-height: 1.2;
62
- padding: 10px 10px 10px 3ch;
62
+ padding: 2px 10px 2px 3ch;
63
63
  text-indent: -2ch;
64
64
  }
65
65
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: doing
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.58
4
+ version: 2.1.62
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-01 00:00:00.000000000 Z
11
+ date: 2022-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: github-markup
@@ -470,6 +470,7 @@ files:
470
470
  - bin/commands/template.rb
471
471
  - bin/commands/today.rb
472
472
  - bin/commands/undo.rb
473
+ - bin/commands/update.rb
473
474
  - bin/commands/view.rb
474
475
  - bin/commands/views.rb
475
476
  - bin/commands/yesterday.rb