Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
refactoring key generator to use less lambdas
  • Loading branch information
tulios committed Mar 18, 2012
1 parent f6ab061 commit 39de1bc
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 23 deletions.
6 changes: 4 additions & 2 deletions lib/stale_if_slow/api.rb
Expand Up @@ -39,8 +39,10 @@ def rename_method name
end

def define_proxy_method_for name, generator, opts
original_impl = lambda {|*args| self.send("#{PREFIX}#{name}", *args)}
performer = TimeoutPerformer.generate(reference: self, method: name, generator: generator, opts: opts, &original_impl)
performer = TimeoutPerformer.generate(reference: self, method: name, generator: generator, opts: opts) do |*args|
self.send("#{PREFIX}#{name}", *args)
end

self.class.instance_eval do
define_method(name) do |*args|
performer.call(*args)
Expand Down
29 changes: 14 additions & 15 deletions lib/stale_if_slow/key_generator.rb
@@ -1,28 +1,27 @@
module StaleIfSlow
class KeyGenerator

def initialize reference, method_name, class_generator = nil, &generator
def initialize reference, method_name, class_generator = nil, &lambda_generator
@reference, @method_name = reference, method_name
@generator = default_generator
@generator = generator || new_class_generator(class_generator) if class_generator or generator
@generator = lambda_generator if lambda_generator
@generator = class_generator.new(@method_name, @reference) if class_generator.is_a?(Class)
end

def generate args
@generator.call(@method_name, @reference, args)
if @generator.respond_to?(:generate)
@generator.generate(args)

elsif @generator
@generator.call(@method_name, @reference, args)

else
default_key(args)
end
end

private
def new_class_generator clazz
lambda {|method_name, reference, args|
generator = clazz.new(method_name, reference, args)
generator.generate
}
end

def default_generator
lambda {|method_name, reference, args|
Digest::MD5.hexdigest("#{reference.class}##{method_name}::#{args.join('|')}")
}
def default_key args
Digest::MD5.hexdigest("#{@reference.class}##{@method_name}::#{args.join('|')}")
end

end
Expand Down
4 changes: 2 additions & 2 deletions spec/stale_if_slow/api_spec.rb
Expand Up @@ -2,8 +2,8 @@

describe StaleIfSlow::API do
class Generator
def initialize(method_name, reference, args); end
def generate; "class"; end
def initialize(method_name, reference); end
def generate(args); "class"; end
end

class Example1
Expand Down
8 changes: 4 additions & 4 deletions spec/stale_if_slow/key_generator_spec.rb
Expand Up @@ -52,12 +52,12 @@

describe "with class generator" do
class Generator
def initialize method_name, reference, args
@reference, @method_name, @args = reference, method_name, args
def initialize method_name, reference
@reference, @method_name = reference, method_name
end

def generate
"#{@reference.class}|#{@method_name}|#{@args.join('|')}"
def generate args
"#{@reference.class}|#{@method_name}|#{args.join('|')}"
end
end

Expand Down
2 changes: 2 additions & 0 deletions spec/stale_if_slow/timeout_performer_spec.rb
Expand Up @@ -152,10 +152,12 @@ def error; raise "error"; end
# value was received
Timeout.should_receive(:timeout).with(performer.timeout, StaleIfSlow::Error).and_raise(StaleIfSlow::Error)
performer.should_not_receive(:write_content)
reference.should_not_receive(original_method)
reference.get.should eql "stale"
end

it "should propagate the exception in case of error" do
reference.should_not_receive(original_method)
reference.stub(original_method).and_raise(StandardError.new("erro"))
expect { reference.get }.to raise_error
end
Expand Down

0 comments on commit 39de1bc

Please sign in to comment.