Class: Bundler::Thor::Group
Relationships & Source Files | |
Super Chains via Extension / Inclusion / Inheritance | |
Instance Chain:
self,
Base
|
|
Inherits: | Object |
Defined in: | lib/bundler/vendor/thor/lib/thor/group.rb |
Overview
::Bundler::Thor
has a special class called Group
. The main difference to ::Bundler::Thor
class is that it invokes all commands at once. It also include some methods that allows invocations to be done at the class method, which are not available to ::Bundler::Thor
commands.
Class Method Summary
-
.desc(description = nil)
The description for this
Group
. -
.help(shell)
Prints help information.
-
.invoke(*names, &block)
Invoke the given namespace or class given.
-
.invoke_from_option(*names, &block)
Invoke a thor class based on the value supplied by the user to the given option named “name”.
-
.printable_commands
(also: .printable_tasks)
Returns commands ready to be printed.
-
.printable_tasks
Alias for .printable_commands.
-
.remove_invocation(*names)
Remove a previously added invocation.
-
.banner
protected
The banner for this class.
-
.create_task(meth)
protected
Alias for .create_command.
-
.self_task
protected
Alias for .self_command.
-
.class_options_help(shell, groups = {})
Internal use only
Overwrite class options help to allow invoked generators options to be shown recursively when invoking a generator.
-
.get_options_from_invocations(group_options, base_options)
Internal use only
Get invocations array and merge options from invocations.
- .handle_argument_error(command, error, _args, arity) Internal use only
-
.invocation_blocks
Internal use only
Stores invocation blocks used on invoke_from_option.
-
.invocations
Internal use only
Stores invocations for this class merging with superclass values.
- .baseclass protected Internal use only
- .create_command(meth) (also: .create_task) protected Internal use only
-
.dispatch(command, given_args, given_opts, config) {|instance| ... }
protected
Internal use only
The method responsible for dispatching given the args.
-
.self_command
(also: .self_task)
protected
Internal use only
Represents the whole class as a command.
Instance Attribute Summary
Base
- Included
Instance Method Summary
-
#_invoke_for_class_method(klass, command = nil, *args, &block)
protected
Internal use only
Shortcut to invoke with padding and block handling.
Base
- Included
#initialize | It receives arguments in an Array and two hashes, one for options and other for configuration. |
Class Method Details
.banner (protected)
The banner for this class. You can customize it if you are invoking the thor class by another ways which is not the Runner
.
# File 'lib/bundler/vendor/thor/lib/thor/group.rb', line 238
def "#{basename} #{self_command.formatted_usage(self, false)}" end
.baseclass (protected)
.class_options_help(shell, groups = {})
Overwrite class options help to allow invoked generators options to be shown recursively when invoking a generator.
# File 'lib/bundler/vendor/thor/lib/thor/group.rb', line 161
def (shell, groups = {}) #:nodoc: (groups, ) do |klass| klass.send(:, groups, ) end super(shell, groups) end
.create_command(meth) (protected) Also known as: .create_task
.create_task(meth) (protected)
Alias for .create_command.
# File 'lib/bundler/vendor/thor/lib/thor/group.rb', line 256
alias_method :create_task, :create_command
.desc(description = nil)
The description for this Group
. If none is provided, but a source root exists, tries to find the USAGE one folder above it, otherwise searches in the superclass.
Parameters
- description<String>
-
The description for this
Group
.
# File 'lib/bundler/vendor/thor/lib/thor/group.rb', line 16
def desc(description = nil) if description @desc = description else @desc ||= from_superclass(:desc, nil) end end
.dispatch(command, given_args, given_opts, config) {|instance| ... } (protected)
The method responsible for dispatching given the args.
# File 'lib/bundler/vendor/thor/lib/thor/group.rb', line 217
def dispatch(command, given_args, given_opts, config) #:nodoc: if Bundler::Thor::HELP_MAPPINGS.include?(given_args.first) help(config[:shell]) return end args, opts = Bundler::Thor::Options.split(given_args) opts = given_opts || opts instance = new(args, opts, config) yield instance if block_given? if command instance.invoke_command(all_commands[command]) else instance.invoke_all end end
.get_options_from_invocations(group_options, base_options)
Get invocations array and merge options from invocations. Those options are added to group_options hash. Options
that already exists in base_options are not added twice.
# File 'lib/bundler/vendor/thor/lib/thor/group.rb', line 172
def (, ) #:nodoc: invocations.each do |name, from_option| value = if from_option option = [name] option.type == :boolean ? name : option.default else name end next unless value klass, _ = prepare_for_invocation(name, value) next unless klass && klass.respond_to?(: ) value = value.to_s human_name = value.respond_to?(:classify) ? value.classify : value [human_name] ||= [] [human_name] += klass. .values.select do |class_option| [class_option.name.to_sym].nil? && class_option.group.nil? && ! .values.flatten.any? { |i| i.name == class_option.name } end yield klass if block_given? end end
.handle_argument_error(command, error, _args, arity)
# File 'lib/bundler/vendor/thor/lib/thor/group.rb', line 207
def handle_argument_error(command, error, _args, arity) #:nodoc: msg = "#{basename} #{command.name} takes #{arity} argument".dup msg << "s" if arity > 1 msg << ", but it should not." raise error, msg end
.help(shell)
Prints help information.
Options
- short
-
When true, shows only usage.
.invocation_blocks
Stores invocation blocks used on invoke_from_option.
# File 'lib/bundler/vendor/thor/lib/thor/group.rb', line 45
def invocation_blocks #:nodoc: @invocation_blocks ||= from_superclass(:invocation_blocks, {}) end
.invocations
Stores invocations for this class merging with superclass values.
# File 'lib/bundler/vendor/thor/lib/thor/group.rb', line 39
def invocations #:nodoc: @invocations ||= from_superclass(:invocations, {}) end
.invoke(*names, &block)
Invoke the given namespace or class given. It adds an instance method that will invoke the klass and command. You can give a block to configure how it will be invoked.
The namespace/class given will have its options showed on the help usage. Check invoke_from_option for more information.
# File 'lib/bundler/vendor/thor/lib/thor/group.rb', line 56
def invoke(*names, &block) = names.last.is_a?(Hash) ? names.pop : {} verbose = .fetch(:verbose, true) names.each do |name| invocations[name] = false invocation_blocks[name] = block if block_given? class_eval <<-METHOD, __FILE__, __LINE__ + 1 def _invoke_#{name.to_s.gsub(/\W/, '_')} klass, command = self.class.prepare_for_invocation(nil, #{name.inspect}) if klass say_status :invoke, #{name.inspect}, #{verbose.inspect} block = self.class.invocation_blocks[#{name.inspect}] _invoke_for_class_method klass, command, &block else say_status :error, %(#{name.inspect} [not found]), :red end end METHOD end end
.invoke_from_option(*names, &block)
Invoke a thor class based on the value supplied by the user to the given option named “name”. A class option must be created before this method is invoked for each name given.
Examples
class GemGenerator < Bundler::Thor::Group
class_option :test_framework, :type => :string
invoke_from_option :test_framework
end
Boolean options
In some cases, you want to invoke a thor class if some option is true or false. This is automatically handled by invoke_from_option. Then the option name is used to invoke the generator.
Preparing for invocation
In some cases you want to customize how a specified hook is going to be invoked. You can do that by overwriting the class method prepare_for_invocation. The class method must necessarily return a klass and an optional command.
Custom invocations
You can also supply a block to customize how the option is going to be invoked. The block receives two parameters, an instance of the current class and the klass to be invoked.
# File 'lib/bundler/vendor/thor/lib/thor/group.rb', line 110
def invoke_from_option(*names, &block) = names.last.is_a?(Hash) ? names.pop : {} verbose = .fetch(:verbose, :white) names.each do |name| unless .key?(name) raise ArgumentError, "You have to define the option #{name.inspect} " \ "before setting invoke_from_option." end invocations[name] = true invocation_blocks[name] = block if block_given? class_eval <<-METHOD, __FILE__, __LINE__ + 1 def _invoke_from_option_#{name.to_s.gsub(/\W/, '_')} return unless options[#{name.inspect}] value = options[#{name.inspect}] value = #{name.inspect} if TrueClass === value klass, command = self.class.prepare_for_invocation(#{name.inspect}, value) if klass say_status :invoke, value, #{verbose.inspect} block = self.class.invocation_blocks[#{name.inspect}] _invoke_for_class_method klass, command, &block else say_status :error, %(\#{value} [not found]), :red end end METHOD end end
.printable_commands Also known as: .printable_tasks
Returns commands ready to be printed.
.printable_tasks
Alias for .printable_commands.
# File 'lib/bundler/vendor/thor/lib/thor/group.rb', line 205
alias_method :printable_tasks, :printable_commands
.remove_invocation(*names)
Remove a previously added invocation.
Examples
remove_invocation :test_framework
# File 'lib/bundler/vendor/thor/lib/thor/group.rb', line 149
def remove_invocation(*names) names.each do |name| remove_command(name) remove_class_option(name) invocations.delete(name) invocation_blocks.delete(name) end end
.self_command (protected) Also known as: .self_task
Represents the whole class as a command.
# File 'lib/bundler/vendor/thor/lib/thor/group.rb', line 243
def self_command #:nodoc: Bundler::Thor::DynamicCommand.new(namespace, ) end
.self_task (protected)
Alias for .self_command.
# File 'lib/bundler/vendor/thor/lib/thor/group.rb', line 246
alias_method :self_task, :self_command
Instance Method Details
#_invoke_for_class_method(klass, command = nil, *args, &block) (protected)
Shortcut to invoke with padding and block handling. Use internally by invoke and invoke_from_option class methods.
# File 'lib/bundler/vendor/thor/lib/thor/group.rb', line 265
def _invoke_for_class_method(klass, command = nil, *args, &block) #:nodoc: with_padding do if block case block.arity when 3 yield(self, klass, command) when 2 yield(self, klass) when 1 instance_exec(klass, &block) end else invoke klass, command, *args end end end