class EcomDev::ChefSpec::Helpers::RunnerProxy

Public Class Methods

new(*args, &before_initialize) click to toggle source
# File lib/ecomdev/chefspec/helpers/runner_proxy.rb, line 5
def initialize(*args, &before_initialize)
  @args = args
  @constructor_block = before_initialize
  @target = nil
  @blocks = {
      :before => {},
      :block => {},
      :after => {}
  }
end

Protected Class Methods

instance(*args, &block) click to toggle source
# File lib/ecomdev/chefspec/helpers/runner_proxy.rb, line 108
def instance(*args, &block)
  proxy = self.new(*args, &block)
  proxy_calls.each do |call|
    proxy.send(call[:method], *call[:args], &call[:block])
  end
  reset
  proxy
end
method_missing(method, *args, &block) click to toggle source
# File lib/ecomdev/chefspec/helpers/runner_proxy.rb, line 122
def method_missing(method, *args, &block)
  proxy_calls.push({method: method, args: args, block: block})
  self
end
reset() click to toggle source
# File lib/ecomdev/chefspec/helpers/runner_proxy.rb, line 117
def reset
  proxy_calls([])
  self
end

Private Class Methods

proxy_calls(calls=nil) click to toggle source
# File lib/ecomdev/chefspec/helpers/runner_proxy.rb, line 128
def proxy_calls(calls=nil)
  @calls ||= []
  unless calls.nil?
    @calls = calls
  end
  @calls
end

Public Instance Methods

after(method, instance_eval = false, &block) click to toggle source
# File lib/ecomdev/chefspec/helpers/runner_proxy.rb, line 33
def after(method, instance_eval = false, &block)
  define_proxy_block(method, :after, instance_eval, &block)
end
before(method, instance_eval = false, &block) click to toggle source
# File lib/ecomdev/chefspec/helpers/runner_proxy.rb, line 29
def before(method, instance_eval = false, &block)
  define_proxy_block(method, :before, instance_eval, &block)
end
block(method, instance_eval = false, &block) click to toggle source
# File lib/ecomdev/chefspec/helpers/runner_proxy.rb, line 37
def block(method, instance_eval = false, &block)
  define_proxy_block(method, :block, instance_eval, &block)
end
options(options = {}, override = false) click to toggle source
# File lib/ecomdev/chefspec/helpers/runner_proxy.rb, line 16
def options(options = {}, override = false)
  if @args.length == 0
    @args << options
    return @args[0]
  end
  if override
    @args[0] = options
  else
    @args[0] = options.merge(@args[0])
  end
  @args[0]
end
proxy_blocks() click to toggle source
# File lib/ecomdev/chefspec/helpers/runner_proxy.rb, line 41
def proxy_blocks
  @blocks
end
runner() click to toggle source
# File lib/ecomdev/chefspec/helpers/runner_proxy.rb, line 45
def runner
  target
end

Protected Instance Methods

block_for?(method, type) click to toggle source
# File lib/ecomdev/chefspec/helpers/runner_proxy.rb, line 58
def block_for?(method, type)
  @blocks.key?(type) && @blocks[type].key?(method) && @blocks[type][method].is_a?(Array)
end
define_proxy_block(method, type, instance_eval = false, &block) click to toggle source

Proxied chef runner

# File lib/ecomdev/chefspec/helpers/runner_proxy.rb, line 51
def define_proxy_block(method, type, instance_eval = false, &block)
  if block_given?
    @blocks[type][method] ||= Array.new
    @blocks[type][method] << {block: block, instance_eval: instance_eval}
  end
end
invoke_blocks(method, type, *args, &block) click to toggle source
# File lib/ecomdev/chefspec/helpers/runner_proxy.rb, line 62
def invoke_blocks(method, type, *args, &block)
  blocks_to_exec = []
  if block_given?
    blocks_to_exec << {block: block, instance_eval: false, caller_block: true}
  end

  if block_for?(method, type)
    blocks_to_exec.push(@blocks[type][method]).flatten!
  end

  blocks_to_exec.each do |info|
    if info[:instance_eval]
      target.instance_exec(*args, &info[:block])
    else
      calling_args = args.clone
      unless info.key?(:caller_block) && info[:caller_block]
        calling_args.unshift(target)
      end
      info[:block].call(*calling_args)
    end
  end
end
method_missing(name, *args, &block) click to toggle source
# File lib/ecomdev/chefspec/helpers/runner_proxy.rb, line 85
def method_missing(name, *args, &block)
  invoke_blocks(name, :before, *args)
  result = target.send(name, *args) do |*block_args|
    invoke_blocks(name, :block, *block_args, &block)
  end
  args.unshift(result)
  invoke_blocks(name, :after, *args)
  result
end
target() click to toggle source
# File lib/ecomdev/chefspec/helpers/runner_proxy.rb, line 95
def target
  unless @target.nil?
    return @target
  end
  block_args = nil
  @target = ChefSpec::SoloRunner.new(*@args) do |*args|
    block_args = args
  end
  invoke_blocks(:initialize, :block, *block_args, &@constructor_block)
  @target
end