Module: Prefactory::Lookups
- Defined in:
- lib/rspec/core/prefactory.rb
Class Method Summary collapse
Instance Method Summary collapse
- #clear_prefactory_memoizations ⇒ Object
- #in_before_all? ⇒ Boolean
-
#prefactory(key) ⇒ Object
instantiate, or access an already-instantiated-and-memoized, prefabricated object.
-
#prefactory_add(key, *args, &block) ⇒ Object
prefabricate an object.
- #prefactory_lookup(key) ⇒ Object
Class Method Details
.included(base) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# 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 |
Instance Method Details
#clear_prefactory_memoizations ⇒ Object
135 136 137 |
# File 'lib/rspec/core/prefactory.rb', line 135 def clear_prefactory_memoizations @prefactory_memo = {} end |
#in_before_all? ⇒ Boolean
97 98 99 |
# File 'lib/rspec/core/prefactory.rb', line 97 def in_before_all? @before_all_context end |
#prefactory(key) ⇒ Object
instantiate, or access an already-instantiated-and-memoized, prefabricated object.
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# 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, &block) ⇒ Object
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.
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# 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) ⇒ Object
75 76 77 |
# File 'lib/rspec/core/prefactory.rb', line 75 def prefactory_lookup(key) PrefactoryLookup.where(:key => key).first end |