Struct.new(:name, :description, :long_description, :usage, :options, :ancestor_name)
Returns the formatted usage by injecting given required arguments and required options into the given usage.
# File bundler/vendor/thor/lib/thor/command.rb, line 41 def formatted_usage(klass, namespace = true, subcommand = false) if ancestor_name formatted = "#{ancestor_name} ".dup # add space elsif namespace namespace = klass.namespace formatted = "#{namespace.gsub(/^(default)/, '')}:".dup end formatted ||= "#{klass.namespace.split(':').last} ".dup if subcommand formatted ||= "".dup Array(usage).map do |specific_usage| formatted_specific_usage = formatted formatted_specific_usage += required_arguments_for(klass, specific_usage) # Add required options formatted_specific_usage += " #{required_options}" # Strip and go! formatted_specific_usage.strip end.join("\n") end
By default, a command invokes a method in the thor class. You can change this implementation to create custom commands.
# File bundler/vendor/thor/lib/thor/command.rb, line 20 def run(instance, args = []) arity = nil if private_method?(instance) instance.class.handle_no_command_error(name) elsif public_method?(instance) arity = instance.method(name).arity instance.__send__(name, *args) elsif local_method?(instance, :method_missing) instance.__send__(:method_missing, name.to_sym, *args) else instance.class.handle_no_command_error(name) end rescue ArgumentError => e handle_argument_error?(instance, e, caller) ? instance.class.handle_argument_error(self, e, args, arity) : (raise e) rescue NoMethodError => e handle_no_method_error?(instance, e, caller) ? instance.class.handle_no_command_error(name) : (raise e) end
# File bundler/vendor/thor/lib/thor/command.rb, line 105 def handle_argument_error?(instance, error, caller) not_debugging?(instance) && (error.message =~ /wrong number of arguments/ || error.message =~ /given \d*, expected \d*/) && begin saned = sans_backtrace(error.backtrace, caller) saned.empty? || saned.size == 1 end end
# File bundler/vendor/thor/lib/thor/command.rb, line 112 def handle_no_method_error?(instance, error, caller) not_debugging?(instance) && error.message =~ /^undefined method `#{name}' for #{Regexp.escape(instance.to_s)}$/ end
# File bundler/vendor/thor/lib/thor/command.rb, line 95 def local_method?(instance, name) methods = instance.public_methods(false) + instance.private_methods(false) + instance.protected_methods(false) !(methods & [name.to_s, name.to_sym]).empty? end
# File bundler/vendor/thor/lib/thor/command.rb, line 78 def not_debugging?(instance) !(instance.class.respond_to?(:debugging) && instance.class.debugging) end
# File bundler/vendor/thor/lib/thor/command.rb, line 91 def private_method?(instance) !(instance.private_methods & [name.to_s, name.to_sym]).empty? end
Add usage with required arguments
# File bundler/vendor/thor/lib/thor/command.rb, line 68 def required_arguments_for(klass, usage) if klass && !klass.arguments.empty? usage.to_s.gsub(/^#{name}/) do |match| match << " " << klass.arguments.map(&:usage).compact.join(" ") end else usage.to_s end end