Skip to content
This repository was archived by the owner on Nov 30, 2024. It is now read-only.

Refactor Memozied Helpers #871

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 13 additions & 7 deletions lib/rspec/core/memoized_helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -192,12 +192,15 @@ def let(name, &block)
# We have to pass the block directly to `define_method` to
# allow it to use method constructs like `super` and `return`.
raise "#let or #subject called without a block" if block.nil?
MemoizedHelpers.module_for(self).define_method(name, &block)

method_name = let_method(name)

MemoizedHelpers.module_for(self).define_method(method_name, &block)

# Apply the memoization. The method has been defined in an ancestor
# module so we can use `super` here to get the value.
define_method(name) do
__memoized.fetch(name) { |k| __memoized[k] = super(&nil) }
__memoized.fetch(name) { |k| __memoized[k] = send("__rspec_let_definition_#{name}",&nil) }
end
end

Expand Down Expand Up @@ -290,12 +293,8 @@ def let!(name, &block)
# @see MemoizedHelpers#should
def subject(name=nil, &block)
if name
let(name, &block)
define_method(name) { __memoized.fetch(name) {|k| __memoized[k] = instance_eval(&block) } }
alias_method :subject, name

self::NamedSubjectPreventSuper.define_method(name) do
raise NotImplementedError, "`super` in named subjects is not supported"
end
else
let(:subject, &block)
end
Expand Down Expand Up @@ -448,6 +447,13 @@ def should_not(matcher=nil, message=nil)
example(&block)
end
end

private

def let_method name
"__rspec_let_definition_#{name}"
end

end

# @api private
Expand Down