Shortcuts for help.
Thor methods that should not be overwritten by the user.
Extend check unknown options to accept a hash of conditions.
options<Hash>: A hash containing :only and/or :except keys
# File lib/thor.rb, line 221 def check_unknown_options!(options={}) @check_unknown_options ||= Hash.new 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
Sets the default task when thor is executed without an explicit task to be called.
name of the default task
# File lib/thor.rb, line 10 def default_task(meth=nil) case meth when :none @default_task = 'help' when nil @default_task ||= from_superclass(:default_task, 'help') else @default_task = meth.to_s end end
Defines the usage and the description of the next task.
usage<String> description<String> options<String>
# File lib/thor.rb, line 45 def desc(usage, description, options={}) if options[:for] task = find_and_refresh_task(options[:for]) task.usage = usage if usage task.description = description if description else @usage, @desc, @hide = usage, description, options[:hide] || false end end
Prints help information for this class.
shell<Thor::Shell>
# File lib/thor.rb, line 179 def help(shell, subcommand = false) list = printable_tasks(true, subcommand) Thor::Util.thor_classes_in(self).each do |klass| list += klass.printable_tasks(false) end list.sort!{ |a,b| a[0] <=> b[0] } shell.say "Tasks:" shell.print_table(list, :indent => 2, :truncate => true) shell.say class_options_help(shell) end
Defines the long description of the next task.
long description<String>
# File lib/thor.rb, line 60 def long_desc(long_description, options={}) if options[:for] task = find_and_refresh_task(options[:for]) task.long_description = long_description if long_description else @long_desc = long_description end end
Maps an input to a task. If you define:
map "-T" => "list"
Running:
thor -T
Will invoke the list task.
Maps the string or the strings in the array to the given task.
# File lib/thor.rb, line 82 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
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 task.
def previous_task # magic end method_option :foo => :bar, :for => :previous_task def next_task # magic end
The name of the argument.
Described below.
: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/thor.rb, line 139 def method_option(name, options={}) scope = if options[:for] find_and_refresh_task(options[:for]).options else method_options end build_option(name, options, scope) end
Declares the options for the next task to be declared.
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/thor.rb, line 105 def method_options(options=nil) @method_options ||= {} build_options(options, @method_options) if options @method_options end
Returns tasks ready to be printed.
# File lib/thor.rb, line 193 def printable_tasks(all = true, subcommand = false) (all ? all_tasks : tasks).map do |_, task| next if task.hidden? item = [] item << banner(task, false, subcommand) item << (task.description ? "# #{task.description.gsub(/\s+/m,' ')}" : "") item end.compact end
Registers another Thor subclass as a command.
Thor subclass to register
Subcommand name to use
Short usage for the subcommand
Description for the subcommand
# File lib/thor.rb, line 28 def register(klass, subcommand_name, usage, description, options={}) if klass <= Thor::Group desc usage, description, options define_method(subcommand_name) { |*args| invoke(klass, args) } else desc usage, description, options subcommand subcommand_name, klass end end
# File lib/thor.rb, line 207 def subcommand(subcommand, subcommand_class) self.subcommands << subcommand.to_s subcommand_class.subcommand_help subcommand define_method(subcommand) do |*args| args, opts = Thor::Arguments.split(args) invoke subcommand_class, args, opts end end
# File lib/thor.rb, line 203 def subcommands @subcommands ||= from_superclass(:subcommands, []) end
Prints help information for the given task.
shell<Thor::Shell> task_name<String>
# File lib/thor.rb, line 157 def task_help(shell, task_name) meth = normalize_task_name(task_name) task = all_tasks[meth] handle_no_task_error(meth) unless task shell.say "Usage:" shell.say " #{banner(task)}" shell.say class_options_help(shell, nil => task.options.map { |_, o| o }) if task.long_description shell.say "Description:" shell.print_wrapped(task.long_description, :indent => 2) else shell.say task.description end end
this is the logic that takes the task name passed in by the user and determines whether it is an unambiguous prefix of a task or alias name.
# File lib/thor.rb, line 349 def find_task_possibilities(meth) len = meth.to_s.length possibilities = all_tasks.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
# File lib/thor.rb, line 363 def subcommand_help(cmd) desc "help [COMMAND]", "Describe subcommands or one specific subcommand" class_eval <<-RUBY def help(task = nil, subcommand = true); super; end RUBY end
# File lib/thor.rb, line 376 def help(task = nil, subcommand = false) task ? self.class.task_help(shell, task) : self.class.help(shell, subcommand) end