doing 2.1.30 → 2.1.34

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 (142) hide show
  1. checksums.yaml +4 -4
  2. data/.irbrc +1 -0
  3. data/CHANGELOG.md +4972 -0
  4. data/Dockerfile-2.6 +3 -1
  5. data/Dockerfile-2.7 +4 -2
  6. data/Dockerfile-3.0 +3 -1
  7. data/Gemfile.lock +1 -67
  8. data/README.md +1 -1
  9. data/bash_profile +13 -0
  10. data/bin/commands/again.rb +1 -1
  11. data/bin/commands/archive.rb +3 -3
  12. data/bin/commands/cancel.rb +1 -1
  13. data/bin/commands/commands.rb +8 -8
  14. data/bin/commands/completion.rb +61 -19
  15. data/bin/commands/config.rb +22 -19
  16. data/bin/commands/done.rb +2 -2
  17. data/bin/commands/flag.rb +1 -1
  18. data/bin/commands/grep.rb +6 -33
  19. data/bin/commands/last.rb +1 -1
  20. data/bin/commands/meanwhile.rb +2 -2
  21. data/bin/commands/now.rb +2 -2
  22. data/bin/commands/on.rb +6 -16
  23. data/bin/commands/open.rb +1 -1
  24. data/bin/commands/recent.rb +5 -17
  25. data/bin/commands/rotate.rb +17 -0
  26. data/bin/commands/sections.rb +82 -7
  27. data/bin/commands/show.rb +8 -28
  28. data/bin/commands/since.rb +5 -16
  29. data/bin/commands/tag_dir.rb +27 -3
  30. data/bin/commands/today.rb +3 -28
  31. data/bin/commands/view.rb +3 -3
  32. data/bin/commands/yesterday.rb +3 -36
  33. data/bin/doing +29 -139
  34. data/docs/doc/Array.html +1 -1
  35. data/docs/doc/BooleanTermParser/Clause.html +1 -1
  36. data/docs/doc/BooleanTermParser/Operator.html +1 -1
  37. data/docs/doc/BooleanTermParser/Query.html +1 -1
  38. data/docs/doc/BooleanTermParser/QueryParser.html +1 -1
  39. data/docs/doc/BooleanTermParser/QueryTransformer.html +1 -1
  40. data/docs/doc/BooleanTermParser.html +1 -1
  41. data/docs/doc/Doing/Color.html +1 -1
  42. data/docs/doc/Doing/Completion.html +324 -4
  43. data/docs/doc/Doing/Configuration.html +3 -3
  44. data/docs/doc/Doing/Errors/DoingNoTraceError.html +1 -1
  45. data/docs/doc/Doing/Errors/DoingRuntimeError.html +1 -1
  46. data/docs/doc/Doing/Errors/DoingStandardError.html +1 -1
  47. data/docs/doc/Doing/Errors/EmptyInput.html +1 -1
  48. data/docs/doc/Doing/Errors/NoResults.html +1 -1
  49. data/docs/doc/Doing/Errors/PluginException.html +1 -1
  50. data/docs/doc/Doing/Errors/UserCancelled.html +1 -1
  51. data/docs/doc/Doing/Errors/WrongCommand.html +1 -1
  52. data/docs/doc/Doing/Errors.html +1 -1
  53. data/docs/doc/Doing/Hooks.html +1 -1
  54. data/docs/doc/Doing/Item.html +144 -3
  55. data/docs/doc/Doing/Items.html +209 -1
  56. data/docs/doc/Doing/LogAdapter.html +1 -1
  57. data/docs/doc/Doing/Logger.html +1807 -0
  58. data/docs/doc/Doing/Note.html +109 -3
  59. data/docs/doc/Doing/Pager.html +1 -1
  60. data/docs/doc/Doing/Plugins.html +1 -1
  61. data/docs/doc/Doing/Prompt.html +1 -1
  62. data/docs/doc/Doing/Section.html +1 -1
  63. data/docs/doc/Doing/TemplateString.html +1 -1
  64. data/docs/doc/Doing/Types.html +3 -3
  65. data/docs/doc/Doing/Util/Backup.html +1 -1
  66. data/docs/doc/Doing/Util.html +1 -1
  67. data/docs/doc/Doing/WWID.html +8 -58
  68. data/docs/doc/Doing.html +4 -4
  69. data/docs/doc/FalseClass.html +1 -1
  70. data/docs/doc/GLI/Commands/Help.html +1 -1
  71. data/docs/doc/GLI/Commands/MarkdownDocumentListener.html +1 -1
  72. data/docs/doc/GLI/Commands.html +1 -1
  73. data/docs/doc/GLI.html +1 -1
  74. data/docs/doc/Hash.html +1 -1
  75. data/docs/doc/Object.html +1 -1
  76. data/docs/doc/PhraseParser/Operator.html +1 -1
  77. data/docs/doc/PhraseParser/PhraseClause.html +1 -1
  78. data/docs/doc/PhraseParser/Query.html +1 -1
  79. data/docs/doc/PhraseParser/QueryParser.html +1 -1
  80. data/docs/doc/PhraseParser/QueryTransformer.html +1 -1
  81. data/docs/doc/PhraseParser/TermClause.html +1 -1
  82. data/docs/doc/PhraseParser.html +1 -1
  83. data/docs/doc/Status.html +1 -1
  84. data/docs/doc/String.html +1 -1
  85. data/docs/doc/Symbol.html +1 -1
  86. data/docs/doc/Time.html +1 -1
  87. data/docs/doc/TrueClass.html +1 -1
  88. data/docs/doc/_index.html +12 -10
  89. data/docs/doc/class_list.html +1 -1
  90. data/docs/doc/file.README.html +2 -2
  91. data/docs/doc/index.html +2 -2
  92. data/docs/doc/method_list.html +424 -304
  93. data/docs/doc/top-level-namespace.html +105 -1
  94. data/docs/index.md +1 -1
  95. data/doing.gemspec +24 -24
  96. data/doing.rdoc +259 -26
  97. data/example_plugin.rb +7 -5
  98. data/inputrc +57 -0
  99. data/lib/completion/_doing.zsh +48 -52
  100. data/lib/completion/doing.bash +14 -25
  101. data/lib/completion/doing.fish +41 -15
  102. data/lib/doing/add_options.rb +152 -0
  103. data/lib/doing/array/array.rb +16 -0
  104. data/lib/doing/changelog/changes.rb +1 -1
  105. data/lib/doing/chronify/string.rb +1 -1
  106. data/lib/doing/completion/bash_completion.rb +12 -51
  107. data/lib/doing/completion/fish_completion.rb +17 -53
  108. data/lib/doing/completion/zsh_completion.rb +21 -59
  109. data/lib/doing/completion.rb +203 -17
  110. data/lib/doing/configuration.rb +7 -1
  111. data/lib/doing/item.rb +30 -5
  112. data/lib/doing/items.rb +53 -5
  113. data/lib/doing/{log_adapter.rb → logger.rb} +8 -2
  114. data/lib/doing/note.rb +24 -8
  115. data/lib/doing/plugins/export/dayone_export.rb +8 -6
  116. data/lib/doing/plugins/export/html_export.rb +4 -4
  117. data/lib/doing/plugins/export/json_export.rb +19 -20
  118. data/lib/doing/plugins/export/markdown_export.rb +2 -2
  119. data/lib/doing/plugins/export/template_export.rb +4 -4
  120. data/lib/doing/plugins/import/calendar_import.rb +2 -2
  121. data/lib/doing/plugins/import/doing_import.rb +2 -2
  122. data/lib/doing/plugins/import/timing_import.rb +2 -2
  123. data/lib/doing/string/highlight.rb +3 -4
  124. data/lib/doing/string/string.rb +8 -0
  125. data/lib/doing/string/tags.rb +1 -1
  126. data/lib/doing/types.rb +2 -2
  127. data/lib/doing/util.rb +1 -1
  128. data/lib/doing/util_backup.rb +12 -12
  129. data/lib/doing/version.rb +1 -1
  130. data/lib/doing/wwid.rb +119 -120
  131. data/lib/doing.rb +61 -3
  132. data/lib/examples/commands/wiki.rb +27 -19
  133. data/lib/examples/plugins/capture_thing_import.rb +1 -1
  134. data/lib/helpers/threaded_tests.rb +2 -0
  135. data/scripts/setting_replace.rb +11 -0
  136. metadata +109 -124
  137. data/.yardoc/checksums +0 -29
  138. data/.yardoc/complete +0 -0
  139. data/.yardoc/object_types +0 -0
  140. data/.yardoc/objects/root.dat +0 -0
  141. data/.yardoc/proxy_types +0 -0
  142. data/bin/commands/add_section.rb +0 -15
data/bin/commands/open.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # @@open
2
2
  desc 'Open the "doing" file in an editor'
3
3
  long_desc "`doing open` defaults to using the editors.doing_file setting
4
- in #{@config.config_file} (#{Doing::Util.find_default_editor('doing_file')})."
4
+ in #{Doing.config.config_file} (#{Doing::Util.find_default_editor('doing_file')})."
5
5
  command :open do |c|
6
6
  c.example 'doing open', desc: 'Open the doing file in the default editor'
7
7
  c.desc 'Open with editor command (e.g. vim, mate)'
@@ -12,9 +12,6 @@ command :recent do |c|
12
12
  c.arg_name 'NAME'
13
13
  c.flag %i[s section], default_value: 'All'
14
14
 
15
- c.desc 'Show time intervals on @done tasks'
16
- c.switch %i[t times], default_value: true, negatable: true
17
-
18
15
  c.desc "Output using a template from configuration"
19
16
  c.arg_name 'TEMPLATE_KEY'
20
17
  c.flag [:config_template], type: TemplateName, default_value: 'recent'
@@ -23,26 +20,17 @@ command :recent do |c|
23
20
  c.arg_name 'TEMPLATE_STRING'
24
21
  c.flag [:template]
25
22
 
26
- c.desc 'Show elapsed time on entries without @done tag'
27
- c.switch [:duration]
28
-
29
- c.desc 'Show intervals with totals at the end of output'
30
- c.switch [:totals], default_value: false, negatable: false
31
-
32
- c.desc 'Sort tags by (name|time)'
33
- default = @settings['tag_sort'].normalize_tag_sort || :name
34
- c.arg_name 'KEY'
35
- c.flag [:tag_sort], must_match: REGEX_TAG_SORT, default_value: default, type: TagSortSymbol
36
-
37
23
  c.desc 'Select from a menu of matching entries to perform additional operations'
38
24
  c.switch %i[i interactive], negatable: false, default_value: false
39
25
 
26
+ add_options(:time_display, c)
27
+
40
28
  c.action do |global_options, options, args|
41
29
  section = @wwid.guess_section(options[:section]) || options[:section].cap_first
42
30
 
43
31
  unless global_options[:version]
44
- if @settings['templates']['recent'].key?('count')
45
- config_count = @settings['templates']['recent']['count'].to_i
32
+ if Doing.setting('templates.recent.count')
33
+ config_count = Doing.setting('templates.recent.count').to_i
46
34
  else
47
35
  config_count = 10
48
36
  end
@@ -56,7 +44,7 @@ command :recent do |c|
56
44
  options[:times] = true if options[:totals]
57
45
  options[:sort_tags] = options[:tag_sort]
58
46
 
59
- template = @settings['templates']['recent'].deep_merge(@settings['templates']['default'])
47
+ template = Doing.setting('templates.recent').deep_merge(Doing.setting('templates.default'))
60
48
  tags_color = template.key?('tags_color') ? template['tags_color'] : nil
61
49
 
62
50
  opts = {
@@ -40,3 +40,20 @@ command :rotate do |c|
40
40
  @wwid.rotate(options)
41
41
  end
42
42
  end
43
+
44
+ # # @@doctor
45
+
46
+ # desc 'Doing file maintenance.'
47
+ # long_desc %(Duplicate entries compressed to a single entry. This will modify the doing file.)
48
+ # command :doctor do |c|
49
+ # c.example 'doing doctor', desc: 'Clean up the Doing file, sorting and removing duplicates'
50
+
51
+ # c.desc 'Only remove duplicates in the same section'
52
+ # c.switch %i[s same_section], negatable: false, default_value: false
53
+
54
+ # c.action do |_global_options, options, _args|
55
+ # @wwid.content.dedup!(match_section: options[:same_section])
56
+ # @wwid.write(@wwid.doing_file)
57
+ # end
58
+ # end
59
+
@@ -1,11 +1,86 @@
1
- # @@sections
2
- desc 'List sections'
1
+ # frozen_string_literal: true
2
+
3
+ # @@add_section
4
+ desc 'List, add, or remove sections in the Doing file'
3
5
  command :sections do |c|
4
- c.desc 'List in single column'
5
- c.switch %i[c column], negatable: false, default_value: false
6
+ c.default_command :list
7
+
8
+ c.example 'doing sections add Ideas', desc: 'Add a section called Ideas to the doing file'
9
+ c.example 'doing sections remove Reminders', desc: 'Remove the section Reminders'
10
+ c.example 'doing sections list', desc: 'List all sections'
11
+
12
+ c.desc 'Add a section'
13
+ c.arg_name 'SECTION_NAME'
14
+ c.command :add do |add|
15
+ add.action do |_g, _o, args|
16
+ raise InvalidArgument, "Section #{args[0]} already exists" if @wwid.sections.include?(args[0])
17
+
18
+ @wwid.content.add_section(args.join(' ').cap_first, log: true)
19
+ @wwid.write(@wwid.doing_file)
20
+ end
21
+ end
22
+
23
+ c.desc 'List sections'
24
+ c.command :list do |list|
25
+ list.desc 'List in single column'
26
+ list.switch %i[c column], negatable: false, default_value: false
27
+
28
+ list.action do |_global_options, options, _args|
29
+ joiner = options[:column] ? "\n" : "\t"
30
+ print @wwid.content.section_titles.join(joiner)
31
+ end
32
+ end
33
+
34
+ c.desc 'Remove a section'
35
+ c.arg_name 'SECTION_NAME'
36
+ c.command :remove do |remove|
37
+ remove.desc 'Archive entries in section before deleting. --no-archive permanently deletes section contents'
38
+ remove.switch %i[a archive], default_value: true, negatable: true
39
+
40
+ remove.action do |_g, options, args|
41
+ raise InvalidArgument, '--delete cannot be used with --archive' if options[:delete] && options[:archive]
42
+
43
+ section = args[0].cap_first
44
+
45
+ unless @wwid.sections.include?(section)
46
+ Doing.logger.log_now(:warn, 'Section:', "#{section} not found, did you mean #{guess_section(section)}?")
47
+ raise InvalidArgument, "Section #{args[0]} doesn't exist"
6
48
 
7
- c.action do |_global_options, options, _args|
8
- joiner = options[:column] ? "\n" : "\t"
9
- print @wwid.content.section_titles.join(joiner)
49
+ end
50
+
51
+ items = @wwid.content.in_section(section)
52
+
53
+ if items.count.positive?
54
+ res = Doing::Prompt.yn("#{options[:archive] ? 'Archive' : 'Delete'} #{items.count} entries from #{section}", default_response: 'n')
55
+
56
+ if options[:archive] && res
57
+ @wwid.archive(section, {keep: 0})
58
+ elsif res
59
+ items.each { |item| @wwid.content.delete_item(item) }
60
+ end
61
+ end
62
+
63
+ @wwid.content.delete_section(section, log: true)
64
+
65
+ @wwid.write(@wwid.doing_file)
66
+ end
67
+ end
68
+ end
69
+
70
+ # For backward compatibility
71
+ # @@add_section
72
+ command :add_section do |c|
73
+ c.desc 'Archive entries in section before deleting'
74
+ c.switch %i[a archive], default_value: true, negatable: true
75
+
76
+ c.desc 'Permanently delete entries in section'
77
+ c.switch %i[d delete], default_value: false
78
+
79
+ c.action do |g, o, a|
80
+ cmd = commands[:sections].commands[:add]
81
+
82
+ action = cmd.send(:get_action, nil)
83
+ action.call(g, o, a)
10
84
  end
11
85
  end
86
+
data/bin/commands/show.rb CHANGED
@@ -27,33 +27,12 @@ command :show do |c|
27
27
  c.flag %i[a age], default_value: :newest, type: AgeSymbol
28
28
 
29
29
  c.desc "Highlight search matches in output. Only affects command line output"
30
- c.switch %i[h hilite], default_value: @settings.dig('search', 'highlight')
30
+ c.switch %i[h hilite], default_value: Doing.settings.dig('search', 'highlight')
31
31
 
32
32
  c.desc 'Sort order (asc/desc)'
33
33
  c.arg_name 'ORDER'
34
34
  c.flag %i[s sort], must_match: REGEX_SORT_ORDER, default_value: :asc, type: OrderSymbol
35
35
 
36
- c.desc 'Show time intervals on @done tasks'
37
- c.switch %i[t times], default_value: true, negatable: true
38
-
39
- c.desc 'Show elapsed time on entries without @done tag'
40
- c.switch [:duration]
41
-
42
- c.desc 'Show intervals with totals at the end of output'
43
- c.switch [:totals], default_value: false, negatable: false
44
-
45
- c.desc 'Sort tags by (name|time)'
46
- default = @settings['tag_sort'].normalize_tag_sort || :name
47
- c.arg_name 'KEY'
48
- c.flag [:tag_sort], must_match: REGEX_TAG_SORT, default_value: default, type: TagSortSymbol
49
-
50
- c.desc 'Tag sort direction (asc|desc)'
51
- c.arg_name 'DIRECTION'
52
- c.flag [:tag_order], must_match: REGEX_SORT_ORDER, default_value: :asc, type: OrderSymbol
53
-
54
- c.desc 'Only show items with recorded time intervals'
55
- c.switch [:only_timed], default_value: false, negatable: false
56
-
57
36
  c.desc "Output using a template from configuration"
58
37
  c.arg_name 'TEMPLATE_KEY'
59
38
  c.flag [:config_template], type: TemplateName, default_value: 'default'
@@ -72,6 +51,7 @@ command :show do |c|
72
51
  c.arg_name 'FORMAT'
73
52
  c.flag %i[o output]
74
53
 
54
+ add_options(:time_display, c)
75
55
  add_options(:search, c)
76
56
  add_options(:tag_filter, c)
77
57
  add_options(:date_filter, c)
@@ -118,7 +98,7 @@ command :show do |c|
118
98
  end
119
99
  end
120
100
  else
121
- section = options[:menu] ? @wwid.choose_section(include_all: true) : @settings['current_section']
101
+ section = options[:menu] ? @wwid.choose_section(include_all: true) : Doing.setting('current_section')
122
102
  section ||= 'All'
123
103
  end
124
104
 
@@ -126,11 +106,11 @@ command :show do |c|
126
106
 
127
107
  options[:times] = true if options[:totals]
128
108
 
129
- template = @settings['templates'][options[:config_template]].deep_merge({
130
- 'wrap_width' => @settings['wrap_width'] || 0,
131
- 'date_format' => @settings['default_date_format'],
132
- 'order' => @settings['order']&.normalize_order || :asc,
133
- 'tags_color' => @settings['tags_color']
109
+ template = Doing.setting(['templates', options[:config_template]]).deep_merge({
110
+ 'wrap_width' => Doing.setting('wrap_width') || 0,
111
+ 'date_format' => Doing.setting('default_date_format'),
112
+ 'order' => Doing.setting('order')&.normalize_order || :asc,
113
+ 'tags_color' => Doing.setting('tags_color')
134
114
  })
135
115
 
136
116
  if options[:search]
@@ -11,20 +11,6 @@ command :since do |c|
11
11
  c.arg_name 'NAME'
12
12
  c.flag %i[s section], default_value: 'All'
13
13
 
14
- c.desc 'Show time intervals on @done tasks'
15
- c.switch %i[t times], default_value: true, negatable: true
16
-
17
- c.desc 'Show elapsed time on entries without @done tag'
18
- c.switch [:duration]
19
-
20
- c.desc 'Show time totals at the end of output'
21
- c.switch [:totals], default_value: false, negatable: false
22
-
23
- c.desc 'Sort tags by (name|time)'
24
- default = @settings['tag_sort'].normalize_tag_sort || :name
25
- c.arg_name 'KEY'
26
- c.flag [:tag_sort], must_match: REGEX_TAG_SORT, default_value: default, type: TagSortSymbol
27
-
28
14
  c.desc "Output to export format (#{Doing::Plugins.plugin_names(type: :export)})"
29
15
  c.arg_name 'FORMAT'
30
16
  c.flag %i[o output]
@@ -37,6 +23,10 @@ command :since do |c|
37
23
  c.arg_name 'TEMPLATE_STRING'
38
24
  c.flag [:template]
39
25
 
26
+ add_options(:time_display, c)
27
+ add_options(:tag_filter, c)
28
+ add_options(:search, c)
29
+
40
30
  c.action do |_global_options, options, args|
41
31
  raise DoingRuntimeError, %(Invalid output type "#{options[:output]}") if options[:output] && options[:output] !~ Doing::Plugins.plugin_regex(type: :export)
42
32
 
@@ -57,7 +47,6 @@ command :since do |c|
57
47
  options[:times] = true if options[:totals]
58
48
  options[:sort_tags] = options[:tag_sort]
59
49
 
60
- Doing::Pager.page @wwid.list_date([start, finish], options[:section], options[:times], options[:output],
61
- { template: options[:template], config_template: options[:config_template], duration: options[:duration], totals: options[:totals], sort_tags: options[:sort_tags] }).chomp
50
+ Doing::Pager.page @wwid.list_date([start, finish], options[:section], options[:times], options[:output], options).chomp
62
51
  end
63
52
  end
@@ -5,7 +5,7 @@ subdirectories will be tagged with the default tags. You can modify these any ti
5
5
  manually editing the .doingrc file.'
6
6
  arg_name 'TAG [TAG..]'
7
7
  command :tag_dir do |c|
8
- c.example 'doing tag_dir project1 project2', desc: 'Add @project1 and @project to to any entries in the current directory'
8
+ c.example 'doing tag_dir project1 project2', desc: 'Add @project1 and @project2 to to any entries created from the current directory'
9
9
  c.example 'doing tag_dir --remove', desc: 'Clear the default tags for the directory'
10
10
 
11
11
  c.desc 'Remove all default_tags from the local .doingrc'
@@ -16,14 +16,38 @@ command :tag_dir do |c|
16
16
 
17
17
  cfg_cmd = commands[:config]
18
18
  set_cmd = cfg_cmd.commands[:set]
19
- set_options = {}
19
+
20
+ set_options = { local: true }
20
21
  if options[:remove]
21
22
  set_args = ['default_tags']
22
23
  set_options[:remove] = true
23
24
  else
25
+ current_tags = Doing.setting('default_tags')
26
+
27
+ tags.delete_if do |tag|
28
+ if current_tags.include?(tag)
29
+ Doing.logger.info('Skipped:', "#{tag} is already applied by existing config")
30
+ true
31
+ else
32
+ false
33
+ end
34
+ end
35
+
36
+ raise EmptyInput, 'No new tags provided' if tags.empty?
37
+
38
+ if File.exist?('.doingrc')
39
+ local = Doing::Util.safe_load_file('.doingrc')
40
+ dir_tags = local['default_tags'] || []
41
+
42
+ tags.concat(dir_tags)
43
+ tags.sort!.uniq!
44
+
45
+ raise UserCancelled, 'Tag(s) already exist for directory' if tags == dir_tags.sort
46
+ end
47
+
24
48
  set_args = ['default_tags', tags.join(',')]
25
49
  end
26
50
  action = set_cmd.send(:get_action, nil)
27
- return action.call(global, set_options, set_args)
51
+ action.call(global, set_options, set_args)
28
52
  end
29
53
  end
@@ -12,20 +12,6 @@ command :today do |c|
12
12
  c.arg_name 'NAME'
13
13
  c.flag %i[s section], default_value: 'All'
14
14
 
15
- c.desc 'Show time intervals on @done tasks'
16
- c.switch %i[t times], default_value: true, negatable: true
17
-
18
- c.desc 'Show elapsed time on entries without @done tag'
19
- c.switch [:duration]
20
-
21
- c.desc 'Show time totals at the end of output'
22
- c.switch [:totals], default_value: false, negatable: false
23
-
24
- c.desc 'Sort tags by (name|time)'
25
- default = @settings['tag_sort'].normalize_tag_sort || :name
26
- c.arg_name 'KEY'
27
- c.flag [:tag_sort], must_match: REGEX_TAG_SORT, default_value: default, type: TagSortSymbol
28
-
29
15
  c.desc "Output to export format (#{Doing::Plugins.plugin_names(type: :export)})"
30
16
  c.arg_name 'FORMAT'
31
17
  c.flag %i[o output]
@@ -38,26 +24,15 @@ command :today do |c|
38
24
  c.arg_name 'TEMPLATE_STRING'
39
25
  c.flag [:template]
40
26
 
41
- c.desc 'View entries before specified time (e.g. 8am, 12:30pm, 15:00)'
42
- c.arg_name 'TIME_STRING'
43
- c.flag [:before]
44
-
45
- c.desc 'View entries after specified time (e.g. 8am, 12:30pm, 15:00)'
46
- c.arg_name 'TIME_STRING'
47
- c.flag [:after]
48
-
49
- c.desc %(
50
- Time range to show `doing today --from "12pm to 4pm"`
51
- )
52
- c.arg_name 'TIME_RANGE'
53
- c.flag [:from], type: DateRangeString
27
+ add_options(:time_filter, c)
28
+ add_options(:time_display, c)
54
29
 
55
30
  c.action do |_global_options, options, _args|
56
31
  raise DoingRuntimeError, %(Invalid output type "#{options[:output]}") if options[:output] && options[:output] !~ Doing::Plugins.plugin_regex(type: :export)
57
32
 
58
33
  options[:times] = true if options[:totals]
59
34
  options[:sort_tags] = options[:tag_sort]
60
- filter_options = %i[after before duration from section sort_tags totals template config_template].each_with_object({}) { |k, hsh| hsh[k] = options[k] }
35
+ filter_options = %i[after before times duration from section sort_tags totals tag_order template config_template only_timed].each_with_object({}) { |k, hsh| hsh[k] = options[k] }
61
36
 
62
37
  Doing::Pager.page @wwid.today(options[:times], options[:output], filter_options).chomp
63
38
  end
data/bin/commands/view.rb CHANGED
@@ -36,7 +36,7 @@ command :view do |c|
36
36
  c.switch [:color], default_value: true, negatable: true
37
37
 
38
38
  c.desc "Highlight search matches in output. Only affects command line output"
39
- c.switch %i[h hilite], default_value: @settings.dig('search', 'highlight')
39
+ c.switch %i[h hilite], default_value: Doing.settings.dig('search', 'highlight')
40
40
 
41
41
  c.desc 'Sort tags by (name|time)'
42
42
  c.arg_name 'KEY'
@@ -82,7 +82,7 @@ command :view do |c|
82
82
  section = if options[:section]
83
83
  @wwid.guess_section(options[:section]) || options[:section].cap_first
84
84
  else
85
- @settings['current_section']
85
+ Doing.setting('current_section')
86
86
  end
87
87
 
88
88
  view = @wwid.get_view(title)
@@ -134,7 +134,7 @@ command :view do |c|
134
134
  section = if options[:section]
135
135
  section
136
136
  else
137
- view['section'] || @settings['current_section']
137
+ view['section'] || Doing.setting('current_section')
138
138
  end
139
139
  order = if view.key?('order')
140
140
  view['order'].normalize_order
@@ -23,49 +23,16 @@ command :yesterday do |c|
23
23
  c.arg_name 'TEMPLATE_STRING'
24
24
  c.flag [:template]
25
25
 
26
- c.desc 'Show time intervals on @done tasks'
27
- c.switch %i[t times], default_value: true, negatable: true
28
-
29
- c.desc 'Show elapsed time on entries without @done tag'
30
- c.switch [:duration]
31
-
32
- c.desc 'Show time totals at the end of output'
33
- c.switch [:totals], default_value: false, negatable: false
34
-
35
- c.desc 'Sort tags by (name|time)'
36
- default = @settings['tag_sort'].normalize_tag_sort || :name
37
- c.arg_name 'KEY'
38
- c.flag [:tag_sort], must_match: REGEX_TAG_SORT, default_value: default, type: TagSortSymbol
39
-
40
- c.desc 'View entries before specified time (e.g. 8am, 12:30pm, 15:00)'
41
- c.arg_name 'TIME_STRING'
42
- c.flag [:before]
43
-
44
- c.desc 'View entries after specified time (e.g. 8am, 12:30pm, 15:00)'
45
- c.arg_name 'TIME_STRING'
46
- c.flag [:after]
47
-
48
- c.desc 'Time range to show, e.g. `doing yesterday --from "1am to 8am"`'
49
- c.arg_name 'TIME_RANGE'
50
- c.flag [:from], must_match: REGEX_TIME_RANGE
51
-
52
- c.desc 'Tag sort direction (asc|desc)'
53
- c.arg_name 'DIRECTION'
54
- c.flag [:tag_order], must_match: REGEX_SORT_ORDER, default_value: :asc, type: OrderSymbol
26
+ add_options(:time_filter, c)
27
+ add_options(:time_display, c)
55
28
 
56
29
  c.action do |_global_options, options, _args|
57
30
  raise DoingRuntimeError, %(Invalid output type "#{options[:output]}") if options[:output] && options[:output] !~ Doing::Plugins.plugin_regex(type: :export)
58
31
 
59
32
  options[:sort_tags] = options[:tag_sort]
60
33
 
61
- if options[:from]
62
- options[:from] = options[:from].split(/#{REGEX_RANGE_INDICATOR}/).map do |time|
63
- "yesterday #{time.sub(/(?mi)(^.*?(?=\d+)|(?<=[ap]m).*?$)/, '')}"
64
- end.join(' to ').split_date_range
65
- end
66
-
67
34
  opt = options.clone
68
- opt[:order] = @settings.dig('templates', options[:config_template], 'order')
35
+ opt[:order] = Doing.setting(['templates', options[:config_template], 'order'])
69
36
 
70
37
  Doing::Pager.page @wwid.yesterday(options[:section], options[:times], options[:output], opt).chomp
71
38
  end