Skip to content

Commit

Permalink
closes #39
Browse files Browse the repository at this point in the history
  • Loading branch information
JelF authored and matthewrudy committed Jan 3, 2016
1 parent 698f16d commit f2ed164
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 2 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ spec/reports
test/tmp
test/version_tmp
tmp
.ruby-version
23 changes: 21 additions & 2 deletions lib/memoist.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# frozen_string_literal: true
require 'memoist/version'
require 'memoist/core_ext/singleton_class'
require 'memoist/blocks_not_supported'

module Memoist

Expand Down Expand Up @@ -111,7 +112,13 @@ def clear_structs
@all_memoized_structs = nil
end

def memoize_caller
caller.find { |x| !x['lib/memoist.rb'] }
end

def memoize(*method_names)
memoize_caller = self.memoize_caller

if method_names.last.is_a?(Hash)
identifier = method_names.pop[:identifier]
end
Expand Down Expand Up @@ -159,7 +166,13 @@ def self.memoized_methods
# end

module_eval <<-EOS, __FILE__, __LINE__ + 1
def #{method_name}(reload = false)
def #{method_name}(reload = false, &block)
if block
raise Memoist::BlocksNotSupported,
"Calls with block is not alowed for memoized method #{method_name}\n" \
"memoist called at #{memoize_caller}"
end
skip_cache = reload || !instance_variable_defined?("#{memoized_ivar}")
set_cache = skip_cache && !frozen?
Expand Down Expand Up @@ -201,7 +214,13 @@ def #{method_name}(reload = false)
# end

module_eval <<-EOS, __FILE__, __LINE__ + 1
def #{method_name}(*args)
def #{method_name}(*args, &block)
if block
raise Memoist::BlocksNotSupported,
"Calls with block is not alowed for memoized method #{method_name}\n" \
"memoist called at #{memoize_caller}"
end
reload = Memoist.extract_reload!(method(#{unmemoized_method.inspect}), args)
skip_cache = reload || !(instance_variable_defined?(#{memoized_ivar.inspect}) && #{memoized_ivar} && #{memoized_ivar}.has_key?(args))
Expand Down
4 changes: 4 additions & 0 deletions lib/memoist/blocks_not_supported.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module Memoist
# Memoist does not support calls with block to cached method_names
BlocksNotSupported = Class.new(StandardError)
end
16 changes: 16 additions & 0 deletions test/memoist_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -461,4 +461,20 @@ def test_private_method_memoization
assert_equal 1, person.is_developer_calls
end

def test_blocks_supported
person = Person.new

assert_raises(Memoist::BlocksNotSupported) { person.name { :block } }
assert_raises(Memoist::BlocksNotSupported) { person.update('smth') { :block } }
end

def test_block_contains_proper_caller
person = Person.new

begin
person.name { :block }
rescue Memoist::BlocksNotSupported => e
assert(e.message =~ /memoist_test.rb:\d+/, "message should contain caller of memoize")
end
end
end

0 comments on commit f2ed164

Please sign in to comment.