toys-core 0.8.1 → 0.9.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 +24 -0
- data/README.md +13 -10
- data/docs/guide.md +1 -1
- data/lib/toys-core.rb +1 -2
- data/lib/toys/acceptor.rb +35 -10
- data/lib/toys/arg_parser.rb +6 -6
- data/lib/toys/cli.rb +10 -6
- data/lib/toys/compat.rb +8 -0
- data/lib/toys/completion.rb +24 -6
- data/lib/toys/context.rb +8 -0
- data/lib/toys/{core_version.rb → core.rb} +11 -3
- data/lib/toys/dsl/flag.rb +7 -20
- data/lib/toys/dsl/positional_arg.rb +7 -20
- data/lib/toys/dsl/tool.rb +79 -20
- data/lib/toys/errors.rb +3 -3
- data/lib/toys/flag.rb +12 -10
- data/lib/toys/loader.rb +95 -106
- data/lib/toys/positional_arg.rb +1 -1
- data/lib/toys/standard_middleware/set_default_descriptions.rb +22 -7
- data/lib/toys/standard_middleware/show_help.rb +3 -3
- data/lib/toys/standard_mixins/exec.rb +33 -16
- data/lib/toys/standard_mixins/gems.rb +1 -1
- data/lib/toys/standard_mixins/terminal.rb +1 -1
- data/lib/toys/tool.rb +93 -24
- data/lib/toys/utils/help_text.rb +51 -38
- data/lib/toys/utils/terminal.rb +2 -2
- metadata +8 -9
- data/lib/toys/alias.rb +0 -106
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 125540448a7c5431f6c788058f7b5b02d0d089b28def144fa673b579bd2b1bff
|
4
|
+
data.tar.gz: 878c996695f10022f756b2a17459e556f29a06b1e96b8b9e2d636624e8bfc65c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a3e9c3fe05a4ced439a842c53c6c2cb73026417f5c6707a3a1ac1e8394a003e546d8aa50a73d94749ac79bd2720148ee86a18c53b60fe52a080a8368f133098
|
7
|
+
data.tar.gz: 98f82815c36fcca6b534248e98ab642762a513410f22467de12a819d32bd589d6e8a8ca1fd187b55bada01987021c9a3f8922ab0e8dec329cade1239db1f464c
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,28 @@
|
|
1
1
|
# Release History
|
2
2
|
|
3
|
+
### 0.9.0 / 2019-12-02
|
4
|
+
|
5
|
+
Functional changes:
|
6
|
+
|
7
|
+
* ADDED: The `delegate_to` directive causes the tool to delegate execution to another tool. This means it takes the same arguments and has the same execution behavior.
|
8
|
+
* ADDED: The `delegate_to` argument to the `tool` directive causes the tool to delegate to another tool. (Note: the `alias_tool` directive is now just shorthand for creating a tool with a delegate, and as such is mildly deprecated.)
|
9
|
+
* ADDED: The `current_tool` function can be called from the DSL to get the current `Toys::Tool` object.
|
10
|
+
* ADDED: The `:e` option is now an alias for `:exit_on_nonzero_status`.
|
11
|
+
* IMPROVED: `alias_tool` is now just shorthand for delegating. This means, aliases can now point to namespaces and will resolve subtools of their targets, and they now support tab completion and online help.
|
12
|
+
* IMPROVED: This release of Toys is now compatible with Ruby 2.7.0-preview3. It fixes some Ruby 2.7 specific bugs, and sanitizes keyword argument usage to eliminate Ruby 2.7 warnings.
|
13
|
+
* IMPROVED: JRuby is now supported for most operations. However, JRuby is generally not recommended because of JVM boot latency, lack of Kernel#fork support, and other issues.
|
14
|
+
* FIXED: The the `tool` directive no longer crashes if not passed a block.
|
15
|
+
|
16
|
+
Internal interface changes:
|
17
|
+
|
18
|
+
* REMOVED: The `Toys::Alias` class has been removed, along with relevant functionality in `Toys::Loader` including `Toys::Loader#make_alias`. Use tool delegation instead.
|
19
|
+
* CHANGED: Positional arguments to middleware specs must now be wrapped in an array.
|
20
|
+
* CHANGED: The `Toys::ArgParser` constructor takes a `default_data` argument instead of `verbosity`.
|
21
|
+
* CHANGED: Version constant is now `Toys::Core::VERSION`.
|
22
|
+
* CHNAGED: The `flag` argument to `Toys::Flag::DefaultCompletion#initialize` is now a required keyword argument.
|
23
|
+
* ADDED: `Toys::Tool#delegate_to` causes the tool to delegate to another tool.
|
24
|
+
* ADDED: The `Toys::Context::Key::DELEGATED_FROM` key provides the delegating context, if any.
|
25
|
+
|
3
26
|
### 0.8.1 / 2019-11-19
|
4
27
|
|
5
28
|
* FIXED: Listing subtools would crash if a broken alias was present.
|
@@ -12,6 +35,7 @@ This is a major update with significant new features and a bunch of fixes. It al
|
|
12
35
|
Major changes and features:
|
13
36
|
|
14
37
|
* CHANGED: Relicensed under the MIT License.
|
38
|
+
* CHANGED: Requires Ruby 2.3 or later.
|
15
39
|
* ADDED: Tab completion for bash. Added APIs and DSL constructs for tools to customize completions.
|
16
40
|
* ADDED: The usage error screen displays suggestions when an argument is misspelled. (Requires Ruby 2.4 or later.)
|
17
41
|
* ADDED: Tools can provide an interrupt handler and a custom usage error handler. Added appropriate APIs and DSL methods.
|
data/README.md
CHANGED
@@ -9,10 +9,10 @@ to write command line executables using the Toys DSL and the power of the Toys
|
|
9
9
|
classes.
|
10
10
|
|
11
11
|
For more detailed information about Toys-Core, see the
|
12
|
-
[Toys-Core User's Guide](https://
|
12
|
+
[Toys-Core User's Guide](https://dazuma.github.io/toys/gems/toys-core/latest/file.guide.html).
|
13
13
|
For background information about Toys itself, see the
|
14
|
-
[Toys README](https://
|
15
|
-
[Toys User Guide](https://
|
14
|
+
[Toys README](https://dazuma.github.io/toys/gems/toys/latest) and the
|
15
|
+
[Toys User Guide](https://dazuma.github.io/toys/gems/toys/latest/file.guide.html).
|
16
16
|
|
17
17
|
## Introductory tutorial
|
18
18
|
|
@@ -21,14 +21,12 @@ executable using Toys-Core.
|
|
21
21
|
|
22
22
|
It assumes basic familiarity with Toys, so, if you have not done so, I
|
23
23
|
recommend first walking through the tutorial in the
|
24
|
-
[Toys README](https://
|
25
|
-
running a unix-like system such as Linux or macOS. Some commands might
|
26
|
-
be modified if you're running on Windows.
|
24
|
+
[Toys README](https://dazuma.github.io/toys/gems/toys/latest). It also assumes
|
25
|
+
you are running a unix-like system such as Linux or macOS. Some commands might
|
26
|
+
need to be modified if you're running on Windows.
|
27
27
|
|
28
28
|
### Install Toys
|
29
29
|
|
30
|
-
Toys requires Ruby 2.3 or later. (JRuby is not currently supported.)
|
31
|
-
|
32
30
|
Install the **toys-core** gem using:
|
33
31
|
|
34
32
|
$ gem install toys-core
|
@@ -36,6 +34,11 @@ Install the **toys-core** gem using:
|
|
36
34
|
You may also install the **toys** gem, which brings in **toys-core** as a
|
37
35
|
dependency.
|
38
36
|
|
37
|
+
Toys-Core requires Ruby 2.3 or later.
|
38
|
+
|
39
|
+
Most parts of Toys-Core work on JRuby. However, JRuby is not recommended
|
40
|
+
because of JVM boot latency, lack of support for Kernel#fork, and other issues.
|
41
|
+
|
39
42
|
### Create a new executable
|
40
43
|
|
41
44
|
We'll start by creating an executable Ruby script. Using your favorite text
|
@@ -327,11 +330,11 @@ deep framework with many more features. Learn about how to write tools using
|
|
327
330
|
the Toys DSL, including validating and interpreting command line arguments,
|
328
331
|
using templates and mixins, controlling subprocesses, and producing nice styled
|
329
332
|
output, in the
|
330
|
-
[Toys User Guide](https://
|
333
|
+
[Toys User Guide](https://dazuma.github.io/toys/gems/toys/latest/file.guide.html).
|
331
334
|
Learn more about how to customize and package your own executable, including
|
332
335
|
handling errors, controlling log output, and providing your own mixins,
|
333
336
|
templates, and middleware, in the
|
334
|
-
[Toys-Core User Guide](https://
|
337
|
+
[Toys-Core User Guide](https://dazuma.github.io/toys/gems/toys-core/latest/file.guide.html).
|
335
338
|
|
336
339
|
## License
|
337
340
|
|
data/docs/guide.md
CHANGED
@@ -14,7 +14,7 @@ line executables in Ruby using the Toys-Core framework.
|
|
14
14
|
This guide assumes you are already familiar with Toys itself, including how to
|
15
15
|
define tools by writing Toys files, parsing arguments and flags, and how tools
|
16
16
|
are executed. For background, please see the
|
17
|
-
[Toys User's Guide](https://
|
17
|
+
[Toys User's Guide](https://dazuma.github.io/toys/gems/toys/latest/file.guide.html).
|
18
18
|
|
19
19
|
**(This user's guide is still under construction.)**
|
20
20
|
|
data/lib/toys-core.rb
CHANGED
@@ -71,13 +71,12 @@ module Toys
|
|
71
71
|
end
|
72
72
|
|
73
73
|
require "toys/acceptor"
|
74
|
-
require "toys/alias"
|
75
74
|
require "toys/arg_parser"
|
76
75
|
require "toys/cli"
|
77
76
|
require "toys/compat"
|
78
77
|
require "toys/completion"
|
79
78
|
require "toys/context"
|
80
|
-
require "toys/
|
79
|
+
require "toys/core"
|
81
80
|
require "toys/dsl/flag"
|
82
81
|
require "toys/dsl/flag_group"
|
83
82
|
require "toys/dsl/positional_arg"
|
data/lib/toys/acceptor.rb
CHANGED
@@ -512,36 +512,61 @@ module Toys
|
|
512
512
|
# default pass-through acceptor {Toys::Acceptor::DEFAULT}. Any type
|
513
513
|
# description you provide is ignored.
|
514
514
|
#
|
515
|
-
#
|
516
|
-
#
|
515
|
+
# Additional options:
|
516
|
+
#
|
517
|
+
# * `:type_desc` (String) The type description for interpolating into
|
517
518
|
# help text. Ignored if the spec indicates the default acceptor or a
|
518
519
|
# well-known acceptor.
|
520
|
+
#
|
521
|
+
# @param spec [Object] See the description for recognized values.
|
522
|
+
# @param options [Hash] Additional options to pass to the completion.
|
519
523
|
# @param block [Proc] See the description for recognized forms.
|
520
524
|
# @return [Toys::Acceptor::Base,Proc]
|
521
525
|
#
|
522
|
-
def create(spec = nil,
|
526
|
+
def create(spec = nil, **options, &block)
|
523
527
|
well_known = lookup_well_known(spec)
|
524
528
|
return well_known if well_known
|
529
|
+
if spec.is_a?(::Hash)
|
530
|
+
options = options.merge(spec)
|
531
|
+
spec = nil
|
532
|
+
end
|
533
|
+
spec ||= options.delete(:"")
|
534
|
+
internal_create(spec, options, block)
|
535
|
+
end
|
536
|
+
|
537
|
+
## @private
|
538
|
+
def scalarize_spec(spec, options, block)
|
539
|
+
spec ||= block
|
540
|
+
if options.empty?
|
541
|
+
spec
|
542
|
+
elsif spec
|
543
|
+
options.merge({"": spec})
|
544
|
+
else
|
545
|
+
options
|
546
|
+
end
|
547
|
+
end
|
548
|
+
|
549
|
+
private
|
550
|
+
|
551
|
+
def internal_create(spec, options, block)
|
525
552
|
case spec
|
526
553
|
when Base
|
527
554
|
spec
|
528
555
|
when ::Regexp
|
529
|
-
Pattern.new(spec,
|
556
|
+
Pattern.new(spec, **options, &block)
|
530
557
|
when ::Array
|
531
|
-
Enum.new(spec,
|
558
|
+
Enum.new(spec, **options)
|
532
559
|
when ::Proc
|
533
|
-
Simple.new(spec,
|
560
|
+
Simple.new(spec, **options)
|
534
561
|
when ::Range
|
535
|
-
Range.new(spec,
|
562
|
+
Range.new(spec, **options, &block)
|
536
563
|
when nil, :default
|
537
|
-
block ? Simple.new(
|
564
|
+
block ? Simple.new(**options, &block) : DEFAULT
|
538
565
|
else
|
539
566
|
raise ToolDefinitionError, "Illegal acceptor spec: #{spec.inspect}"
|
540
567
|
end
|
541
568
|
end
|
542
569
|
|
543
|
-
private
|
544
|
-
|
545
570
|
def standard_well_knowns
|
546
571
|
@standard_well_knowns ||= {
|
547
572
|
::Object => DEFAULT,
|
data/lib/toys/arg_parser.rb
CHANGED
@@ -266,7 +266,7 @@ module Toys
|
|
266
266
|
# to the user. Optional.
|
267
267
|
#
|
268
268
|
def initialize(message = nil, value: nil, values: nil, suggestions: nil)
|
269
|
-
super(message || "Tool not found: \"#{Array(values).join(' ')}\"
|
269
|
+
super(message || "Tool not found: \"#{Array(values).join(' ')}\"",
|
270
270
|
value: value, suggestions: suggestions)
|
271
271
|
@name = name
|
272
272
|
end
|
@@ -291,14 +291,14 @@ module Toys
|
|
291
291
|
#
|
292
292
|
# @param cli [Toys::CLI] The CLI in effect.
|
293
293
|
# @param tool [Toys::Tool] The tool defining the argument format.
|
294
|
-
# @param
|
294
|
+
# @param default_data [Hash] Additional initial data (such as verbosity).
|
295
295
|
# @param require_exact_flag_match [Boolean] Whether to require flag matches
|
296
296
|
# be exact (not partial). Default is false.
|
297
297
|
#
|
298
|
-
def initialize(cli, tool,
|
298
|
+
def initialize(cli, tool, default_data: {}, require_exact_flag_match: false)
|
299
299
|
@require_exact_flag_match = require_exact_flag_match
|
300
300
|
@loader = cli.loader
|
301
|
-
@data = initial_data(cli, tool,
|
301
|
+
@data = initial_data(cli, tool, default_data)
|
302
302
|
@tool = tool
|
303
303
|
@seen_flag_keys = []
|
304
304
|
@errors = []
|
@@ -439,7 +439,7 @@ module Toys
|
|
439
439
|
REMAINING_HANDLER = ->(val, prev) { prev.is_a?(::Array) ? prev << val : [val] }
|
440
440
|
ARG_HANDLER = ->(val, _prev) { val }
|
441
441
|
|
442
|
-
def initial_data(cli, tool,
|
442
|
+
def initial_data(cli, tool, default_data)
|
443
443
|
data = {
|
444
444
|
Context::Key::ARGS => nil,
|
445
445
|
Context::Key::CLI => cli,
|
@@ -451,7 +451,7 @@ module Toys
|
|
451
451
|
Context::Key::USAGE_ERRORS => [],
|
452
452
|
}
|
453
453
|
Compat.merge_clones(data, tool.default_data)
|
454
|
-
data[
|
454
|
+
default_data.each { |k, v| data[k] ||= v }
|
455
455
|
data
|
456
456
|
end
|
457
457
|
|
data/lib/toys/cli.rb
CHANGED
@@ -224,7 +224,7 @@ module Toys
|
|
224
224
|
# @yieldparam cli [Toys::CLI] If you pass a block, the new CLI is yielded
|
225
225
|
# to it so you can add paths and make other modifications.
|
226
226
|
#
|
227
|
-
def child(_opts
|
227
|
+
def child(**_opts)
|
228
228
|
cli = CLI.new(executable_name: @executable_name,
|
229
229
|
config_dir_name: @config_dir_name,
|
230
230
|
config_file_name: @config_file_name,
|
@@ -392,7 +392,7 @@ module Toys
|
|
392
392
|
#
|
393
393
|
# @return [Integer] The resulting process status code (i.e. 0 for success).
|
394
394
|
#
|
395
|
-
def run(*args, verbosity: 0)
|
395
|
+
def run(*args, verbosity: 0, delegated_from: nil)
|
396
396
|
tool, remaining = ContextualError.capture("Error finding tool definition") do
|
397
397
|
@loader.lookup(args.flatten)
|
398
398
|
end
|
@@ -400,7 +400,11 @@ module Toys
|
|
400
400
|
"Error during tool execution!", tool.source_info&.source_path,
|
401
401
|
tool_name: tool.full_name, tool_args: remaining
|
402
402
|
) do
|
403
|
-
|
403
|
+
default_data = {
|
404
|
+
Context::Key::VERBOSITY => verbosity,
|
405
|
+
Context::Key::DELEGATED_FROM => delegated_from,
|
406
|
+
}
|
407
|
+
run_tool(tool, remaining, default_data)
|
404
408
|
end
|
405
409
|
rescue ContextualError, ::Interrupt => e
|
406
410
|
@error_handler.call(e).to_i
|
@@ -414,12 +418,12 @@ module Toys
|
|
414
418
|
#
|
415
419
|
# @param tool [Toys::Tool] The tool to run.
|
416
420
|
# @param args [Array<String>] Command line arguments passed to the tool.
|
417
|
-
# @param
|
421
|
+
# @param default_data [Hash] Initial tool context data.
|
418
422
|
# @return [Integer] The resulting status code
|
419
423
|
#
|
420
|
-
def run_tool(tool, args,
|
424
|
+
def run_tool(tool, args, default_data)
|
421
425
|
arg_parser = ArgParser.new(self, tool,
|
422
|
-
|
426
|
+
default_data: default_data,
|
423
427
|
require_exact_flag_match: tool.exact_flag_match_required?)
|
424
428
|
arg_parser.parse(args).finish
|
425
429
|
context = tool.tool_class.new(arg_parser.data)
|
data/lib/toys/compat.rb
CHANGED
@@ -30,6 +30,14 @@ module Toys
|
|
30
30
|
## @private
|
31
31
|
CURRENT_VERSION = ::Gem::Version.new(::RUBY_VERSION)
|
32
32
|
|
33
|
+
## @private
|
34
|
+
IS_JRUBY = ::RUBY_PLATFORM == "java"
|
35
|
+
|
36
|
+
## @private
|
37
|
+
def self.allow_fork?
|
38
|
+
!IS_JRUBY && RbConfig::CONFIG["host_os"] !~ /mswin/
|
39
|
+
end
|
40
|
+
|
33
41
|
## @private
|
34
42
|
def self.check_minimum_version(version)
|
35
43
|
CURRENT_VERSION >= ::Gem::Version.new(version)
|
data/lib/toys/completion.rb
CHANGED
@@ -70,7 +70,7 @@ module Toys
|
|
70
70
|
# @return [Toys::Completion::Context]
|
71
71
|
#
|
72
72
|
def with(**delta_params)
|
73
|
-
Context.new(
|
73
|
+
Context.new(**@params.merge(delta_params))
|
74
74
|
end
|
75
75
|
|
76
76
|
##
|
@@ -208,7 +208,7 @@ module Toys
|
|
208
208
|
|
209
209
|
## @private
|
210
210
|
def hash
|
211
|
-
string.hash
|
211
|
+
string.hash ^ (partial? ? 1 : 0)
|
212
212
|
end
|
213
213
|
|
214
214
|
##
|
@@ -306,7 +306,7 @@ module Toys
|
|
306
306
|
dir = ::File.expand_path(prefix, @cwd)
|
307
307
|
return [] unless ::File.directory?(dir)
|
308
308
|
prefix = nil if [".", ""].include?(prefix)
|
309
|
-
omits = [".", ".."]
|
309
|
+
omits = [".", "..", ""]
|
310
310
|
children = Compat.glob_in_dir(name, dir).find_all do |child|
|
311
311
|
!omits.include?(child)
|
312
312
|
end
|
@@ -420,16 +420,22 @@ module Toys
|
|
420
420
|
# @return [Toys::Completion::Base,Proc]
|
421
421
|
#
|
422
422
|
def self.create(spec = nil, **options, &block)
|
423
|
-
spec
|
423
|
+
if spec.is_a?(::Hash)
|
424
|
+
options = options.merge(spec)
|
425
|
+
spec = nil
|
426
|
+
end
|
427
|
+
spec ||= options.delete(:"") || block
|
424
428
|
case spec
|
425
429
|
when nil, :empty, :default
|
426
430
|
EMPTY
|
427
431
|
when ::Proc, Base
|
428
432
|
spec
|
429
433
|
when ::Array
|
430
|
-
Enum.new(spec, options)
|
434
|
+
Enum.new(spec, **options)
|
431
435
|
when :file_system
|
432
|
-
FileSystem.new(options)
|
436
|
+
FileSystem.new(**options)
|
437
|
+
when ::Class
|
438
|
+
spec.new(**options)
|
433
439
|
else
|
434
440
|
if spec.respond_to?(:call)
|
435
441
|
spec
|
@@ -438,5 +444,17 @@ module Toys
|
|
438
444
|
end
|
439
445
|
end
|
440
446
|
end
|
447
|
+
|
448
|
+
## @private
|
449
|
+
def self.scalarize_spec(spec, options, block)
|
450
|
+
spec ||= block
|
451
|
+
if options.empty?
|
452
|
+
spec
|
453
|
+
elsif spec
|
454
|
+
options.merge({"": spec})
|
455
|
+
else
|
456
|
+
options
|
457
|
+
end
|
458
|
+
end
|
441
459
|
end
|
442
460
|
end
|
data/lib/toys/context.rb
CHANGED
@@ -86,6 +86,14 @@ module Toys
|
|
86
86
|
#
|
87
87
|
CONTEXT_DIRECTORY = ::Object.new.freeze
|
88
88
|
|
89
|
+
##
|
90
|
+
# Context key for the context from which the current call was delegated.
|
91
|
+
# The value is either another context object, or `nil` if the current
|
92
|
+
# call is not delegated.
|
93
|
+
# @return [Object]
|
94
|
+
#
|
95
|
+
DELEGATED_FROM = ::Object.new.freeze
|
96
|
+
|
89
97
|
##
|
90
98
|
# Context key for the active `Logger` object.
|
91
99
|
# @return [Object]
|
@@ -23,8 +23,16 @@
|
|
23
23
|
|
24
24
|
module Toys
|
25
25
|
##
|
26
|
-
#
|
27
|
-
# @return [String]
|
26
|
+
# The core Toys classes.
|
28
27
|
#
|
29
|
-
|
28
|
+
module Core
|
29
|
+
##
|
30
|
+
# Current version of Toys core.
|
31
|
+
# @return [String]
|
32
|
+
#
|
33
|
+
VERSION = "0.9.0"
|
34
|
+
end
|
35
|
+
|
36
|
+
## @private deprecated
|
37
|
+
CORE_VERSION = Core::VERSION
|
30
38
|
end
|
data/lib/toys/dsl/flag.rb
CHANGED
@@ -55,8 +55,8 @@ module Toys
|
|
55
55
|
@long_desc = long_desc || []
|
56
56
|
@display_name = display_name
|
57
57
|
accept(acceptor)
|
58
|
-
complete_flags(flag_completion)
|
59
|
-
complete_values(value_completion)
|
58
|
+
complete_flags(flag_completion, **{})
|
59
|
+
complete_values(value_completion, **{})
|
60
60
|
end
|
61
61
|
|
62
62
|
##
|
@@ -135,9 +135,7 @@ module Toys
|
|
135
135
|
# @return [self]
|
136
136
|
#
|
137
137
|
def accept(spec = nil, **options, &block)
|
138
|
-
@
|
139
|
-
@acceptor_options = options
|
140
|
-
@acceptor_block = block
|
138
|
+
@acceptor = Acceptor.scalarize_spec(spec, options, block)
|
141
139
|
self
|
142
140
|
end
|
143
141
|
|
@@ -186,9 +184,7 @@ module Toys
|
|
186
184
|
# @return [self]
|
187
185
|
#
|
188
186
|
def complete_flags(spec = nil, **options, &block)
|
189
|
-
@
|
190
|
-
@flag_completion_options = options
|
191
|
-
@flag_completion_block = block
|
187
|
+
@flag_completion = Completion.scalarize_spec(spec, options, block)
|
192
188
|
self
|
193
189
|
end
|
194
190
|
|
@@ -204,9 +200,7 @@ module Toys
|
|
204
200
|
# @return [self]
|
205
201
|
#
|
206
202
|
def complete_values(spec = nil, **options, &block)
|
207
|
-
@
|
208
|
-
@value_completion_options = options
|
209
|
-
@value_completion_block = block
|
203
|
+
@value_completion = Completion.scalarize_spec(spec, options, block)
|
210
204
|
self
|
211
205
|
end
|
212
206
|
|
@@ -313,16 +307,9 @@ module Toys
|
|
313
307
|
|
314
308
|
## @private
|
315
309
|
def _add_to(tool, key)
|
316
|
-
acceptor = tool.scalar_acceptor(@acceptor_spec, @acceptor_options, &@acceptor_block)
|
317
|
-
flag_completion = tool.scalar_completion(
|
318
|
-
@flag_completion_spec, @flag_completion_options, &@flag_completion_block
|
319
|
-
)
|
320
|
-
value_completion = tool.scalar_completion(
|
321
|
-
@value_completion_spec, @value_completion_options, &@value_completion_block
|
322
|
-
)
|
323
310
|
tool.add_flag(key, @flags,
|
324
|
-
accept: acceptor, default: @default, handler: @handler,
|
325
|
-
complete_flags: flag_completion, complete_values: value_completion,
|
311
|
+
accept: @acceptor, default: @default, handler: @handler,
|
312
|
+
complete_flags: @flag_completion, complete_values: @value_completion,
|
326
313
|
report_collisions: @report_collisions, group: @group,
|
327
314
|
desc: @desc, long_desc: @long_desc, display_name: @display_name)
|
328
315
|
end
|