doing 2.1.1pre → 2.1.2pre

Sign up to get free protection for your applications and to get access to all the features.
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