toys-core 0.11.5 → 0.13.0

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +62 -0
  3. data/LICENSE.md +1 -1
  4. data/README.md +5 -2
  5. data/docs/guide.md +1 -1
  6. data/lib/toys/acceptor.rb +13 -4
  7. data/lib/toys/arg_parser.rb +7 -7
  8. data/lib/toys/cli.rb +170 -120
  9. data/lib/toys/compat.rb +71 -23
  10. data/lib/toys/completion.rb +18 -6
  11. data/lib/toys/context.rb +24 -15
  12. data/lib/toys/core.rb +6 -2
  13. data/lib/toys/dsl/base.rb +87 -0
  14. data/lib/toys/dsl/flag.rb +26 -20
  15. data/lib/toys/dsl/flag_group.rb +18 -14
  16. data/lib/toys/dsl/internal.rb +206 -0
  17. data/lib/toys/dsl/positional_arg.rb +26 -16
  18. data/lib/toys/dsl/tool.rb +180 -218
  19. data/lib/toys/errors.rb +64 -8
  20. data/lib/toys/flag.rb +662 -656
  21. data/lib/toys/flag_group.rb +24 -10
  22. data/lib/toys/input_file.rb +13 -7
  23. data/lib/toys/loader.rb +293 -140
  24. data/lib/toys/middleware.rb +46 -22
  25. data/lib/toys/mixin.rb +10 -8
  26. data/lib/toys/positional_arg.rb +21 -20
  27. data/lib/toys/settings.rb +914 -0
  28. data/lib/toys/source_info.rb +147 -35
  29. data/lib/toys/standard_middleware/add_verbosity_flags.rb +2 -0
  30. data/lib/toys/standard_middleware/apply_config.rb +6 -4
  31. data/lib/toys/standard_middleware/handle_usage_errors.rb +1 -0
  32. data/lib/toys/standard_middleware/set_default_descriptions.rb +19 -18
  33. data/lib/toys/standard_middleware/show_help.rb +19 -5
  34. data/lib/toys/standard_middleware/show_root_version.rb +2 -0
  35. data/lib/toys/standard_mixins/bundler.rb +24 -15
  36. data/lib/toys/standard_mixins/exec.rb +43 -34
  37. data/lib/toys/standard_mixins/fileutils.rb +3 -1
  38. data/lib/toys/standard_mixins/gems.rb +21 -17
  39. data/lib/toys/standard_mixins/git_cache.rb +46 -0
  40. data/lib/toys/standard_mixins/highline.rb +8 -8
  41. data/lib/toys/standard_mixins/terminal.rb +5 -5
  42. data/lib/toys/standard_mixins/xdg.rb +56 -0
  43. data/lib/toys/template.rb +11 -9
  44. data/lib/toys/{tool.rb → tool_definition.rb} +292 -226
  45. data/lib/toys/utils/completion_engine.rb +7 -2
  46. data/lib/toys/utils/exec.rb +162 -132
  47. data/lib/toys/utils/gems.rb +85 -60
  48. data/lib/toys/utils/git_cache.rb +813 -0
  49. data/lib/toys/utils/help_text.rb +117 -37
  50. data/lib/toys/utils/terminal.rb +11 -3
  51. data/lib/toys/utils/xdg.rb +293 -0
  52. data/lib/toys/wrappable_string.rb +9 -2
  53. data/lib/toys-core.rb +18 -6
  54. metadata +14 -7
@@ -17,11 +17,12 @@ module Toys
17
17
  #
18
18
  # @param type [Symbol] The type of group. Default is `:optional`.
19
19
  # @param desc [String,Array<String>,Toys::WrappableString] Short
20
- # description for the group. See {Toys::Tool#desc=} for a description
21
- # of allowed formats. Defaults to `"Flags"`.
20
+ # description for the group. See {Toys::ToolDefinition#desc} for a
21
+ # description of allowed formats. Defaults to `"Flags"`.
22
22
  # @param long_desc [Array<String,Array<String>,Toys::WrappableString>]
23
- # Long description for the flag group. See {Toys::Tool#long_desc=} for
24
- # a description of allowed formats. Defaults to the empty array.
23
+ # Long description for the flag group. See
24
+ # {Toys::ToolDefinition#long_desc} for a description of allowed
25
+ # formats. Defaults to the empty array.
25
26
  # @param name [String,Symbol,nil] The name of the group, or nil for no
26
27
  # name.
27
28
  # @return [Toys::FlagGroup::Base] A flag group of the correct subclass.
@@ -55,6 +56,7 @@ module Toys
55
56
  # Create a flag group.
56
57
  # This argument list is subject to change. Use {Toys::FlagGroup.create}
57
58
  # instead for a more stable interface.
59
+ #
58
60
  # @private
59
61
  #
60
62
  def initialize(name, desc, long_desc)
@@ -167,12 +169,16 @@ module Toys
167
169
  self
168
170
  end
169
171
 
170
- ## @private
172
+ ##
173
+ # @private
174
+ #
171
175
  def <<(flag)
172
176
  flags << flag
173
177
  end
174
178
 
175
- ## @private
179
+ ##
180
+ # @private
181
+ #
176
182
  def validation_errors(_seen)
177
183
  []
178
184
  end
@@ -182,7 +188,9 @@ module Toys
182
188
  # A FlagGroup containing all required flags
183
189
  #
184
190
  class Required < Base
185
- ## @private
191
+ ##
192
+ # @private
193
+ #
186
194
  def validation_errors(seen)
187
195
  results = []
188
196
  flags.each do |flag|
@@ -205,7 +213,9 @@ module Toys
205
213
  # A FlagGroup in which exactly one flag must be set
206
214
  #
207
215
  class ExactlyOne < Base
208
- ## @private
216
+ ##
217
+ # @private
218
+ #
209
219
  def validation_errors(seen)
210
220
  seen_names = []
211
221
  flags.each do |flag|
@@ -228,7 +238,9 @@ module Toys
228
238
  # A FlagGroup in which at most one flag must be set
229
239
  #
230
240
  class AtMostOne < Base
231
- ## @private
241
+ ##
242
+ # @private
243
+ #
232
244
  def validation_errors(seen)
233
245
  seen_names = []
234
246
  flags.each do |flag|
@@ -248,7 +260,9 @@ module Toys
248
260
  # A FlagGroup in which at least one flag must be set
249
261
  #
250
262
  class AtLeastOne < Base
251
- ## @private
263
+ ##
264
+ # @private
265
+ #
252
266
  def validation_errors(seen)
253
267
  flags.each do |flag|
254
268
  return [] if seen.include?(flag.key)
@@ -5,17 +5,21 @@
5
5
  # is parsed, a module is created under this parent for that file's constants.
6
6
  #
7
7
  module Toys::InputFile # rubocop:disable Style/ClassAndModuleChildren
8
- ## @private
8
+ ##
9
+ # @private
10
+ #
9
11
  def self.__binding
10
12
  binding
11
13
  end
12
14
 
13
- ## @private
14
- def self.evaluate(tool_class, remaining_words, source)
15
+ ##
16
+ # @private
17
+ #
18
+ def self.evaluate(tool_class, words, priority, remaining_words, source, loader)
15
19
  namespace = ::Module.new
16
20
  namespace.module_eval do
17
21
  include ::Toys::Context::Key
18
- @tool_class = tool_class
22
+ @__tool_class = tool_class
19
23
  end
20
24
  path = source.source_path
21
25
  basename = ::File.basename(path).tr(".-", "_").gsub(/\W/, "")
@@ -23,7 +27,7 @@ module Toys::InputFile # rubocop:disable Style/ClassAndModuleChildren
23
27
  str = build_eval_string(name, ::IO.read(path))
24
28
  if str
25
29
  const_set(name, namespace)
26
- ::Toys::DSL::Tool.prepare(tool_class, remaining_words, source) do
30
+ ::Toys::DSL::Internal.prepare(tool_class, words, priority, remaining_words, source, loader) do
27
31
  ::Toys::ContextualError.capture_path("Error while loading Toys config!", path) do
28
32
  # rubocop:disable Security/Eval
29
33
  eval(str, __binding, path, -2)
@@ -33,13 +37,15 @@ module Toys::InputFile # rubocop:disable Style/ClassAndModuleChildren
33
37
  end
34
38
  end
35
39
 
36
- ## @private
40
+ ##
41
+ # @private
42
+ #
37
43
  def self.build_eval_string(module_name, string)
38
44
  index = string.index(/^\s*[^#\s]/)
39
45
  return nil if index.nil?
40
46
  "#{string[0, index]}\n" \
41
47
  "module #{module_name}\n" \
42
- "@tool_class.class_eval do\n" \
48
+ "@__tool_class.class_eval do\n" \
43
49
  "#{string[index..-1]}\n" \
44
50
  "end\n" \
45
51
  "end\n"