Skip to content

Commit

Permalink
Patch ActiveRecord adapter to remove deprecation notice under Rails 3.
Browse files Browse the repository at this point in the history
  • Loading branch information
Brian Rose & Kevin Olsen committed Aug 4, 2010
1 parent 82fe467 commit f47b0e0
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 22 deletions.
8 changes: 7 additions & 1 deletion lib/pickle/adapters/active_record.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,13 @@ def self.except_classes

# Gets a list of the available models for this adapter
def self.model_classes
::ActiveRecord::Base.__send__(:subclasses).select do |klass|
begin
klasses = ::ActiveRecord::Base.__send__(:descendants) # Rails 3
rescue
klasses = ::ActiveRecord::Base.__send__(:subclasses) # Rails 2
end

klasses.select do |klass|
!klass.abstract_class? && klass.table_exists? && !except_classes.include?(klass.name)
end
end
Expand Down
65 changes: 44 additions & 21 deletions spec/pickle/adapter_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@

describe Pickle::Adapter do
it ".factories should raise NotImplementedError" do
lambda{ Pickle::Adapter.factories }.should raise_error(NotImplementedError)
lambda { Pickle::Adapter.factories }.should raise_error(NotImplementedError)
end

it "#create should raise NotImplementedError" do
lambda{ Pickle::Adapter.new.create }.should raise_error(NotImplementedError)
lambda { Pickle::Adapter.new.create }.should raise_error(NotImplementedError)
end

describe ".model_classes" do
Expand All @@ -26,7 +26,7 @@
klass4 = Class.new(ActiveRecord::Base)
klass5 = Class.new(ActiveRecord::Base)
klass6 = Class.new(ActiveRecord::Base)
[klass1, klass2,klass3,klass4, klass5, klass6].each{|k| k.stub!(:table_exists?).and_return(true)}
[klass1, klass2, klass3, klass4, klass5, klass6].each { |k| k.stub!(:table_exists?).and_return(true) }

klass2.stub!(:name).and_return("CGI::Session::ActiveRecordStore::Session")
klass3.stub!(:name).and_return("ActiveRecord::SessionStore::Session")
Expand All @@ -39,37 +39,60 @@

describe "adapters: " do
before do
@klass1 = returning(Class.new(ActiveRecord::Base)) {|k| k.stub!(:name).and_return('One')}
@klass2 = returning(Class.new(ActiveRecord::Base)) {|k| k.stub!(:name).and_return('One::Two')}
@klass3 = returning(Class.new(ActiveRecord::Base)) {|k| k.stub!(:name).and_return('Three')}
@klass1 = returning(Class.new(ActiveRecord::Base)) { |k| k.stub!(:name).and_return('One') }
@klass2 = returning(Class.new(ActiveRecord::Base)) { |k| k.stub!(:name).and_return('One::Two') }
@klass3 = returning(Class.new(ActiveRecord::Base)) { |k| k.stub!(:name).and_return('Three') }
end

describe 'ActiveRecord' do
before do
ActiveRecord::Base::PickleAdapter.stub!(:model_classes).and_return([@klass1, @klass2, @klass3])
end

it ".factories should create one for each active record class" do
Pickle::Adapter::ActiveRecord.should_receive(:new).with(@klass1).once
Pickle::Adapter::ActiveRecord.should_receive(:new).with(@klass2).once
Pickle::Adapter::ActiveRecord.should_receive(:new).with(@klass3).once
Pickle::Adapter::ActiveRecord.factories
#DEPRECATION WARNING: subclasses is deprecated and will be removed from Rails 3.0 (use descendants instead). (called from __send__ at /Users/pivotal/workspace/factorylabs/protosite/vendor/cache/ruby/1.8/gems/pickle-0.3.1/lib/pickle/adapters/active_record.rb:21)

describe ".model_classes" do
it "calls .descendants" do
::ActiveRecord::Base.should_receive(:descendants).and_return([])
::ActiveRecord::Base.should_not_receive(:subclasses).and_return([])

ActiveRecord::Base::PickleAdapter.model_classes
end

it "calls .subclasses when .descendants doesn't respond" do
::ActiveRecord::Base.should_receive(:subclasses).and_return([])

ActiveRecord::Base::PickleAdapter.model_classes
end

end

describe ".new(Class)" do
describe 'with class stubs' do
before do
@factory = Pickle::Adapter::ActiveRecord.new(@klass2)
ActiveRecord::Base::PickleAdapter.stub!(:model_classes).and_return([@klass1, @klass2, @klass3])
end

it "should have underscored (s/_) name of Class as #name" do
@factory.name.should == 'one_two'
it ".factories should create one for each active record class" do
Pickle::Adapter::ActiveRecord.should_receive(:new).with(@klass1).once
Pickle::Adapter::ActiveRecord.should_receive(:new).with(@klass2).once
Pickle::Adapter::ActiveRecord.should_receive(:new).with(@klass3).once
Pickle::Adapter::ActiveRecord.factories
end

it "#create(attrs) should call Class.create!(attrs)" do
@klass2.should_receive(:create!).with({:key => "val"})
@factory.create(:key => "val")
describe ".new(Class)" do
before do
@factory = Pickle::Adapter::ActiveRecord.new(@klass2)
end

it "should have underscored (s/_) name of Class as #name" do
@factory.name.should == 'one_two'
end

it "#create(attrs) should call Class.create!(attrs)" do
@klass2.should_receive(:create!).with({:key => "val"})
@factory.create(:key => "val")
end
end
end


end

describe 'FactoryGirl' do
Expand Down

0 comments on commit f47b0e0

Please sign in to comment.