sunspot_rails 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. data/History.txt +6 -1
  2. data/README.rdoc +0 -26
  3. data/dev_tasks/spec.rake +15 -24
  4. data/gemfiles/{rails-2.3.16 → rails-3.0.0} +11 -5
  5. data/gemfiles/{rails-3.0.20 → rails-3.1.0} +11 -4
  6. data/gemfiles/{rails-3.1.10 → rails-3.2.0} +11 -4
  7. data/gemfiles/rails-4.0.0 +20 -0
  8. data/generators/sunspot/templates/sunspot.yml +7 -4
  9. data/lib/generators/sunspot_rails/install/templates/config/sunspot.yml +4 -0
  10. data/lib/sunspot/rails/adapters.rb +12 -11
  11. data/lib/sunspot/rails/configuration.rb +2 -2
  12. data/lib/sunspot/rails/log_subscriber.rb +11 -6
  13. data/lib/sunspot/rails/railtie.rb +1 -1
  14. data/lib/sunspot/rails/searchable.rb +10 -15
  15. data/lib/sunspot/rails/solr_instrumentation.rb +7 -5
  16. data/lib/sunspot/rails/solr_logging.rb +2 -5
  17. data/lib/sunspot/rails/stub_session_proxy.rb +14 -0
  18. data/lib/sunspot/rails/tasks.rb +47 -42
  19. data/lib/sunspot_rails.rb +2 -7
  20. data/spec/configuration_spec.rb +10 -10
  21. data/spec/model_spec.rb +38 -29
  22. data/spec/rails_template/app/models/post_with_default_scope.rb +3 -1
  23. data/spec/rails_template/app/models/rake_task_auto_load_test_model.rb +13 -0
  24. data/spec/rails_template/config/database.yml +11 -0
  25. data/spec/rails_template/config/routes.rb +3 -9
  26. data/spec/rake_task_spec.rb +40 -0
  27. data/spec/searchable_spec.rb +3 -0
  28. data/spec/session_spec.rb +1 -1
  29. data/spec/spec_helper.rb +59 -32
  30. data/spec/stub_session_proxy_spec.rb +8 -4
  31. data/sunspot_rails.gemspec +1 -0
  32. metadata +42 -22
  33. data/gemfiles/rails-3.2.11 +0 -12
  34. data/spec/rails_template/config/boot.rb +0 -127
  35. data/spec/rails_template/config/preinitializer.rb +0 -22
@@ -82,10 +82,16 @@ module Sunspot
82
82
  0
83
83
  end
84
84
 
85
+ def facets
86
+ []
87
+ end
88
+
85
89
  def facet(name)
90
+ FacetStub.new
86
91
  end
87
92
 
88
93
  def dynamic_facet(name)
94
+ FacetStub.new
89
95
  end
90
96
 
91
97
  def execute
@@ -140,6 +146,14 @@ module Sunspot
140
146
  end
141
147
 
142
148
  end
149
+
150
+ class FacetStub
151
+
152
+ def rows
153
+ []
154
+ end
155
+
156
+ end
143
157
 
144
158
  end
145
159
  end
@@ -14,55 +14,60 @@ namespace :sunspot do
14
14
  # $ rake sunspot:reindex[1000,Post] # reindex only the Post model in
15
15
  # # batchs of 1000
16
16
  # $ rake sunspot:reindex[,Post+Author] # reindex Post and Author model
17
- task :reindex, [:batch_size, :models] => [:environment] do |t, args|
18
- puts "*Note: the reindex task will remove your current indexes and start from scratch."
19
- puts "If you have a large dataset, reindexing can take a very long time, possibly weeks."
20
- puts "This is not encouraged if you have anywhere near or over 1 million rows."
21
- puts "Are you sure you want to drop your indexes and completely reindex? (y/n)"
22
- answer = STDIN.gets.chomp
23
- return false if answer == "n"
24
-
17
+ task :reindex, [:batch_size, :models, :silence] => [:environment] do |t, args|
25
18
  # Retry once or gracefully fail for a 5xx error so we don't break reindexing
26
- Sunspot.session = Sunspot::SessionProxy::Retry5xxSessionProxy.new(Sunspot.session)
27
-
28
- # Set up general options for reindexing
29
- reindex_options = { :batch_commit => false }
19
+ with_session(Sunspot::SessionProxy::Retry5xxSessionProxy.new(Sunspot.session)) do
30
20
 
31
- case args[:batch_size]
32
- when 'false'
33
- reindex_options[:batch_size] = nil
34
- when /^\d+$/
35
- reindex_options[:batch_size] = args[:batch_size].to_i if args[:batch_size].to_i > 0
36
- end
21
+ # Set up general options for reindexing
22
+ reindex_options = { :batch_commit => false }
37
23
 
38
- # Load all the application's models. Models which invoke 'searchable' will register themselves
39
- # in Sunspot.searchable.
40
- Dir.glob(Rails.root.join('app/models/**/*.rb')).each { |path| require path }
41
-
42
- # By default, reindex all searchable models
43
- sunspot_models = Sunspot.searchable
24
+ case args[:batch_size]
25
+ when 'false'
26
+ reindex_options[:batch_size] = nil
27
+ when /^\d+$/
28
+ reindex_options[:batch_size] = args[:batch_size].to_i if args[:batch_size].to_i > 0
29
+ end
44
30
 
45
- # Choose a specific subset of models, if requested
46
- if args[:models]
47
- model_names = args[:models].split('+')
48
- sunspot_models = model_names.map{ |m| m.constantize }
49
- end
31
+ # Load all the application's models. Models which invoke 'searchable' will register themselves
32
+ # in Sunspot.searchable.
33
+ Rails.application.eager_load!
34
+
35
+ if args[:models].present?
36
+ # Choose a specific subset of models, if requested
37
+ model_names = args[:models].split(/[+ ]/)
38
+ sunspot_models = model_names.map{ |m| m.constantize }
39
+ else
40
+ # By default, reindex all searchable models
41
+ sunspot_models = Sunspot.searchable
42
+ end
50
43
 
51
- # Set up progress_bar to, ah, report progress
52
- begin
53
- require 'progress_bar'
54
- total_documents = sunspot_models.map { | m | m.count }.sum
55
- reindex_options[:progress_bar] = ProgressBar.new(total_documents)
56
- rescue LoadError => e
57
- $stdout.puts "Skipping progress bar: for progress reporting, add gem 'progress_bar' to your Gemfile"
58
- rescue Exception => e
59
- $stderr.puts "Error using progress bar: #{e.message}"
44
+ # Set up progress_bar to, ah, report progress unless the user has chosen to silence output
45
+ begin
46
+ require 'progress_bar'
47
+ total_documents = sunspot_models.map { | m | m.count }.sum
48
+ reindex_options[:progress_bar] = ProgressBar.new(total_documents)
49
+ rescue LoadError => e
50
+ $stdout.puts "Skipping progress bar: for progress reporting, add gem 'progress_bar' to your Gemfile"
51
+ rescue Exception => e
52
+ $stderr.puts "Error using progress bar: #{e.message}"
53
+ end unless args[:silence]
54
+
55
+ # Finally, invoke the class-level solr_reindex on each model
56
+ sunspot_models.each do |model|
57
+ model.solr_reindex(reindex_options)
58
+ end
60
59
  end
60
+ end
61
61
 
62
- # Finally, invoke the class-level solr_reindex on each model
63
- sunspot_models.each do |model|
64
- model.solr_reindex(reindex_options)
65
- end
62
+ # Swaps sunspot sessions for the duration of the block
63
+ # Ensures the session is returned to normal in case this task is called from within the rails app
64
+ # and not just a one-off from the command line
65
+ def with_session(new_session)
66
+ original_session = Sunspot.session
67
+ Sunspot.session = new_session
68
+ yield
69
+ ensure
70
+ Sunspot.session = original_session
66
71
  end
67
72
 
68
73
  def sunspot_solr_in_load_path?
data/lib/sunspot_rails.rb CHANGED
@@ -1,12 +1,7 @@
1
1
  # This needs to be loaded before sunspot/search/paginated_collection
2
2
  # or #to_json gets defined in Object breaking delegation to Array via
3
3
  # method_missing
4
- require 'active_support/core_ext/object/to_json' if ::Rails.version >= '3'
4
+ require 'active_support/core_ext/object/to_json'
5
5
 
6
6
  require 'sunspot/rails'
7
-
8
- if ::Rails.version >= '3'
9
- require 'sunspot/rails/railtie'
10
- else
11
- require 'sunspot/rails/init'
12
- end
7
+ require 'sunspot/rails/railtie'
@@ -2,7 +2,7 @@ require File.expand_path('spec_helper', File.dirname(__FILE__))
2
2
 
3
3
  describe Sunspot::Rails::Configuration, "default values without a sunspot.yml" do
4
4
  before(:each) do
5
- File.stub!(:exist?).and_return(false) # simulate sunspot.yml not existing
5
+ File.stub(:exist?).and_return(false) # simulate sunspot.yml not existing
6
6
  @config = Sunspot::Rails::Configuration.new
7
7
  end
8
8
 
@@ -11,27 +11,27 @@ describe Sunspot::Rails::Configuration, "default values without a sunspot.yml" d
11
11
  end
12
12
 
13
13
  it "should handle the 'path' property when not set" do
14
- @config.path.should == '/solr'
14
+ @config.path.should == '/solr/default'
15
15
  end
16
16
 
17
17
  describe "port" do
18
18
  it "should default to port 8981 in test" do
19
- ::Rails.stub!(:env => 'test')
19
+ ::Rails.stub(:env => 'test')
20
20
  @config = Sunspot::Rails::Configuration.new
21
21
  @config.port.should == 8981
22
22
  end
23
23
  it "should default to port 8982 in development" do
24
- ::Rails.stub!(:env => 'development')
24
+ ::Rails.stub(:env => 'development')
25
25
  @config = Sunspot::Rails::Configuration.new
26
26
  @config.port.should == 8982
27
27
  end
28
28
  it "should default to 8983 in production" do
29
- ::Rails.stub!(:env => 'production')
29
+ ::Rails.stub(:env => 'production')
30
30
  @config = Sunspot::Rails::Configuration.new
31
31
  @config.port.should == 8983
32
32
  end
33
33
  it "should generally default to 8983" do
34
- ::Rails.stub!(:env => 'staging')
34
+ ::Rails.stub(:env => 'staging')
35
35
  @config = Sunspot::Rails::Configuration.new
36
36
  @config.port.should == 8983
37
37
  end
@@ -88,7 +88,7 @@ end
88
88
 
89
89
  describe Sunspot::Rails::Configuration, "user provided sunspot.yml" do
90
90
  before(:each) do
91
- ::Rails.stub!(:env => 'config_test')
91
+ ::Rails.stub(:env => 'config_test')
92
92
  @config = Sunspot::Rails::Configuration.new
93
93
  end
94
94
 
@@ -145,7 +145,7 @@ end
145
145
 
146
146
  describe Sunspot::Rails::Configuration, "with disabled: true in sunspot.yml" do
147
147
  before(:each) do
148
- ::Rails.stub!(:env => 'config_disabled_test')
148
+ ::Rails.stub(:env => 'config_disabled_test')
149
149
  @config = Sunspot::Rails::Configuration.new
150
150
  end
151
151
 
@@ -160,7 +160,7 @@ describe Sunspot::Rails::Configuration, "with ENV['SOLR_URL'] overriding sunspot
160
160
  end
161
161
 
162
162
  before(:each) do
163
- ::Rails.stub!(:env => 'config_test')
163
+ ::Rails.stub(:env => 'config_test')
164
164
  @config = Sunspot::Rails::Configuration.new
165
165
  end
166
166
 
@@ -187,7 +187,7 @@ describe Sunspot::Rails::Configuration, "with ENV['WEBSOLR_URL'] overriding suns
187
187
  end
188
188
 
189
189
  before(:each) do
190
- ::Rails.stub!(:env => 'config_test')
190
+ ::Rails.stub(:env => 'config_test')
191
191
  @config = Sunspot::Rails::Configuration.new
192
192
  end
193
193
 
data/spec/model_spec.rb CHANGED
@@ -119,46 +119,50 @@ describe 'ActiveRecord mixin' do
119
119
  with :title, 'Bogus Post'
120
120
  end.results.should be_empty
121
121
  end
122
-
123
- it 'should use the include option on the data accessor when specified' do
124
- Post.should_receive(:all).with(hash_including(:include => [:blog])).and_return([@post])
125
- Post.search do
126
- with :title, 'Test Post'
127
- data_accessor_for(Post).include = [:blog]
128
- end.results.should == [@post]
122
+
123
+ it 'should not allow bogus options to search' do
124
+ lambda { Post.search(:bogus => :option) }.should raise_error(ArgumentError)
129
125
  end
130
126
 
131
127
  it 'should pass :include option from search call to data accessor' do
132
- Post.should_receive(:all).with(hash_including(:include => [:blog])).and_return([@post])
133
- Post.search(:include => [:blog]) do
128
+ Post.search(:include => [:location]) do
134
129
  with :title, 'Test Post'
135
- end.results.should == [@post]
130
+ end.data_accessor_for(Post).include.should == [:location]
136
131
  end
137
132
 
138
- it 'should use the select option from search call to data accessor' do
139
- Post.should_receive(:all).with(hash_including(:select => 'title, published_at')).and_return([@post])
140
- Post.search(:select => 'title, published_at') do
133
+ it 'should use the include option on the data accessor when specified' do
134
+ @post.update_attribute(:location, Location.create)
135
+ post = Post.search do
141
136
  with :title, 'Test Post'
142
- end.results.should == [@post]
143
- end
137
+ data_accessor_for(Post).include = [:location]
138
+ end.results.first
144
139
 
145
- it 'should not allow bogus options to search' do
146
- lambda { Post.search(:bogus => :option) }.should raise_error(ArgumentError)
140
+ (Rails.version >= '3.1' ? post.association(:location).loaded? : post.loaded_location?).should be_true # Rails 3.1 removed "loaded_#{association}" method
141
+ end
142
+
143
+ it 'should use the select option from search call to data accessor' do
144
+ Post.search(:select => 'id, title, body') do
145
+ with :title, 'Test Post'
146
+ end.data_accessor_for(Post).select.should == 'id, title, body'
147
147
  end
148
148
 
149
149
  it 'should use the select option on the data accessor when specified' do
150
- Post.should_receive(:all).with(hash_including(:select => 'title, published_at')).and_return([@post])
151
150
  Post.search do
152
151
  with :title, 'Test Post'
153
- data_accessor_for(Post).select = [:title, :published_at]
154
- end.results.should == [@post]
152
+ data_accessor_for(Post).select = 'id, title, body'
153
+ end.results.first.attribute_names.sort.should == ['body', 'id', 'title']
155
154
  end
156
155
 
157
156
  it 'should not use the select option on the data accessor when not specified' do
158
- Post.should_receive(:all).with(hash_not_including(:select)).and_return([@post])
159
157
  Post.search do
160
158
  with :title, 'Test Post'
161
- end.results.should == [@post]
159
+ end.results.first.attribute_names.should == Post.first.attribute_names
160
+ end
161
+
162
+ it 'should accept an array as a select option' do
163
+ Post.search(:select => ['id', 'title', 'body']) do
164
+ with :title, 'Test Post'
165
+ end.results.first.attribute_names.sort.should == ['body', 'id', 'title']
162
166
  end
163
167
 
164
168
  it 'should gracefully handle nonexistent records' do
@@ -286,15 +290,20 @@ describe 'ActiveRecord mixin' do
286
290
  @posts = Array.new(2) { Post.create }
287
291
  end
288
292
 
289
- describe "when not using batches" do
290
-
291
- it "should select all if the batch_size is nil" do
292
- Post.should_receive(:all).with(:include => []).and_return([])
293
- Post.reindex(:batch_size => nil)
294
- end
293
+ it "should use batches if the batch_size is specified" do
294
+ relation(Post).class.any_instance.should_receive(:find_in_batches)
295
+ Post.reindex(:batch_size => 50)
296
+ end
295
297
 
298
+ it "should select all if the batch_size isn't greater than 0" do
299
+ relation(Post).class.any_instance.should_not_receive(:find_in_batches)
300
+ Post.reindex(:batch_size => nil)
301
+ Post.reindex(:batch_size => 0)
302
+ end
303
+
304
+ describe "when not using batches" do
296
305
  it "should search for models with includes" do
297
- Post.should_receive(:all).with(:include => :author).and_return([])
306
+ Post.should_receive(:includes).with(:author).and_return(relation(Post))
298
307
  Post.reindex(:batch_size => nil, :include => :author)
299
308
  end
300
309
 
@@ -5,7 +5,9 @@ class PostWithDefaultScope < ActiveRecord::Base
5
5
 
6
6
  attr_accessible :title, :type, :location_id, :body, :blog
7
7
 
8
- default_scope :order => :title
8
+ def self.default_scope
9
+ order(:title)
10
+ end
9
11
 
10
12
  searchable :auto_index => false, :auto_remove => false do
11
13
  string :title
@@ -0,0 +1,13 @@
1
+ # This model should not be used for any test other than the spec test that
2
+ # checks if all models are loaded. We don't want to pre-load this model in
3
+ # another test because we're checking to see if it will be auto-loaded by
4
+ # the reindex task
5
+ class RakeTaskAutoLoadTestModel < ActiveRecord::Base
6
+ def self.table_name
7
+ 'posts'
8
+ end
9
+
10
+ searchable do
11
+ string :name
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ <% if ENV['DB'] == 'postgres' %>
2
+ test:
3
+ adapter: postgresql
4
+ database: sunspot_test
5
+ <% elsif ENV['DB'] == 'sqlite' %>
6
+ test:
7
+ adapter: sqlite3
8
+ database: db/test.sqlite3
9
+ pool: 5
10
+ timeout: 5000
11
+ <% end %>
@@ -1,9 +1,3 @@
1
- if Rails::VERSION::MAJOR == 2
2
- ActionController::Routing::Routes.draw do |map|
3
- map.resources :posts, :only => :create
4
- end
5
- elsif Rails::VERSION::MAJOR == 3
6
- Rails.application.routes.draw do
7
- resources :posts, :only => :create
8
- end
9
- end
1
+ Rails.application.routes.draw do
2
+ resources :posts, :only => :create
3
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+ require 'rake'
3
+
4
+ describe 'sunspot namespace rake task' do
5
+ before :all do
6
+ require "#{Rails.root}/../../lib/sunspot/rails/tasks"
7
+ Rake::Task.define_task(:environment)
8
+ end
9
+
10
+ describe 'sunspot:reindex' do
11
+ it "should reindex all models if none are specified" do
12
+ run_rake_task("sunspot:reindex", '', '', true)
13
+
14
+ # This model should not be used by any other test and therefore should only be loaded by this test
15
+ Sunspot.searchable.collect(&:name).should include('RakeTaskAutoLoadTestModel')
16
+ end
17
+
18
+ it "should accept a space delimited list of models to reindex" do
19
+ Post.should_receive(:solr_reindex)
20
+ Author.should_receive(:solr_reindex)
21
+ Blog.should_not_receive(:solr_reindex)
22
+
23
+ run_rake_task("sunspot:reindex", '', "Post Author", true)
24
+ end
25
+
26
+ it "should accept a plus delimited list of models to reindex" do
27
+ Post.should_receive(:solr_reindex)
28
+ Author.should_receive(:solr_reindex)
29
+ Blog.should_not_receive(:solr_reindex)
30
+
31
+ run_rake_task("sunspot:reindex", '', "Post+Author", true)
32
+ end
33
+ end
34
+ end
35
+
36
+ def run_rake_task(task_name, *task_args)
37
+ task = Rake::Task[task_name.to_s]
38
+ task.reenable
39
+ task.invoke(*task_args) # Invoke but skip the reindex warning
40
+ end
@@ -3,6 +3,9 @@ require File.expand_path('spec_helper', File.dirname(__FILE__))
3
3
  describe Sunspot::Rails::Searchable do
4
4
  describe '#searchable' do
5
5
  it "should register models with Sunspot.searchable (via Sunspot.setup)" do
6
+ # Rspec runs tests in random order, causing this test to fail on occasion unless we ensure the models have loaded.
7
+ Author; Blog; Post;
8
+
6
9
  Sunspot.searchable.should_not be_empty
7
10
  Sunspot.searchable.should include(Author)
8
11
  Sunspot.searchable.should include(Blog)
data/spec/session_spec.rb CHANGED
@@ -31,7 +31,7 @@ describe 'Sunspot::Rails session' do
31
31
  context 'disabled' do
32
32
  before do
33
33
  Sunspot::Rails.reset
34
- ::Rails.stub!(:env).and_return("config_disabled_test")
34
+ ::Rails.stub(:env).and_return("config_disabled_test")
35
35
  end
36
36
 
37
37
  after do
data/spec/spec_helper.rb CHANGED
@@ -1,48 +1,75 @@
1
- ENV['RAILS_ENV'] = 'test'
1
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
2
+ ENV["RAILS_ENV"] ||= 'test'
2
3
  if rsolr_version = ENV['RSOLR_GEM_VERSION']
3
4
  STDERR.puts("Forcing RSolr version #{rsolr_version}")
4
5
  gem "rsolr", rsolr_version
5
6
  end
6
7
 
7
- require File.expand_path('config/environment', ENV['RAILS_ROOT'])
8
+ # Require the Database-specific gems
9
+ ENV['DB'] ||= 'sqlite'
10
+ Bundler.require(ENV['DB'])
8
11
 
9
- begin
10
- require 'rspec'
11
- require 'rspec/rails'
12
- rescue LoadError => e
13
- require 'spec'
14
- require 'spec/rails'
15
- end
16
- require 'rake'
12
+ require File.expand_path('config/environment', ENV['RAILS_ROOT'])
13
+ require 'rspec/rails'
14
+ require 'rspec/autorun'
17
15
  require File.join('sunspot', 'rails', 'solr_logging')
18
16
 
19
- def load_schema
20
- stdout = $stdout
21
- $stdout = StringIO.new # suppress output while building the schema
22
- load File.join(ENV['RAILS_ROOT'], 'db', 'schema.rb')
23
- $stdout = stdout
24
- end
25
-
26
- def silence_stderr(&block)
27
- stderr = $stderr
28
- $stderr = StringIO.new
29
- yield
30
- $stderr = stderr
31
- end
32
-
33
- rspec =
34
- begin
35
- RSpec
36
- rescue NameError, ArgumentError
37
- Spec::Runner
38
- end
17
+ # Requires supporting ruby files with custom matchers and macros, etc, in
18
+ # spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
19
+ # run as spec files by default. This means that files in spec/support that end
20
+ # in _spec.rb will both be required and run as specs, causing the specs to be
21
+ # run twice. It is recommended that you do not name files matching this glob to
22
+ # end with _spec.rb. You can configure this pattern with with the --pattern
23
+ # option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
24
+ Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
39
25
 
40
26
  # Load all shared examples
41
27
  Dir[File.expand_path("shared_examples/*.rb", File.dirname(__FILE__))].each {|f| require f}
42
28
 
43
- rspec.configure do |config|
29
+ # Load the schema
30
+ load File.join(ENV['RAILS_ROOT'], 'db', 'schema.rb')
31
+
32
+ RSpec.configure do |config|
33
+ # ## Mock Framework
34
+ #
35
+ # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
36
+ #
37
+ # config.mock_with :mocha
38
+ # config.mock_with :flexmock
39
+ # config.mock_with :rr
40
+
41
+ # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
42
+ config.fixture_path = "#{::Rails.root}/spec/fixtures"
43
+
44
+ # If you're not using ActiveRecord, or you'd prefer not to run each of your
45
+ # examples within a transaction, remove the following line or assign false
46
+ # instead of true.
47
+ config.use_transactional_fixtures = true
48
+
49
+ # If true, the base class of anonymous controllers will be inferred
50
+ # automatically. This will be the default behavior in future versions of
51
+ # rspec-rails.
52
+ config.infer_base_class_for_anonymous_controllers = false
53
+
54
+ # Run specs in random order to surface order dependencies. If you find an
55
+ # order dependency and want to debug it, you can fix the order by providing
56
+ # the seed, which is printed after each run.
57
+ # --seed 1234
58
+ config.order = "random"
59
+
44
60
  config.before(:each) do
45
- load_schema
61
+ empty_tables
46
62
  Sunspot.remove_all!
63
+ end
64
+ end
65
+
66
+ def empty_tables
67
+ ActiveRecord::Base.connection.tables.each do |table_name|
68
+ ActiveRecord::Base.connection.execute("DELETE FROM #{table_name}") unless table_name == 'schema_migrations'
47
69
  end
48
70
  end
71
+
72
+ # COMPATIBILITY: Rails 4 has deprecated the 'scoped' method in favour of 'all'
73
+ def relation(clazz)
74
+ ::Rails.version >= '4' ? clazz.all : clazz.scoped
75
+ end