Skip to content

Commit 7cb9915

Browse files
authored
allow memoize to take multiple method names (#37)
1 parent c0fa24a commit 7cb9915

File tree

2 files changed

+60
-3
lines changed

2 files changed

+60
-3
lines changed

lib/memery.rb

+5-3
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,12 @@ def included(base = nil, &block)
3535
extend ModuleMethods
3636

3737
module ClassMethods
38-
def memoize(method_name, condition: nil, ttl: nil)
38+
def memoize(*method_names, condition: nil, ttl: nil)
3939
prepend_memery_module!
40-
define_memoized_method!(method_name, condition: condition, ttl: ttl)
41-
method_name
40+
method_names.each do |method_name|
41+
define_memoized_method!(method_name, condition: condition, ttl: ttl)
42+
end
43+
method_names.length > 1 ? method_names : method_names.first
4244
end
4345

4446
def memoized?(method_name)

spec/memery_spec.rb

+55
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,33 @@ def self.macro(name)
134134
macro memoize def g; end
135135
end
136136

137+
class H
138+
include Memery
139+
140+
[:a, :b, :m, :n, :x, :y].each do |name|
141+
define_method(name) do
142+
CALLS << name
143+
name
144+
end
145+
end
146+
147+
memoize :m, :n
148+
memoize :x, :y, ttl: 3
149+
end
150+
137151
RSpec.describe Memery do
138152
subject(:a) { A.new }
139153

140154
before { CALLS.clear }
141155
before { B_CALLS.clear }
142156

157+
let(:unmemoized_class) do
158+
Class.new do
159+
include Memery
160+
attr_reader :a, :b, :m, :n, :x, :y
161+
end
162+
end
163+
143164
context "methods without args" do
144165
specify do
145166
values = [ a.m, a.m_nil, a.m, a.m_nil ]
@@ -366,6 +387,40 @@ def self.macro(name)
366387
end
367388
end
368389

390+
describe "with multiple methods" do
391+
let(:h) { H.new }
392+
393+
specify do
394+
values = [h.m, h.n, h.m, h.n]
395+
expect(values).to eq([:m, :n, :m, :n])
396+
expect(CALLS).to eq([:m, :n])
397+
end
398+
399+
specify do
400+
values = [h.x, h.y, h.x, h.y]
401+
expect(values).to eq([:x, :y, :x, :y])
402+
expect(CALLS).to eq([:x, :y])
403+
end
404+
405+
specify do
406+
expect(unmemoized_class.memoize(:x, :y, ttl: 3)).to eq([:x, :y])
407+
end
408+
end
409+
410+
describe ".memoize return value" do
411+
specify do
412+
expect(unmemoized_class.memoize(:x)).to eq(:x)
413+
expect(unmemoized_class.memoize(:m, ttl: 3)).to eq(:m)
414+
expect(unmemoized_class.memoize(:a, condition: -> { 1 == 2 })).to eq(:a)
415+
end
416+
417+
specify do
418+
expect(unmemoized_class.memoize(:x, :y)).to eq([:x, :y])
419+
expect(unmemoized_class.memoize(:m, :n, ttl: 3)).to eq([:m, :n])
420+
expect(unmemoized_class.memoize(:a, :b, condition: -> { 1 == 2 })).to eq([:a, :b])
421+
end
422+
end
423+
369424
describe ".memoized?" do
370425
subject { object.memoized?(method_name) }
371426

0 commit comments

Comments
 (0)