Class: Bundler::Thor
Constant Summary
-
AmbiguousTaskError =
# File 'lib/bundler/vendor/thor/lib/thor/error.rb', line 62AmbiguousCommandError
-
Correctable =
Internal use only
# File 'lib/bundler/vendor/thor/lib/thor/error.rb', line 2if defined?(DidYouMean::SpellChecker) && defined?(DidYouMean::Correctable) # In order to support versions of Ruby that don't have keyword # arguments, we need our own spell checker class that doesn't take key # words. Even though this code wouldn't be hit because of the check # above, it's still necessary because the interpreter would otherwise be # unable to parse the file. class NoKwargSpellChecker < DidYouMean::SpellChecker # :nodoc: def initialize(dictionary) @dictionary = dictionary end end DidYouMean::Correctable end
-
DynamicTask =
# File 'lib/bundler/vendor/thor/lib/thor/command.rb', line 141DynamicCommand
-
HELP_MAPPINGS =
Shortcuts for help.
%w(-h -? --help -D)
-
HiddenTask =
# File 'lib/bundler/vendor/thor/lib/thor/command.rb', line 125HiddenCommand
-
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 117Command
-
UndefinedTaskError =
# File 'lib/bundler/vendor/thor/lib/thor/error.rb', line 58UndefinedCommandError
-
VERSION =
# File 'lib/bundler/vendor/thor/lib/thor/version.rb', line 2"1.0.0"
Class Method Summary
-
.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.
-
.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_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.
- .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.
- .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
-
.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.
-
.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
.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 407
def (command, namespace = nil, subcommand = false) $thor_runner ||= 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 414
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 255
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 268
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) 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 172
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) if command.long_description shell.say "Description:" shell.print_wrapped(command.long_description, :indent => 2) 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 422
def create_command(meth) #:nodoc: @usage ||= nil @desc ||= nil @long_desc ||= nil @hide ||= nil if @usage && @desc base_class = @hide ? Bundler::Thor::HiddenCommand : Bundler::Thor::Command commands[meth] = base_class.new(meth, @desc, @long_desc, @usage, ) @usage, @desc, @long_desc, @method_options, @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
.create_task(meth) (protected)
Alias for .create_command.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 442
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.rb', line 347
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 361
def disable_required_check #:nodoc: @disable_required_check ||= Set.new([: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 339
def disable_required_check!(*command_names) disable_required_check.merge(command_names) end
.disable_required_check?(command) ⇒ Boolean
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 343
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 366
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 = 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 418
def dynamic_command_class #:nodoc: Bundler::Thor::DynamicCommand end
.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 484
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 497
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 195
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 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
.initialize_added (protected)
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 444
def initialize_added #:nodoc: .merge!( ) @method_options = nil end
.long_desc(long_description, options = {})
Defines the long description of the next command.
Parameters
long description<String>
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 71
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, **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 93
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_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 155
def method_option(name, = {}) 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 121
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 463
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 479
alias_method :normalize_task_name, :normalize_command_name
.option(name, options = {})
Alias for .method_option.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 164
alias_method :option, :method_option
.options(options = nil)
Alias for .method_options.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 127
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
.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 214
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 223
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 450
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 454
alias_method :retrieve_task_name, :retrieve_command_name
.stop_on_unknown_option (protected)
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 356
def stop_on_unknown_option #:nodoc: @stop_on_unknown_option ||= Set.new 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 325
def stop_on_unknown_option!(*command_names) stop_on_unknown_option.merge(command_names) end
.stop_on_unknown_option?(command) ⇒ Boolean
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 329
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 234
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, : => }] 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 230
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 499
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 225
def subcommands @subcommands ||= from_superclass(:subcommands, []) end
.subtask(subcommand, subcommand_class)
Alias for .subcommand.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 249
alias_method :subtask, :subcommand
.subtask_help(cmd) (protected)
Alias for .subcommand_help.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 505
alias_method :subtask_help, :subcommand_help
.subtasks
Alias for .subcommands.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 228
alias_method :subtasks, :subcommands
.task_help(shell, command_name)
Alias for .command_help.
# File 'lib/bundler/vendor/thor/lib/thor.rb', line 188
alias_method :task_help, :command_help
Instance Method Details
#help(command = nil, subcommand = false)
[ GitHub ]# File 'lib/bundler/vendor/thor/lib/thor.rb', line 513
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