doing 2.1.4pre → 2.1.5pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/.yardoc/checksums +14 -13
  3. data/.yardoc/object_types +0 -0
  4. data/.yardoc/objects/root.dat +0 -0
  5. data/CHANGELOG.md +21 -0
  6. data/Gemfile.lock +3 -1
  7. data/README.md +1 -1
  8. data/bin/doing +149 -91
  9. data/doc/Array.html +63 -1
  10. data/doc/BooleanTermParser/Clause.html +293 -0
  11. data/doc/BooleanTermParser/Operator.html +172 -0
  12. data/doc/BooleanTermParser/Query.html +417 -0
  13. data/doc/BooleanTermParser/QueryParser.html +135 -0
  14. data/doc/BooleanTermParser/QueryTransformer.html +124 -0
  15. data/doc/BooleanTermParser.html +115 -0
  16. data/doc/Doing/CLIFormat.html +131 -0
  17. data/doc/Doing/Color.html +2 -2
  18. data/doc/Doing/Completion.html +1 -1
  19. data/doc/Doing/Configuration.html +116 -12
  20. data/doc/Doing/Errors/DoingNoTraceError.html +1 -1
  21. data/doc/Doing/Errors/DoingRuntimeError.html +1 -1
  22. data/doc/Doing/Errors/DoingStandardError.html +1 -1
  23. data/doc/Doing/Errors/EmptyInput.html +1 -1
  24. data/doc/Doing/Errors/NoResults.html +1 -1
  25. data/doc/Doing/Errors/PluginException.html +1 -1
  26. data/doc/Doing/Errors/UserCancelled.html +1 -1
  27. data/doc/Doing/Errors/WrongCommand.html +1 -1
  28. data/doc/Doing/Errors.html +1 -1
  29. data/doc/Doing/Hooks.html +1 -1
  30. data/doc/Doing/Item.html +100 -73
  31. data/doc/Doing/Items.html +2 -2
  32. data/doc/Doing/LogAdapter.html +70 -1
  33. data/doc/Doing/Note.html +5 -134
  34. data/doc/Doing/Pager.html +1 -1
  35. data/doc/Doing/Plugins.html +380 -40
  36. data/doc/Doing/Prompt.html +1 -1
  37. data/doc/Doing/Section.html +1 -1
  38. data/doc/Doing/TemplateString.html +713 -0
  39. data/doc/Doing/Util/Backup.html +686 -0
  40. data/doc/Doing/Util.html +1 -1
  41. data/doc/Doing/WWID.html +5 -5
  42. data/doc/Doing.html +4 -4
  43. data/doc/GLI/Commands/MarkdownDocumentListener.html +1 -1
  44. data/doc/GLI/Commands.html +1 -1
  45. data/doc/GLI.html +1 -1
  46. data/doc/Hash.html +1 -1
  47. data/doc/PhraseParser/Operator.html +172 -0
  48. data/doc/PhraseParser/PhraseClause.html +303 -0
  49. data/doc/PhraseParser/Query.html +495 -0
  50. data/doc/PhraseParser/QueryParser.html +136 -0
  51. data/doc/PhraseParser/QueryTransformer.html +124 -0
  52. data/doc/PhraseParser/TermClause.html +293 -0
  53. data/doc/PhraseParser.html +115 -0
  54. data/doc/Status.html +1 -1
  55. data/doc/String.html +182 -12
  56. data/doc/Symbol.html +35 -1
  57. data/doc/Time.html +1 -1
  58. data/doc/_index.html +21 -14
  59. data/doc/class_list.html +1 -1
  60. data/doc/file.README.html +2 -2
  61. data/doc/index.html +2 -2
  62. data/doc/method_list.html +319 -175
  63. data/doc/top-level-namespace.html +1 -1
  64. data/doing.gemspec +1 -0
  65. data/doing.rdoc +56 -9
  66. data/lib/doing/array.rb +9 -0
  67. data/lib/doing/configuration.rb +30 -8
  68. data/lib/doing/item.rb +12 -3
  69. data/lib/doing/log_adapter.rb +28 -0
  70. data/lib/doing/note.rb +31 -30
  71. data/lib/doing/plugin_manager.rb +57 -13
  72. data/lib/doing/plugins/export/dayone_export.rb +209 -0
  73. data/lib/doing/plugins/export/template_export.rb +90 -85
  74. data/lib/doing/prompt.rb +9 -6
  75. data/lib/doing/string.rb +68 -27
  76. data/lib/doing/symbol.rb +4 -0
  77. data/lib/doing/template_string.rb +197 -0
  78. data/lib/doing/util.rb +4 -2
  79. data/lib/doing/util_backup.rb +55 -3
  80. data/lib/doing/version.rb +1 -1
  81. data/lib/doing/wwid.rb +27 -18
  82. data/lib/doing.rb +3 -0
  83. data/lib/templates/doing-dayone-entry.erb +6 -0
  84. data/lib/templates/doing-dayone.erb +5 -0
  85. metadata +42 -2
@@ -102,7 +102,7 @@
102
102
  </div>
103
103
 
104
104
  <div id="footer">
105
- Generated on Fri Dec 17 16:17:18 2021 by
105
+ Generated on Sun Dec 19 12:35:32 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.gemspec CHANGED
@@ -41,5 +41,6 @@ spec = Gem::Specification.new do |s|
41
41
  s.add_runtime_dependency('tty-which', '~> 0.5', '>= 0.5.0')
42
42
  s.add_runtime_dependency('tty-markdown', '~> 0.7', '>= 0.7.0')
43
43
  s.add_runtime_dependency('parslet', '~> 2.0', '>= 2.0.0')
44
+ s.add_runtime_dependency('plist', '~> 3.6', '>= 3.6.0')
44
45
  # s.add_runtime_dependency('amatch', '~> 0.4', '>= 0.4.0')
45
46
  end
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.4pre
8
+ v2.1.5pre
9
9
 
10
10
  === Global Options
11
11
  === --config_file arg
@@ -711,7 +711,7 @@ Date range to show, or a single day to filter date on.
711
711
 
712
712
  ===== -o|--output FORMAT
713
713
 
714
- Output to export format (csv|doing|html|markdown|say|taskpaper|template|timeline|wiki)
714
+ Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|markdown|say|taskpaper|template|timeline|wiki)
715
715
 
716
716
  [Default Value] None
717
717
 
@@ -1204,7 +1204,7 @@ it will create a range.
1204
1204
  ===== Options
1205
1205
  ===== -o|--output FORMAT
1206
1206
 
1207
- Output to export format (csv|doing|html|markdown|say|taskpaper|template|timeline|wiki)
1207
+ Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|markdown|say|taskpaper|template|timeline|wiki)
1208
1208
 
1209
1209
  [Default Value] None
1210
1210
 
@@ -1532,7 +1532,7 @@ Move selected items to section
1532
1532
 
1533
1533
  ===== -o|--output FORMAT
1534
1534
 
1535
- Output entries to format (csv|doing|html|markdown|say|taskpaper|template|timeline|wiki)
1535
+ Output entries to format (csv|dayone|dayone-days|dayone-entries|doing|html|markdown|say|taskpaper|template|timeline|wiki)
1536
1536
 
1537
1537
  [Default Value] None
1538
1538
 
@@ -1669,6 +1669,7 @@ Show entries older than date. If this is only a time (8am, 1:30pm, 15:00), all d
1669
1669
  Max count to show
1670
1670
 
1671
1671
  [Default Value] 0
1672
+ [Must Match] (?-mix:^\d+$)
1672
1673
 
1673
1674
 
1674
1675
  ===== --case TYPE
@@ -1693,7 +1694,7 @@ Date range to show, or a single day to filter date on.
1693
1694
 
1694
1695
  ===== -o|--output FORMAT
1695
1696
 
1696
- Output to export format (csv|doing|html|markdown|say|taskpaper|template|timeline|wiki)
1697
+ Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|markdown|say|taskpaper|template|timeline|wiki)
1697
1698
 
1698
1699
  [Default Value] None
1699
1700
 
@@ -1784,7 +1785,7 @@ and "2d" would be interpreted as "two days ago."
1784
1785
  ===== Options
1785
1786
  ===== -o|--output FORMAT
1786
1787
 
1787
- Output to export format (csv|doing|html|markdown|say|taskpaper|template|timeline|wiki)
1788
+ Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|markdown|say|taskpaper|template|timeline|wiki)
1788
1789
 
1789
1790
  [Default Value] None
1790
1791
 
@@ -1939,6 +1940,22 @@ List all tags in the current Doing file
1939
1940
 
1940
1941
 
1941
1942
  ===== Options
1943
+ ===== --bool BOOLEAN
1944
+
1945
+ Boolean used to combine multiple tags. Use PATTERN to parse + and - as booleans.
1946
+
1947
+ [Default Value] PATTERN
1948
+ [Must Match] (?i-mx:^(?:and|all|any|or|not|none|p(?:at(?:tern)?)?)$)
1949
+
1950
+
1951
+ ===== --case TYPE
1952
+
1953
+ Case sensitivity for search string matching [(c)ase-sensitive, (i)gnore, (s)mart]
1954
+
1955
+ [Default Value] smart
1956
+ [Must Match] (?-mix:^[csi])
1957
+
1958
+
1942
1959
  ===== -o|--order ORDER
1943
1960
 
1944
1961
  Sort order (asc/desc)
@@ -1954,6 +1971,14 @@ Section
1954
1971
  [Default Value] All
1955
1972
 
1956
1973
 
1974
+ ===== --search QUERY
1975
+
1976
+ Get tags for items matching search. Surround with
1977
+ slashes for regex (e.g. "/query/"), start with a single quote for exact match ("'query").
1978
+
1979
+ [Default Value] None
1980
+
1981
+
1957
1982
  ===== --sort SORT_ORDER
1958
1983
 
1959
1984
  Sort by name or count
@@ -1962,11 +1987,33 @@ Sort by name or count
1962
1987
  [Must Match] (?-mix:^(?:n(?:ame)?|c(?:ount)?)$)
1963
1988
 
1964
1989
 
1990
+ ===== --tag TAG
1991
+
1992
+ Get tags for entries matching tags. Combine multiple tags with a comma. Wildcards allowed (*, ?).
1993
+
1994
+ [Default Value] None
1995
+
1996
+
1965
1997
  ===== -c|--[no-]counts
1966
1998
  Show count of occurrences
1967
1999
 
1968
2000
 
1969
2001
 
2002
+ ===== -i|--interactive
2003
+ Select items to scan from a menu of matching entries
2004
+
2005
+
2006
+
2007
+ ===== --not
2008
+ Get tags from items that *don't* match search/tag filters
2009
+
2010
+
2011
+
2012
+ ===== -x|--exact
2013
+ Force exact search string matching (case sensitive)
2014
+
2015
+
2016
+
1970
2017
  ==== Command: <tt>template TYPE</tt>
1971
2018
  Output HTML, CSS, and Markdown (ERB) templates for customization
1972
2019
 
@@ -2016,7 +2063,7 @@ Time range to show `doing today --from "12pm to 4pm"`
2016
2063
 
2017
2064
  ===== -o|--output FORMAT
2018
2065
 
2019
- Output to export format (csv|doing|html|markdown|say|taskpaper|template|timeline|wiki)
2066
+ Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|markdown|say|taskpaper|template|timeline|wiki)
2020
2067
 
2021
2068
  [Default Value] None
2022
2069
 
@@ -2141,7 +2188,7 @@ Date range to show, or a single day to filter date on.
2141
2188
 
2142
2189
  ===== -o|--output FORMAT
2143
2190
 
2144
- Output to export format (csv|doing|html|markdown|say|taskpaper|template|timeline|wiki)
2191
+ Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|markdown|say|taskpaper|template|timeline|wiki)
2145
2192
 
2146
2193
  [Default Value] None
2147
2194
 
@@ -2324,7 +2371,7 @@ Time range to show, e.g. `doing yesterday --from "1am to 8am"`
2324
2371
 
2325
2372
  ===== -o|--output FORMAT
2326
2373
 
2327
- Output to export format (csv|doing|html|markdown|say|taskpaper|template|timeline|wiki)
2374
+ Output to export format (csv|dayone|dayone-days|dayone-entries|doing|html|markdown|say|taskpaper|template|timeline|wiki)
2328
2375
 
2329
2376
  [Default Value] None
2330
2377
 
data/lib/doing/array.rb CHANGED
@@ -5,6 +5,15 @@ module Doing
5
5
  ## Array helpers
6
6
  ##
7
7
  class ::Array
8
+ ##
9
+ ## Convert an @tags to plain strings
10
+ ##
11
+ ## @return [Array] array of strings
12
+ ##
13
+ def tags_to_array
14
+ map { |t| t.sub(/^@/, '') }
15
+ end
16
+
8
17
  # Convert strings to @tags
9
18
  #
10
19
  # @example `['one', '@two', 'three'].to_tags`
@@ -29,8 +29,8 @@ module Doing
29
29
  'plugin_path' => File.join(Util.user_home, '.config', 'doing', 'plugins'),
30
30
  'command_path' => File.join(Util.user_home, '.config', 'doing', 'commands')
31
31
  },
32
- 'doing_file' => '~/what_was_i_doing.md',
33
- 'backup_dir' => '~/.doing_backup',
32
+ 'doing_file' => '~/.local/share/doing/what_was_i_doing.md',
33
+ 'backup_dir' => '~/.local/share/doing/doing_backup',
34
34
  'current_section' => 'Currently',
35
35
  'paginate' => false,
36
36
  'never_time' => [],
@@ -43,7 +43,8 @@ module Doing
43
43
  'templates' => {
44
44
  'default' => {
45
45
  'date_format' => '%Y-%m-%d %H:%M',
46
- 'template' => '%date | %title %interval%duration%note',
46
+ 'template' => '%reset%cyan%shortdate %boldwhite%80║ title %dark%boldmagenta[%boldwhite%-10section%boldmagenta]%reset
47
+ %yellow%interval%boldred%duration%dark%white%80_14┃ note',
47
48
  'wrap_width' => 0,
48
49
  'order' => 'asc'
49
50
  },
@@ -60,7 +61,8 @@ module Doing
60
61
  },
61
62
  'recent' => {
62
63
  'date_format' => '%_I:%M%P',
63
- 'template' => '%shortdate: %title (%section) %interval%duration%note',
64
+ 'template' => '%reset%cyan%shortdate %boldwhite%80║ title %dark%boldmagenta[%boldwhite%-10section%boldmagenta]%reset
65
+ %yellow%interval%boldred%duration%dark%white%80_14┃ note',
64
66
  'wrap_width' => 88,
65
67
  'count' => 10,
66
68
  'order' => 'asc'
@@ -72,7 +74,7 @@ module Doing
72
74
  'views' => {
73
75
  'done' => {
74
76
  'date_format' => '%_I:%M%P',
75
- 'template' => '%date | %title%note',
77
+ 'template' => '%date | %title (%section)% 18: note',
76
78
  'wrap_width' => 0,
77
79
  'section' => 'All',
78
80
  'count' => 0,
@@ -93,6 +95,11 @@ module Doing
93
95
  'marker_color' => 'red',
94
96
  'default_tags' => [],
95
97
  'tag_sort' => 'name',
98
+ 'search' => {
99
+ 'matching' => 'pattern', # fuzzy, pattern, exact
100
+ 'distance' => 3,
101
+ 'case' => 'smart' # sensitive, ignore, smart
102
+ },
96
103
  'include_notes' => true
97
104
  }
98
105
 
@@ -110,6 +117,17 @@ module Doing
110
117
  @config_dir ||= File.join(Util.user_home, '.config', 'doing')
111
118
  end
112
119
 
120
+ ##
121
+ ## Check if configuration enforces exact string matching
122
+ ##
123
+ ## @return [Boolean] exact matching enabled
124
+ ##
125
+ def exact_match?
126
+ search_settings = @settings['search']
127
+ matching = search_settings.fetch('matching', 'pattern').normalize_matching
128
+ matching == :exact
129
+ end
130
+
113
131
  def default_config_file
114
132
  if File.exist?(config_dir) && !File.directory?(config_dir)
115
133
  raise DoingRuntimeError, "#{config_dir} exists but is not a directory"
@@ -220,11 +238,15 @@ module Doing
220
238
  cfg.nil? ? nil : { real_path[-1] => cfg }
221
239
  end
222
240
 
223
- # It takes the input, fills in the defaults where values do not exist.
241
+ # It takes the input, fills in the defaults where values
242
+ # do not exist.
243
+ #
244
+ # @param user_config a Hash or Configuration of
245
+ # overrides.
224
246
  #
225
- # user_config - a Hash or Configuration of overrides.
247
+ # @return [Hash] a Configuration filled with
248
+ # defaults.
226
249
  #
227
- # Returns a Configuration filled with defaults.
228
250
  def from(user_config)
229
251
  Util.deep_merge_hashes(DEFAULTS, Configuration[user_config].stringify_keys)
230
252
  end
data/lib/doing/item.rb CHANGED
@@ -7,7 +7,7 @@ module Doing
7
7
  class Item
8
8
  attr_accessor :date, :title, :section, :note
9
9
 
10
- attr_reader :id
10
+ # attr_reader :id
11
11
 
12
12
  ##
13
13
  ## Initialize an item with date, title, section, and
@@ -162,6 +162,10 @@ module Doing
162
162
  @title.scan(/(?<= |\A)@([^\s(]+)/).map { |tag| tag[0] }.sort.uniq
163
163
  end
164
164
 
165
+ def tag_array
166
+ tags.tags_to_array
167
+ end
168
+
165
169
  ##
166
170
  ## Test if item contains tag(s)
167
171
  ##
@@ -208,8 +212,13 @@ module Doing
208
212
  ##
209
213
  ## @return [Boolean] matches search criteria
210
214
  ##
211
- def search(search, distance: 3, negate: false, case_type: :smart)
212
- if search.is_rx?
215
+ def search(search, distance: nil, negate: false, case_type: nil)
216
+ prefs = Doing.config.settings['search'] || {}
217
+ matching = prefs.fetch('matching', 'pattern').normalize_matching
218
+ distance ||= prefs.fetch('distance', 3).to_i
219
+ case_type ||= prefs.fetch('case', 'smart').normalize_case
220
+
221
+ if search.is_rx? || matching == :fuzzy
213
222
  matches = @title + @note.to_s =~ search.to_rx(distance: distance, case_type: case_type)
214
223
  else
215
224
  query = to_phrase_query(search.strip)
@@ -38,6 +38,7 @@ module Doing
38
38
  rotated
39
39
  skipped
40
40
  updated
41
+ exported
41
42
  ].freeze
42
43
 
43
44
  #
@@ -265,6 +266,31 @@ module Doing
265
266
  end
266
267
  end
267
268
 
269
+ def benchmark(key, state)
270
+ return unless ENV['DOING_BENCHMARK']
271
+
272
+ @benchmarks ||= {}
273
+ @benchmarks[key] ||= { start: nil, finish: nil }
274
+ @benchmarks[key][state] = Process.clock_gettime(Process::CLOCK_MONOTONIC)
275
+ end
276
+
277
+ def log_benchmarks
278
+ if ENV['DOING_BENCHMARK']
279
+ output = []
280
+ @benchmarks.each do |k, timers|
281
+ if timers[:finish] && timers[:start]
282
+ output << "#{k}: #{timers[:finish] - timers[:start]}"
283
+ else
284
+ output << "#{k}: error"
285
+ end
286
+ end
287
+ output.each do |msg|
288
+ $stdout.puts color_message(:debug, 'Benchmark:', msg)
289
+ end
290
+ end
291
+ end
292
+
293
+
268
294
  def log_change(tags_added: [], tags_removed: [], count: 1, item: nil, single: false)
269
295
  if tags_added.empty? && tags_removed.empty?
270
296
  count(:skipped, level: :debug, message: '%count %items with no change', count: count)
@@ -319,6 +345,8 @@ module Doing
319
345
  ['Archived:', data[:message] || 'completed and archived %count %items']
320
346
  when :skipped
321
347
  ['Skipped:', data[:message] || '%count %items were unchanged']
348
+ when :exported
349
+ ['Exported:', data[:message] || '%count %items were exported']
322
350
  end
323
351
  end
324
352
 
data/lib/doing/note.rb CHANGED
@@ -22,7 +22,7 @@ module Doing
22
22
  ## Add note contents, optionally replacing existing note
23
23
  ##
24
24
  ## @param note [Array] The note to add, can be
25
- ## string or array (Note)
25
+ ## String, Array, or Note
26
26
  ## @param replace [Boolean] replace existing
27
27
  ## content
28
28
  ##
@@ -36,32 +36,7 @@ module Doing
36
36
  end
37
37
 
38
38
  ##
39
- ## Append an array of strings to note
40
- ##
41
- ## @param lines [Array] Array of strings
42
- ##
43
- def append(lines)
44
- concat(lines)
45
- replace compress
46
- end
47
-
48
- ##
49
- ## Append a string to the note content
50
- ##
51
- ## @param input [String] The input string,
52
- ## newlines will be split
53
- ##
54
- def append_string(input)
55
- concat(input.split(/\n/).map(&:strip))
56
- replace compress
57
- end
58
-
59
- def compress!
60
- replace compress
61
- end
62
-
63
- ##
64
- ## Remove blank lines and comment lines (#)
39
+ ## Remove blank lines and comments (#)
65
40
  ##
66
41
  ## @return [Array] compressed array
67
42
  ##
@@ -69,8 +44,8 @@ module Doing
69
44
  delete_if { |l| l =~ /^\s*$/ || l =~ /^#/ }
70
45
  end
71
46
 
72
- def strip_lines!
73
- replace strip_lines
47
+ def compress!
48
+ replace compress
74
49
  end
75
50
 
76
51
  ##
@@ -83,6 +58,10 @@ module Doing
83
58
  map(&:strip)
84
59
  end
85
60
 
61
+ def strip_lines!
62
+ replace strip_lines
63
+ end
64
+
86
65
  ##
87
66
  ## Note as multi-line string
88
67
  def to_s
@@ -101,11 +80,33 @@ module Doing
101
80
  ## @param other [Note] The other Note
102
81
  ##
103
82
  ## @return [Boolean] true if equal
104
- ##
105
83
  def equal?(other)
106
84
  return false unless other.is_a?(Note)
107
85
 
108
86
  to_s == other.to_s
109
87
  end
88
+
89
+ private
90
+
91
+ ##
92
+ ## Append an array of strings to note
93
+ ##
94
+ ## @param lines [Array] Array of strings
95
+ ##
96
+ def append(lines)
97
+ concat(lines)
98
+ replace compress
99
+ end
100
+
101
+ ##
102
+ ## Append a string to the note content
103
+ ##
104
+ ## @param input [String] The input string,
105
+ ## newlines will be split
106
+ ##
107
+ def append_string(input)
108
+ concat(input.split(/\n/).map(&:strip))
109
+ replace compress
110
+ end
110
111
  end
111
112
  end
@@ -28,26 +28,30 @@ module Doing
28
28
  plugins
29
29
  end
30
30
 
31
- # Public: Setup the plugin search path
31
+ # Setup the plugin search path
32
+ #
33
+ # @param add_dir [String] optional additional
34
+ # path to include
35
+ #
36
+ # @return [Array] Returns an Array of plugin search paths
32
37
  #
33
- # Returns an Array of plugin search paths
34
38
  def plugins_path(add_dir = nil)
35
39
  paths = Array(File.join(File.dirname(__FILE__), 'plugins'))
36
40
  paths << File.join(add_dir) if add_dir
37
41
  paths.map { |d| File.expand_path(d) }
38
42
  end
39
43
 
40
- ##
44
+
41
45
  # Register a plugin
42
46
  #
43
- # param: +[String|Array]+ title The name of the plugin (can be an array of names)
44
- #
45
- # param: +type+ The plugin type (:import, :export)
46
- #
47
- # param: +klass+ The class responding to :render or :import
47
+ # @param title [String|Array] The name of the
48
+ # plugin (can be an array of names)
49
+ # @param type [Symbol] The plugin type
50
+ # (:import, :export)
51
+ # @param klass [Class] The class responding to
52
+ # :render or :import
48
53
  #
49
- #
50
- # returns: Success boolean
54
+ # @return [Boolean] Success boolean
51
55
  #
52
56
  def register(title, type, klass)
53
57
  type = validate_plugin(title, type, klass)
@@ -90,6 +94,15 @@ module Doing
90
94
  type
91
95
  end
92
96
 
97
+ ##
98
+ ## Converts a partial symbol to a valid plugin type,
99
+ ## e.g. :imp => :import
100
+ ##
101
+ ## @param type [Symbol] the symbol to test
102
+ ## @param default [Symbol] fallback value
103
+ ##
104
+ ## @return [Symbol] :import or :export
105
+ ##
93
106
  def valid_type(type, default: nil)
94
107
  type ||= default
95
108
 
@@ -154,10 +167,13 @@ module Doing
154
167
  end
155
168
 
156
169
  ##
157
- ## Return a regular expression of all
158
- ## plugin triggers for type
170
+ ## Return a regular expression of all plugin triggers
171
+ ## for type
172
+ ##
173
+ ## @param type [Symbol] The type :import or
174
+ ## :export
159
175
  ##
160
- ## @param type The type :import or :export
176
+ ## @return [Regexp] regular expression
161
177
  ##
162
178
  def plugin_regex(type: :export)
163
179
  type = valid_type(type)
@@ -168,6 +184,14 @@ module Doing
168
184
  Regexp.new("^(?:#{pattern.join('|')})$", true)
169
185
  end
170
186
 
187
+ ##
188
+ ## Return array of available template names
189
+ ##
190
+ ## @param type [Symbol] Plugin type (:import,
191
+ ## :export)
192
+ ##
193
+ ## @return [Array<String>] template names
194
+ ##
171
195
  def plugin_templates(type: :export)
172
196
  type = valid_type(type)
173
197
  templates = []
@@ -181,6 +205,15 @@ module Doing
181
205
  templates
182
206
  end
183
207
 
208
+ ##
209
+ ## Return a regular expression of all template
210
+ ## triggers for type
211
+ ##
212
+ ## @param type [Symbol] The type :import or
213
+ ## :export
214
+ ##
215
+ ## @return [Regexp] regular expression
216
+ ##
184
217
  def template_regex(type: :export)
185
218
  type = valid_type(type)
186
219
  pattern = []
@@ -193,6 +226,17 @@ module Doing
193
226
  Regexp.new("^(?:#{pattern.join('|')})$", true)
194
227
  end
195
228
 
229
+ ##
230
+ ## Find and return the appropriate template for a
231
+ ## trigger string. Outputs a string that can be
232
+ ## written out to the terminal for redirection
233
+ ##
234
+ ## @param trigger [String] The trigger to test
235
+ ## @param type [Symbol] the plugin type
236
+ ## (:import, :export)
237
+ ##
238
+ ## @return [String] string content of template for trigger
239
+ ##
196
240
  def template_for_trigger(trigger, type: :export)
197
241
  type = valid_type(type)
198
242
  plugs = plugins[type].clone