Class: Toys::Tool
- Inherits:
-
Object
- Object
- Toys::Tool
- Defined in:
- lib/toys/tool.rb
Overview
A Tool describes a single command that can be invoked using Toys. It has a name, a series of one or more words that you use to identify the tool on the command line. It also has a set of formal flags and command line arguments supported, and a block that gets run when the tool is executed.
Defined Under Namespace
Classes: DefaultCompletion
Instance Attribute Summary collapse
-
#built_middleware ⇒ Array<Toys::Middleware>
readonly
The stack of built middleware specs for this tool.
-
#completion ⇒ Toys::Completion::Base, Proc
The completion strategy for this tool.
-
#custom_context_directory ⇒ String?
The custom context directory set for this tool.
-
#default_data ⇒ Hash
readonly
The default context data set by arguments.
-
#delegate_target ⇒ Array<String>?
readonly
The full name of the delegate target, if any.
-
#desc ⇒ Toys::WrappableString
The short description string.
-
#flag_groups ⇒ Array<Toys::FlagGroup>
readonly
A list of all defined flag groups, in order.
-
#flags ⇒ Array<Toys::Flag>
readonly
A list of all defined flags.
-
#full_name ⇒ Array<String>
readonly
The name of the tool as an array of strings.
-
#interrupt_handler ⇒ Proc, ...
The interrupt handler.
-
#long_desc ⇒ Array<Toys::WrappableString>
The long description strings.
-
#optional_args ⇒ Array<Toys::PositionalArg>
readonly
A list of all defined optional positional arguments.
-
#priority ⇒ Integer
readonly
The priority of this tool definition.
-
#remaining_arg ⇒ Toys::PositionalArg?
readonly
The remaining arguments specification.
-
#required_args ⇒ Array<Toys::PositionalArg>
readonly
A list of all defined required positional arguments.
-
#source_info ⇒ Toys::SourceInfo?
readonly
Info on the source of this tool.
-
#subtool_middleware_stack ⇒ Array<Toys::Middleware::Spec>
readonly
The stack of middleware specs used for subtools.
-
#tool_class ⇒ Class
readonly
The tool class.
-
#usage_error_handler ⇒ Proc, ...
The usage error handler.
-
#used_flags ⇒ Array<String>
readonly
A list of flags that have been used in the flag definitions.
Instance Method Summary collapse
-
#add_acceptor(name, acceptor = nil, type_desc: nil, &block) ⇒ self
Add a named acceptor to the tool.
-
#add_completion(name, completion = nil, **options, &block) ⇒ self
Add a named completion proc to this tool.
-
#add_flag(key, flags = [], accept: nil, default: nil, handler: nil, complete_flags: nil, complete_values: nil, report_collisions: true, group: nil, desc: nil, long_desc: nil, display_name: nil) ⇒ self
Add a flag to the current tool.
-
#add_flag_group(type: :optional, desc: nil, long_desc: nil, name: nil, report_collisions: true, prepend: false) ⇒ self
Add a flag group to the group list.
-
#add_initializer(proc, *args, **kwargs) ⇒ self
Add an initializer.
-
#add_mixin(name, mixin_module = nil, &block) ⇒ self
Add a named mixin module to this tool.
-
#add_optional_arg(key, default: nil, accept: nil, complete: nil, display_name: nil, desc: nil, long_desc: nil) ⇒ self
Add an optional positional argument to the current tool.
-
#add_required_arg(key, accept: nil, complete: nil, display_name: nil, desc: nil, long_desc: nil) ⇒ self
Add a required positional argument to the current tool.
-
#add_template(name, template_class = nil, &block) ⇒ self
Add a named template class to this tool.
-
#append_long_desc(long_desc) ⇒ self
Append long description strings.
-
#argument_parsing_disabled? ⇒ Boolean
Returns true if this tool has disabled argument parsing.
-
#context_directory ⇒ String?
Return the effective context directory.
-
#definition_finished? ⇒ Boolean
Returns true if this tool's definition has been finished and is locked.
-
#delegate_to(target) ⇒ self
Causes this tool to delegate to another tool.
-
#disable_argument_parsing ⇒ self
Disable argument parsing for this tool.
-
#disable_flag(*flags) ⇒ self
Mark one or more flags as disabled, preventing their use by any subsequent flag definition.
-
#display_name ⇒ String
A displayable name of this tool, generally the full name delimited by spaces.
-
#enforce_flags_before_args(state = true) ⇒ self
Enforce that flags must come before args for this tool.
-
#exact_flag_match_required? ⇒ Boolean
Returns true if this tool requires exact flag matches.
-
#flags_before_args_enforced? ⇒ Boolean
Returns true if this tool enforces flags before args.
-
#handles_interrupts? ⇒ Boolean
Returns true if this tool handles interrupts.
-
#handles_usage_errors? ⇒ Boolean
Returns true if this tool handles usage errors.
-
#include_mixin(name) ⇒ self
Include the given mixin in the tool class.
-
#includes_arguments? ⇒ Boolean
Returns true if at least one flag or positional argument is defined for this tool.
-
#includes_definition? ⇒ Boolean
Returns true if this tool has any definition information.
-
#includes_description? ⇒ Boolean
Returns true if there is a specific description set for this tool.
-
#includes_modules? ⇒ Boolean
Returns true if this tool has at least one included module.
-
#lock_source(source) ⇒ self
Sets the path to the file that defines this tool.
-
#lookup_acceptor(name) ⇒ Tool::Acceptor::Base?
Get the named acceptor from this tool or its ancestors.
-
#lookup_completion(name) ⇒ Tool::Completion::Base, ...
Get the named completion from this tool or its ancestors.
-
#lookup_mixin(name) ⇒ Module?
Get the named mixin from this tool or its ancestors.
-
#lookup_template(name) ⇒ Class?
Get the named template from this tool or its ancestors.
-
#positional_args ⇒ Array<Toys::PositionalArg>
All arg definitions in order: required, optional, remaining.
-
#require_exact_flag_match(state = true) ⇒ self
Require that flags must match exactly.
-
#resolve_flag(str) ⇒ Toys::Flag::Resolution
Resolve the given flag given the flag string.
-
#root? ⇒ Boolean
Returns true if this tool is a root tool.
-
#run_handler=(proc) ⇒ Object
Set the run handler block.
-
#runnable? ⇒ Boolean
Returns true if this tool is marked as runnable.
-
#set_remaining_args(key, default: [], accept: nil, complete: nil, display_name: nil, desc: nil, long_desc: nil) ⇒ self
Specify what should be done with unmatched positional arguments.
-
#simple_name ⇒ String
The local name of this tool, i.e.
Instance Attribute Details
#built_middleware ⇒ Array<Toys::Middleware> (readonly)
The stack of built middleware specs for this tool.
197 198 199 |
# File 'lib/toys/tool.rb', line 197 def built_middleware @built_middleware end |
#completion ⇒ Toys::Completion::Base, Proc
The completion strategy for this tool.
When reading, this may return an instance of one of the subclasses of Completion::Base, or a Proc that duck-types it. Generally, this defaults to a DefaultCompletion, providing a standard algorithm that finds appropriate completions from flags, positional arguments, and subtools.
When setting, you may pass any of the following:
-
nil
or:default
which sets the value to a default instance. - A Hash of options to pass to the DefaultCompletion constructor.
- Any other form recognized by Completion.create.
232 233 234 |
# File 'lib/toys/tool.rb', line 232 def completion @completion end |
#custom_context_directory ⇒ String?
The custom context directory set for this tool.
213 214 215 |
# File 'lib/toys/tool.rb', line 213 def custom_context_directory @custom_context_directory end |
#default_data ⇒ Hash (readonly)
The default context data set by arguments.
181 182 183 |
# File 'lib/toys/tool.rb', line 181 def default_data @default_data end |
#delegate_target ⇒ Array<String>? (readonly)
The full name of the delegate target, if any.
258 259 260 |
# File 'lib/toys/tool.rb', line 258 def delegate_target @delegate_target end |
#desc ⇒ Toys::WrappableString
The short description string.
When reading, this is always returned as a WrappableString.
When setting, the description may be provided as any of the following:
- A WrappableString.
- A normal String, which will be transformed into a WrappableString using spaces as word delimiters.
- An Array of String, which will be transformed into a WrappableString where each array element represents an individual word for wrapping.
112 113 114 |
# File 'lib/toys/tool.rb', line 112 def desc @desc end |
#flag_groups ⇒ Array<Toys::FlagGroup> (readonly)
A list of all defined flag groups, in order.
138 139 140 |
# File 'lib/toys/tool.rb', line 138 def flag_groups @flag_groups end |
#flags ⇒ Array<Toys::Flag> (readonly)
A list of all defined flags.
145 146 147 |
# File 'lib/toys/tool.rb', line 145 def flags @flags end |
#full_name ⇒ Array<String> (readonly)
The name of the tool as an array of strings. This array may not be modified.
81 82 83 |
# File 'lib/toys/tool.rb', line 81 def full_name @full_name end |
#interrupt_handler ⇒ Proc, ...
The interrupt handler.
241 242 243 |
# File 'lib/toys/tool.rb', line 241 def interrupt_handler @interrupt_handler end |
#long_desc ⇒ Array<Toys::WrappableString>
The long description strings.
When reading, this is returned as an Array of WrappableString representing the lines in the description.
When setting, the description must be provided as an Array where each element may be any of the following:
- A WrappableString representing one line.
- A normal String representing a line. This will be transformed into a WrappableString using spaces as word delimiters.
- An Array of String representing a line. This will be transformed into a WrappableString where each array element represents an individual word for wrapping.
131 132 133 |
# File 'lib/toys/tool.rb', line 131 def long_desc @long_desc end |
#optional_args ⇒ Array<Toys::PositionalArg> (readonly)
A list of all defined optional positional arguments.
159 160 161 |
# File 'lib/toys/tool.rb', line 159 def optional_args @optional_args end |
#priority ⇒ Integer (readonly)
The priority of this tool definition.
88 89 90 |
# File 'lib/toys/tool.rb', line 88 def priority @priority end |
#remaining_arg ⇒ Toys::PositionalArg? (readonly)
The remaining arguments specification.
167 168 169 |
# File 'lib/toys/tool.rb', line 167 def remaining_arg @remaining_arg end |
#required_args ⇒ Array<Toys::PositionalArg> (readonly)
A list of all defined required positional arguments.
152 153 154 |
# File 'lib/toys/tool.rb', line 152 def required_args @required_args end |
#source_info ⇒ Toys::SourceInfo? (readonly)
Info on the source of this tool.
205 206 207 |
# File 'lib/toys/tool.rb', line 205 def source_info @source_info end |
#subtool_middleware_stack ⇒ Array<Toys::Middleware::Spec> (readonly)
The stack of middleware specs used for subtools.
This array may be modified in place.
190 191 192 |
# File 'lib/toys/tool.rb', line 190 def subtool_middleware_stack @subtool_middleware_stack end |
#tool_class ⇒ Class (readonly)
The tool class.
95 96 97 |
# File 'lib/toys/tool.rb', line 95 def tool_class @tool_class end |
#usage_error_handler ⇒ Proc, ...
The usage error handler.
250 251 252 |
# File 'lib/toys/tool.rb', line 250 def usage_error_handler @usage_error_handler end |
#used_flags ⇒ Array<String> (readonly)
A list of flags that have been used in the flag definitions.
174 175 176 |
# File 'lib/toys/tool.rb', line 174 def used_flags @used_flags end |
Instance Method Details
#add_acceptor(name, acceptor = nil, type_desc: nil, &block) ⇒ self
Add a named acceptor to the tool. This acceptor may be refereneced by name when adding a flag or an arg. See Acceptor.create for detailed information on how to specify an acceptor.
529 530 531 532 533 534 535 536 537 538 |
# File 'lib/toys/tool.rb', line 529 def add_acceptor(name, acceptor = nil, type_desc: nil, &block) name = name.to_s if @acceptors.key?(name) raise ToolDefinitionError, "An acceptor named #{name.inspect} has already been defined in tool" \ " #{display_name.inspect}." end @acceptors[name] = Toys::Acceptor.create(acceptor, type_desc: type_desc, &block) self end |
#add_completion(name, completion = nil, **options, &block) ⇒ self
Add a named completion proc to this tool. The completion may be referenced by name when adding a flag or an arg. See Completion.create for detailed information on how to specify a completion.
576 577 578 579 580 581 582 583 584 585 |
# File 'lib/toys/tool.rb', line 576 def add_completion(name, completion = nil, **, &block) name = name.to_s if @completions.key?(name) raise ToolDefinitionError, "A completion named #{name.inspect} has already been defined in tool" \ " #{display_name.inspect}." end @completions[name] = Toys::Completion.create(completion, **, &block) self end |
#add_flag(key, flags = [], accept: nil, default: nil, handler: nil, complete_flags: nil, complete_values: nil, report_collisions: true, group: nil, desc: nil, long_desc: nil, display_name: nil) ⇒ self
Add a flag to the current tool. Each flag must specify a key which
the script may use to obtain the flag value from the context.
You may then provide the flags themselves in OptionParser
form.
753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 |
# File 'lib/toys/tool.rb', line 753 def add_flag(key, flags = [], accept: nil, default: nil, handler: nil, complete_flags: nil, complete_values: nil, report_collisions: true, group: nil, desc: nil, long_desc: nil, display_name: nil) unless group.is_a?(FlagGroup::Base) group_name = group group = @flag_group_names[group_name] raise ToolDefinitionError, "No such flag group: #{group_name.inspect}" if group.nil? end check_definition_state(is_arg: true) accept = resolve_acceptor_name(accept) complete_flags = resolve_completion_name(complete_flags) complete_values = resolve_completion_name(complete_values) flag_def = Flag.new(key, flags, @used_flags, report_collisions, accept, handler, default, complete_flags, complete_values, desc, long_desc, display_name, group) if flag_def.active? @flags << flag_def group << flag_def end @default_data[key] = default self end |
#add_flag_group(type: :optional, desc: nil, long_desc: nil, name: nil, report_collisions: true, prepend: false) ⇒ self
Add a flag group to the group list.
The type should be one of the following symbols:
-
:optional
All flags in the group are optional -
:required
All flags in the group are required -
:exactly_one
Exactly one flag in the group must be provided -
:at_least_one
At least one flag in the group must be provided -
:at_most_one
At most one flag in the group must be provided
686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 |
# File 'lib/toys/tool.rb', line 686 def add_flag_group(type: :optional, desc: nil, long_desc: nil, name: nil, report_collisions: true, prepend: false) if !name.nil? && @flag_group_names.key?(name) return self unless report_collisions raise ToolDefinitionError, "Flag group #{name} already exists" end group = FlagGroup.create(type: type, name: name, desc: desc, long_desc: long_desc) @flag_group_names[name] = group unless name.nil? if prepend @flag_groups.unshift(group) else @flag_groups.push(group) end self end |
#add_initializer(proc, *args, **kwargs) ⇒ self
Add an initializer.
950 951 952 953 954 |
# File 'lib/toys/tool.rb', line 950 def add_initializer(proc, *args, **kwargs) check_definition_state @initializers << [proc, args, kwargs] self end |
#add_mixin(name, mixin_module = nil, &block) ⇒ self
Add a named mixin module to this tool. You may provide a mixin module or a block that configures one.
550 551 552 553 554 555 556 557 558 559 |
# File 'lib/toys/tool.rb', line 550 def add_mixin(name, mixin_module = nil, &block) name = name.to_s if @mixins.key?(name) raise ToolDefinitionError, "A mixin named #{name.inspect} has already been defined in tool" \ " #{display_name.inspect}." end @mixins[name] = mixin_module || Mixin.create(&block) self end |
#add_optional_arg(key, default: nil, accept: nil, complete: nil, display_name: nil, desc: nil, long_desc: nil) ⇒ self
Add an optional positional argument to the current tool. You must specify a key which the script may use to obtain the argument value from the context. If an optional argument is not given on the command line, the value is set to the given default.
856 857 858 859 860 861 862 863 864 865 866 |
# File 'lib/toys/tool.rb', line 856 def add_optional_arg(key, default: nil, accept: nil, complete: nil, display_name: nil, desc: nil, long_desc: nil) check_definition_state(is_arg: true) accept = resolve_acceptor_name(accept) complete = resolve_completion_name(complete) arg_def = PositionalArg.new(key, :optional, accept, default, complete, desc, long_desc, display_name) @optional_args << arg_def @default_data[key] = default self end |
#add_required_arg(key, accept: nil, complete: nil, display_name: nil, desc: nil, long_desc: nil) ⇒ self
Add a required positional argument to the current tool. You must specify a key which the script may use to obtain the argument value from the context.
818 819 820 821 822 823 824 825 826 827 |
# File 'lib/toys/tool.rb', line 818 def add_required_arg(key, accept: nil, complete: nil, display_name: nil, desc: nil, long_desc: nil) check_definition_state(is_arg: true) accept = resolve_acceptor_name(accept) complete = resolve_completion_name(complete) arg_def = PositionalArg.new(key, :required, accept, nil, complete, desc, long_desc, display_name) @required_args << arg_def self end |
#add_template(name, template_class = nil, &block) ⇒ self
Add a named template class to this tool. You may provide a template class or a block that configures one.
597 598 599 600 601 602 603 604 605 606 |
# File 'lib/toys/tool.rb', line 597 def add_template(name, template_class = nil, &block) name = name.to_s if @templates.key?(name) raise ToolDefinitionError, "A template named #{name.inspect} has already been defined in tool" \ " #{display_name.inspect}." end @templates[name] = template_class || Template.create(&block) self end |
#append_long_desc(long_desc) ⇒ self
Append long description strings.
You must pass an array of lines in the long description. See #long_desc for details on how each line may be represented.
508 509 510 511 512 |
# File 'lib/toys/tool.rb', line 508 def append_long_desc(long_desc) check_definition_state @long_desc.concat(WrappableString.make_array(long_desc)) self end |
#argument_parsing_disabled? ⇒ Boolean
Returns true if this tool has disabled argument parsing.
359 360 361 |
# File 'lib/toys/tool.rb', line 359 def argument_parsing_disabled? @disable_argument_parsing end |
#context_directory ⇒ String?
Return the effective context directory. If there is a custom context directory, uses that. Otherwise, looks for a custom context directory up the tool ancestor chain. If none is found, uses the default context directory from the source info. It is possible for there to be no context directory at all, in which case, returns nil.
1000 1001 1002 |
# File 'lib/toys/tool.rb', line 1000 def context_directory lookup_custom_context_directory || source_info&.context_directory end |
#definition_finished? ⇒ Boolean
Returns true if this tool's definition has been finished and is locked.
351 352 353 |
# File 'lib/toys/tool.rb', line 351 def definition_finished? @definition_finished end |
#delegate_to(target) ⇒ self
Causes this tool to delegate to another tool.
1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 |
# File 'lib/toys/tool.rb', line 1010 def delegate_to(target) if @delegate_target raise ToolDefinitionError, "Cannot delegate tool #{display_name.inspect} because" \ " it already delegates to \"#{@delegate_target.join(' ')}\"." end if includes_arguments? raise ToolDefinitionError, "Cannot delegate tool #{display_name.inspect} because" \ " arguments have already been defined." end if runnable? raise ToolDefinitionError, "Cannot delegate tool #{display_name.inspect} because" \ " the run method has already been defined." end disable_argument_parsing self.run_handler = make_delegation_run_handler(target) self.completion = DefaultCompletion.new(delegation_target: target) @delegate_target = target self end |
#disable_argument_parsing ⇒ self
Disable argument parsing for this tool.
613 614 615 616 617 618 619 620 621 622 |
# File 'lib/toys/tool.rb', line 613 def disable_argument_parsing check_definition_state if includes_arguments? raise ToolDefinitionError, "Cannot disable argument parsing for tool #{display_name.inspect}" \ " because arguments have already been defined." end @disable_argument_parsing = true self end |
#disable_flag(*flags) ⇒ self
Mark one or more flags as disabled, preventing their use by any subsequent flag definition. This may be used to prevent middleware from defining a particular flag.
784 785 786 787 788 789 790 791 792 793 |
# File 'lib/toys/tool.rb', line 784 def disable_flag(*flags) check_definition_state(is_arg: true) flags = flags.uniq intersection = @used_flags & flags unless intersection.empty? raise ToolDefinitionError, "Cannot disable flags already used: #{intersection.inspect}" end @used_flags.concat(flags) self end |
#display_name ⇒ String
A displayable name of this tool, generally the full name delimited by spaces.
275 276 277 |
# File 'lib/toys/tool.rb', line 275 def display_name full_name.join(" ") end |
#enforce_flags_before_args(state = true) ⇒ self
Enforce that flags must come before args for this tool.
You may disable enforcement by passoing false
for the state.
631 632 633 634 635 636 637 638 639 640 |
# File 'lib/toys/tool.rb', line 631 def enforce_flags_before_args(state = true) check_definition_state if argument_parsing_disabled? raise ToolDefinitionError, "Cannot enforce flags before args for tool #{display_name.inspect}" \ " because parsing is disabled." end @enforce_flags_before_args = state self end |
#exact_flag_match_required? ⇒ Boolean
Returns true if this tool requires exact flag matches.
375 376 377 |
# File 'lib/toys/tool.rb', line 375 def exact_flag_match_required? @require_exact_flag_match end |
#flags_before_args_enforced? ⇒ Boolean
Returns true if this tool enforces flags before args.
367 368 369 |
# File 'lib/toys/tool.rb', line 367 def flags_before_args_enforced? @enforce_flags_before_args end |
#handles_interrupts? ⇒ Boolean
Returns true if this tool handles interrupts.
299 300 301 |
# File 'lib/toys/tool.rb', line 299 def handles_interrupts? !interrupt_handler.nil? end |
#handles_usage_errors? ⇒ Boolean
Returns true if this tool handles usage errors.
307 308 309 |
# File 'lib/toys/tool.rb', line 307 def handles_usage_errors? !usage_error_handler.nil? end |
#include_mixin(name) ⇒ self
Include the given mixin in the tool class.
457 458 459 460 |
# File 'lib/toys/tool.rb', line 457 def include_mixin(name) tool_class.include(name) self end |
#includes_arguments? ⇒ Boolean
Returns true if at least one flag or positional argument is defined for this tool.
332 333 334 335 336 |
# File 'lib/toys/tool.rb', line 332 def includes_arguments? !default_data.empty? || !flags.empty? || !required_args.empty? || !optional_args.empty? || !remaining_arg.nil? || flags_before_args_enforced? end |
#includes_definition? ⇒ Boolean
Returns true if this tool has any definition information.
342 343 344 345 |
# File 'lib/toys/tool.rb', line 342 def includes_definition? includes_arguments? || runnable? || argument_parsing_disabled? || includes_modules? || includes_description? end |
#includes_description? ⇒ Boolean
Returns true if there is a specific description set for this tool.
323 324 325 |
# File 'lib/toys/tool.rb', line 323 def includes_description? !long_desc.empty? || !desc.empty? end |
#includes_modules? ⇒ Boolean
Returns true if this tool has at least one included module.
315 316 317 |
# File 'lib/toys/tool.rb', line 315 def includes_modules? @includes_modules end |
#lock_source(source) ⇒ self
Sets the path to the file that defines this tool. A tool may be defined from at most one path. If a different path is already set, it is left unchanged.
470 471 472 473 |
# File 'lib/toys/tool.rb', line 470 def lock_source(source) @source_info ||= source self end |
#lookup_acceptor(name) ⇒ Tool::Acceptor::Base?
Get the named acceptor from this tool or its ancestors.
414 415 416 |
# File 'lib/toys/tool.rb', line 414 def lookup_acceptor(name) @acceptors.fetch(name.to_s) { |k| @parent ? @parent.lookup_acceptor(k) : nil } end |
#lookup_completion(name) ⇒ Tool::Completion::Base, ...
Get the named completion from this tool or its ancestors.
447 448 449 |
# File 'lib/toys/tool.rb', line 447 def lookup_completion(name) @completions.fetch(name.to_s) { |k| @parent ? @parent.lookup_completion(k) : nil } end |
#lookup_mixin(name) ⇒ Module?
Get the named mixin from this tool or its ancestors.
436 437 438 |
# File 'lib/toys/tool.rb', line 436 def lookup_mixin(name) @mixins.fetch(name.to_s) { |k| @parent ? @parent.lookup_mixin(k) : nil } end |
#lookup_template(name) ⇒ Class?
Get the named template from this tool or its ancestors.
425 426 427 |
# File 'lib/toys/tool.rb', line 425 def lookup_template(name) @templates.fetch(name.to_s) { |k| @parent ? @parent.lookup_template(k) : nil } end |
#positional_args ⇒ Array<Toys::PositionalArg>
All arg definitions in order: required, optional, remaining.
384 385 386 387 388 |
# File 'lib/toys/tool.rb', line 384 def positional_args result = required_args + optional_args result << remaining_arg if remaining_arg result end |
#require_exact_flag_match(state = true) ⇒ self
Require that flags must match exactly. (If false, flags can match an unambiguous substring.)
649 650 651 652 653 654 655 656 657 658 |
# File 'lib/toys/tool.rb', line 649 def require_exact_flag_match(state = true) check_definition_state if argument_parsing_disabled? raise ToolDefinitionError, "Cannot require exact flag match for tool" \ " #{display_name.inspect} because parsing is disabled." end @require_exact_flag_match = state self end |
#resolve_flag(str) ⇒ Toys::Flag::Resolution
Resolve the given flag given the flag string. Returns an object that describes the resolution result, including whether the resolution matched a unique flag, the specific flag syntax that was matched, and additional information.
399 400 401 402 403 404 405 |
# File 'lib/toys/tool.rb', line 399 def resolve_flag(str) result = Flag::Resolution.new(str) flags.each do |flag_def| result.merge!(flag_def.resolve(str)) end result end |
#root? ⇒ Boolean
Returns true if this tool is a root tool.
283 284 285 |
# File 'lib/toys/tool.rb', line 283 def root? full_name.empty? end |
#run_handler=(proc) ⇒ Object
Set the run handler block
911 912 913 914 |
# File 'lib/toys/tool.rb', line 911 def run_handler=(proc) check_definition_state(is_method: true) @tool_class.to_run(&proc) end |
#runnable? ⇒ Boolean
Returns true if this tool is marked as runnable.
291 292 293 |
# File 'lib/toys/tool.rb', line 291 def runnable? tool_class.public_instance_methods(false).include?(:run) end |
#set_remaining_args(key, default: [], accept: nil, complete: nil, display_name: nil, desc: nil, long_desc: nil) ⇒ self
Specify what should be done with unmatched positional arguments. You must specify a key which the script may use to obtain the remaining args from the context.
894 895 896 897 898 899 900 901 902 903 904 |
# File 'lib/toys/tool.rb', line 894 def set_remaining_args(key, default: [], accept: nil, complete: nil, display_name: nil, desc: nil, long_desc: nil) check_definition_state(is_arg: true) accept = resolve_acceptor_name(accept) complete = resolve_completion_name(complete) arg_def = PositionalArg.new(key, :remaining, accept, default, complete, desc, long_desc, display_name) @remaining_arg = arg_def @default_data[key] = default self end |
#simple_name ⇒ String
The local name of this tool, i.e. the last element of the full name.
265 266 267 |
# File 'lib/toys/tool.rb', line 265 def simple_name full_name.last end |