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