module Prefactory::Lookups

Public Class Methods

included(base) click to toggle source
# File lib/rspec/core/prefactory.rb, line 37
def self.included(base)
  PrefactoryLookup.create_table

  base.instance_eval do
    def before_with_detect_before_all(*args, &block)
      before_all_context = (args.first == :all)
      modified_block = proc do
        @before_all_context = before_all_context
        instance_eval(&block)
        @before_all_context = nil
      end
      before_without_detect_before_all(*args, &modified_block)
    end

    class << self
      alias_method :before_without_detect_before_all, :before
      alias_method :before, :before_with_detect_before_all
    end

    def set!(key, *args, &set_block)
      before(:all) do
        modified_block = proc { instance_eval(&set_block) } if set_block
        prefactory_add(key, *args, &modified_block)
      end
    end
  end

  # allow shorthand access to a prefabricated object
  # e.g. with prefactory_add(:active_user), calling the method active_user will return the (memoized) object,
  # by invoking the 'prefactory' method.
  base.class_eval do
    def method_missing(key, *args, &block)
      result = prefactory(key)
      result == Prefactory::NotDefined ? super : result
    end
  end
end

Public Instance Methods

before_with_detect_before_all(*args, &block) click to toggle source
# File lib/rspec/core/prefactory.rb, line 41
def before_with_detect_before_all(*args, &block)
  before_all_context = (args.first == :all)
  modified_block = proc do
    @before_all_context = before_all_context
    instance_eval(&block)
    @before_all_context = nil
  end
  before_without_detect_before_all(*args, &modified_block)
end
clear_prefactory_memoizations() click to toggle source
# File lib/rspec/core/prefactory.rb, line 135
def clear_prefactory_memoizations
  @prefactory_memo = {}
end
in_before_all?() click to toggle source
# File lib/rspec/core/prefactory.rb, line 97
def in_before_all?
  @before_all_context
end
method_missing(key, *args, &block) click to toggle source
Calls superclass method
# File lib/rspec/core/prefactory.rb, line 68
def method_missing(key, *args, &block)
  result = prefactory(key)
  result == Prefactory::NotDefined ? super : result
end
prefactory(key) click to toggle source

instantiate, or access an already-instantiated-and-memoized, prefabricated object.

# File lib/rspec/core/prefactory.rb, line 80
def prefactory(key)
  @prefactory_memo ||= {}
  @prefactory_memo[key] ||= begin
    lookup = prefactory_lookup(key)
    if lookup.present?
      if lookup[:result_class]
        lookup[:result_class].constantize.find(lookup[:result_id])
      else
        YAML.load(lookup[:result_value])
      end
    else
      Prefactory::NotDefined
    end
  rescue
  end
end
prefactory_add(key, *args) { || ... } click to toggle source

prefabricate an object. Can be passed any block that returns a class accessible by Klass.find(id), or, if no block is passed, invokes create(key, options) to use e.g. a FactoryGirl factory of that key name.

# File lib/rspec/core/prefactory.rb, line 103
def prefactory_add(key, *args, &block)
  raise "prefactory_add can only be used in a before(:all) context.  Change to a before(:all) or set!, or use let/let! instead." unless in_before_all?
  result = nil
  clear_prefactory_memoizations
  if block
    result = yield
  else
    result = create(key, *args) if respond_to?(:create)
  end
  if result.present?
    if result.respond_to?(:id)
      PrefactoryLookup.where(:key => key).first_or_initialize.tap do |lookup|
        lookup.result_class = result.class.name
        lookup.result_id = result.id
        lookup.result_value = nil
        lookup.save!
      end
    else
      PrefactoryLookup.where(:key => key).first_or_initialize.tap do |lookup|
        lookup.result_class = nil
        lookup.result_id = nil
        lookup.result_value = YAML.dump(result)
        lookup.save!
      end
    end
  else
    warn "WARNING: Failed to add #{key} to prefactory: block result not present"
  end
  clear_prefactory_memoizations
  result
end
prefactory_lookup(key) click to toggle source
# File lib/rspec/core/prefactory.rb, line 75
def prefactory_lookup(key)
  PrefactoryLookup.where(:key => key).first
end
set!(key, *args, &set_block) click to toggle source
# File lib/rspec/core/prefactory.rb, line 56
def set!(key, *args, &set_block)
  before(:all) do
    modified_block = proc { instance_eval(&set_block) } if set_block
    prefactory_add(key, *args, &modified_block)
  end
end