sunspot_rails 1.2.1 → 1.3.0.rc6
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.
- data/.gitignore +7 -0
- data/.rspec +1 -0
- data/History.txt +15 -0
- data/README.rdoc +14 -7
- data/Rakefile +0 -6
- data/TESTING.md +32 -18
- data/dev_tasks/spec.rake +103 -18
- data/gemfiles/rails-2.3.14 +15 -0
- data/gemfiles/rails-3.0.10 +15 -0
- data/gemfiles/rails-3.1.1 +15 -0
- data/lib/sunspot/rails.rb +13 -6
- data/lib/sunspot/rails/configuration.rb +25 -4
- data/lib/sunspot/rails/log_subscriber.rb +33 -0
- data/lib/sunspot/rails/railtie.rb +10 -0
- data/lib/sunspot/rails/railties/controller_runtime.rb +36 -0
- data/lib/sunspot/rails/searchable.rb +88 -20
- data/lib/sunspot/rails/server.rb +10 -77
- data/lib/sunspot/rails/solr_instrumentation.rb +20 -0
- data/lib/sunspot/rails/solr_logging.rb +16 -17
- data/lib/sunspot/rails/stub_session_proxy.rb +56 -2
- data/lib/sunspot/rails/tasks.rb +56 -33
- data/lib/sunspot_rails.rb +5 -0
- data/spec/configuration_spec.rb +27 -5
- data/spec/model_lifecycle_spec.rb +1 -1
- data/spec/model_spec.rb +240 -1
- data/spec/rails_template/app/controllers/application_controller.rb +10 -0
- data/spec/rails_template/app/controllers/posts_controller.rb +6 -0
- data/spec/rails_template/app/models/author.rb +8 -0
- data/spec/rails_template/app/models/blog.rb +12 -0
- data/spec/rails_template/app/models/location.rb +2 -0
- data/spec/rails_template/app/models/photo_post.rb +2 -0
- data/spec/rails_template/app/models/post.rb +11 -0
- data/spec/rails_template/app/models/post_with_auto.rb +10 -0
- data/spec/rails_template/app/models/post_with_default_scope.rb +11 -0
- data/spec/rails_template/config/boot.rb +127 -0
- data/spec/rails_template/config/preinitializer.rb +22 -0
- data/spec/rails_template/config/routes.rb +9 -0
- data/spec/rails_template/config/sunspot.yml +22 -0
- data/spec/rails_template/db/schema.rb +27 -0
- data/spec/request_lifecycle_spec.rb +1 -1
- data/spec/searchable_spec.rb +12 -0
- data/spec/server_spec.rb +2 -6
- data/spec/session_spec.rb +35 -2
- data/spec/shared_examples/indexed_after_save.rb +8 -0
- data/spec/shared_examples/not_indexed_after_save.rb +8 -0
- data/spec/spec_helper.rb +4 -2
- data/spec/stub_session_proxy_spec.rb +2 -2
- data/sunspot_rails.gemspec +43 -0
- metadata +114 -44
- data/lib/sunspot/rails/version.rb +0 -5
@@ -0,0 +1,10 @@
|
|
1
|
+
# Filters added to this controller apply to all controllers in the application.
|
2
|
+
# Likewise, all the methods added will be available for all controllers.
|
3
|
+
|
4
|
+
class ApplicationController < ActionController::Base
|
5
|
+
helper :all # include all helpers, all the time
|
6
|
+
protect_from_forgery # See ActionController::RequestForgeryProtection for details
|
7
|
+
|
8
|
+
# Scrub sensitive parameters from your log
|
9
|
+
# filter_parameter_logging :password
|
10
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class Blog < ActiveRecord::Base
|
2
|
+
has_many :posts
|
3
|
+
has_many :comments, :through => :posts
|
4
|
+
|
5
|
+
searchable :include => { :posts => :author } do
|
6
|
+
string :subdomain
|
7
|
+
text :name
|
8
|
+
end
|
9
|
+
|
10
|
+
# Make sure that includes are added to with multiple searchable calls
|
11
|
+
searchable(:include => :comments) {}
|
12
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
if defined?(RAILS_GEM_VERSION) && RAILS_GEM_VERSION =~ /^2/ # Rails 2 only
|
2
|
+
RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
|
3
|
+
|
4
|
+
module Rails
|
5
|
+
class << self
|
6
|
+
def boot!
|
7
|
+
unless booted?
|
8
|
+
preinitialize
|
9
|
+
pick_boot.run
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def booted?
|
14
|
+
defined? Rails::Initializer
|
15
|
+
end
|
16
|
+
|
17
|
+
def pick_boot
|
18
|
+
(vendor_rails? ? VendorBoot : GemBoot).new
|
19
|
+
end
|
20
|
+
|
21
|
+
def vendor_rails?
|
22
|
+
File.exist?("#{RAILS_ROOT}/vendor/rails")
|
23
|
+
end
|
24
|
+
|
25
|
+
def preinitialize
|
26
|
+
load(preinitializer_path) if File.exist?(preinitializer_path)
|
27
|
+
end
|
28
|
+
|
29
|
+
def preinitializer_path
|
30
|
+
"#{RAILS_ROOT}/config/preinitializer.rb"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class Boot
|
35
|
+
def run
|
36
|
+
load_initializer
|
37
|
+
Rails::Initializer.run(:set_load_path)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class VendorBoot < Boot
|
42
|
+
def load_initializer
|
43
|
+
require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
|
44
|
+
Rails::Initializer.run(:install_gem_spec_stubs)
|
45
|
+
Rails::GemDependency.add_frozen_gem_path
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class GemBoot < Boot
|
50
|
+
def load_initializer
|
51
|
+
self.class.load_rubygems
|
52
|
+
load_rails_gem
|
53
|
+
require 'initializer'
|
54
|
+
end
|
55
|
+
|
56
|
+
def load_rails_gem
|
57
|
+
if version = self.class.gem_version
|
58
|
+
gem 'rails', version
|
59
|
+
else
|
60
|
+
gem 'rails'
|
61
|
+
end
|
62
|
+
rescue Gem::LoadError => load_error
|
63
|
+
if load_error.message =~ /Could not find RubyGem rails/
|
64
|
+
STDERR.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
|
65
|
+
exit 1
|
66
|
+
else
|
67
|
+
raise
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class << self
|
72
|
+
def rubygems_version
|
73
|
+
Gem::RubyGemsVersion rescue nil
|
74
|
+
end
|
75
|
+
|
76
|
+
def gem_version
|
77
|
+
if defined? RAILS_GEM_VERSION
|
78
|
+
RAILS_GEM_VERSION
|
79
|
+
elsif ENV.include?('RAILS_GEM_VERSION')
|
80
|
+
ENV['RAILS_GEM_VERSION']
|
81
|
+
else
|
82
|
+
parse_gem_version(read_environment_rb)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def load_rubygems
|
87
|
+
min_version = '1.3.2'
|
88
|
+
require 'rubygems'
|
89
|
+
unless rubygems_version >= min_version
|
90
|
+
$stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
|
91
|
+
exit 1
|
92
|
+
end
|
93
|
+
|
94
|
+
rescue LoadError
|
95
|
+
$stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
|
96
|
+
exit 1
|
97
|
+
end
|
98
|
+
|
99
|
+
def parse_gem_version(text)
|
100
|
+
$1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
def read_environment_rb
|
105
|
+
File.read("#{RAILS_ROOT}/config/environment.rb")
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
class Rails::Boot
|
112
|
+
def run
|
113
|
+
load_initializer
|
114
|
+
|
115
|
+
Rails::Initializer.class_eval do
|
116
|
+
def load_gems
|
117
|
+
@bundler_loaded ||= Bundler.require :default, Rails.env
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
Rails::Initializer.run(:set_load_path)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
# All that for this:
|
126
|
+
Rails.boot!
|
127
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
if defined?(RAILS_GEM_VERSION) && RAILS_GEM_VERSION =~ /^2/ # Rails 2 only
|
2
|
+
begin
|
3
|
+
require "rubygems"
|
4
|
+
require "bundler"
|
5
|
+
rescue LoadError
|
6
|
+
raise "Could not load the bundler gem. Install it with `gem install bundler`."
|
7
|
+
end
|
8
|
+
|
9
|
+
if Gem::Version.new(Bundler::VERSION) <= Gem::Version.new("0.9.24")
|
10
|
+
raise RuntimeError, "Your bundler version is too old for Rails 2.3." +
|
11
|
+
"Run `gem install bundler` to upgrade."
|
12
|
+
end
|
13
|
+
|
14
|
+
begin
|
15
|
+
# Set up load paths for all bundled gems
|
16
|
+
ENV["BUNDLE_GEMFILE"] = File.expand_path("../../Gemfile", __FILE__)
|
17
|
+
Bundler.setup
|
18
|
+
rescue Bundler::GemNotFound
|
19
|
+
raise RuntimeError, "Bundler couldn't find some gems." +
|
20
|
+
"Did you run `bundle install`?"
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
test:
|
2
|
+
solr:
|
3
|
+
hostname: localhost
|
4
|
+
port: 8980
|
5
|
+
development:
|
6
|
+
solr:
|
7
|
+
hostname: localhost
|
8
|
+
port: 8981
|
9
|
+
config_test:
|
10
|
+
solr:
|
11
|
+
hostname: some.host
|
12
|
+
port: 1234
|
13
|
+
path: /solr/idx
|
14
|
+
log_level: WARNING
|
15
|
+
data_path: /my_superior_path/data
|
16
|
+
pid_dir: /my_superior_path/pids
|
17
|
+
solr_home: /my_superior_path
|
18
|
+
bind_address: 127.0.0.1
|
19
|
+
auto_commit_after_request: false
|
20
|
+
auto_commit_after_delete_request: true
|
21
|
+
config_disabled_test:
|
22
|
+
disabled: true
|
@@ -0,0 +1,27 @@
|
|
1
|
+
ActiveRecord::Schema.define(:version => 0) do
|
2
|
+
create_table :posts, :force => true do |t|
|
3
|
+
t.string :title
|
4
|
+
t.string :type
|
5
|
+
t.integer :location_id
|
6
|
+
t.text :body
|
7
|
+
t.references :blog
|
8
|
+
t.timestamps
|
9
|
+
end
|
10
|
+
|
11
|
+
create_table :locations, :force => true do |t|
|
12
|
+
t.float :lat
|
13
|
+
t.float :lng
|
14
|
+
end
|
15
|
+
|
16
|
+
create_table :blogs, :force => true do |t|
|
17
|
+
t.string :name
|
18
|
+
t.string :subdomain
|
19
|
+
t.timestamps
|
20
|
+
end
|
21
|
+
|
22
|
+
create_table :writers, :force => true, :primary_key => :writer_id do |t|
|
23
|
+
t.string :name
|
24
|
+
t.timestamps
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe Sunspot::Rails::Searchable do
|
4
|
+
describe '#searchable' do
|
5
|
+
it "should register models with Sunspot.searchable (via Sunspot.setup)" do
|
6
|
+
Sunspot.searchable.should_not be_empty
|
7
|
+
Sunspot.searchable.should include(Author)
|
8
|
+
Sunspot.searchable.should include(Blog)
|
9
|
+
Sunspot.searchable.should include(Post)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/spec/server_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.
|
1
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
2
2
|
|
3
3
|
describe Sunspot::Rails::Server do
|
4
4
|
before :each do
|
@@ -11,12 +11,8 @@ describe Sunspot::Rails::Server do
|
|
11
11
|
@server.solr_home.should == @solr_home
|
12
12
|
end
|
13
13
|
|
14
|
-
it "sets the correct Solr library path" do
|
15
|
-
@server.lib_path.should == File.join(@solr_home, 'lib')
|
16
|
-
end
|
17
|
-
|
18
14
|
it "sets the correct Solr PID path" do
|
19
|
-
@server.pid_path.should == File.join(
|
15
|
+
@server.pid_path.should == File.join(@server.pid_dir, 'sunspot-solr-test.pid')
|
20
16
|
end
|
21
17
|
|
22
18
|
it "sets the correct Solr data dir" do
|
data/spec/session_spec.rb
CHANGED
@@ -1,7 +1,25 @@
|
|
1
|
-
require
|
1
|
+
require 'thread'
|
2
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
2
3
|
|
3
4
|
describe 'Sunspot::Rails session' do
|
4
|
-
it '
|
5
|
+
it 'is a different object for each thread' do
|
6
|
+
# Queue is just a convenient thread-safe container
|
7
|
+
sessions_queue = Queue.new
|
8
|
+
|
9
|
+
# Create some threads which dump their session into the queue
|
10
|
+
Array.new(2) {
|
11
|
+
Thread.new { sessions_queue << Sunspot.session.session }
|
12
|
+
}.each { |thread| thread.join }
|
13
|
+
|
14
|
+
# Collect the items from the queue
|
15
|
+
sessions = []
|
16
|
+
until sessions_queue.empty?
|
17
|
+
sessions << sessions_queue.pop
|
18
|
+
end
|
19
|
+
|
20
|
+
# There should be no items in the queue with the same object_id
|
21
|
+
object_ids = sessions.map(&:object_id)
|
22
|
+
object_ids.uniq.should == object_ids
|
5
23
|
end
|
6
24
|
|
7
25
|
it 'should create a separate master/slave session if configured' do
|
@@ -10,6 +28,21 @@ describe 'Sunspot::Rails session' do
|
|
10
28
|
it 'should not create a separate master/slave session if no master configured' do
|
11
29
|
end
|
12
30
|
|
31
|
+
context 'disabled' do
|
32
|
+
before do
|
33
|
+
Sunspot::Rails.reset
|
34
|
+
::Rails.stub!(:env).and_return("config_disabled_test")
|
35
|
+
end
|
36
|
+
|
37
|
+
after do
|
38
|
+
Sunspot::Rails.reset
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'sets the session proxy as a stub' do
|
42
|
+
Sunspot::Rails.build_session.should be_a_kind_of(Sunspot::Rails::StubSessionProxy)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
13
46
|
private
|
14
47
|
|
15
48
|
def with_configuration(options)
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
ENV['RAILS_ENV'] = 'test'
|
2
|
-
ENV['RAILS_ROOT'] ||= File.join(File.dirname(__FILE__), 'rails3')
|
3
2
|
if rsolr_version = ENV['RSOLR_GEM_VERSION']
|
4
3
|
STDERR.puts("Forcing RSolr version #{rsolr_version}")
|
5
4
|
gem "rsolr", rsolr_version
|
@@ -31,13 +30,16 @@ def silence_stderr(&block)
|
|
31
30
|
$stderr = stderr
|
32
31
|
end
|
33
32
|
|
34
|
-
rspec =
|
33
|
+
rspec =
|
35
34
|
begin
|
36
35
|
RSpec
|
37
36
|
rescue NameError, ArgumentError
|
38
37
|
Spec::Runner
|
39
38
|
end
|
40
39
|
|
40
|
+
# Load all shared examples
|
41
|
+
Dir[File.expand_path("shared_examples/*.rb", File.dirname(__FILE__))].each {|f| require f}
|
42
|
+
|
41
43
|
rspec.configure do |config|
|
42
44
|
config.before(:each) do
|
43
45
|
load_schema
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require File.
|
2
|
-
require File.
|
1
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
2
|
+
require File.expand_path('../lib/sunspot/rails/spec_helper', File.dirname(__FILE__))
|
3
3
|
|
4
4
|
describe 'specs with Sunspot stubbed' do
|
5
5
|
disconnect_sunspot
|