Skip to content

Commit

Permalink
Merge pull request #1431 from taavo/tiny_lazy_model_refactor
Browse files Browse the repository at this point in the history
LazyModel: refactor to remove unnecessary #store method
  • Loading branch information
bbenezech committed Dec 10, 2012
2 parents 50e1c5b + a72f910 commit 0154ed8
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 40 deletions.
9 changes: 6 additions & 3 deletions lib/rails_admin/config.rb
Expand Up @@ -244,9 +244,12 @@ def model(entity, &block)
entity.class.name.to_sym
end
end
config = @registry[key] ||= RailsAdmin::Config::LazyModel.new(entity)
config.store(block) if block
config

if block
@registry[key] = RailsAdmin::Config::LazyModel.new(entity, &block)
else
@registry[key] ||= RailsAdmin::Config::LazyModel.new(entity)
end
end

def default_hidden_fields=(fields)
Expand Down
21 changes: 6 additions & 15 deletions lib/rails_admin/config/lazy_model.rb
Expand Up @@ -3,27 +3,18 @@
module RailsAdmin
module Config
class LazyModel
def initialize(entity)
def initialize(entity, &block)
@entity = entity
@deferred_block = block
end

def method_missing(method, *args, &block)
if @block && not(@block_already_evaluated)
@model ||= RailsAdmin::Config::Model.new(@entity)
@model.instance_eval(&@block)
@block_already_evaluated = true
else
@model ||= RailsAdmin::Config::Model.new(@entity)
end
@model.send(method, *args, &block)
end

def store(block)
if @block # reset model to not eval twice
if !@model
@model = RailsAdmin::Config::Model.new(@entity)
@block_already_evaluated = false
@model.instance_eval(&@deferred_block) if @deferred_block
end
@block = block

@model.send(method, *args, &block)
end
end
end
Expand Down
30 changes: 8 additions & 22 deletions spec/rails_admin/config/lazy_model_spec.rb
@@ -1,41 +1,27 @@
require 'spec_helper'

describe RailsAdmin::Config::LazyModel do
let(:lazy_model) { RailsAdmin::Config::LazyModel.new(:Team) }

describe "#store" do
let(:block) { Proc.new { register_instance_option('parameter') } } # an arbitrary instance method we can spy on
let(:other_block) { Proc.new { register_instance_option('other parameter') } }

it "doesn't execute the block immediately" do
it "doesn't evaluate the block immediately" do
RailsAdmin::Config::Model.any_instance.should_not_receive(:register_instance_option)
lazy_model.store(block)
end

it "executes only when reading" do
RailsAdmin::Config::Model.any_instance.should_receive(:register_instance_option).with('parameter')
lazy_model.store(block)
lazy_model.groups # an arbitrary instance method on RailsAdmin::Config::Model to wake up lazy_model
RailsAdmin::Config::LazyModel.new(:Team, &block)
end

it "evaluates only last block" do
RailsAdmin::Config::Model.any_instance.should_not_receive(:register_instance_option).with('parameter')
RailsAdmin::Config::Model.any_instance.should_receive(:register_instance_option).with('other parameter')
lazy_model.store(block)
lazy_model.store(other_block)
lazy_model.groups
end
it "evaluates block when reading" do
RailsAdmin::Config::Model.any_instance.should_receive(:register_instance_option).with('parameter')

it "resets models when a new block is given" do
lazy_model.store(block)
lazy_model.groups
RailsAdmin::Config::Model.should_receive(:new)
lazy_model.store(other_block)
lazy_model = RailsAdmin::Config::LazyModel.new(:Team, &block)
lazy_model.groups # an arbitrary instance method on RailsAdmin::Config::Model to wake up lazy_model
end

it "evaluates config block only once" do
RailsAdmin::Config::Model.any_instance.should_receive(:register_instance_option).once.with('parameter')
lazy_model.store(block)

lazy_model = RailsAdmin::Config::LazyModel.new(:Team, &block)
lazy_model.groups
lazy_model.groups
end
Expand Down

0 comments on commit 0154ed8

Please sign in to comment.