From 39de1bce379517ae44afd4259d00fa3e059b7876 Mon Sep 17 00:00:00 2001 From: tulios Date: Sun, 18 Mar 2012 17:46:07 -0300 Subject: [PATCH] refactoring key generator to use less lambdas --- lib/stale_if_slow/api.rb | 6 ++-- lib/stale_if_slow/key_generator.rb | 29 ++++++++++---------- spec/stale_if_slow/api_spec.rb | 4 +-- spec/stale_if_slow/key_generator_spec.rb | 8 +++--- spec/stale_if_slow/timeout_performer_spec.rb | 2 ++ 5 files changed, 26 insertions(+), 23 deletions(-) diff --git a/lib/stale_if_slow/api.rb b/lib/stale_if_slow/api.rb index 1c293bd..d06432c 100644 --- a/lib/stale_if_slow/api.rb +++ b/lib/stale_if_slow/api.rb @@ -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) diff --git a/lib/stale_if_slow/key_generator.rb b/lib/stale_if_slow/key_generator.rb index 4a41078..384c327 100644 --- a/lib/stale_if_slow/key_generator.rb +++ b/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 diff --git a/spec/stale_if_slow/api_spec.rb b/spec/stale_if_slow/api_spec.rb index 75bbbd3..beabc1b 100644 --- a/spec/stale_if_slow/api_spec.rb +++ b/spec/stale_if_slow/api_spec.rb @@ -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 diff --git a/spec/stale_if_slow/key_generator_spec.rb b/spec/stale_if_slow/key_generator_spec.rb index 12e0141..ba7b4c8 100644 --- a/spec/stale_if_slow/key_generator_spec.rb +++ b/spec/stale_if_slow/key_generator_spec.rb @@ -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 diff --git a/spec/stale_if_slow/timeout_performer_spec.rb b/spec/stale_if_slow/timeout_performer_spec.rb index 09bdc62..7878ff2 100644 --- a/spec/stale_if_slow/timeout_performer_spec.rb +++ b/spec/stale_if_slow/timeout_performer_spec.rb @@ -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