substantial-sunspot_rails 2.0.0.pre.111215
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 +66 -0
- data/LICENSE +18 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +265 -0
- data/Rakefile +12 -0
- data/TODO +8 -0
- data/dev_tasks/rdoc.rake +24 -0
- data/dev_tasks/release.rake +4 -0
- data/dev_tasks/spec.rake +107 -0
- data/dev_tasks/todo.rake +4 -0
- data/gemfiles/rails-2.3.14 +15 -0
- data/gemfiles/rails-3.0.11 +15 -0
- data/gemfiles/rails-3.1.3 +15 -0
- data/generators/sunspot/sunspot_generator.rb +9 -0
- data/generators/sunspot/templates/sunspot.yml +18 -0
- data/install.rb +1 -0
- data/lib/generators/sunspot_rails.rb +9 -0
- data/lib/generators/sunspot_rails/install/install_generator.rb +13 -0
- data/lib/generators/sunspot_rails/install/templates/config/sunspot.yml +17 -0
- data/lib/substantial-sunspot_rails.rb +1 -0
- data/lib/sunspot/rails.rb +65 -0
- data/lib/sunspot/rails/adapters.rb +83 -0
- data/lib/sunspot/rails/configuration.rb +340 -0
- data/lib/sunspot/rails/init.rb +5 -0
- data/lib/sunspot/rails/log_subscriber.rb +33 -0
- data/lib/sunspot/rails/railtie.rb +36 -0
- data/lib/sunspot/rails/railties/controller_runtime.rb +36 -0
- data/lib/sunspot/rails/request_lifecycle.rb +36 -0
- data/lib/sunspot/rails/searchable.rb +480 -0
- data/lib/sunspot/rails/server.rb +106 -0
- data/lib/sunspot/rails/solr_instrumentation.rb +18 -0
- data/lib/sunspot/rails/solr_logging.rb +62 -0
- data/lib/sunspot/rails/spec_helper.rb +26 -0
- data/lib/sunspot/rails/stub_session_proxy.rb +142 -0
- data/lib/sunspot/rails/tasks.rb +84 -0
- data/lib/sunspot_rails.rb +12 -0
- data/spec/configuration_spec.rb +195 -0
- data/spec/model_lifecycle_spec.rb +63 -0
- data/spec/model_spec.rb +595 -0
- 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 +61 -0
- data/spec/schema.rb +27 -0
- data/spec/searchable_spec.rb +12 -0
- data/spec/server_spec.rb +33 -0
- data/spec/session_spec.rb +57 -0
- 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 +48 -0
- data/spec/stub_session_proxy_spec.rb +122 -0
- data/substantial-sunspot_rails.gemspec +43 -0
- metadata +228 -0
@@ -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: 8983
|
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,61 @@
|
|
1
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe PostsController, :type => :controller do
|
4
|
+
begin
|
5
|
+
include ::RSpec::Rails::ControllerExampleGroup
|
6
|
+
rescue NameError
|
7
|
+
# Silent -- rspec-rails 1.x catches the :type => :controller
|
8
|
+
end
|
9
|
+
|
10
|
+
before(:each) do
|
11
|
+
Sunspot::Rails.configuration = @configuration = Sunspot::Rails::Configuration.new
|
12
|
+
end
|
13
|
+
|
14
|
+
after(:each) do
|
15
|
+
Sunspot::Rails.configuration = nil
|
16
|
+
end
|
17
|
+
|
18
|
+
unless respond_to?(:describes)
|
19
|
+
controller_name :posts # RSpec 1
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should automatically commit after each action if specified' do
|
23
|
+
@configuration.user_configuration = { 'auto_commit_after_request' => true }
|
24
|
+
Sunspot.should_receive(:commit_if_dirty)
|
25
|
+
post :create, :post => { :title => 'Test 1' }
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should not commit, if configuration is set to false' do
|
29
|
+
@configuration.user_configuration = { 'auto_commit_after_request' => false }
|
30
|
+
Sunspot.should_not_receive(:commit_if_dirty)
|
31
|
+
post :create, :post => { :title => 'Test 1' }
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should commit if configuration is not specified' do
|
35
|
+
@configuration.user_configuration = {}
|
36
|
+
Sunspot.should_receive(:commit_if_dirty)
|
37
|
+
post :create, :post => { :title => 'Test 1' }
|
38
|
+
end
|
39
|
+
|
40
|
+
### auto_commit_if_delete_dirty
|
41
|
+
|
42
|
+
it 'should automatically commit after each delete if specified' do
|
43
|
+
@configuration.user_configuration = { 'auto_commit_after_request' => false,
|
44
|
+
'auto_commit_after_delete_request' => true }
|
45
|
+
Sunspot.should_receive(:commit_if_delete_dirty)
|
46
|
+
post :create, :post => { :title => 'Test 1' }
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should not automatically commit on delete if configuration is set to false' do
|
50
|
+
@configuration.user_configuration = { 'auto_commit_after_request' => false,
|
51
|
+
'auto_commit_after_delete_request' => false }
|
52
|
+
Sunspot.should_not_receive(:commit_if_delete_dirty)
|
53
|
+
post :create, :post => { :title => 'Test 1' }
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should not automatically commit on delete if configuration is not specified' do
|
57
|
+
@configuration.user_configuration = { 'auto_commit_after_request' => false }
|
58
|
+
Sunspot.should_not_receive(:commit_if_delete_dirty)
|
59
|
+
post :create, :post => { :title => 'Test 1' }
|
60
|
+
end
|
61
|
+
end
|
data/spec/schema.rb
ADDED
@@ -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
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.expand_path('spec_helper', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe Sunspot::Rails::Server do
|
4
|
+
before :each do
|
5
|
+
@server = Sunspot::Rails::Server.new
|
6
|
+
@config = Sunspot::Rails::Configuration.new
|
7
|
+
@solr_home = File.join(@config.solr_home)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "sets the correct Solr home" do
|
11
|
+
@server.solr_home.should == @solr_home
|
12
|
+
end
|
13
|
+
|
14
|
+
it "sets the correct Solr PID path" do
|
15
|
+
@server.pid_path.should == File.join(@server.pid_dir, 'sunspot-solr-test.pid')
|
16
|
+
end
|
17
|
+
|
18
|
+
it "sets the correct Solr data dir" do
|
19
|
+
@server.solr_data_dir.should == File.join(@solr_home, 'data', 'test')
|
20
|
+
end
|
21
|
+
|
22
|
+
it "sets the correct port" do
|
23
|
+
@server.port.should == 8983
|
24
|
+
end
|
25
|
+
|
26
|
+
it "sets the correct log level" do
|
27
|
+
@server.log_level.should == "FINE"
|
28
|
+
end
|
29
|
+
|
30
|
+
it "sets the correct log file" do
|
31
|
+
@server.log_file.should == File.join(Rails.root, 'log', 'sunspot-solr-test.log')
|
32
|
+
end
|
33
|
+
end
|