Class: Thor
- Inherits:
-
Object
- Object
- Thor
- Includes:
- Base
- Defined in:
- lib/thor.rb,
lib/thor/base.rb,
lib/thor/util.rb,
lib/thor/error.rb,
lib/thor/shell.rb,
lib/thor/actions.rb,
lib/thor/command.rb,
lib/thor/version.rb,
lib/thor/invocation.rb,
lib/thor/shell/html.rb,
lib/thor/line_editor.rb,
lib/thor/rake_compat.rb,
lib/thor/shell/basic.rb,
lib/thor/shell/color.rb,
lib/thor/parser/option.rb,
lib/thor/parser/options.rb,
lib/thor/parser/argument.rb,
lib/thor/parser/arguments.rb,
lib/thor/actions/directory.rb,
lib/thor/line_editor/basic.rb,
lib/thor/actions/create_file.rb,
lib/thor/actions/create_link.rb,
lib/thor/line_editor/readline.rb,
lib/thor/parser/shared_option.rb,
lib/thor/core_ext/ordered_hash.rb,
lib/thor/actions/empty_directory.rb,
lib/thor/actions/inject_into_file.rb,
lib/thor/actions/file_manipulation.rb,
lib/thor/core_ext/hash_with_indifferent_access.rb
Direct Known Subclasses
Defined Under Namespace
Modules: Actions, Base, CoreExt, Invocation, LineEditor, RakeCompat, Sandbox, Shell, Util Classes: AmbiguousCommandError, Argument, Arguments, Command, ConflictingArgumentError, DynamicCommand, Error, Execution, Group, HiddenCommand, InvocationError, MalformattedArgumentError, Option, Options, ProhibitedArgumentError, RequiredArgumentMissingError, Runner, SharedOption, UndefinedCommandError, UnknownArgumentError
Constant Summary collapse
- HELP_MAPPINGS =
Shortcuts for help.
%w(-h -? --help -D)- THOR_RESERVED_WORDS =
Thor methods that should not be overwritten by the user.
%w(invoke shell options behavior root destination_root relative_root action add_file create_file in_root inside run run_ruby_script)- TEMPLATE_EXTNAME =
".tt"- UndefinedTaskError =
UndefinedCommandError- AmbiguousTaskError =
AmbiguousCommandError- Task =
Command- HiddenTask =
HiddenCommand- DynamicTask =
DynamicCommand- ROOT =
Absolute, expanded path to the gem’s root directory.
Pathname.new( __dir__ ).join( '..', '..' ).
- VERSION =
Gem version string.
See versioning for details.
'0.1.7'- THOR_VERSION =
The version of Thor that Atli is up to date with.
Right now, it’s the version of Thor that was forked, but if I’m able to merge Thor updates in and end up doing so, I intend to update this to reflect it.
See versioning for details.
'0.1.7'
Instance Attribute Summary
Attributes included from Base
#args, #options, #parent_options
Class Method Summary collapse
-
.banner(command, namespace = nil, subcommand = false) ⇒ String
protected
The banner for this class.
-
.baseclass ⇒ Object
protected
:nodoc:.
-
.build_shared_option(name, options) ⇒ Object
protected
Build a Thor::SharedOption and add it to Thor.shared_method_options.
-
.check_unknown_options!(options = {}) ⇒ Object
Extend check unknown options to accept a hash of conditions.
-
.check_unknown_options?(config) ⇒ Boolean
Overwrite check_unknown_options? to take subcommands and options into account.
-
.command_help(shell, command_name, subcommand = false) ⇒ nil
(also: task_help)
Prints help information for the given command.
-
.create_command(meth) ⇒ Object
(also: create_task)
protected
:nodoc:.
-
.default_command(meth = nil) ⇒ Object
(also: default_task)
Sets the default command when thor is executed without an explicit command to be called.
-
.desc(usage, description, options = {}) ⇒ Object
Defines the usage and the description of the next command.
-
.disable_required_check ⇒ Object
protected
help command has the required check disabled by default.
-
.disable_required_check!(*command_names) ⇒ Object
Disable the check for required options for the given commands.
-
.disable_required_check?(command) ⇒ Boolean
:nodoc:.
-
.dispatch(meth, given_args, given_opts, config) {|instance| ... } ⇒ Object
protected
The method responsible for dispatching given the args.
-
.dynamic_command_class ⇒ Object
protected
:nodoc:.
-
.find_command_possibilities(meth) ⇒ Object
(also: find_task_possibilities)
protected
this is the logic that takes the command name passed in by the user and determines whether it is an unambiguous substrings of a command or alias name.
-
.find_shared_method_options(*names, groups: nil) ⇒ Hash<Symbol, Thor::SharedOption>
(also: find_shared_options)
Find shared options given names and groups.
-
.help(shell, subcommand = false) ⇒ nil
Prints help information for this class.
-
.include_method_options(*names, groups: nil) ⇒ Hash<Symbol, Thor::SharedOption>
(also: include_options)
Add the SharedOption instances with
namesand ingroupsto the next defined command method. -
.initialize_added ⇒ Object
protected
:nodoc:.
-
.long_desc(long_description, options = {}) ⇒ Object
Defines the long description of the next command.
-
.map(mappings = nil) ⇒ Object
Maps an input to a command.
-
.method_option(name, options = {}) ⇒ Object
(also: option)
Adds an option to the set of method options.
-
.method_options(options = nil) ⇒ Object
(also: options)
Declares the options for the next command to be declared.
-
.normalize_command_name(meth) ⇒ Object
(also: normalize_task_name)
protected
receives a (possibly nil) command name and returns a name that is in the commands hash.
-
.package_name(name, _ = {}) ⇒ Object
Allows for custom “Command” package naming.
-
.printable_commands(all = true, subcommand = false) ⇒ Object
(also: printable_tasks)
Returns commands ready to be printed.
-
.register(klass, subcommand_name, usage, description, options = {}) ⇒ Object
Registers another Thor subclass as a command.
-
.retrieve_command_name(args) ⇒ Object
(also: retrieve_task_name)
protected
Retrieve the command name from given args.
-
.shared_method_option(name, **options) ⇒ Object
(also: shared_option)
Declare a shared method option with an optional groups that can then be added by name or group to commands.
-
.shared_method_options(options = nil) ⇒ Hash<Symbol, Thor::SharedOption] Get all shared options
(also: shared_options)
Hash<Symbol, Thor::SharedOption] Get all shared options.
-
.stop_on_unknown_option ⇒ Object
protected
.
-
.stop_on_unknown_option!(*command_names) ⇒ Object
Stop parsing of options as soon as an unknown option or a regular argument is encountered.
-
.stop_on_unknown_option?(command) ⇒ Boolean
:nodoc:.
- .subcommand(subcommand, subcommand_class) ⇒ Object (also: subtask)
-
.subcommand_classes ⇒ Hash<String, Class<Thor::Base>]
Map of subcommand names to Thor classes for this Thor class only.
- .subcommand_help(cmd) ⇒ Object (also: subtask_help) protected
-
.subcommands ⇒ Array<String>
(also: subtasks)
List of subcommand names, including those inherited from super classes.
Instance Method Summary collapse
- #help(*args) ⇒ Object
-
#option_kwds(*names, groups: nil) ⇒ Hash<Symbol, V>
protected
Get a Hash mapping option name symbols to their values ready for ** usage in a method call for the option names and shared option groups.
Methods included from Base
included, #initialize, #on_run_error, #on_run_success, register_klass_file, subclass_files, subclasses
Class Method Details
.banner(command, namespace = nil, subcommand = false) ⇒ String (protected)
The banner for this class. You can customize it if you are invoking the thor class by another ways which is not the Thor::Runner. It receives the command that is going to be invoked and a boolean which indicates if the namespace should be displayed as arguments.
635 636 637 |
# File 'lib/thor.rb', line 635 def (command, namespace = nil, subcommand = false) "#{basename} #{command.formatted_usage(self, $thor_runner, subcommand)}" end |
.baseclass ⇒ Object (protected)
:nodoc:
640 641 642 |
# File 'lib/thor.rb', line 640 def baseclass #:nodoc: Thor end |
.build_shared_option(name, options) ⇒ Object (protected)
Build a Thor::SharedOption and add it to Thor.shared_method_options.
The Thor::SharedOption is returned.
Parameters
- name<Symbol>
-
The name of the argument.
- options<Hash>
-
Described in both class_option and method_option, with the additional ‘:groups` shared option keyword.
779 780 781 782 783 784 |
# File 'lib/thor.rb', line 779 def build_shared_option(name, ) [name] = Thor::SharedOption.new( name, .merge(:check_default_type => check_default_type?) ) end |
.check_unknown_options!(options = {}) ⇒ Object
Extend check unknown options to accept a hash of conditions.
Parameters
options<Hash>: A hash containing :only and/or :except keys
303 304 305 306 307 308 309 310 311 312 313 |
# File 'lib/thor.rb', line 303 def ( = {}) ||= {} .each do |key, value| if value [key] = Array(value) else .delete(key) end end end |
.check_unknown_options?(config) ⇒ Boolean
Overwrite check_unknown_options? to take subcommands and options into account.
317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 |
# File 'lib/thor.rb', line 317 def (config) #:nodoc: = return false unless command = config[:current_command] return true unless command name = command.name if subcommands.include?(name) false elsif [:except] ![:except].include?(name.to_sym) elsif [:only] [:only].include?(name.to_sym) else true end end |
.command_help(shell, command_name, subcommand = false) ⇒ nil Also known as: task_help
Prints help information for the given command.
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
# File 'lib/thor.rb', line 193 def command_help(shell, command_name, subcommand = false) meth = normalize_command_name(command_name) command = all_commands[meth] handle_no_command_error(meth) unless command shell.say "Usage:" shell.say " #{banner(command, nil, subcommand)}" shell.say (shell, nil => command..values) if command.long_description shell.say "Description:" shell.print_wrapped(command.long_description, :indent => 2) else shell.say command.description end nil end |
.create_command(meth) ⇒ Object (protected) Also known as: create_task
:nodoc:
648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 |
# File 'lib/thor.rb', line 648 def create_command(meth) #:nodoc: @usage ||= nil @desc ||= nil @long_desc ||= nil @hide ||= nil if @usage && @desc base_class = @hide ? Thor::HiddenCommand : Thor::Command commands[meth] = base_class.new( meth, @desc, @long_desc, @usage, ) @usage, @desc, @long_desc, , @hide = nil true elsif all_commands[meth] || meth == "method_missing" true else puts "[WARNING] Attempted to create command #{meth.inspect} without usage or description. " \ "Call desc if you want this method to be available as command or declare it inside a " \ "no_commands{} block. Invoked from #{caller[1].inspect}." false end end |
.default_command(meth = nil) ⇒ Object Also known as: default_task
Sets the default command when thor is executed without an explicit command to be called.
Parameters
- meth<Symbol>
-
name of the default command
26 27 28 29 30 31 32 |
# File 'lib/thor.rb', line 26 def default_command(meth = nil) if meth @default_command = meth == :none ? "help" : meth.to_s else @default_command ||= from_superclass(:default_command, "help") end end |
.desc(usage, description, options = {}) ⇒ Object
Defines the usage and the description of the next command.
Parameters
usage<String> description<String> options<String>
59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/thor.rb', line 59 def desc(usage, description, = {}) if [:for] command = find_and_refresh_command([:for]) command.usage = usage if usage command.description = description if description else @usage = usage @desc = description @hide = [:hide] || false end end |
.disable_required_check ⇒ Object (protected)
help command has the required check disabled by default.
574 575 576 |
# File 'lib/thor.rb', line 574 def disable_required_check #:nodoc: @disable_required_check ||= Set.new([:help]) end |
.disable_required_check!(*command_names) ⇒ Object
Disable the check for required options for the given commands. This is useful if you have a command that does not need the required options to work, like help.
Parameters
- Symbol …
-
A list of commands that should be affected.
388 389 390 |
# File 'lib/thor.rb', line 388 def disable_required_check!(*command_names) disable_required_check.merge(command_names) end |
.disable_required_check?(command) ⇒ Boolean
:nodoc:
392 393 394 |
# File 'lib/thor.rb', line 392 def disable_required_check?(command) #:nodoc: command && disable_required_check.include?(command.name.to_sym) end |
.dispatch(meth, given_args, given_opts, config) {|instance| ... } ⇒ Object (protected)
The method responsible for dispatching given the args.
579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 |
# File 'lib/thor.rb', line 579 def dispatch(meth, given_args, given_opts, config) #:nodoc: # rubocop:disable MethodLength meth ||= retrieve_command_name(given_args) command = all_commands[normalize_command_name(meth)] if !command && config[:invoked_via_subcommand] # We're a subcommand and our first argument didn't match any of our # commands. So we put it back and call our default command. given_args.unshift(meth) command = all_commands[normalize_command_name(default_command)] end if command args, opts = Thor::Options.split(given_args) if stop_on_unknown_option?(command) && !args.empty? # given_args starts with a non-option, so we treat everything as # ordinary arguments args.concat opts opts.clear end else args = given_args opts = nil command = dynamic_command_class.new(meth) end opts = given_opts || opts || [] config[:current_command] = command config[:command_options] = command. instance = new(args, opts, config) yield instance if block_given? args = instance.args trailing = args[Range.new(arguments.size, -1)] instance.invoke_command(command, trailing || []) end |
.dynamic_command_class ⇒ Object (protected)
:nodoc:
644 645 646 |
# File 'lib/thor.rb', line 644 def dynamic_command_class #:nodoc: Thor::DynamicCommand end |
.find_command_possibilities(meth) ⇒ Object (protected) Also known as: find_task_possibilities
this is the logic that takes the command name passed in by the user and determines whether it is an unambiguous substrings of a command or alias name.
720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 |
# File 'lib/thor.rb', line 720 def find_command_possibilities(meth) len = meth.to_s.length possibilities = all_commands.merge(map).keys.select { |n| meth == n[0, len] }.sort unique_possibilities = possibilities.map { |k| map[k] || k }.uniq if possibilities.include?(meth) [meth] elsif unique_possibilities.size == 1 unique_possibilities else possibilities end end |
.find_shared_method_options(*names, groups: nil) ⇒ Hash<Symbol, Thor::SharedOption> Also known as:
Find shared options given names and groups.
435 436 437 438 439 440 441 442 |
# File 'lib/thor.rb', line 435 def *names, groups: nil groups_set = Set[*groups] . select { |name, option| names.include?( name ) || !(option.groups & groups_set).empty? } end |
.help(shell, subcommand = false) ⇒ nil
Prints help information for this class.
218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
# File 'lib/thor.rb', line 218 def help(shell, subcommand = false) list = printable_commands(true, subcommand) Thor::Util.thor_classes_in(self).each do |klass| list += klass.printable_commands(false) end list.sort! { |a, b| a[0] <=> b[0] } if defined?(@package_name) && @package_name shell.say "#{@package_name} commands:" else shell.say "Commands:" end shell.print_table(list, :indent => 2, :truncate => true) shell.say (shell) end |
.include_method_options(*names, groups: nil) ⇒ Hash<Symbol, Thor::SharedOption> Also known as: include_options
Add the SharedOption instances with names and in groups to the next defined command method.
554 555 556 557 558 559 |
# File 'lib/thor.rb', line 554 def *names, groups: nil ( *names, groups: groups ). each do |name, option| [name] = option end end |
.initialize_added ⇒ Object (protected)
:nodoc:
676 677 678 679 |
# File 'lib/thor.rb', line 676 def initialize_added #:nodoc: .merge!() = nil end |
.long_desc(long_description, options = {}) ⇒ Object
Defines the long description of the next command.
Parameters
long description<String>
76 77 78 79 80 81 82 83 |
# File 'lib/thor.rb', line 76 def long_desc(long_description, = {}) if [:for] command = find_and_refresh_command([:for]) command.long_description = long_description if long_description else @long_desc = long_description end end |
.map(mappings = nil) ⇒ Object
Maps an input to a command. If you define:
map "-T" => "list"
Running:
thor -T
Will invoke the list command.
Parameters
- Hash[String|Array => Symbol]
-
Maps the string or the strings in the
array to the given command.
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'lib/thor.rb', line 99 def map(mappings = nil) @map ||= from_superclass(:map, {}) if mappings mappings.each do |key, value| if key.respond_to?(:each) key.each { |subkey| @map[subkey] = value } else @map[key] = value end end end @map end |
.method_option(name, options = {}) ⇒ Object Also known as: option
Adds an option to the set of method options. If :for is given as option, it allows you to change the options from a previous defined command.
def previous_command
# magic
end
method_option :foo => :bar, :for => :previous_command
def next_command
# magic
end
Parameters
- name<Symbol>
-
The name of the argument.
- options<Hash>
-
Described below.
Options
:desc - Description for the argument. :required - If the argument is required or not. :default - Default value for this argument. It cannot be required and
have default values.
:aliases - Aliases for this option. :type - The type of the argument, can be :string, :hash, :array,
:numeric or :boolean.
:banner - String to show on usage notes. :hide - If you want to hide this option from the help.
158 159 160 161 162 163 164 165 166 |
# File 'lib/thor.rb', line 158 def method_option(name, = {}) scope = if [:for] find_and_refresh_command([:for]). else end build_option(name, , scope) end |
.method_options(options = nil) ⇒ Object Also known as: options
Declares the options for the next command to be declared.
Parameters
- Hash[Symbol => Object]
-
The hash key is the name of the option and the value
is the type of the option. Can be :string, :array, :hash, :boolean, :numeric or :required (string). If you give a value, the type of the value is used.
122 123 124 125 126 |
# File 'lib/thor.rb', line 122 def ( = nil) ||= {} (, ) if end |
.normalize_command_name(meth) ⇒ Object (protected) Also known as: normalize_task_name
receives a (possibly nil) command name and returns a name that is in the commands hash. In addition to normalizing aliases, this logic will determine if a shortened command is an unambiguous substring of a command or alias.
normalize_command_name also converts names like animal-prison into animal_prison.
695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 |
# File 'lib/thor.rb', line 695 def normalize_command_name(meth) #:nodoc: return default_command.to_s.tr("-", "_") unless meth possibilities = find_command_possibilities(meth) if possibilities.size > 1 raise AmbiguousTaskError, "Ambiguous command #{meth} matches [#{possibilities.join(', ')}]" end if possibilities.empty? meth ||= default_command elsif map[meth] meth = map[meth] else meth = possibilities.first end meth.to_s.tr("-", "_") # treat foo-bar as foo_bar end |
.package_name(name, _ = {}) ⇒ Object
Allows for custom “Command” package naming.
Parameters
name<String> options<Hash>
16 17 18 |
# File 'lib/thor.rb', line 16 def package_name(name, _ = {}) @package_name = name.nil? || name == "" ? nil : name end |
.printable_commands(all = true, subcommand = false) ⇒ Object Also known as: printable_tasks
Returns commands ready to be printed.
237 238 239 240 241 242 243 244 245 246 |
# File 'lib/thor.rb', line 237 def printable_commands(all = true, subcommand = false) (all ? all_commands : commands).map do |_, command| next if command.hidden? item = [] item << (command, false, subcommand) item << ( command.description ? "# #{command.description.gsub(/\s+/m, ' ')}" : "" ) item end.compact end |
.register(klass, subcommand_name, usage, description, options = {}) ⇒ Object
Registers another Thor subclass as a command.
Parameters
- klass<Class>
-
Thor subclass to register
- command<String>
-
Subcommand name to use
- usage<String>
-
Short usage for the subcommand
- description<String>
-
Description for the subcommand
42 43 44 45 46 47 48 49 50 |
# File 'lib/thor.rb', line 42 def register(klass, subcommand_name, usage, description, = {}) if klass <= Thor::Group desc usage, description, define_method(subcommand_name) { |*args| invoke(klass, args) } else desc usage, description, subcommand subcommand_name, klass end end |
.retrieve_command_name(args) ⇒ Object (protected) Also known as: retrieve_task_name
Retrieve the command name from given args.
682 683 684 685 |
# File 'lib/thor.rb', line 682 def retrieve_command_name(args) #:nodoc: meth = args.first.to_s unless args.empty? args.shift if meth && (map[meth] || meth !~ /^\-/) end |
.shared_method_option(name, **options) ⇒ Object Also known as:
Declare a shared method option with an optional groups that can then be added by name or group to commands.
The shared options can then be added to methods individually by name and collectively as groups with include_method_options.
531 532 533 534 535 536 537 538 539 540 541 542 543 544 |
# File 'lib/thor.rb', line 531 def shared_method_option name, ** # Don't think the `:for` option makes sense... that would just be a # regular method option, right? I guess `:for` could be an array and # apply the option to each command, but it seems like that would just # be better as an extension to the {.method_option} behavior. # # So, we raise if we see it if .key? :for raise ArgumentError, ".shared_method_option does not accept the `:for` option" end build_shared_option(name, ) end |
.shared_method_options(options = nil) ⇒ Hash<Symbol, Thor::SharedOption] Get all shared options Also known as:
402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 |
# File 'lib/thor.rb', line 402 def ( = nil) ||= begin # Reach up the inheritance chain, if there's anyone there if superclass.respond_to? __method__ superclass.send( __method__ ).dup else # Or just default to empty {} end end if # We don't support this (yet at least) raise NotImplementedError, "Bulk set not supported, use .shared_method_option" # build_shared_options(options, @shared_method_options) end end |
.stop_on_unknown_option ⇒ Object (protected)
569 570 571 |
# File 'lib/thor.rb', line 569 def stop_on_unknown_option #:nodoc: @stop_on_unknown_option ||= Set.new end |
.stop_on_unknown_option!(*command_names) ⇒ Object
Stop parsing of options as soon as an unknown option or a regular argument is encountered. All remaining arguments are passed to the command. This is useful if you have a command that can receive arbitrary additional options, and where those additional options should not be handled by Thor.
Example
To better understand how this is useful, let’s consider a command that calls an external command. A user may want to pass arbitrary options and arguments to that command. The command itself also accepts some options, which should be handled by Thor.
class_option "verbose", :type => :boolean
stop_on_unknown_option! :exec
:except => :exec
desc "exec", "Run a shell command"
def exec(*args)
puts "diagnostic output" if [:verbose]
Kernel.exec(*args)
end
Here exec can be called with --verbose to get diagnostic output, e.g.:
$ thor exec --verbose echo foo
diagnostic output
foo
But if --verbose is given after echo, it is passed to echo instead:
$ thor exec echo --verbose foo
--verbose foo
Parameters
- Symbol …
-
A list of commands that should be affected.
374 375 376 |
# File 'lib/thor.rb', line 374 def stop_on_unknown_option!(*command_names) stop_on_unknown_option.merge(command_names) end |
.stop_on_unknown_option?(command) ⇒ Boolean
:nodoc:
378 379 380 |
# File 'lib/thor.rb', line 378 def stop_on_unknown_option?(command) #:nodoc: command && stop_on_unknown_option.include?(command.name.to_sym) end |
.subcommand(subcommand, subcommand_class) ⇒ Object Also known as: subtask
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 |
# File 'lib/thor.rb', line 278 def subcommand(subcommand, subcommand_class) subcommands << subcommand.to_s subcommand_class.subcommand_help subcommand subcommand_classes[subcommand.to_s] = subcommand_class define_method(subcommand) do |*args| args, opts = Thor::Arguments.split(args) invoke_args = [ args, opts, {:invoked_via_subcommand => true, :class_options => } ] invoke_args.unshift "help" if opts.delete("--help") || opts.delete("-h") invoke subcommand_class, *invoke_args end subcommand_class.commands.each do |_meth, command| command.ancestor_name = subcommand end end |
.subcommand_classes ⇒ Hash<String, Class<Thor::Base>]
‘.subcommands` is not necessarily equal to `.subcommand_classes.keys`
-
it won’t be when there are subcommands inherited from super classes.
I’m not really sure how this relates to Group… and I’m not going to take the time to find out now.
Map of subcommand names to Thor classes for this Thor class only.
273 274 275 |
# File 'lib/thor.rb', line 273 def subcommand_classes @subcommand_classes ||= {} end |
.subcommand_help(cmd) ⇒ Object (protected) Also known as: subtask_help
737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 |
# File 'lib/thor.rb', line 737 def subcommand_help(cmd) logger.trace __method__.to_s, cmd: cmd, caller: caller desc "help [COMMAND]", "Describe subcommands or one specific subcommand" # Atli - This used to be {#class_eval} (maybe to support really old # Rubies? Who knows...) but that made it really hard to find in # stack traces, so I switched it to {#define_method}. # define_method :help do |*args| # Add the `is_subcommand = true` trailing arg case args[-1] when true # pass when false # Weird, `false` was explicitly passed... whatever, set it to `true` args[-1] = true else # "Normal" case, append it args << true end super( *args ) end end |
.subcommands ⇒ Array<String> Also known as: subtasks
List of subcommand names, including those inherited from super classes.
255 256 257 |
# File 'lib/thor.rb', line 255 def subcommands @subcommands ||= from_superclass(:subcommands, []) end |
Instance Method Details
#help(*args) ⇒ Object
831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 |
# File 'lib/thor.rb', line 831 def help(*args) is_subcommand = case args[-1] when true, false args.pop else false end # Will be the {String} command (get help on that command) # or `nil` (get help on this class) command = args.shift # Possibly empty array of string subcommands from something like # # myexe help sub cmd # # in which case it would end up being `['cmd']` and we actually are just # passing through and want to get help on the `cmd` subcommand. # subcommands = args logger.trace "#help", args: args, command: command, is_subcommand: is_subcommand, subcommands: subcommands if command if self.class.subcommands.include? command if subcommands.empty? # Get help on a subcommand *class* self.class.subcommand_classes[command].help(shell, true) else # Atli addition - handle things like `myexe help sub cmd` # Want help on something (class or command) further down the line invoke self.class.subcommand_classes[command], ['help', *subcommands], {}, {:invoked_via_subcommand => true, :class_options => } end else # Want help on a *command* of this class # # Atli - Now that we've modified {.command_help} to accept # `subcommand`, pass it (it seems to have already been getting # the correct value to here). self.class.command_help(shell, command, is_subcommand) end else # We want help on *this class itself* (list available commands) self.class.help(shell, is_subcommand) end end |
#option_kwds(*names, groups: nil) ⇒ Hash<Symbol, V> (protected)
Get a Hash mapping option name symbols to their values ready for ** usage in a method call for the option names and shared option groups.
803 804 805 806 807 808 809 810 811 812 813 814 815 |
# File 'lib/thor.rb', line 803 def option_kwds *names, groups: nil # Transform names into a set of strings name_set = Set.new names.map( &:to_s ) # Add groups (if any) if groups self.class.( groups: groups ).each do |name, option| name_set << name.to_s end end .slice( *name_set ).sym_keys end |