Thor::Invocation

Public Instance Methods

invoke(name=nil, *args) click to toggle source

Receives a name and invokes it. The name can be a string (either “task” or “namespace:task”), a Thor::Task, a Class or a Thor instance. If the task cannot be guessed by name, it can also be supplied as second argument.

You can also supply the arguments, options and configuration values for the task to be invoked, if none is given, the same values used to initialize the invoker are used to initialize the invoked.

When no name is given, it will invoke the default task of the current class.

Examples

  class A < Thor
    def foo
      invoke :bar
      invoke "b:hello", ["José"]
    end

    def bar
      invoke "b:hello", ["José"]
    end
  end

  class B < Thor
    def hello(name)
      puts "hello #{name}"
    end
  end

You can notice that the method “foo” above invokes two tasks: “bar”, which belongs to the same class and “hello” which belongs to the class B.

By using an invocation system you ensure that a task is invoked only once. In the example above, invoking “foo” will invoke “b:hello” just once, even if it’s invoked later by “bar” method.

When class A invokes class B, all arguments used on A initialization are supplied to B. This allows lazy parse of options. Let’s suppose you have some rspec tasks:

  class Rspec < Thor::Group
    class_option :mock_framework, :type => :string, :default => :rr

    def invoke_mock_framework
      invoke "rspec:#{options[:mock_framework]}"
    end
  end

As you noticed, it invokes the given mock framework, which might have its own options:

  class Rspec::RR < Thor::Group
    class_option :style, :type => :string, :default => :mock
  end

Since it’s not rspec concern to parse mock framework options, when RR is invoked all options are parsed again, so RR can extract only the options that it’s going to use.

If you want Rspec::RR to be initialized with its own set of options, you have to do that explicitely:

  invoke "rspec:rr", [], :style => :foo

Besides giving an instance, you can also give a class to invoke:

  invoke Rspec::RR, [], :style => :foo
     # File lib/bundler/vendor/thor/invocation.rb, line 96
 96:     def invoke(name=nil, *args)
 97:       if name.nil?
 98:         warn "[Thor] Calling invoke() without argument is deprecated. Please use invoke_all instead.\n#{caller.join("\n")}"
 99:         return invoke_all
100:       end
101: 
102:       args.unshift(nil) if Array === args.first || NilClass === args.first
103:       task, args, opts, config = args
104: 
105:       klass, task = _retrieve_class_and_task(name, task)
106:       raise "Expected Thor class, got #{klass}" unless klass <= Thor::Base
107: 
108:       args, opts, config = _parse_initialization_options(args, opts, config)
109:       klass.send(:dispatch, task, args, opts, config)
110:     end
invoke_with_padding(*args) click to toggle source

Invokes using shell padding.

     # File lib/bundler/vendor/thor/invocation.rb, line 128
128:     def invoke_with_padding(*args)
129:       with_padding { invoke(*args) }
130:     end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.