sunspot_rails 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
data/History.txt CHANGED
@@ -1,3 +1,8 @@
1
+ == 2.1.0
2
+ * Dropped Rails 2 support in favour of supporting Rails 4
3
+ * Passing :silence => true while invoking sunspot:reindex task will no longer show the Progress Bar
4
+ * Model names can now also be delimited with spaces when passing them the sunspot:reindex task
5
+
1
6
  == 2.0.0
2
7
  * Finds orphaned objects in batches to avoid excessive memory use (Peer Allan)
3
8
  * Default batch size can be specified by setting `Sunspot.config.indexing.default_batch_size`
@@ -67,7 +72,7 @@
67
72
  == 0.10.6
68
73
  * Added script/generate sunspot support to generate the required sunspot.yml
69
74
  file [Brandon Keepers]
70
-
75
+
71
76
  == 0.10.5
72
77
  * Added a auto_commit_after_request option to sunspot.yml. Sunspot will not
73
78
  automatically commit any changes in solr if you set this value to false.
data/README.rdoc CHANGED
@@ -26,32 +26,6 @@ In your <code>Gemfile</code>:
26
26
  gem 'sunspot_solr'
27
27
  end
28
28
 
29
- == Installation in Rails 2
30
-
31
- In your project's <code>config/environment.rb</code>, add the following gem dependencies:
32
-
33
- config.gem 'sunspot'
34
- config.gem 'sunspot_rails'
35
-
36
- And in your project's <code>config/development.rb</code> and <code>config/test.rb</code>,
37
- add the following gem dependency to install the optional packaged Solr:
38
-
39
- config.gem 'sunspot_solr'
40
-
41
- Install the gems with:
42
-
43
- rake gems:install
44
-
45
- Generate the file <code>config/sunspot.yml</code>:
46
-
47
- script/generate sunspot
48
-
49
- Rails doesn't automatically load rake tasks from plugins installed as gems
50
- (https://rails.lighthouseapp.com/projects/8994/tickets/59). If you installed
51
- Sunspot::Rails as a gem, add the following line to your project's Rakefile:
52
-
53
- require 'sunspot/rails/tasks'
54
-
55
29
  == Using Sunspot::Rails
56
30
 
57
31
  If you wish to make modifications to the Solr schema, you can create a custom
data/dev_tasks/spec.rake CHANGED
@@ -17,11 +17,13 @@ namespace :spec do
17
17
  File.join(File.dirname(__FILE__), "..", "spec", "rails_template")
18
18
  end
19
19
 
20
- task :run_with_rails => [:set_gemfile, :generate_rails_app, :setup_rails_app, :run]
20
+ def version
21
+ ENV['VERSION']
22
+ end
21
23
 
22
- task :set_gemfile do
23
- version = ENV['VERSION']
24
+ task :run_with_rails => [:set_gemfile, :generate_rails_app, :initialize_database, :setup_rails_app, :run]
24
25
 
26
+ task :set_gemfile do
25
27
  ENV['BUNDLE_PATH'] = vendor_path(version)
26
28
  ENV['BUNDLE_GEMFILE'] = gemfile_path(version)
27
29
 
@@ -32,41 +34,30 @@ namespace :spec do
32
34
  end
33
35
 
34
36
  task :generate_rails_app do
35
- version = ENV['VERSION']
36
37
  app_path = rails_app_path(version)
37
38
 
38
39
  unless File.exist?(File.expand_path("config/environment.rb", app_path))
39
- rails_cmd = "bundle exec rails _#{version}_"
40
-
41
40
  puts "Generating Rails #{version} application..."
42
- if version.start_with?("2")
43
- sh("#{rails_cmd} \"#{app_path}\" --force") || exit(1)
44
- elsif version.start_with?("3")
45
- sh("#{rails_cmd} new \"#{app_path}\" --force --skip-git --skip-javascript --skip-gemfile --skip-sprockets") || exit(1)
46
- end
41
+ sh("bundle exec rails _#{version}_ new \"#{app_path}\" --force --skip-git --skip-javascript --skip-gemfile --skip-sprockets") || exit(1)
47
42
  end
48
43
  end
49
44
 
50
- task :setup_rails_app do
51
- version = ENV['VERSION']
52
- app_path = rails_app_path(version)
45
+ task :initialize_database do
46
+ if ENV['DB'] == 'postgres'
47
+ sh "psql -c 'DROP DATABASE IF EXISTS sunspot_test;' -d template1"
48
+ sh "psql -c 'create database sunspot_test;' -d template1"
49
+ end
50
+ end
53
51
 
54
- FileUtils.cp_r File.join(rails_template_path, "."), app_path
52
+ task :setup_rails_app do
53
+ FileUtils.cp_r File.join(rails_template_path, "."), rails_app_path(version)
55
54
  end
56
55
 
57
56
  task :run do
58
- version = ENV['VERSION']
59
-
60
57
  ENV['BUNDLE_GEMFILE'] = gemfile_path(version)
61
58
  ENV['RAILS_ROOT'] = rails_app_path(version)
62
59
 
63
- spec_command = if version.start_with?("2")
64
- "spec"
65
- elsif version.start_with?("3")
66
- "rspec"
67
- end
68
-
69
- sh "bundle exec #{spec_command} #{ENV['SPEC'] || 'spec/*_spec.rb'} --color"
60
+ sh "bundle exec rspec #{ENV['SPEC'] || 'spec/*_spec.rb'} --color"
70
61
  end
71
62
  end
72
63
 
@@ -1,13 +1,19 @@
1
- source :rubygems
1
+ source 'http://rubygems.org'
2
2
 
3
- gem 'rails', '2.3.16'
4
- gem 'sqlite3', '~> 1.3.7'
3
+ gem 'rails', '~> 3.0.0'
5
4
 
6
5
  gem 'sunspot', :path => File.expand_path('../../../sunspot', __FILE__)
7
6
  gem 'sunspot_solr', :path => File.expand_path('../../../sunspot_solr', __FILE__)
8
7
  gem 'sunspot_rails', :path => File.expand_path('../..', __FILE__)
9
8
 
10
9
  group :test do
11
- gem 'rspec-rails', '~> 1.3.4'
12
- gem 'test-unit', '~> 1.2.3', :platform => :mri_19
10
+ gem 'rspec-rails', '~> 2.14.0'
13
11
  end
12
+
13
+ group :postgres do
14
+ gem 'pg'
15
+ end
16
+
17
+ group :sqlite do
18
+ gem 'sqlite3', '~> 1.3.7'
19
+ end
@@ -1,12 +1,19 @@
1
- source :rubygems
1
+ source 'http://rubygems.org'
2
2
 
3
- gem 'rails', '3.0.20'
4
- gem 'sqlite3', '~> 1.3.7'
3
+ gem 'rails', '~> 3.1.0'
5
4
 
6
5
  gem 'sunspot', :path => File.expand_path('../../../sunspot', __FILE__)
7
6
  gem 'sunspot_solr', :path => File.expand_path('../../../sunspot_solr', __FILE__)
8
7
  gem 'sunspot_rails', :path => File.expand_path('../..', __FILE__)
9
8
 
10
9
  group :test do
11
- gem 'rspec-rails', '~> 2.8.1'
10
+ gem 'rspec-rails', '~> 2.14.0'
12
11
  end
12
+
13
+ group :postgres do
14
+ gem 'pg'
15
+ end
16
+
17
+ group :sqlite do
18
+ gem 'sqlite3', '~> 1.3.7'
19
+ end
@@ -1,12 +1,19 @@
1
- source :rubygems
1
+ source 'http://rubygems.org'
2
2
 
3
- gem 'rails', '3.1.10'
4
- gem 'sqlite3', '~> 1.3.7'
3
+ gem 'rails', '~> 3.2.0'
5
4
 
6
5
  gem 'sunspot', :path => File.expand_path('../../../sunspot', __FILE__)
7
6
  gem 'sunspot_solr', :path => File.expand_path('../../../sunspot_solr', __FILE__)
8
7
  gem 'sunspot_rails', :path => File.expand_path('../..', __FILE__)
9
8
 
10
9
  group :test do
11
- gem 'rspec-rails', '~> 2.8.1'
10
+ gem 'rspec-rails', '~> 2.14.0'
12
11
  end
12
+
13
+ group :postgres do
14
+ gem 'pg'
15
+ end
16
+
17
+ group :sqlite do
18
+ gem 'sqlite3', '~> 1.3.7'
19
+ end
@@ -0,0 +1,20 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'rails', '~> 4.0.0'
4
+
5
+ gem 'sunspot', :path => File.expand_path('../../../sunspot', __FILE__)
6
+ gem 'sunspot_solr', :path => File.expand_path('../../../sunspot_solr', __FILE__)
7
+ gem 'sunspot_rails', :path => File.expand_path('../..', __FILE__)
8
+
9
+ group :test do
10
+ gem 'protected_attributes' # Rails 4 support for attr_accessor so specs still work
11
+ gem 'rspec-rails', '~> 2.14.0'
12
+ end
13
+
14
+ group :postgres do
15
+ gem 'pg'
16
+ end
17
+
18
+ group :sqlite do
19
+ gem 'sqlite3', '~> 1.3.7'
20
+ end
@@ -3,18 +3,21 @@ production:
3
3
  hostname: localhost
4
4
  port: 8983
5
5
  log_level: WARNING
6
- # read_timeout: 2
7
- # open_timeout: 0.5
6
+ path: /solr/production
7
+ read_timeout: 20
8
+ open_timeout: 1
8
9
 
9
10
  development:
10
11
  solr:
11
12
  hostname: localhost
12
- port: 8982
13
+ port: 8983
13
14
  log_level: INFO
15
+ path: /solr/development
14
16
 
15
17
  test:
16
18
  solr:
17
19
  hostname: localhost
18
- port: 8981
20
+ port: 8983
19
21
  log_level: WARNING
22
+ path: /solr/test
20
23
 
@@ -3,6 +3,7 @@ production:
3
3
  hostname: localhost
4
4
  port: 8983
5
5
  log_level: WARNING
6
+ path: /solr/production
6
7
  # read_timeout: 2
7
8
  # open_timeout: 0.5
8
9
 
@@ -11,9 +12,12 @@ development:
11
12
  hostname: localhost
12
13
  port: 8982
13
14
  log_level: INFO
15
+ path: /solr/development
14
16
 
15
17
  test:
16
18
  solr:
17
19
  hostname: localhost
18
20
  port: 8981
19
21
  log_level: WARNING
22
+ path: /solr/test
23
+
@@ -53,9 +53,7 @@ module Sunspot #:nodoc:
53
53
  # ActiveRecord::Base:: ActiveRecord model
54
54
  #
55
55
  def load(id)
56
- @clazz.first(options_for_find.merge(
57
- :conditions => { @clazz.primary_key => id}
58
- ))
56
+ @clazz.where(@clazz.primary_key => id).merge(scope_for_load).first
59
57
  end
60
58
 
61
59
  #
@@ -70,18 +68,21 @@ module Sunspot #:nodoc:
70
68
  # Array:: Collection of ActiveRecord models
71
69
  #
72
70
  def load_all(ids)
73
- @clazz.all(options_for_find.merge(
74
- :conditions => { @clazz.primary_key => ids.map { |id| id }}
75
- ))
71
+ @clazz.where(@clazz.primary_key => ids).merge(scope_for_load)
76
72
  end
77
73
 
78
74
  private
79
75
 
80
- def options_for_find
81
- options = {}
82
- options[:include] = @include unless !defined?(@include) || @include.blank?
83
- options[:select] = @select unless !defined?(@select) || @select.blank?
84
- options
76
+ def scope_for_load
77
+ scope = relation
78
+ scope = scope.includes(@include) if @include.present?
79
+ scope = scope.select(@select) if @select.present?
80
+ scope
81
+ end
82
+
83
+ # COMPATIBILITY: Rails 4 has deprecated the 'scoped' method in favour of 'all'
84
+ def relation
85
+ ::Rails.version >= '4' ? @clazz.all : @clazz.scoped
85
86
  end
86
87
  end
87
88
  end
@@ -88,7 +88,7 @@ module Sunspot #:nodoc:
88
88
 
89
89
  #
90
90
  # The url path to the Solr servlet (useful if you are running multicore).
91
- # Default '/solr'.
91
+ # Default '/solr/default'.
92
92
  #
93
93
  # ==== Returns
94
94
  #
@@ -352,7 +352,7 @@ module Sunspot #:nodoc:
352
352
  end
353
353
 
354
354
  def default_path
355
- '/solr'
355
+ '/solr/default'
356
356
  end
357
357
 
358
358
  end
@@ -13,15 +13,15 @@ module Sunspot
13
13
  rt, self.runtime = runtime, 0
14
14
  rt
15
15
  end
16
-
16
+
17
17
  def self.logger=(logger)
18
18
  @logger = logger
19
19
  end
20
-
20
+
21
21
  def self.logger
22
22
  @logger if defined?(@logger)
23
23
  end
24
-
24
+
25
25
  def logger
26
26
  self.class.logger || ::Rails.logger
27
27
  end
@@ -32,9 +32,14 @@ module Sunspot
32
32
 
33
33
  name = '%s (%.1fms)' % ["SOLR Request", event.duration]
34
34
 
35
- # produces: path=/select parameters={fq: ["type:Tag"], q: rossi, fl: * score, qf: tag_name_text, defType: dismax, start: 0, rows: 20}
36
- parameters = event.payload[:parameters].map { |k, v| "#{k}: #{color(v, BOLD, true)}" }.join(', ')
37
- request = "path=#{event.payload[:path]} parameters={#{parameters}}"
35
+ # produces: path=select parameters={fq: ["type:Tag"], q: "rossi", fl: "* score", qf: "tag_name_text", defType: "edismax", start: 0, rows: 20}
36
+ path = color(event.payload[:path], BOLD, true)
37
+ parameters = event.payload[:parameters].map { |k, v|
38
+ v = "\"#{v}\"" if v.is_a? String
39
+ v = v.to_s.gsub(/\\/,'') # unescape
40
+ "#{k}: #{color(v, BOLD, true)}"
41
+ }.join(', ')
42
+ request = "path=#{path} parameters={#{parameters}}"
38
43
 
39
44
  debug " #{color(name, GREEN, true)} [ #{request} ]"
40
45
  end
@@ -12,7 +12,7 @@ module Sunspot
12
12
  include(Sunspot::Rails::RequestLifecycle)
13
13
  end
14
14
  require 'sunspot/rails/log_subscriber'
15
- RSolr::Connection.module_eval{ include Sunspot::Rails::SolrInstrumentation }
15
+ RSolr::Client.class_eval{ include Sunspot::Rails::SolrInstrumentation }
16
16
  end
17
17
 
18
18
  # Expose database runtime to controller for logging.
@@ -246,29 +246,24 @@ module Sunspot #:nodoc:
246
246
  :batch_size => Sunspot.config.indexing.default_batch_size,
247
247
  :batch_commit => true,
248
248
  :include => self.sunspot_options[:include],
249
- :start => opts.delete(:first_id) || 0
249
+ :start => opts.delete(:first_id)
250
250
  }.merge(opts)
251
- find_in_batch_options = {
252
- :include => options[:include],
253
- :batch_size => options[:batch_size],
254
- :start => options[:start]
255
- }
256
- progress_bar = options[:progress_bar]
257
- if options[:batch_size]
251
+
252
+ if options[:batch_size].to_i > 0
258
253
  batch_counter = 0
259
- find_in_batches(find_in_batch_options) do |records|
260
- solr_benchmark options[:batch_size], batch_counter do
254
+ self.includes(options[:include]).find_in_batches(options.slice(:batch_size, :start)) do |records|
255
+
256
+ solr_benchmark(options[:batch_size], batch_counter += 1) do
261
257
  Sunspot.index(records.select { |model| model.indexable? })
262
258
  Sunspot.commit if options[:batch_commit]
263
259
  end
264
- # track progress
265
- progress_bar.increment!(records.length) if progress_bar
266
- batch_counter += 1
260
+
261
+ options[:progress_bar].increment!(records.length) if options[:progress_bar]
267
262
  end
268
263
  else
269
- records = all(:include => options[:include]).select { |model| model.indexable? }
270
- Sunspot.index!(records)
264
+ Sunspot.index! self.includes(options[:include]).select(&:indexable?)
271
265
  end
266
+
272
267
  # perform a final commit if not committing in batches
273
268
  Sunspot.commit unless options[:batch_commit]
274
269
  end
@@ -4,14 +4,16 @@ module Sunspot
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  included do
7
- alias_method_chain :execute, :as_instrumentation
7
+ alias_method_chain :send_and_receive, :as_instrumentation
8
8
  end
9
9
 
10
10
 
11
- def execute_with_as_instrumentation(path, params={}, *extra)
12
- ActiveSupport::Notifications.instrument("request.rsolr",
13
- {:path => path, :parameters => params}) do
14
- execute_without_as_instrumentation(path, params, *extra)
11
+ def send_and_receive_with_as_instrumentation(path, opts)
12
+ parameters = (opts[:params] || {})
13
+ parameters.merge!(opts[:data]) if opts[:data].is_a? Hash
14
+ payload = {:path => path, :parameters => parameters}
15
+ ActiveSupport::Notifications.instrument("request.rsolr", payload) do
16
+ send_and_receive_without_as_instrumentation(path, opts)
15
17
  end
16
18
  end
17
19
  end
@@ -39,11 +39,8 @@ module Sunspot
39
39
  private
40
40
 
41
41
  def format_log_entry(message, dump = nil)
42
- @colorize_logging ||= begin
43
- ::Rails.application.config.colorize_logging # Rails 3
44
- rescue NoMethodError
45
- ActiveRecord::Base.colorize_logging # Rails 2
46
- end
42
+ @colorize_logging ||= ::Rails.application.config.colorize_logging
43
+
47
44
  if @colorize_logging
48
45
  message_color, dump_color = "4;32;1", "0;1"
49
46
  log_entry = " \e[#{message_color}m#{message}\e[0m "