Class: Bundler::Thor
Constant Summary
-
AmbiguousTaskError =
# File 'lib/bundler/vendor/thor/lib/thor/error.rb', line 59AmbiguousCommandError
-
Correctable =
# File 'lib/bundler/vendor/thor/lib/thor/error.rb', line 2if defined?(DidYouMean::SpellChecker) && defined?(DidYouMean::Correctable) # rubocop:disable Naming/ConstantName Module.new do def to_s super + DidYouMean.formatter. (corrections) end def corrections @corrections ||= self.class.const_get(:SpellChecker).new(self).corrections end end end
-
DynamicTask =
# File 'lib/bundler/vendor/thor/lib/thor/command.rb', line 150DynamicCommand
-
HELP_MAPPINGS =
Shortcuts for help.
%w(-h -? --help -D)
-
HiddenTask =
# File 'lib/bundler/vendor/thor/lib/thor/command.rb', line 134HiddenCommand
-
TEMPLATE_EXTNAME =
# File 'lib/bundler/vendor/thor/lib/thor/base.rb', line 23".tt"
-
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)
-
Task =
# File 'lib/bundler/vendor/thor/lib/thor/command.rb', line 126Command
-
UndefinedTaskError =
# File 'lib/bundler/vendor/thor/lib/thor/error.rb', line 55UndefinedCommandError
-
VERSION =
# File 'lib/bundler/vendor/thor/lib/thor/version.rb', line 2"1.3.2"
Class Method Summary
-
.at_least_one(*args, &block)
Alias for .method_at_least_one.
-
.check_unknown_options!(options = {})
Extend check unknown options to accept a hash of conditions.
-
.command_help(shell, command_name)
(also: .task_help)
Prints help information for the given command.
-
.default_command(meth = nil)
(also: .default_task)
Sets the default command when thor is executed without an explicit command to be called.
-
.default_task(meth = nil)
Alias for .default_command.
-
.desc(usage, description, options = {})
Defines the usage and the description of the next command.
-
.disable_required_check!(*command_names)
Disable the check for required options for the given commands.
-
.exclusive(*args, &block)
Alias for .method_exclusive.
-
.help(shell, subcommand = false)
Prints help information for this class.
-
.long_desc(long_description, options = {})
Defines the long description of the next command.
-
.map(mappings = nil, **kw)
Maps an input to a command.
-
.method_at_least_one(*args, &block)
(also: .at_least_one)
Adds and declares option group for required at least one of options in the block of arguments.
-
.method_exclusive(*args, &block)
(also: .exclusive)
Adds and declares option group for exclusive options in the block and arguments.
-
.method_option(name, options = {})
(also: .option)
Adds an option to the set of method options.
-
.method_options(options = nil)
(also: .options)
Declares the options for the next command to be declared.
-
.option(name, options = {})
Alias for .method_option.
-
.options(options = nil)
Alias for .method_options.
-
.package_name(name, _ = {})
Allows for custom “Command” package naming.
-
.printable_commands(all = true, subcommand = false)
(also: .printable_tasks)
Returns commands ready to be printed.
-
.printable_tasks(all = true, subcommand = false)
Alias for .printable_commands.
-
.register(klass, subcommand_name, usage, description, options = {})
Registers another
Thor
subclass as a command. -
.stop_on_unknown_option!(*command_names)
Stop parsing of options as soon as an unknown option or a regular argument is encountered.
- .subcommand(subcommand, subcommand_class) (also: .subtask)
- .subcommand_classes
- .subcommands (also: .subtasks)
-
.subtask(subcommand, subcommand_class)
Alias for .subcommand.
-
.subtasks
Alias for .subcommands.
-
.task_help(shell, command_name)
Alias for .command_help.
-
.banner(command, namespace = nil, subcommand = false)
protected
The banner for this class.
-
.create_task(meth)
protected
Alias for .create_command.
-
.find_command_possibilities(meth)
(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_task_possibilities(meth)
protected
Alias for .find_command_possibilities.
-
.normalize_task_name(meth)
protected
Alias for .normalize_command_name.
-
.retrieve_task_name(args)
protected
Alias for .retrieve_command_name.
-
.sort_commands!(list)
protected
Sort the commands, lexicographically by default.
- .subcommand_help(cmd) (also: .subtask_help) protected
-
.subtask_help(cmd)
protected
Alias for .subcommand_help.
-
.check_unknown_options?(config) ⇒ Boolean
Internal use only
Overwrite check_unknown_options? to take subcommands and options into account.
-
.command_exists?(command_name) ⇒ Boolean
Internal use only
Checks if a specified command exists.
- .deprecation_warning(message) Internal use only
- .disable_required_check?(command) ⇒ Boolean Internal use only
- .stop_on_unknown_option?(command) ⇒ Boolean Internal use only
- .baseclass protected Internal use only
- .create_command(meth) (also: .create_task) protected Internal use only
-
.disable_required_check
protected
Internal use only
help command has the required check disabled by default.
-
.dispatch(meth, given_args, given_opts, config) {|instance| ... }
protected
Internal use only
The method responsible for dispatching given the args.
- .dynamic_command_class protected Internal use only
- .initialize_added protected Internal use only
-
.method_at_least_one_option_names
protected
Internal use only
Returns this class at least one of required options array set.
-
.method_exclusive_option_names
protected
Internal use only
Returns this class exclusive options array set.
-
.normalize_command_name(meth)
(also: .normalize_task_name)
protected
Internal use only
receives a (possibly nil) command name and returns a name that is in the commands hash.
- .print_at_least_one_required_options(shell, command = nil) protected Internal use only
- .print_exclusive_options(shell, command = nil) protected Internal use only
-
.retrieve_command_name(args)
(also: .retrieve_task_name)
protected
Internal use only
Retrieve the command name from given args.
- .stop_on_unknown_option protected Internal use only
Instance Attribute Summary
Base
- Included
Instance Method Summary
Base
- Included
#initialize | It receives arguments in an Array and two hashes, one for options and other for configuration. |
Class Method Details
.at_least_one(*args, &block)
Alias for .method_at_least_one.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 250
alias_method :at_least_one, :method_at_least_one
.banner(command, namespace = nil, subcommand = false) (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.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 546
def (command, namespace = nil, subcommand = false) command.formatted_usage(self, $thor_runner, subcommand).split("\n").map do |formatted_usage| "#{basename} #{formatted_usage}" end.join("\n") end
.baseclass (protected)
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 552
def baseclass #:nodoc: Bundler::Thor end
.check_unknown_options!(options = {})
Extend check unknown options to accept a hash of conditions.
Parameters
options<Hash>: A hash containing :only
and/or :except
keys
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 350
def ( = {}) @check_unknown_options ||= {} .each do |key, value| if value @check_unknown_options[key] = Array(value) else @check_unknown_options.delete(key) end end @check_unknown_options end
.check_unknown_options?(config) ⇒ Boolean
Overwrite check_unknown_options? to take subcommands and options into account.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 363
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_exists?(command_name) ⇒ Boolean
Checks if a specified command exists.
Parameters
- command_name<String>
-
The name of the command to check for existence.
Returns
- Boolean
-
true
if the command exists,false
otherwise.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 449
def command_exists?(command_name) #:nodoc: commands.keys.include?(normalize_command_name(command_name)) end
.command_help(shell, command_name) Also known as: .task_help
Prints help information for the given command.
Parameters
shell<Bundler::Thor::Shell> command_name<String>
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 258
def command_help(shell, command_name) meth = normalize_command_name(command_name) command = all_commands[meth] handle_no_command_error(meth) unless command shell.say "Usage:" shell.say " #{ (command).split("\n").join("\n ")}" shell.say (shell, nil => command. .values) (shell, command) (shell, command) if command.long_description shell.say "Description:" if command.wrap_long_description shell.print_wrapped(command.long_description, indent: 2) else shell.say command.long_description end else shell.say command.description end end
.create_command(meth) (protected) Also known as: .create_task
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 560
def create_command(meth) #:nodoc: @usage ||= nil @desc ||= nil @long_desc ||= nil @long_desc_wrap ||= nil @hide ||= nil if @usage && @desc base_class = @hide ? Bundler::Thor::HiddenCommand : Bundler::Thor::Command relations = {exclusive_option_names: method_exclusive_option_names, at_least_one_option_names: method_at_least_one_option_names} commands[meth] = base_class.new(meth, @desc, @long_desc, @long_desc_wrap, @usage, , relations) @usage, @desc, @long_desc, @long_desc_wrap, @method_options, @hide = nil @method_exclusive_option_names, @method_at_least_one_option_names = 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
.create_task(meth) (protected)
Alias for .create_command.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 584
alias_method :create_task, :create_command
.default_command(meth = nil) 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
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 21
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
.default_task(meth = nil)
Alias for .default_command.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 28
alias_method :default_task, :default_command
.deprecation_warning(message)
# File 'lib/bundler/vendor/thor/lib/thor/base.rb', line 26
def deprecation_warning( ) #:nodoc: unless ENV["THOR_SILENCE_DEPRECATION"] warn "Deprecation warning: #{}\n" + "You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION." end end
.desc(usage, description, options = {})
Defines the usage and the description of the next command.
Parameters
usage<String> description<String> options<String>
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 54
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 (protected)
help command has the required check disabled by default.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 478
def disable_required_check #:nodoc: @disable_required_check ||= [:help] end
.disable_required_check!(*command_names)
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.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 434
def disable_required_check!(*command_names) @disable_required_check = disable_required_check | command_names end
.disable_required_check?(command) ⇒ Boolean
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 438
def disable_required_check?(command) #:nodoc: command && disable_required_check.include?(command.name.to_sym) end
.dispatch(meth, given_args, given_opts, config) {|instance| ... } (protected)
The method responsible for dispatching given the args.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 505
def dispatch(meth, given_args, given_opts, config) #:nodoc: 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 = Bundler::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. 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 (protected)
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 556
def dynamic_command_class #:nodoc: Bundler::Thor::DynamicCommand end
.exclusive(*args, &block)
Alias for .method_exclusive.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 207
alias_method :exclusive, :method_exclusive
.find_command_possibilities(meth) (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.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 626
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_task_possibilities(meth) (protected)
Alias for .find_command_possibilities.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 639
alias_method :find_task_possibilities, :find_command_possibilities
.help(shell, subcommand = false)
Prints help information for this class.
Parameters
shell<Bundler::Thor::Shell>
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 288
def help(shell, subcommand = false) list = printable_commands(true, subcommand) Bundler::Thor::Util.thor_classes_in(self).each do |klass| list += klass.printable_commands(false) end sort_commands!(list) 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) (shell) (shell) end
.initialize_added (protected)
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 586
def initialize_added #:nodoc: .merge!( ) @method_options = nil end
.long_desc(long_description, options = {})
Defines the long description of the next command.
Long description is by default indented, line-wrapped and repeated whitespace merged. In order to print long description verbatim, with indentation and spacing exactly as found in the code, use the wrap
option
long_desc 'your very long description', wrap: false
Parameters
long description<String> options<Hash>
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 78
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 @long_desc_wrap = [:wrap] != false end end
.map(mappings = nil, **kw)
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.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 101
def map(mappings = nil, **kw) @map ||= from_superclass(:map, {}) if mappings && !kw.empty? mappings = kw.merge!(mappings) else mappings ||= kw end 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_at_least_one(*args, &block) Also known as: .at_least_one
Adds and declares option group for required at least one of options in the block of arguments. You can declare options as the outside of the block.
If :for
is given as option, it allows you to change the options from a previous defined command.
Parameters
- options<Hash>
-
:for
is applied for previous defined command.
Examples
at_least_one do
option :one
option :two
end
Or
option :one
option :two
at_least_one :one, :two
If you do not give “–one” and “–two” Thor::AtLeastOneRequiredArgumentError
will be raised.
You can use at_least_one and exclusive at the same time.
exclusive do
at_least_one do
option :one
option :two
end
end
Then it is required either only one of “–one” or “–two”.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 246
def method_at_least_one(*args, &block) (:, :method_at_least_one_option_names, *args, &block) end
.method_at_least_one_option_names (protected)
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 469
def method_at_least_one_option_names #:nodoc: @method_at_least_one_option_names ||= [] end
.method_exclusive(*args, &block) Also known as: .exclusive
Adds and declares option group for exclusive options in the block and arguments. You can declare options as the outside of the block.
If :for
is given as option, it allows you to change the options from a previous defined command.
Parameters
- options<Hash>
-
:for
is applied for previous defined command.
Examples
exclusive do
option :one
option :two
end
Or
option :one
option :two
exclusive :one, :two
If you give “–one” and “–two” at the same time ExclusiveArgumentsError will be raised.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 203
def method_exclusive(*args, &block) (:, :method_exclusive_option_names, *args, &block) end
.method_exclusive_option_names (protected)
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 460
def method_exclusive_option_names #:nodoc: @method_exclusive_option_names ||= [] end
.method_option(name, options = {}) 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, :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.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 163
def method_option(name, = {}) unless [ Symbol, String ].any? { |klass| name.is_a?(klass) } raise ArgumentError, "Expected a Symbol or String, got #{name.inspect}" end scope = if [:for] find_and_refresh_command( [:for]). else end build_option(name, , scope) end
.method_options(options = nil) 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.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 129
def ( = nil) @method_options ||= {} (, @method_options) if @method_options end
.normalize_command_name(meth) (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
.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 605
def normalize_command_name(meth) #:nodoc: return default_command.to_s.tr("-", "_") unless meth possibilities = find_command_possibilities(meth) raise AmbiguousTaskError, "Ambiguous command #{meth} matches [#{possibilities.join(', ')}]" if possibilities.size > 1 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
.normalize_task_name(meth) (protected)
Alias for .normalize_command_name.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 621
alias_method :normalize_task_name, :normalize_command_name
.option(name, options = {})
Alias for .method_option.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 175
alias_method :option, :method_option
.options(options = nil)
Alias for .method_options.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 135
alias_method :, :
.package_name(name, _ = {})
Allows for custom “Command” package naming.
Parameters
name<String> options<Hash>
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 12
def package_name(name, _ = {}) @package_name = name.nil? || name == "" ? nil : name end
.print_at_least_one_required_options(shell, command = nil) (protected)
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 493
def (shell, command = nil) # :nodoc: opts = [] opts = command.method_at_least_one_option_names unless command.nil? opts += class_at_least_one_option_names unless opts.empty? shell.say "Required At Least One:" shell.print_table(opts.map{ |ex| ex.map{ |e| "--#{e}"}}, indent: 2 ) shell.say end end
.print_exclusive_options(shell, command = nil) (protected)
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 482
def (shell, command = nil) # :nodoc: opts = [] opts = command.method_exclusive_option_names unless command.nil? opts += class_exclusive_option_names unless opts.empty? shell.say "Exclusive Options:" shell.print_table(opts.map{ |ex| ex.map{ |e| "--#{e}"}}, indent: 2 ) shell.say end end
.printable_commands(all = true, subcommand = false) Also known as: .printable_tasks
Returns commands ready to be printed.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 309
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
.printable_tasks(all = true, subcommand = false)
Alias for .printable_commands.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 318
alias_method :printable_tasks, :printable_commands
.register(klass, subcommand_name, usage, description, options = {})
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
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 37
def register(klass, subcommand_name, usage, description, = {}) if klass <= Bundler::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) (protected) Also known as: .retrieve_task_name
Retrieve the command name from given args.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 592
def retrieve_command_name(args) #:nodoc: meth = args.first.to_s unless args.empty? args.shift if meth && (map[meth] || meth !~ /^\-/) end
.retrieve_task_name(args) (protected)
Alias for .retrieve_command_name.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 596
alias_method :retrieve_task_name, :retrieve_command_name
.sort_commands!(list) (protected)
Sort the commands, lexicographically by default.
Can be overridden in the subclass to change the display order of the commands.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 653
def sort_commands!(list) list.sort! { |a, b| a[0] <=> b[0] } end
.stop_on_unknown_option (protected)
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 473
def stop_on_unknown_option #:nodoc: @stop_on_unknown_option ||= [] end
.stop_on_unknown_option!(*command_names)
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.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 420
def stop_on_unknown_option!(*command_names) @stop_on_unknown_option = stop_on_unknown_option | command_names end
.stop_on_unknown_option?(command) ⇒ Boolean
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 424
def stop_on_unknown_option?(command) #:nodoc: command && stop_on_unknown_option.include?(command.name.to_sym) end
.subcommand(subcommand, subcommand_class) Also known as: .subtask
[ GitHub ]# File 'lib/bundler/vendor/thor/lib/thor.rb', line 329
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 = Bundler::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
[ GitHub ]# File 'lib/bundler/vendor/thor/lib/thor.rb', line 325
def subcommand_classes @subcommand_classes ||= {} end
.subcommand_help(cmd) (protected) Also known as: .subtask_help
[ GitHub ]# File 'lib/bundler/vendor/thor/lib/thor.rb', line 641
def subcommand_help(cmd) desc "help [COMMAND]", "Describe subcommands or one specific subcommand" class_eval " def help(command = nil, subcommand = true); super; end " end
.subcommands Also known as: .subtasks
[ GitHub ]# File 'lib/bundler/vendor/thor/lib/thor.rb', line 320
def subcommands @subcommands ||= from_superclass(:subcommands, []) end
.subtask(subcommand, subcommand_class)
Alias for .subcommand.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 344
alias_method :subtask, :subcommand
.subtask_help(cmd) (protected)
Alias for .subcommand_help.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 647
alias_method :subtask_help, :subcommand_help
.subtasks
Alias for .subcommands.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 323
alias_method :subtasks, :subcommands
.task_help(shell, command_name)
Alias for .command_help.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 281
alias_method :task_help, :command_help
Instance Method Details
#help(command = nil, subcommand = false)
[ GitHub ]# File 'lib/bundler/vendor/thor/lib/thor.rb', line 663
def help(command = nil, subcommand = false) if command if self.class.subcommands.include? command self.class.subcommand_classes[command].help(shell, true) else self.class.command_help(shell, command) end else self.class.help(shell, subcommand) end end