sunspot_association 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ .bundle/
2
+ log/*.log
3
+ pkg/
4
+ tmp/
5
+ spec/sunspot_association.sqlite3
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - ruby-head
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'rake'
4
+
5
+ gemspec
6
+
7
+ group :development do
8
+ gem 'rspec'
9
+ gem 'shoulda-matchers'
10
+ gem 'guard'
11
+ gem 'guard-rspec'
12
+ gem 'rb-fsevent'
13
+ gem 'with_model'
14
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,98 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ sunspot_association (0.0.1)
5
+ activerecord (~> 3.0)
6
+ sunspot_solr
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ activemodel (3.2.13)
12
+ activesupport (= 3.2.13)
13
+ builder (~> 3.0.0)
14
+ activerecord (3.2.13)
15
+ activemodel (= 3.2.13)
16
+ activesupport (= 3.2.13)
17
+ arel (~> 3.0.2)
18
+ tzinfo (~> 0.3.29)
19
+ activesupport (3.2.13)
20
+ i18n (= 0.6.1)
21
+ multi_json (~> 1.0)
22
+ arel (3.0.2)
23
+ bourne (1.1.2)
24
+ mocha (= 0.10.5)
25
+ builder (3.0.4)
26
+ coderay (1.0.9)
27
+ diff-lcs (1.1.3)
28
+ guard (1.6.2)
29
+ listen (>= 0.6.0)
30
+ lumberjack (>= 1.0.2)
31
+ pry (>= 0.9.10)
32
+ terminal-table (>= 1.4.3)
33
+ thor (>= 0.14.6)
34
+ guard-rspec (2.4.0)
35
+ guard (>= 1.1)
36
+ rspec (~> 2.11)
37
+ i18n (0.6.1)
38
+ listen (0.7.2)
39
+ lumberjack (1.0.2)
40
+ metaclass (0.0.1)
41
+ method_source (0.8.1)
42
+ mocha (0.10.5)
43
+ metaclass (~> 0.0.1)
44
+ multi_json (1.7.2)
45
+ nokogiri (1.5.6)
46
+ pr_geohash (1.0.0)
47
+ pry (0.9.12)
48
+ coderay (~> 1.0.5)
49
+ method_source (~> 0.8)
50
+ slop (~> 3.4)
51
+ rake (10.0.4)
52
+ rb-fsevent (0.9.3)
53
+ rsolr (1.0.8)
54
+ builder (>= 2.1.2)
55
+ rspec (2.12.0)
56
+ rspec-core (~> 2.12.0)
57
+ rspec-expectations (~> 2.12.0)
58
+ rspec-mocks (~> 2.12.0)
59
+ rspec-core (2.12.2)
60
+ rspec-expectations (2.12.1)
61
+ diff-lcs (~> 1.1.3)
62
+ rspec-mocks (2.12.2)
63
+ shoulda-matchers (1.4.2)
64
+ activesupport (>= 3.0.0)
65
+ bourne (~> 1.1.2)
66
+ slop (3.4.4)
67
+ sqlite3 (1.3.7)
68
+ sunspot (1.3.3)
69
+ pr_geohash (~> 1.0)
70
+ rsolr (~> 1.0.7)
71
+ sunspot_rails (1.3.3)
72
+ nokogiri
73
+ sunspot (= 1.3.3)
74
+ sunspot_solr (2.0.0)
75
+ sunspot_test (0.4.0)
76
+ sunspot_rails (>= 1.2.1)
77
+ terminal-table (1.4.5)
78
+ thor (0.18.1)
79
+ tzinfo (0.3.37)
80
+ with_model (0.3.1)
81
+ activerecord (>= 2.3.5, < 4.0.0)
82
+ rspec (~> 2.11)
83
+
84
+ PLATFORMS
85
+ ruby
86
+
87
+ DEPENDENCIES
88
+ bundler (>= 1.0.0)
89
+ guard
90
+ guard-rspec
91
+ rake
92
+ rb-fsevent
93
+ rspec
94
+ shoulda-matchers
95
+ sqlite3
96
+ sunspot_association!
97
+ sunspot_test
98
+ with_model
data/Guardfile ADDED
@@ -0,0 +1,10 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec' do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch('spec/spec_helper.rb') { "spec" }
7
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
8
+ watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
9
+ end
10
+
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2013 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,74 @@
1
+ # sunspot_association [![Build Status](https://secure.travis-ci.org/Arjeno/sunspot_association.png?branch=master)](http://travis-ci.org/Arjeno/sunspot_association)
2
+
3
+ Automatically reindex ActiveRecord associations using Sunspot.
4
+
5
+ ## Usage
6
+
7
+ Add to your Gemfile:
8
+
9
+ ```ruby
10
+ gem 'sunspot_association'
11
+ ```
12
+
13
+ Add to your model:
14
+
15
+ ```ruby
16
+ class Company < ActiveRecord::Base
17
+ sunspot_associate :orders, :fields => :name
18
+ end
19
+ ```
20
+
21
+ ## Example
22
+
23
+ ```ruby
24
+ class User < ActiveRecord::Base
25
+ belongs_to :company
26
+
27
+ searchable do
28
+ text :company_name { company.try(:name) }
29
+ end
30
+ end
31
+
32
+ class Order < ActiveRecord::Base
33
+ belongs_to :company
34
+
35
+ searchable do
36
+ text :company_name { company.try(:name) }
37
+ end
38
+ end
39
+
40
+ class Company < ActiveRecord::Base
41
+ has_many :orders
42
+ has_many :users
43
+
44
+ sunspot_associate :orders, :users
45
+
46
+ # Or only track changes for the name field
47
+ # => sunspot_associate :orders, :users, :fields => :name
48
+ end
49
+ ```
50
+
51
+ ## License
52
+
53
+ Copyright (c) 2013 Arjen Oosterkamp
54
+
55
+ MIT License
56
+
57
+ Permission is hereby granted, free of charge, to any person obtaining
58
+ a copy of this software and associated documentation files (the
59
+ "Software"), to deal in the Software without restriction, including
60
+ without limitation the rights to use, copy, modify, merge, publish,
61
+ distribute, sublicense, and/or sell copies of the Software, and to
62
+ permit persons to whom the Software is furnished to do so, subject to
63
+ the following conditions:
64
+
65
+ The above copyright notice and this permission notice shall be
66
+ included in all copies or substantial portions of the Software.
67
+
68
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
69
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
70
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
71
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
72
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
73
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
74
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ task :default => :spec
@@ -0,0 +1,3 @@
1
+ module SunspotAssociation
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,118 @@
1
+ require 'active_record'
2
+ require 'sunspot_association/version'
3
+
4
+ module SunspotAssociation
5
+ module Model
6
+
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+
11
+ ## Attributes
12
+
13
+ cattr_accessor :sunspot_association_configuration
14
+ cattr_accessor :sunspot_association_callbacks
15
+
16
+ end
17
+
18
+ module ClassMethods
19
+
20
+ def sunspot_associate?
21
+ self.sunspot_association_configuration != {}
22
+ end
23
+
24
+ # Reindex associations when a model changes
25
+ #
26
+ # Options:
27
+ #
28
+ # :fields
29
+ # => Field(s) to watch for changes
30
+ #
31
+ # :on_create
32
+ # => Specifies if it should reindex associations when a record is created
33
+ #
34
+ # Examples:
35
+ #
36
+ # => sunspot_associate :orders, :fields => :name
37
+ # => sunspot_associate :orders, :users, :fields => [:name, :phone], :on_create => true
38
+ #
39
+ def sunspot_associate(*args)
40
+ options = args.extract_options!
41
+ fields = options.delete(:fields)
42
+
43
+ self.sunspot_association_configuration ||= {}
44
+
45
+ args.each do |object|
46
+ default = { :fields => [] }
47
+ config = self.sunspot_association_configuration[object] || default
48
+
49
+ # Fields
50
+ config[:fields] += Array(fields)
51
+ config[:fields].compact!
52
+ config[:fields].uniq!
53
+
54
+ config.merge!(options)
55
+
56
+ self.sunspot_association_configuration[object] = config
57
+ end
58
+
59
+ sunspot_association_callbacks!
60
+ end
61
+
62
+ def sunspot_association_callbacks!
63
+ return true if self.sunspot_association_callbacks == true
64
+
65
+ after_create Proc.new { |o| o.reindex_sunspot_associations!(:create) }
66
+ after_update Proc.new { |o| o.reindex_sunspot_associations!(:update) }
67
+ after_destroy Proc.new { |o| o.reindex_sunspot_associations!(:destroy) }
68
+
69
+ self.sunspot_association_callbacks = true
70
+ end
71
+
72
+ def reset_sunspot_associations!
73
+ self.sunspot_association_configuration = {}
74
+ self.sunspot_association_callbacks = false
75
+ end
76
+
77
+ end
78
+
79
+ # Main callback method, checks if it should reindex an association
80
+ def reindex_sunspot_associations!(event)
81
+ self.class.sunspot_association_configuration.each do |object, config|
82
+ case event
83
+ when :create
84
+ reindex_sunspot_association!(object) if config[:on_create]
85
+ when :update
86
+ reindex_sunspot_association!(object) if reindex_sunspot_association?(object)
87
+ when :destroy
88
+ reindex_sunspot_association!(object)
89
+ end
90
+ end
91
+ end
92
+
93
+ # Checks if an association should be reindexed
94
+ # => reindex_sunspot_association?(:orders) => true
95
+ def reindex_sunspot_association?(object)
96
+ if (config = (self.class.sunspot_association_configuration || {})[object]).present?
97
+ if config[:fields].present?
98
+ return ! (changed & (config[:fields] || []).map(&:to_s)).empty?
99
+ else
100
+ return changed.any?
101
+ end
102
+ end
103
+
104
+ false
105
+ end
106
+
107
+ # Reindexes an association using Sunspot.index
108
+ def reindex_sunspot_association!(object)
109
+ return false unless self.class.sunspot_associate?
110
+ return false unless self.respond_to?(object)
111
+
112
+ Sunspot.index self.send(object)
113
+ end
114
+
115
+ end
116
+ end
117
+
118
+ ActiveRecord::Base.send(:include, SunspotAssociation::Model)
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :sunspot_association do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,12 @@
1
+ require 'active_record'
2
+ require 'sunspot_association'
3
+ require 'shoulda/matchers'
4
+ require 'with_model'
5
+ require 'sunspot_test/rspec'
6
+
7
+ RSpec.configure do |config|
8
+ config.extend WithModel
9
+ end
10
+
11
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3",
12
+ :database => File.dirname(__FILE__) + "/sunspot_association.sqlite3")
@@ -0,0 +1,166 @@
1
+ require 'spec_helper'
2
+
3
+ describe SunspotAssociation do
4
+
5
+ with_model :User do
6
+ table do |t|
7
+ t.belongs_to :company
8
+ t.string :name
9
+ t.timestamps
10
+ end
11
+
12
+ model do
13
+ belongs_to :company
14
+ end
15
+ end
16
+
17
+ with_model :Order do
18
+ table do |t|
19
+ t.belongs_to :company
20
+ t.string :number
21
+ t.timestamps
22
+ end
23
+
24
+ model do
25
+ belongs_to :company
26
+ end
27
+ end
28
+
29
+ with_model :Company do
30
+ table do |t|
31
+ t.string :name
32
+ t.string :number
33
+ t.timestamps
34
+ end
35
+
36
+ model do
37
+ has_many :orders
38
+ has_many :users
39
+ sunspot_associate :orders
40
+ end
41
+ end
42
+
43
+ let(:company) { Company.create({ :name => 'Company name', :number => '1' }) }
44
+ let(:order) { Order.create({ :number => '1', :company => company }) }
45
+ let(:user) { User.create({ :name => 'John Doe', :company => company }) }
46
+
47
+ before(:each) do
48
+ Company.sunspot_associate :orders, :fields => :name
49
+ Company.sunspot_associate :users, :on_create => true
50
+ end
51
+
52
+ after(:each) do
53
+ Company.reset_sunspot_associations!
54
+ end
55
+
56
+ describe :sunspot_association_configuration do
57
+
58
+ it do
59
+ Company.sunspot_association_configuration.should == {
60
+ :orders => { :fields => [:name] },
61
+ :users => { :fields => [], :on_create => true }
62
+ }
63
+ end
64
+
65
+ context 'with multiple objects' do
66
+
67
+ before(:each) do
68
+ Company.sunspot_associate :orders, :users, :fields => :name, :on_create => true
69
+ end
70
+
71
+ it do
72
+ Company.sunspot_association_configuration.should == {
73
+ :orders => { :fields => [:name], :on_create => true },
74
+ :users => { :fields => [:name], :on_create => true },
75
+ }
76
+ end
77
+
78
+ end
79
+
80
+ end
81
+
82
+ describe :reindex_sunspot_association? do
83
+
84
+ subject { company }
85
+
86
+ context 'without changes' do
87
+
88
+ it { company.reindex_sunspot_association?(:orders).should be_false }
89
+ it { company.reindex_sunspot_association?(:users).should be_false }
90
+
91
+ end
92
+
93
+ context 'with changes' do
94
+
95
+ before(:each) { company.name = 'Name change' }
96
+
97
+ it { company.reindex_sunspot_association?(:orders).should be_true }
98
+ it { company.reindex_sunspot_association?(:users).should be_true }
99
+
100
+ end
101
+
102
+ context 'with any change' do
103
+
104
+ before(:each) { company.number = '5' }
105
+
106
+ it { company.reindex_sunspot_association?(:orders).should be_false }
107
+ it { company.reindex_sunspot_association?(:users).should be_true }
108
+
109
+ end
110
+
111
+ end
112
+
113
+ describe :callbacks do
114
+
115
+ context :after_create do
116
+
117
+ let(:company) { Company.new }
118
+ after(:each) { company.save }
119
+
120
+ it do
121
+ company.should_not_receive(:reindex_sunspot_association!).with(:orders)
122
+ company.should_receive(:reindex_sunspot_association!).with(:users)
123
+ end
124
+
125
+ end
126
+
127
+ context :after_update do
128
+
129
+ context 'with tracked change' do
130
+
131
+ after(:each) { company.update_attributes({ :name => 'name change' }) }
132
+
133
+ it do
134
+ company.should_receive(:reindex_sunspot_association!).with(:orders)
135
+ company.should_receive(:reindex_sunspot_association!).with(:users)
136
+ end
137
+
138
+ end
139
+
140
+ context 'with untracked change' do
141
+
142
+ after(:each) { company.update_attributes({ :number => '5' }) }
143
+
144
+ it do
145
+ company.should_not_receive(:reindex_sunspot_association!).with(:orders)
146
+ company.should_receive(:reindex_sunspot_association!).with(:users)
147
+ end
148
+
149
+ end
150
+
151
+ end
152
+
153
+ context :after_destroy do
154
+
155
+ after(:each) { company.destroy }
156
+
157
+ it do
158
+ company.should_receive(:reindex_sunspot_association!).with(:orders)
159
+ company.should_receive(:reindex_sunspot_association!).with(:users)
160
+ end
161
+
162
+ end
163
+
164
+ end
165
+
166
+ end
@@ -0,0 +1,29 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+
3
+ # Maintain your gem's version:
4
+ require "sunspot_association/version"
5
+
6
+ # Describe your gem and declare its dependencies:
7
+ Gem::Specification.new do |s|
8
+ s.name = "sunspot_association"
9
+ s.version = SunspotAssociation::VERSION
10
+ s.authors = ["Arjen Oosterkamp"]
11
+ s.email = ["mail@arjen.me"]
12
+ s.homepage = ""
13
+ s.summary = %q{Automatically reindex ActiveRecord associations using Sunspot}
14
+ s.description = %q{Automatically reindex ActiveRecord associations using Sunspot}
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_development_dependency "bundler", ">= 1.0.0"
22
+ s.add_development_dependency "rspec", "~> 2.3"
23
+
24
+ s.add_development_dependency "sqlite3"
25
+ s.add_development_dependency "sunspot_test"
26
+
27
+ s.add_dependency "activerecord", "~> 3.0"
28
+ s.add_dependency "sunspot_solr"
29
+ end
metadata ADDED
@@ -0,0 +1,158 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sunspot_association
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Arjen Oosterkamp
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.0.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 1.0.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '2.3'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '2.3'
46
+ - !ruby/object:Gem::Dependency
47
+ name: sqlite3
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: sunspot_test
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: activerecord
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: '3.0'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '3.0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: sunspot_solr
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: Automatically reindex ActiveRecord associations using Sunspot
111
+ email:
112
+ - mail@arjen.me
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - .gitignore
118
+ - .travis.yml
119
+ - Gemfile
120
+ - Gemfile.lock
121
+ - Guardfile
122
+ - MIT-LICENSE
123
+ - README.md
124
+ - Rakefile
125
+ - lib/sunspot_association.rb
126
+ - lib/sunspot_association/version.rb
127
+ - lib/tasks/sunspot_association_tasks.rake
128
+ - spec/spec_helper.rb
129
+ - spec/sunspot_association_spec.rb
130
+ - sunspot_association.gemspec
131
+ homepage: ''
132
+ licenses: []
133
+ post_install_message:
134
+ rdoc_options: []
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ none: false
145
+ requirements:
146
+ - - ! '>='
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ requirements: []
150
+ rubyforge_project:
151
+ rubygems_version: 1.8.24
152
+ signing_key:
153
+ specification_version: 3
154
+ summary: Automatically reindex ActiveRecord associations using Sunspot
155
+ test_files:
156
+ - spec/spec_helper.rb
157
+ - spec/sunspot_association_spec.rb
158
+ has_rdoc: