doing 2.1.1pre → 2.1.2pre

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 (55) 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 +13 -0
  6. data/Gemfile.lock +1 -1
  7. data/README.md +1 -1
  8. data/bin/doing +61 -11
  9. data/doc/Array.html +1 -1
  10. data/doc/Doing/Color.html +1 -1
  11. data/doc/Doing/Completion.html +1 -1
  12. data/doc/Doing/Configuration.html +8 -7
  13. data/doc/Doing/Errors/DoingNoTraceError.html +1 -1
  14. data/doc/Doing/Errors/DoingRuntimeError.html +1 -1
  15. data/doc/Doing/Errors/DoingStandardError.html +1 -1
  16. data/doc/Doing/Errors/EmptyInput.html +1 -1
  17. data/doc/Doing/Errors/NoResults.html +1 -1
  18. data/doc/Doing/Errors/PluginException.html +1 -1
  19. data/doc/Doing/Errors/UserCancelled.html +1 -1
  20. data/doc/Doing/Errors/WrongCommand.html +1 -1
  21. data/doc/Doing/Errors.html +1 -1
  22. data/doc/Doing/Hooks.html +1 -1
  23. data/doc/Doing/Item.html +47 -2
  24. data/doc/Doing/Items.html +1 -1
  25. data/doc/Doing/LogAdapter.html +1 -1
  26. data/doc/Doing/Note.html +1 -1
  27. data/doc/Doing/Pager.html +1 -1
  28. data/doc/Doing/Plugins.html +1 -1
  29. data/doc/Doing/Prompt.html +1 -1
  30. data/doc/Doing/Section.html +1 -1
  31. data/doc/Doing/Util.html +1 -1
  32. data/doc/Doing/WWID.html +1 -1
  33. data/doc/Doing.html +2 -2
  34. data/doc/GLI/Commands/MarkdownDocumentListener.html +1 -1
  35. data/doc/GLI/Commands.html +1 -1
  36. data/doc/GLI.html +1 -1
  37. data/doc/Hash.html +1 -1
  38. data/doc/Status.html +1 -1
  39. data/doc/String.html +1 -1
  40. data/doc/Symbol.html +1 -1
  41. data/doc/Time.html +1 -1
  42. data/doc/_index.html +1 -1
  43. data/doc/file.README.html +2 -2
  44. data/doc/index.html +2 -2
  45. data/doc/method_list.html +257 -249
  46. data/doc/top-level-namespace.html +1 -1
  47. data/doing.rdoc +54 -9
  48. data/lib/completion/doing.bash +18 -18
  49. data/lib/doing/configuration.rb +19 -8
  50. data/lib/doing/item.rb +7 -0
  51. data/lib/doing/plugins/export/template_export.rb +25 -1
  52. data/lib/doing/prompt.rb +4 -2
  53. data/lib/doing/version.rb +1 -1
  54. data/lib/doing/wwid.rb +56 -23
  55. metadata +2 -2
@@ -102,7 +102,7 @@
102
102
  </div>
103
103
 
104
104
  <div id="footer">
105
- Generated on Sat Nov 27 13:57:12 2021 by
105
+ Generated on Sun Nov 28 05:27:33 2021 by
106
106
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
107
107
  0.9.26 (ruby-3.0.1).
108
108
  </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.1pre
8
+ v2.1.2pre
9
9
 
10
10
  === Global Options
11
11
  === --config_file arg
@@ -145,7 +145,7 @@ Repeat last entry matching tags. Combine multiple tags with a comma.
145
145
 
146
146
 
147
147
  ===== -e|--editor
148
- Edit duplicated entry with emacs -nw before adding
148
+ Edit duplicated entry with vim before adding
149
149
 
150
150
 
151
151
 
@@ -541,7 +541,7 @@ Include date
541
541
 
542
542
 
543
543
  ===== -e|--editor
544
- Edit entry with emacs -nw (with no arguments, edits the last entry)
544
+ Edit entry with vim (with no arguments, edits the last entry)
545
545
 
546
546
 
547
547
 
@@ -724,6 +724,11 @@ Sort tags by (name|time)
724
724
  [Must Match] (?i-mx:^(?:name|time)$)
725
725
 
726
726
 
727
+ ===== --[no-]duration
728
+ Show elapsed time on entries without @done tag
729
+
730
+
731
+
727
732
  ===== -i|--interactive
728
733
  Display an interactive menu of results to perform further operations
729
734
 
@@ -902,8 +907,13 @@ Tag filter, combine multiple tags with a comma.
902
907
  [Default Value] None
903
908
 
904
909
 
910
+ ===== --[no-]duration
911
+ Show elapsed time if entry is not tagged @done
912
+
913
+
914
+
905
915
  ===== -e|--editor
906
- Edit entry with emacs -nw
916
+ Edit entry with vim
907
917
 
908
918
 
909
919
 
@@ -937,7 +947,7 @@ Note
937
947
 
938
948
 
939
949
  ===== -e|--editor
940
- Edit entry with emacs -nw
950
+ Edit entry with vim
941
951
 
942
952
 
943
953
 
@@ -1059,7 +1069,7 @@ Archive previous @meanwhile entry
1059
1069
 
1060
1070
 
1061
1071
  ===== -e|--editor
1062
- Edit entry with emacs -nw
1072
+ Edit entry with vim
1063
1073
 
1064
1074
 
1065
1075
 
@@ -1110,7 +1120,7 @@ Add/remove note from last entry matching tag
1110
1120
 
1111
1121
 
1112
1122
  ===== -e|--editor
1113
- Edit entry with emacs -nw
1123
+ Edit entry with vim
1114
1124
 
1115
1125
 
1116
1126
 
@@ -1141,7 +1151,7 @@ Record what you're starting now, or backdate the start time using natural langua
1141
1151
 
1142
1152
  A parenthetical at the end of the entry will be converted to a note.
1143
1153
 
1144
- Run with no argument to create a new entry using emacs -nw.
1154
+ Run with no argument to create a new entry using vim.
1145
1155
  ===== Options
1146
1156
  ===== -b|--back|--started DATE_STRING
1147
1157
 
@@ -1165,7 +1175,7 @@ Section
1165
1175
 
1166
1176
 
1167
1177
  ===== -e|--editor
1168
- Edit entry with emacs -nw
1178
+ Edit entry with vim
1169
1179
 
1170
1180
 
1171
1181
 
@@ -1203,6 +1213,11 @@ Sort tags by (name|time)
1203
1213
  [Must Match] (?i-mx:^(?:name|time)$)
1204
1214
 
1205
1215
 
1216
+ ===== --[no-]duration
1217
+ Show elapsed time on entries without @done tag
1218
+
1219
+
1220
+
1206
1221
  ===== -t|--[no-]times
1207
1222
  Show time intervals on @done tasks
1208
1223
 
@@ -1281,6 +1296,11 @@ Sort tags by (name|time)
1281
1296
  [Must Match] (?i-mx:^(?:name|time)$)
1282
1297
 
1283
1298
 
1299
+ ===== --[no-]duration
1300
+ Show elapsed time on entries without @done tag
1301
+
1302
+
1303
+
1284
1304
  ===== -i|--interactive
1285
1305
  Select from a menu of matching entries to perform additional operations
1286
1306
 
@@ -1688,6 +1708,11 @@ Sort tags by (name|time)
1688
1708
  [Must Match] (?i-mx:^(?:name|time))
1689
1709
 
1690
1710
 
1711
+ ===== --[no-]duration
1712
+ Show elapsed time on entries without @done tag
1713
+
1714
+
1715
+
1691
1716
  ===== -i|--interactive
1692
1717
  Select from a menu of matching entries to perform additional operations
1693
1718
 
@@ -1746,6 +1771,11 @@ Sort tags by (name|time)
1746
1771
  [Must Match] (?i-mx:^(?:name|time)$)
1747
1772
 
1748
1773
 
1774
+ ===== --[no-]duration
1775
+ Show elapsed time on entries without @done tag
1776
+
1777
+
1778
+
1749
1779
  ===== -t|--[no-]times
1750
1780
  Show time intervals on @done tasks
1751
1781
 
@@ -1939,6 +1969,11 @@ Sort tags by (name|time)
1939
1969
  [Must Match] (?i-mx:^(?:name|time)$)
1940
1970
 
1941
1971
 
1972
+ ===== --[no-]duration
1973
+ Show elapsed time on entries without @done tag
1974
+
1975
+
1976
+
1942
1977
  ===== -t|--[no-]times
1943
1978
  Show time intervals on @done tasks
1944
1979
 
@@ -2065,6 +2100,11 @@ Include colors in output
2065
2100
 
2066
2101
 
2067
2102
 
2103
+ ===== --[no-]duration
2104
+ Show elapsed time on entries without @done tag
2105
+
2106
+
2107
+
2068
2108
  ===== -i|--interactive
2069
2109
  Select from a menu of matching entries to perform additional operations
2070
2110
 
@@ -2223,6 +2263,11 @@ Sort tags by (name|time)
2223
2263
  [Must Match] (?i-mx:^(?:name|time)$)
2224
2264
 
2225
2265
 
2266
+ ===== --[no-]duration
2267
+ Show elapsed time on entries without @done tag
2268
+
2269
+
2270
+
2226
2271
  ===== -t|--[no-]times
2227
2272
  Show time intervals on @done tasks
2228
2273
 
@@ -101,9 +101,9 @@ _doing_finish() {
101
101
  _doing_grep() {
102
102
 
103
103
  if [[ "$token" == --* ]]; then
104
- COMPREPLY=( $( compgen -W '--after --before --case --from --interactive --not --output --only_timed --section --times --tag_sort --totals --exact' -- $token ) )
104
+ COMPREPLY=( $( compgen -W '--after --before --case --duration --from --interactive --not --output --only_timed --section --times --tag_sort --totals --exact' -- $token ) )
105
105
  elif [[ "$token" == -* ]]; then
106
- COMPREPLY=( $( compgen -W '-i -o -s -t -x --after --before --case --from --interactive --not --output --only_timed --section --times --tag_sort --totals --exact' -- $token ) )
106
+ COMPREPLY=( $( compgen -W '-i -o -s -t -x --after --before --case --duration --from --interactive --not --output --only_timed --section --times --tag_sort --totals --exact' -- $token ) )
107
107
 
108
108
  fi
109
109
  }
@@ -131,9 +131,9 @@ _doing_import() {
131
131
  _doing_last() {
132
132
 
133
133
  if [[ "$token" == --* ]]; then
134
- COMPREPLY=( $( compgen -W '--bool --case --editor --not --section --search --tag --exact' -- $token ) )
134
+ COMPREPLY=( $( compgen -W '--bool --case --duration --editor --not --section --search --tag --exact' -- $token ) )
135
135
  elif [[ "$token" == -* ]]; then
136
- COMPREPLY=( $( compgen -W '-e -s -x --bool --case --editor --not --section --search --tag --exact' -- $token ) )
136
+ COMPREPLY=( $( compgen -W '-e -s -x --bool --case --duration --editor --not --section --search --tag --exact' -- $token ) )
137
137
 
138
138
  fi
139
139
  }
@@ -191,9 +191,9 @@ _doing_now() {
191
191
  _doing_on() {
192
192
 
193
193
  if [[ "$token" == --* ]]; then
194
- COMPREPLY=( $( compgen -W '--output --section --times --tag_sort --totals' -- $token ) )
194
+ COMPREPLY=( $( compgen -W '--duration --output --section --times --tag_sort --totals' -- $token ) )
195
195
  elif [[ "$token" == -* ]]; then
196
- COMPREPLY=( $( compgen -W '-o -s -t --output --section --times --tag_sort --totals' -- $token ) )
196
+ COMPREPLY=( $( compgen -W '-o -s -t --duration --output --section --times --tag_sort --totals' -- $token ) )
197
197
 
198
198
  fi
199
199
  }
@@ -221,9 +221,9 @@ _doing_plugins() {
221
221
  _doing_recent() {
222
222
 
223
223
  if [[ "$token" == --* ]]; then
224
- COMPREPLY=( $( compgen -W '--interactive --section --times --tag_sort --totals' -- $token ) )
224
+ COMPREPLY=( $( compgen -W '--duration --interactive --section --times --tag_sort --totals' -- $token ) )
225
225
  elif [[ "$token" == -* ]]; then
226
- COMPREPLY=( $( compgen -W '-i -s -t --interactive --section --times --tag_sort --totals' -- $token ) )
226
+ COMPREPLY=( $( compgen -W '-i -s -t --duration --interactive --section --times --tag_sort --totals' -- $token ) )
227
227
 
228
228
  fi
229
229
  }
@@ -276,9 +276,9 @@ local words=$(doing sections)
276
276
  IFS="$OLD_IFS"
277
277
 
278
278
  if [[ "$token" == --* ]]; then
279
- COMPREPLY=( $( compgen -W '--age --after --bool --before --count --case --from --interactive --not --output --only_timed --sort --search --times --tag --tag_order --tag_sort --totals --exact' -- $token ) )
279
+ COMPREPLY=( $( compgen -W '--age --after --bool --before --count --case --duration --from --interactive --not --output --only_timed --sort --search --times --tag --tag_order --tag_sort --totals --exact' -- $token ) )
280
280
  elif [[ "$token" == -* ]]; then
281
- COMPREPLY=( $( compgen -W '-a -b -c -i -o -s -t -x --age --after --bool --before --count --case --from --interactive --not --output --only_timed --sort --search --times --tag --tag_order --tag_sort --totals --exact' -- $token ) )
281
+ COMPREPLY=( $( compgen -W '-a -b -c -i -o -s -t -x --age --after --bool --before --count --case --duration --from --interactive --not --output --only_timed --sort --search --times --tag --tag_order --tag_sort --totals --exact' -- $token ) )
282
282
  else
283
283
  local nocasematchWasOff=0
284
284
  shopt nocasematch >/dev/null || nocasematchWasOff=1
@@ -301,9 +301,9 @@ IFS="$OLD_IFS"
301
301
  _doing_since() {
302
302
 
303
303
  if [[ "$token" == --* ]]; then
304
- COMPREPLY=( $( compgen -W '--output --section --times --tag_sort --totals' -- $token ) )
304
+ COMPREPLY=( $( compgen -W '--duration --output --section --times --tag_sort --totals' -- $token ) )
305
305
  elif [[ "$token" == -* ]]; then
306
- COMPREPLY=( $( compgen -W '-o -s -t --output --section --times --tag_sort --totals' -- $token ) )
306
+ COMPREPLY=( $( compgen -W '-o -s -t --duration --output --section --times --tag_sort --totals' -- $token ) )
307
307
 
308
308
  fi
309
309
  }
@@ -331,9 +331,9 @@ _doing_template() {
331
331
  _doing_today() {
332
332
 
333
333
  if [[ "$token" == --* ]]; then
334
- COMPREPLY=( $( compgen -W '--after --before --from --output --section --times --tag_sort --totals' -- $token ) )
334
+ COMPREPLY=( $( compgen -W '--after --before --duration --from --output --section --times --tag_sort --totals' -- $token ) )
335
335
  elif [[ "$token" == -* ]]; then
336
- COMPREPLY=( $( compgen -W '-o -s -t --after --before --from --output --section --times --tag_sort --totals' -- $token ) )
336
+ COMPREPLY=( $( compgen -W '-o -s -t --after --before --duration --from --output --section --times --tag_sort --totals' -- $token ) )
337
337
 
338
338
  fi
339
339
  }
@@ -356,9 +356,9 @@ local words=$(doing views)
356
356
  IFS="$OLD_IFS"
357
357
 
358
358
  if [[ "$token" == --* ]]; then
359
- COMPREPLY=( $( compgen -W '--after --bool --before --count --case --color --from --interactive --not --output --only_timed --section --search --times --tag --tag_order --tag_sort --totals --exact' -- $token ) )
359
+ COMPREPLY=( $( compgen -W '--after --bool --before --count --case --color --duration --from --interactive --not --output --only_timed --section --search --times --tag --tag_order --tag_sort --totals --exact' -- $token ) )
360
360
  elif [[ "$token" == -* ]]; then
361
- COMPREPLY=( $( compgen -W '-b -c -i -o -s -t -x --after --bool --before --count --case --color --from --interactive --not --output --only_timed --section --search --times --tag --tag_order --tag_sort --totals --exact' -- $token ) )
361
+ COMPREPLY=( $( compgen -W '-b -c -i -o -s -t -x --after --bool --before --count --case --color --duration --from --interactive --not --output --only_timed --section --search --times --tag --tag_order --tag_sort --totals --exact' -- $token ) )
362
362
  else
363
363
  local nocasematchWasOff=0
364
364
  shopt nocasematch >/dev/null || nocasematchWasOff=1
@@ -401,9 +401,9 @@ _doing_wiki() {
401
401
  _doing_yesterday() {
402
402
 
403
403
  if [[ "$token" == --* ]]; then
404
- COMPREPLY=( $( compgen -W '--after --before --from --output --section --times --tag_order --tag_sort --totals' -- $token ) )
404
+ COMPREPLY=( $( compgen -W '--after --before --duration --from --output --section --times --tag_order --tag_sort --totals' -- $token ) )
405
405
  elif [[ "$token" == -* ]]; then
406
- COMPREPLY=( $( compgen -W '-o -s -t --after --before --from --output --section --times --tag_order --tag_sort --totals' -- $token ) )
406
+ COMPREPLY=( $( compgen -W '-o -s -t --after --before --duration --from --output --section --times --tag_order --tag_sort --totals' -- $token ) )
407
407
 
408
408
  fi
409
409
  }
@@ -32,28 +32,29 @@ module Doing
32
32
  'never_finish' => [],
33
33
 
34
34
  'timer_format' => 'text',
35
+ 'interval_format' => 'text',
35
36
 
36
37
  'templates' => {
37
38
  'default' => {
38
39
  'date_format' => '%Y-%m-%d %H:%M',
39
- 'template' => '%date | %title%note',
40
+ 'template' => '%date | %title %interval%duration%note',
40
41
  'wrap_width' => 0,
41
42
  'order' => 'asc'
42
43
  },
43
44
  'today' => {
44
45
  'date_format' => '%_I:%M%P',
45
- 'template' => '%date: %title %interval%note',
46
+ 'template' => '%date: %title %interval%duration%note',
46
47
  'wrap_width' => 0,
47
48
  'order' => 'asc'
48
49
  },
49
50
  'last' => {
50
51
  'date_format' => '%-I:%M%P on %a',
51
- 'template' => '%title (at %date)%odnote',
52
+ 'template' => '%title (at %date) %interval%duration%odnote',
52
53
  'wrap_width' => 88
53
54
  },
54
55
  'recent' => {
55
56
  'date_format' => '%_I:%M%P',
56
- 'template' => '%shortdate: %title (%section)',
57
+ 'template' => '%shortdate: %title (%section) %interval%duration%note',
57
58
  'wrap_width' => 88,
58
59
  'count' => 10,
59
60
  'order' => 'asc'
@@ -153,7 +154,7 @@ module Doing
153
154
  ## matched, first match wins)
154
155
  ## @return [Array] ordered array of resolved keys
155
156
  ##
156
- def resolve_key_path(keypath)
157
+ def resolve_key_path(keypath, create: false)
157
158
  cfg = @settings
158
159
  real_path = []
159
160
  unless keypath =~ /^[.*]?$/
@@ -170,8 +171,18 @@ module Doing
170
171
  end
171
172
 
172
173
  if new_cfg.nil?
173
- Doing.logger.error("Key match not found: #{path}")
174
- break
174
+ return nil unless create
175
+
176
+ resolved = real_path.count.positive? ? "Resolved #{real_path.join('->')}, but " : ''
177
+ Doing.logger.log_now(:warn, "#{resolved}#{path} is unknown")
178
+ new_path = [*real_path, path, *paths].join('->')
179
+ Doing.logger.log_now(:warn, "Continuing will create the path #{new_path}")
180
+ res = Prompt.yn('Key path not found, create it?', default_response: true)
181
+ raise InvalidArgument, 'Invalid key path' unless res
182
+
183
+ real_path.push(path).concat(paths)
184
+ Doing.logger.debug('Config:', "translated key path #{keypath} to #{real_path.join('.')}")
185
+ return real_path
175
186
  end
176
187
  cfg = new_cfg
177
188
  end
@@ -194,7 +205,7 @@ module Doing
194
205
  cfg = @settings
195
206
  real_path = ['config']
196
207
  unless keypath =~ /^[.*]?$/
197
- real_path = resolve_key_path(keypath)
208
+ real_path = resolve_key_path(keypath, create: false)
198
209
  return nil unless real_path&.count&.positive?
199
210
 
200
211
  cfg = cfg.dig(*real_path)
data/lib/doing/item.rb CHANGED
@@ -31,6 +31,13 @@ module Doing
31
31
  # @date = new_date.is_a?(Time) ? new_date : Time.parse(new_date)
32
32
  # end
33
33
 
34
+ ## If the entry doesn't have a @done date, return the elapsed time
35
+ def duration
36
+ return nil if @title =~ /(?<=^| )@done\b/
37
+
38
+ return Time.now - @date
39
+ end
40
+
34
41
  ##
35
42
  ## Get the difference between the item's start date and
36
43
  ## the value of its @done tag (if present)
@@ -58,11 +58,35 @@ module Doing
58
58
  format("%#{pad}s", item.date.strftime(opt[:format]))
59
59
  end
60
60
 
61
- interval = wwid.get_interval(item, record: true) if opt[:times]
61
+ interval = wwid.get_interval(item, record: true, formatted: false) if opt[:times]
62
+ if interval
63
+ case opt[:interval_format].to_sym
64
+ when :human
65
+ _d, h, m = wwid.format_time(interval, human: true)
66
+ interval = format('%<h> 4dh %<m>02dm', h: h, m: m)
67
+ else
68
+ d, h, m = wwid.format_time(interval)
69
+ interval = format('%<d>02d:%<h>02d:%<m>02d', d: d, h: h, m: m)
70
+ end
71
+ end
62
72
 
63
73
  interval ||= ''
64
74
  output.sub!(/%interval/, interval)
65
75
 
76
+ duration = item.duration if opt[:duration]
77
+ if duration
78
+ case opt[:interval_format].to_sym
79
+ when :human
80
+ _d, h, m = wwid.format_time(duration, human: true)
81
+ duration = format('%<h> 4dh %<m>02dm', h: h, m: m)
82
+ else
83
+ d, h, m = wwid.format_time(duration)
84
+ duration = format('%<d>02d:%<h>02d:%<m>02d', d: d, h: h, m: m)
85
+ end
86
+ end
87
+ duration ||= ''
88
+ output.sub!(/%duration/, duration)
89
+
66
90
  output.sub!(/%(\d+)?shortdate/) do
67
91
  pad = Regexp.last_match(1) || 13
68
92
  format("%#{pad}s", item.date.relative_date)
data/lib/doing/prompt.rb CHANGED
@@ -110,10 +110,12 @@ module Doing
110
110
  return nil unless $stdout.isatty
111
111
 
112
112
  # fzf_args << '-1' # User is expecting a menu, and even if only one it seves as confirmation
113
- fzf_args << %(--prompt "#{prompt}")
113
+ fzf_args << %(--prompt="#{prompt}")
114
+ fzf_args << "--height=#{options.count + 2}"
115
+ fzf_args << '--info=inline'
114
116
  fzf_args << '--multi' if multiple
115
117
  header = "esc: cancel,#{multiple ? ' tab: multi-select, ctrl-a: select all,' : ''} return: confirm"
116
- fzf_args << %(--header "#{header}")
118
+ fzf_args << %(--header="#{header}")
117
119
  options.sort! if sorted
118
120
  res = `echo #{Shellwords.escape(options.join("\n"))}|#{fzf} #{fzf_args.join(' ')}`
119
121
  return false if res.strip.size.zero?
data/lib/doing/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Doing
2
- VERSION = '2.1.1pre'
2
+ VERSION = '2.1.2pre'
3
3
  end
data/lib/doing/wwid.rb CHANGED
@@ -1429,20 +1429,23 @@ module Doing
1429
1429
  ##
1430
1430
  def list_section(opt = {})
1431
1431
  opt[:config_template] ||= 'default'
1432
- cfg = @config.dig('templates', opt[:config_template]).deep_merge({
1433
- 'wrap_width' => @config['wrap_width'] || 0,
1434
- 'date_format' => @config['default_date_format'],
1435
- 'order' => @config['order'] || 'asc',
1436
- 'tags_color' => @config['tags_color']
1437
- })
1432
+ cfg = @config.dig('templates',
1433
+ opt[:config_template]).deep_merge({
1434
+ 'wrap_width' => @config['wrap_width'] || 0,
1435
+ 'date_format' => @config['default_date_format'],
1436
+ 'order' => @config['order'] || 'asc',
1437
+ 'tags_color' => @config['tags_color'],
1438
+ 'duration' => @config['duration'],
1439
+ 'interval_format' => @config['interval_format']
1440
+ })
1441
+ opt[:duration] ||= cfg['duration'] || false
1442
+ opt[:interval_format] ||= cfg['interval_format'] || 'text'
1438
1443
  opt[:count] ||= 0
1439
1444
  opt[:age] ||= 'newest'
1440
1445
  opt[:format] ||= cfg['date_format']
1441
1446
  opt[:order] ||= cfg['order'] || 'asc'
1442
1447
  opt[:tag_order] ||= 'asc'
1443
- if opt[:tags_color].nil?
1444
- opt[:tags_color] = cfg['tags_color'] || false
1445
- end
1448
+ opt[:tags_color] = cfg['tags_color'] || false if opt[:tags_color].nil?
1446
1449
  opt[:template] ||= cfg['template']
1447
1450
 
1448
1451
  # opt[:highlight] ||= true
@@ -1452,17 +1455,17 @@ module Doing
1452
1455
  opt[:section] = choose_section
1453
1456
  title = opt[:section]
1454
1457
  elsif opt[:section].instance_of?(String)
1455
- if opt[:section] =~ /^all$/i
1456
- title = if opt[:page_title]
1458
+ title = if opt[:section] =~ /^all$/i
1459
+ if opt[:page_title]
1457
1460
  opt[:page_title]
1458
1461
  elsif opt[:tag_filter] && opt[:tag_filter]['bool'].normalize_bool != :not
1459
1462
  opt[:tag_filter]['tags'].map { |tag| "@#{tag}" }.join(' + ')
1460
1463
  else
1461
1464
  'doing'
1462
1465
  end
1463
- else
1464
- title = guess_section(opt[:section])
1465
- end
1466
+ else
1467
+ guess_section(opt[:section])
1468
+ end
1466
1469
  end
1467
1470
 
1468
1471
  items = filter_items(Items.new, opt: opt).reverse
@@ -1531,15 +1534,22 @@ module Doing
1531
1534
  'wrap_width' => @config['wrap_width'] || 0,
1532
1535
  'date_format' => @config['default_date_format'],
1533
1536
  'order' => @config['order'] || 'asc',
1534
- 'tags_color' => @config['tags_color']
1537
+ 'tags_color' => @config['tags_color'],
1538
+ 'duration' => @config['duration'],
1539
+ 'interval_format' => @config['interval_format']
1535
1540
  })
1536
1541
 
1542
+ opt[:duration] ||= cfg['duration'] || false
1543
+ opt[:interval_format] ||= cfg['interval_format'] || 'text'
1544
+
1537
1545
  options = {
1538
1546
  after: opt[:after],
1539
1547
  before: opt[:before],
1540
1548
  count: 0,
1549
+ duration: opt[:duration],
1541
1550
  from: opt[:from],
1542
1551
  format: cfg['date_format'],
1552
+ interval_format: opt[:interval_format],
1543
1553
  order: cfg['order'] || 'asc',
1544
1554
  output: output,
1545
1555
  section: opt[:section],
@@ -1571,8 +1581,18 @@ module Doing
1571
1581
  # :date_filter expects an array with start and end date
1572
1582
  dates = [dates, dates] if dates.instance_of?(String)
1573
1583
 
1574
- list_section({ section: section, count: 0, order: 'asc', date_filter: dates, times: times,
1575
- output: output, totals: opt[:totals], sort_tags: opt[:sort_tags], config_template: 'default' })
1584
+ list_section({
1585
+ section: section,
1586
+ count: 0,
1587
+ order: 'asc',
1588
+ date_filter: dates,
1589
+ times: times,
1590
+ output: output,
1591
+ totals: opt[:totals],
1592
+ duration: opt[:duration],
1593
+ sort_tags: opt[:sort_tags],
1594
+ config_template: 'default'
1595
+ })
1576
1596
  end
1577
1597
 
1578
1598
  ##
@@ -1595,6 +1615,7 @@ module Doing
1595
1615
  after: opt[:after],
1596
1616
  before: opt[:before],
1597
1617
  count: 0,
1618
+ duration: opt[:duration],
1598
1619
  from: opt[:from],
1599
1620
  order: opt[:order],
1600
1621
  output: output,
@@ -1626,8 +1647,13 @@ module Doing
1626
1647
  'wrap_width' => @config['wrap_width'] || 0,
1627
1648
  'date_format' => @config['default_date_format'],
1628
1649
  'order' => @config['order'] || 'asc',
1629
- 'tags_color' => @config['tags_color']
1650
+ 'tags_color' => @config['tags_color'],
1651
+ 'duration' => @config['duration'],
1652
+ 'interval_format' => @config['interval_format']
1630
1653
  })
1654
+ opt[:duration] ||= cfg['duration'] || false
1655
+ opt[:interval_format] ||= cfg['interval_format'] || 'text'
1656
+
1631
1657
  section ||= @config['current_section']
1632
1658
  section = guess_section(section)
1633
1659
 
@@ -1649,8 +1675,12 @@ module Doing
1649
1675
  'wrap_width' => @config['wrap_width'] || 0,
1650
1676
  'date_format' => @config['default_date_format'],
1651
1677
  'order' => @config['order'] || 'asc',
1652
- 'tags_color' => @config['tags_color']
1678
+ 'tags_color' => @config['tags_color'],
1679
+ 'duration' => @config['duration'],
1680
+ 'interval_format' => @config['interval_format']
1653
1681
  })
1682
+ options[:duration] ||= cfg['duration'] || false
1683
+ options[:interval_format] ||= cfg['interval_format'] || 'text'
1654
1684
 
1655
1685
  opts = {
1656
1686
  section: section,
@@ -1658,7 +1688,12 @@ module Doing
1658
1688
  count: 1,
1659
1689
  format: cfg['date_format'],
1660
1690
  template: cfg['template'],
1661
- times: times
1691
+ times: times,
1692
+ duration: options[:duration],
1693
+ interval_format: options[:interval_format],
1694
+ case: options[:case],
1695
+ not: options[:negate],
1696
+ config_template: 'last'
1662
1697
  }
1663
1698
 
1664
1699
  if options[:tag]
@@ -1669,9 +1704,7 @@ module Doing
1669
1704
  end
1670
1705
 
1671
1706
  opts[:search] = options[:search] if options[:search]
1672
- opts[:case] = options[:case]
1673
- opts[:not] = options[:negate]
1674
- opts[:config_template] = 'last'
1707
+
1675
1708
  list_section(opts)
1676
1709
  end
1677
1710
 
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.1pre
4
+ version: 2.1.2pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Terpstra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-27 00:00:00.000000000 Z
11
+ date: 2021-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: safe_yaml