toys-core 0.11.5 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +62 -0
- data/LICENSE.md +1 -1
- data/README.md +5 -2
- data/docs/guide.md +1 -1
- data/lib/toys/acceptor.rb +13 -4
- data/lib/toys/arg_parser.rb +7 -7
- data/lib/toys/cli.rb +170 -120
- data/lib/toys/compat.rb +71 -23
- data/lib/toys/completion.rb +18 -6
- data/lib/toys/context.rb +24 -15
- data/lib/toys/core.rb +6 -2
- data/lib/toys/dsl/base.rb +87 -0
- data/lib/toys/dsl/flag.rb +26 -20
- data/lib/toys/dsl/flag_group.rb +18 -14
- data/lib/toys/dsl/internal.rb +206 -0
- data/lib/toys/dsl/positional_arg.rb +26 -16
- data/lib/toys/dsl/tool.rb +180 -218
- data/lib/toys/errors.rb +64 -8
- data/lib/toys/flag.rb +662 -656
- data/lib/toys/flag_group.rb +24 -10
- data/lib/toys/input_file.rb +13 -7
- data/lib/toys/loader.rb +293 -140
- data/lib/toys/middleware.rb +46 -22
- data/lib/toys/mixin.rb +10 -8
- data/lib/toys/positional_arg.rb +21 -20
- data/lib/toys/settings.rb +914 -0
- data/lib/toys/source_info.rb +147 -35
- data/lib/toys/standard_middleware/add_verbosity_flags.rb +2 -0
- data/lib/toys/standard_middleware/apply_config.rb +6 -4
- data/lib/toys/standard_middleware/handle_usage_errors.rb +1 -0
- data/lib/toys/standard_middleware/set_default_descriptions.rb +19 -18
- data/lib/toys/standard_middleware/show_help.rb +19 -5
- data/lib/toys/standard_middleware/show_root_version.rb +2 -0
- data/lib/toys/standard_mixins/bundler.rb +24 -15
- data/lib/toys/standard_mixins/exec.rb +43 -34
- data/lib/toys/standard_mixins/fileutils.rb +3 -1
- data/lib/toys/standard_mixins/gems.rb +21 -17
- data/lib/toys/standard_mixins/git_cache.rb +46 -0
- data/lib/toys/standard_mixins/highline.rb +8 -8
- data/lib/toys/standard_mixins/terminal.rb +5 -5
- data/lib/toys/standard_mixins/xdg.rb +56 -0
- data/lib/toys/template.rb +11 -9
- data/lib/toys/{tool.rb → tool_definition.rb} +292 -226
- data/lib/toys/utils/completion_engine.rb +7 -2
- data/lib/toys/utils/exec.rb +162 -132
- data/lib/toys/utils/gems.rb +85 -60
- data/lib/toys/utils/git_cache.rb +813 -0
- data/lib/toys/utils/help_text.rb +117 -37
- data/lib/toys/utils/terminal.rb +11 -3
- data/lib/toys/utils/xdg.rb +293 -0
- data/lib/toys/wrappable_string.rb +9 -2
- data/lib/toys-core.rb +18 -6
- metadata +14 -7
data/lib/toys/flag_group.rb
CHANGED
@@ -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::
|
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
|
24
|
-
# a description of allowed
|
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
|
-
##
|
172
|
+
##
|
173
|
+
# @private
|
174
|
+
#
|
171
175
|
def <<(flag)
|
172
176
|
flags << flag
|
173
177
|
end
|
174
178
|
|
175
|
-
##
|
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
|
-
##
|
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
|
-
##
|
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
|
-
##
|
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
|
-
##
|
263
|
+
##
|
264
|
+
# @private
|
265
|
+
#
|
252
266
|
def validation_errors(seen)
|
253
267
|
flags.each do |flag|
|
254
268
|
return [] if seen.include?(flag.key)
|
data/lib/toys/input_file.rb
CHANGED
@@ -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
|
-
##
|
8
|
+
##
|
9
|
+
# @private
|
10
|
+
#
|
9
11
|
def self.__binding
|
10
12
|
binding
|
11
13
|
end
|
12
14
|
|
13
|
-
##
|
14
|
-
|
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
|
-
@
|
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::
|
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
|
-
##
|
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
|
-
"@
|
48
|
+
"@__tool_class.class_eval do\n" \
|
43
49
|
"#{string[index..-1]}\n" \
|
44
50
|
"end\n" \
|
45
51
|
"end\n"
|