toys-core 0.3.5 → 0.3.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/lib/toys/cli.rb +15 -10
- data/lib/toys/config_dsl.rb +103 -17
- data/lib/toys/context.rb +60 -48
- data/lib/toys/core_version.rb +1 -1
- data/lib/toys/helpers/exec.rb +1 -1
- data/lib/toys/helpers/highline.rb +4 -9
- data/lib/toys/middleware/add_verbosity_flags.rb +6 -6
- data/lib/toys/middleware/set_default_descriptions.rb +162 -92
- data/lib/toys/middleware/show_help.rb +12 -6
- data/lib/toys/middleware/{show_version.rb → show_root_version.rb} +14 -23
- data/lib/toys/tool.rb +122 -372
- data/lib/toys/tool/acceptor.rb +190 -0
- data/lib/toys/tool/arg_definition.rb +130 -0
- data/lib/toys/tool/flag_definition.rb +322 -0
- data/lib/toys/utils/exec.rb +1 -1
- data/lib/toys/utils/help_text.rb +21 -15
- data/lib/toys/utils/line_output.rb +29 -12
- data/lib/toys/utils/wrappable_string.rb +23 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1552f14b276734b92f59f9c1d4464679ec1facdc6480e8ecb01b7818d7541712
|
4
|
+
data.tar.gz: d8da75bf066fa32de202edc57151a37c20b08a29537e7fbb25e9683d705fe625
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b3816d90527525a282e55b534a2c250fd7667b7c4a9c4922dbd9a67c9bea72223eb6e16f2d1a0d035213ce86be013bdce2a073c56b8f35c4e223262a494faaaa
|
7
|
+
data.tar.gz: d73196fce65e1c0cc5904dd93e529bd798cfd10a19a1ac4ac9c138b30c62d516f5e76380502e38306ad91105526fd699dbf41fa20643c2b8bd852dfa1914ce06
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Release History
|
2
2
|
|
3
|
+
### 0.3.6 / 2018-05-21
|
4
|
+
|
5
|
+
* CHANGED: Renamed show_version middleware to show_root_version.
|
6
|
+
* CHANGED: Reworked set_default_descriptions interface for more flexibility.
|
7
|
+
* CHANGED: Renamed Utils::Exec#config_defaults to configure_defaults to match the helper.
|
8
|
+
* CHANGED: Removed Context#new_cli and exposed Context#cli instead.
|
9
|
+
* CHANGED: Renamed CLI#empty_clone to CLI#child.
|
10
|
+
* IMPROVED: show_help middleware lets you control display of the source path section.
|
11
|
+
* IMPROVED: Optional parameters are now supported for flags.
|
12
|
+
* IMPROVED: Support custom acceptors.
|
13
|
+
* IMPROVED: Highline helper automatically sets use_color based on the type of stdout.
|
14
|
+
|
3
15
|
### 0.3.5 / 2018-05-15
|
4
16
|
|
5
17
|
* CHANGED: Exec logic now lives in a utils class.
|
data/lib/toys/cli.rb
CHANGED
@@ -219,19 +219,24 @@ module Toys
|
|
219
219
|
|
220
220
|
##
|
221
221
|
# Make a clone with the same settings but no paths in the loader.
|
222
|
+
# This is sometimes useful for running sub-tools.
|
222
223
|
#
|
223
224
|
# @return [Toys::CLI]
|
225
|
+
# @yieldparam cli [Toys::CLI] If you pass a block, the new CLI is yielded
|
226
|
+
# to it so you can add paths and make other modifications.
|
224
227
|
#
|
225
|
-
def
|
226
|
-
CLI.new(binary_name: @binary_name,
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
228
|
+
def child
|
229
|
+
cli = CLI.new(binary_name: @binary_name,
|
230
|
+
config_dir_name: @config_dir_name,
|
231
|
+
config_file_name: @config_file_name,
|
232
|
+
index_file_name: @index_file_name,
|
233
|
+
preload_file_name: @preload_file_name,
|
234
|
+
middleware_stack: @middleware_stack,
|
235
|
+
logger: @logger,
|
236
|
+
base_level: @base_level,
|
237
|
+
error_handler: @error_handler)
|
238
|
+
yield cli if block_given?
|
239
|
+
cli
|
235
240
|
end
|
236
241
|
|
237
242
|
##
|
data/lib/toys/config_dsl.rb
CHANGED
@@ -27,6 +27,8 @@
|
|
27
27
|
# POSSIBILITY OF SUCH DAMAGE.
|
28
28
|
;
|
29
29
|
|
30
|
+
require "toys/context"
|
31
|
+
|
30
32
|
module Toys
|
31
33
|
##
|
32
34
|
# This class defines the DSL for a toys configuration file.
|
@@ -63,6 +65,12 @@ module Toys
|
|
63
65
|
# toys greet rubyists
|
64
66
|
#
|
65
67
|
class ConfigDSL
|
68
|
+
# Copy the well-known context key constants here, so that script blocks
|
69
|
+
# inside config DSL files can access them without qualification.
|
70
|
+
::Toys::Context.constants.each do |const|
|
71
|
+
const_set(const, ::Toys::Context.const_get(const))
|
72
|
+
end
|
73
|
+
|
66
74
|
##
|
67
75
|
# Create an instance of the DSL.
|
68
76
|
# @private
|
@@ -84,6 +92,62 @@ module Toys
|
|
84
92
|
@path = path
|
85
93
|
end
|
86
94
|
|
95
|
+
##
|
96
|
+
# Create an acceptor that can be passed into a flag or arg. An acceptor
|
97
|
+
# validates and/or converts a string parameter to a Ruby object. This
|
98
|
+
# acceptor may, for the current tool, be referenced by the name you provide
|
99
|
+
# when you create a flag or arg.
|
100
|
+
#
|
101
|
+
# An acceptor contains a validator, which parses and validates the string
|
102
|
+
# syntax of an argument, and a converter, which takes the validation
|
103
|
+
# results and returns a final value for the context data.
|
104
|
+
#
|
105
|
+
# The validator may be either a regular expression or a list of valid
|
106
|
+
# inputs.
|
107
|
+
#
|
108
|
+
# If the validator is a regular expression, it is matched against the
|
109
|
+
# argument string and succeeds only if the expression covers the *entire*
|
110
|
+
# string. The elements of the MatchData (i.e. the string matched, plus any
|
111
|
+
# captures) are then passed into the conversion function.
|
112
|
+
#
|
113
|
+
# If the validator is an array, the *string form* of the array elements
|
114
|
+
# (i.e. the results of calling to_s on each element) are considered the
|
115
|
+
# valid values for the argument. This is useful for enums, for example.
|
116
|
+
# In this case, the input is converted to the original array element, and
|
117
|
+
# any converter function you provide is ignored.
|
118
|
+
#
|
119
|
+
# If you provide no validator, then no validation takes place and all
|
120
|
+
# argument strings are considered valid. The string itself is passed on to
|
121
|
+
# the converter.
|
122
|
+
#
|
123
|
+
# The converter should be a proc that takes as its arguments the results
|
124
|
+
# of validation. For example, if you use a regular expression validator,
|
125
|
+
# the converter should take a series of strings arguments, the first of
|
126
|
+
# which is the full input string, and the rest of which are captures.
|
127
|
+
# If you provide no converter, no conversion is done and the input string
|
128
|
+
# is considered the final value. You may also provide the converter as a
|
129
|
+
# block.
|
130
|
+
#
|
131
|
+
# @param [String] name The acceptor name.
|
132
|
+
# @param [Regexp,Array,nil] validator The validator.
|
133
|
+
# @param [Proc,nil] converter The validator.
|
134
|
+
#
|
135
|
+
def acceptor(name, validator = nil, converter = nil, &block)
|
136
|
+
accept =
|
137
|
+
case validator
|
138
|
+
when ::Regexp
|
139
|
+
Tool::PatternAcceptor.new(name, validator, converter, &block)
|
140
|
+
when ::Array
|
141
|
+
Tool::EnumAcceptor.new(name, validator)
|
142
|
+
when nil
|
143
|
+
Tool::Acceptor.new(name, converter, &block)
|
144
|
+
else
|
145
|
+
raise ToolDefinitionError, "Illegal validator: #{validator.inspect}"
|
146
|
+
end
|
147
|
+
_cur_tool.add_acceptor(accept)
|
148
|
+
self
|
149
|
+
end
|
150
|
+
|
87
151
|
##
|
88
152
|
# Create a subtool. You must provide a block defining the subtool.
|
89
153
|
#
|
@@ -233,7 +297,10 @@ module Toys
|
|
233
297
|
# @param [Symbol] key The key to use to retrieve the value from the
|
234
298
|
# execution context.
|
235
299
|
# @param [String...] flags The flags in OptionParser format.
|
236
|
-
# @param [Object
|
300
|
+
# @param [Object] accept An acceptor that validates and/or converts the
|
301
|
+
# value. You may provide either the name of an acceptor you have
|
302
|
+
# defined, or one of the default acceptors provided by OptionParser.
|
303
|
+
# Optional. If not specified, accepts any value as a string.
|
237
304
|
# @param [Object] default The default value. This is the value that will
|
238
305
|
# be set in the context if this flag is not provided on the command
|
239
306
|
# line. Defaults to `nil`.
|
@@ -242,6 +309,9 @@ module Toys
|
|
242
309
|
# and the previous value, and it should return the new value that
|
243
310
|
# should be set. The default handler simply replaces the previous
|
244
311
|
# value. i.e. the default is effectively `-> (val, _prev) { val }`.
|
312
|
+
# @param [Boolean] report_collisions Raise an exception if a flag is
|
313
|
+
# requested that is already in use or marked as unusable. Default is
|
314
|
+
# true.
|
245
315
|
# @param [String,Array<String>,Toys::Utils::WrappableString] desc Short
|
246
316
|
# description for the flag. See {Toys::ConfigDSL#desc} for a description
|
247
317
|
# of the allowed formats. Defaults to the empty string.
|
@@ -250,22 +320,18 @@ module Toys
|
|
250
320
|
# description of the allowed formats. (But note that this param takes
|
251
321
|
# an Array of description lines, rather than a series of arguments.)
|
252
322
|
# Defaults to the empty array.
|
253
|
-
# @param [Boolean] only_unique If true, any flags that are already
|
254
|
-
# defined in this tool are removed from this flag. For example, if
|
255
|
-
# an earlier flag uses `-a`, and this flag wants to use both
|
256
|
-
# `-a` and `-b`, then only `-b` will be assigned to this flag.
|
257
|
-
# Defaults to false.
|
258
323
|
# @yieldparam flag_dsl [Toys::ConfigDSL::FlagDSL] An object that lets you
|
259
324
|
# configure this flag in a block.
|
260
325
|
#
|
261
326
|
def flag(key, *flags,
|
262
|
-
accept: nil, default: nil, handler: nil,
|
263
|
-
|
327
|
+
accept: nil, default: nil, handler: nil,
|
328
|
+
report_collisions: true,
|
329
|
+
desc: nil, long_desc: nil)
|
264
330
|
return self if _cur_tool.nil?
|
265
|
-
flag_dsl = FlagDSL.new(flags, accept, default, handler, desc, long_desc)
|
331
|
+
flag_dsl = FlagDSL.new(flags, accept, default, handler, report_collisions, desc, long_desc)
|
266
332
|
yield flag_dsl if block_given?
|
267
333
|
_cur_tool.lock_definition_path(@path)
|
268
|
-
flag_dsl._add_to(_cur_tool, key
|
334
|
+
flag_dsl._add_to(_cur_tool, key)
|
269
335
|
self
|
270
336
|
end
|
271
337
|
|
@@ -276,7 +342,10 @@ module Toys
|
|
276
342
|
#
|
277
343
|
# @param [Symbol] key The key to use to retrieve the value from the
|
278
344
|
# execution context.
|
279
|
-
# @param [Object
|
345
|
+
# @param [Object] accept An acceptor that validates and/or converts the
|
346
|
+
# value. You may provide either the name of an acceptor you have
|
347
|
+
# defined, or one of the default acceptors provided by OptionParser.
|
348
|
+
# Optional. If not specified, accepts any value as a string.
|
280
349
|
# @param [String] display_name A name to use for display (in help text and
|
281
350
|
# error reports). Defaults to the key in upper case.
|
282
351
|
# @param [String,Array<String>,Toys::Utils::WrappableString] desc Short
|
@@ -311,7 +380,10 @@ module Toys
|
|
311
380
|
# @param [Object] default The default value. This is the value that will
|
312
381
|
# be set in the context if this argument is not provided on the command
|
313
382
|
# line. Defaults to `nil`.
|
314
|
-
# @param [Object
|
383
|
+
# @param [Object] accept An acceptor that validates and/or converts the
|
384
|
+
# value. You may provide either the name of an acceptor you have
|
385
|
+
# defined, or one of the default acceptors provided by OptionParser.
|
386
|
+
# Optional. If not specified, accepts any value as a string.
|
315
387
|
# @param [String] display_name A name to use for display (in help text and
|
316
388
|
# error reports). Defaults to the key in upper case.
|
317
389
|
# @param [String,Array<String>,Toys::Utils::WrappableString] desc Short
|
@@ -346,7 +418,10 @@ module Toys
|
|
346
418
|
# @param [Object] default The default value. This is the value that will
|
347
419
|
# be set in the context if no unmatched arguments are provided on the
|
348
420
|
# command line. Defaults to the empty array `[]`.
|
349
|
-
# @param [Object
|
421
|
+
# @param [Object] accept An acceptor that validates and/or converts the
|
422
|
+
# value. You may provide either the name of an acceptor you have
|
423
|
+
# defined, or one of the default acceptors provided by OptionParser.
|
424
|
+
# Optional. If not specified, accepts any value as a string.
|
350
425
|
# @param [String] display_name A name to use for display (in help text and
|
351
426
|
# error reports). Defaults to the key in upper case.
|
352
427
|
# @param [String,Array<String>,Toys::Utils::WrappableString] desc Short
|
@@ -418,11 +493,12 @@ module Toys
|
|
418
493
|
#
|
419
494
|
class FlagDSL
|
420
495
|
## @private
|
421
|
-
def initialize(flags, accept, default, handler, desc, long_desc)
|
496
|
+
def initialize(flags, accept, default, handler, report_collisions, desc, long_desc)
|
422
497
|
@flags = flags
|
423
498
|
@accept = accept
|
424
499
|
@default = default
|
425
500
|
@handler = handler
|
501
|
+
@report_collisions = report_collisions
|
426
502
|
@desc = desc
|
427
503
|
@long_desc = long_desc
|
428
504
|
end
|
@@ -467,6 +543,16 @@ module Toys
|
|
467
543
|
self
|
468
544
|
end
|
469
545
|
|
546
|
+
##
|
547
|
+
# Set whether to raise an exception if a flag is requested that is
|
548
|
+
# already in use or marked as disabled.
|
549
|
+
# @param [Boolean] setting
|
550
|
+
#
|
551
|
+
def report_collisions(setting)
|
552
|
+
@report_collisions = setting
|
553
|
+
self
|
554
|
+
end
|
555
|
+
|
470
556
|
##
|
471
557
|
# Set the short description. See {Toys::ConfigDSL#desc} for the allowed
|
472
558
|
# formats.
|
@@ -489,11 +575,11 @@ module Toys
|
|
489
575
|
end
|
490
576
|
|
491
577
|
## @private
|
492
|
-
def _add_to(tool, key
|
578
|
+
def _add_to(tool, key)
|
493
579
|
tool.add_flag(key, @flags,
|
494
580
|
accept: @accept, default: @default, handler: @handler,
|
495
|
-
|
496
|
-
|
581
|
+
report_collisions: @report_collisions,
|
582
|
+
desc: @desc, long_desc: @long_desc)
|
497
583
|
end
|
498
584
|
end
|
499
585
|
|
data/lib/toys/context.rb
CHANGED
@@ -31,75 +31,91 @@ require "logger"
|
|
31
31
|
|
32
32
|
module Toys
|
33
33
|
##
|
34
|
-
#
|
34
|
+
# This class manages the object context in effect during the execution of a
|
35
|
+
# tool. The context is a hash of key-value pairs.
|
35
36
|
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
37
|
+
# Flags and arguments defined by your tool normally report their values in
|
38
|
+
# the context, using keys that are strings or symbols.
|
39
|
+
#
|
40
|
+
# Keys that are neither strings nor symbols are by convention used for other
|
41
|
+
# context information, including:
|
42
|
+
# * Common information such as the {Toys::Tool} object being executed, the
|
43
|
+
# arguments originally passed to it, or the usage error string. These
|
44
|
+
# well-known keys can be accessed via constants in the {Toys::Context}
|
45
|
+
# module.
|
46
|
+
# * Common settings such as the verbosity level, and whether to exit
|
47
|
+
# immediately if a subprocess exits with a nonzero result. These keys are
|
48
|
+
# also present as {Toys::Context} constants.
|
49
|
+
# * Private information used internally by middleware and helpers.
|
50
|
+
#
|
51
|
+
# This class provides convenience accessors for common keys and settings, and
|
52
|
+
# you can retrieve argument-set keys using the {#options} hash.
|
43
53
|
#
|
44
54
|
class Context
|
55
|
+
##
|
56
|
+
# Context key for the currently running CLI.
|
57
|
+
# @return [Object]
|
58
|
+
#
|
59
|
+
CLI = ::Object.new.freeze
|
60
|
+
|
45
61
|
##
|
46
62
|
# Context key for the verbosity value. Verbosity is an integer defaulting
|
47
63
|
# to 0, with higher values meaning more verbose and lower meaning quieter.
|
48
|
-
# @return [
|
64
|
+
# @return [Object]
|
49
65
|
#
|
50
|
-
VERBOSITY =
|
66
|
+
VERBOSITY = ::Object.new.freeze
|
51
67
|
|
52
68
|
##
|
53
69
|
# Context key for the `Toys::Tool` object being executed.
|
54
|
-
# @return [
|
70
|
+
# @return [Object]
|
55
71
|
#
|
56
|
-
TOOL =
|
72
|
+
TOOL = ::Object.new.freeze
|
57
73
|
|
58
74
|
##
|
59
75
|
# Context key for the full name of the tool being executed. Value is an
|
60
76
|
# array of strings.
|
61
|
-
# @return [
|
77
|
+
# @return [Object]
|
62
78
|
#
|
63
|
-
TOOL_NAME =
|
79
|
+
TOOL_NAME = ::Object.new.freeze
|
64
80
|
|
65
81
|
##
|
66
82
|
# Context key for the active `Toys::Loader` object.
|
67
|
-
# @return [
|
83
|
+
# @return [Object]
|
68
84
|
#
|
69
|
-
LOADER =
|
85
|
+
LOADER = ::Object.new.freeze
|
70
86
|
|
71
87
|
##
|
72
88
|
# Context key for the active `Logger` object.
|
73
|
-
# @return [
|
89
|
+
# @return [Object]
|
74
90
|
#
|
75
|
-
LOGGER =
|
91
|
+
LOGGER = ::Object.new.freeze
|
76
92
|
|
77
93
|
##
|
78
94
|
# Context key for the name of the toys binary. Value is a string.
|
79
|
-
# @return [
|
95
|
+
# @return [Object]
|
80
96
|
#
|
81
|
-
BINARY_NAME =
|
97
|
+
BINARY_NAME = ::Object.new.freeze
|
82
98
|
|
83
99
|
##
|
84
100
|
# Context key for the argument list passed to the current tool. Value is
|
85
101
|
# an array of strings.
|
86
|
-
# @return [
|
102
|
+
# @return [Object]
|
87
103
|
#
|
88
|
-
ARGS =
|
104
|
+
ARGS = ::Object.new.freeze
|
89
105
|
|
90
106
|
##
|
91
107
|
# Context key for the usage error raised. Value is a string if there was
|
92
108
|
# an error, or nil if there was no error.
|
93
|
-
# @return [
|
109
|
+
# @return [Object]
|
94
110
|
#
|
95
|
-
USAGE_ERROR =
|
111
|
+
USAGE_ERROR = ::Object.new.freeze
|
96
112
|
|
97
113
|
##
|
98
114
|
# Context key for whether nonzero exit codes from subprocesses should cause
|
99
115
|
# an immediate exit. Value is a truthy or falsy value.
|
100
|
-
# @return [
|
116
|
+
# @return [Object]
|
101
117
|
#
|
102
|
-
EXIT_ON_NONZERO_STATUS =
|
118
|
+
EXIT_ON_NONZERO_STATUS = ::Object.new.freeze
|
103
119
|
|
104
120
|
##
|
105
121
|
# Create a Context object. Applications generally will not need to create
|
@@ -111,15 +127,23 @@ module Toys
|
|
111
127
|
# @param [Hash] data
|
112
128
|
#
|
113
129
|
def initialize(cli, data)
|
114
|
-
@_cli = cli
|
115
130
|
@_data = data
|
131
|
+
@_data[CLI] = cli
|
116
132
|
@_data[LOADER] = cli.loader
|
117
133
|
@_data[BINARY_NAME] = cli.binary_name
|
118
134
|
@_data[LOGGER] = cli.logger
|
119
135
|
end
|
120
136
|
|
121
137
|
##
|
122
|
-
# Return the
|
138
|
+
# Return the currently running CLI.
|
139
|
+
# @return [Toys::CLI]
|
140
|
+
#
|
141
|
+
def cli
|
142
|
+
@_data[CLI]
|
143
|
+
end
|
144
|
+
|
145
|
+
##
|
146
|
+
# Return the current verbosity setting as an integer.
|
123
147
|
# @return [Integer]
|
124
148
|
#
|
125
149
|
def verbosity
|
@@ -196,7 +220,7 @@ module Toys
|
|
196
220
|
alias get []
|
197
221
|
|
198
222
|
##
|
199
|
-
# Set an option or other piece of data by key.
|
223
|
+
# Set an option or other piece of context data by key.
|
200
224
|
#
|
201
225
|
# @param [Symbol] key
|
202
226
|
# @param [Object] value
|
@@ -206,7 +230,7 @@ module Toys
|
|
206
230
|
end
|
207
231
|
|
208
232
|
##
|
209
|
-
# Set an option or other piece of data by key.
|
233
|
+
# Set an option or other piece of context data by key.
|
210
234
|
#
|
211
235
|
# @param [Symbol] key
|
212
236
|
# @param [Object] value
|
@@ -221,15 +245,16 @@ module Toys
|
|
221
245
|
end
|
222
246
|
|
223
247
|
##
|
224
|
-
# Returns the subset of the context that
|
225
|
-
#
|
226
|
-
# not
|
248
|
+
# Returns the subset of the context that uses string or symbol keys. By
|
249
|
+
# convention, this includes keys that are set by tool flags and arguments,
|
250
|
+
# but does not include well-known context values such as verbosity or
|
251
|
+
# private context values used by middleware or helpers.
|
227
252
|
#
|
228
253
|
# @return [Hash]
|
229
254
|
#
|
230
255
|
def options
|
231
256
|
@_data.select do |k, _v|
|
232
|
-
|
257
|
+
k.is_a?(::Symbol) || k.is_a?(::String)
|
233
258
|
end
|
234
259
|
end
|
235
260
|
|
@@ -245,26 +270,13 @@ module Toys
|
|
245
270
|
# @return [Integer] The resulting status code
|
246
271
|
#
|
247
272
|
def run(*args, cli: nil, exit_on_nonzero_status: nil)
|
248
|
-
cli ||= @
|
273
|
+
cli ||= @_data[CLI]
|
249
274
|
exit_on_nonzero_status = @_data[EXIT_ON_NONZERO_STATUS] if exit_on_nonzero_status.nil?
|
250
275
|
code = cli.run(args.flatten, verbosity: @_data[VERBOSITY])
|
251
276
|
exit(code) if exit_on_nonzero_status && !code.zero?
|
252
277
|
code
|
253
278
|
end
|
254
279
|
|
255
|
-
##
|
256
|
-
# Return a new CLI with the same settings as the currnet CLI but no paths.
|
257
|
-
# This can be used to run a toys "sub-instance". Add any new paths to the
|
258
|
-
# returned CLI, then call {#run}, passing in the CLI, to execute a tool.
|
259
|
-
#
|
260
|
-
# @return [Toys::CLI]
|
261
|
-
#
|
262
|
-
def new_cli
|
263
|
-
cli = @_cli.empty_clone
|
264
|
-
yield cli if block_given?
|
265
|
-
cli
|
266
|
-
end
|
267
|
-
|
268
280
|
##
|
269
281
|
# Exit immediately with the given status code
|
270
282
|
#
|