elastic_searchable 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,7 +1,7 @@
1
1
  source "http://rubygems.org"
2
2
  # Add dependencies required to use your gem here.
3
3
  gem "activerecord", "~> 2.3.5"
4
- gem 'rubberband', '~> 0.0.6'
4
+ gem 'httparty', '~> 0.7.3'
5
5
  gem 'backgrounded', '~> 0.7.0'
6
6
  gem 'will_paginate', '~> 2.3.15'
7
7
  gem 'larsklevan-after_commit', '~> 1.0.5', :require => 'after_commit'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.3.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{elastic_searchable}
8
- s.version = "0.2.2"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ryan Sonnek"]
12
- s.date = %q{2011-02-01}
12
+ s.date = %q{2011-02-03}
13
13
  s.description = %q{integrate the elastic search engine with rails}
14
14
  s.email = %q{ryan@codecrate.com}
15
15
  s.extra_rdoc_files = [
@@ -36,7 +36,7 @@ Gem::Specification.new do |s|
36
36
  s.homepage = %q{http://github.com/wireframe/elastic_searchable}
37
37
  s.licenses = ["MIT"]
38
38
  s.require_paths = ["lib"]
39
- s.rubygems_version = %q{1.4.2}
39
+ s.rubygems_version = %q{1.5.0}
40
40
  s.summary = %q{elastic search for activerecord}
41
41
  s.test_files = [
42
42
  "test/helper.rb",
@@ -48,7 +48,7 @@ Gem::Specification.new do |s|
48
48
 
49
49
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
50
50
  s.add_runtime_dependency(%q<activerecord>, ["~> 2.3.5"])
51
- s.add_runtime_dependency(%q<rubberband>, ["~> 0.0.6"])
51
+ s.add_runtime_dependency(%q<httparty>, ["~> 0.7.3"])
52
52
  s.add_runtime_dependency(%q<backgrounded>, ["~> 0.7.0"])
53
53
  s.add_runtime_dependency(%q<will_paginate>, ["~> 2.3.15"])
54
54
  s.add_runtime_dependency(%q<larsklevan-after_commit>, ["~> 1.0.5"])
@@ -60,7 +60,7 @@ Gem::Specification.new do |s|
60
60
  s.add_development_dependency(%q<sqlite3-ruby>, ["~> 1.3.2"])
61
61
  else
62
62
  s.add_dependency(%q<activerecord>, ["~> 2.3.5"])
63
- s.add_dependency(%q<rubberband>, ["~> 0.0.6"])
63
+ s.add_dependency(%q<httparty>, ["~> 0.7.3"])
64
64
  s.add_dependency(%q<backgrounded>, ["~> 0.7.0"])
65
65
  s.add_dependency(%q<will_paginate>, ["~> 2.3.15"])
66
66
  s.add_dependency(%q<larsklevan-after_commit>, ["~> 1.0.5"])
@@ -73,7 +73,7 @@ Gem::Specification.new do |s|
73
73
  end
74
74
  else
75
75
  s.add_dependency(%q<activerecord>, ["~> 2.3.5"])
76
- s.add_dependency(%q<rubberband>, ["~> 0.0.6"])
76
+ s.add_dependency(%q<httparty>, ["~> 0.7.3"])
77
77
  s.add_dependency(%q<backgrounded>, ["~> 0.7.0"])
78
78
  s.add_dependency(%q<will_paginate>, ["~> 2.3.15"])
79
79
  s.add_dependency(%q<larsklevan-after_commit>, ["~> 1.0.5"])
@@ -15,7 +15,7 @@ module ElasticSearchable
15
15
  attr_accessor :elastic_options
16
16
 
17
17
  # Valid options:
18
- # :index (optional) configure index to store data in. default to model table name
18
+ # :index (optional) configure index to store data in. default to ElasticSearchable.default_index
19
19
  # :type (optional) configue type to store data in. default to model table name
20
20
  # :index_options (optional) configure index properties (ex: tokenizer)
21
21
  # :mapping (optional) configure field properties for this model (ex: skip analyzer for field)
@@ -24,11 +24,6 @@ module ElasticSearchable
24
24
  # :json (optional) configure the json document to be indexed (see http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json for available options)
25
25
  def elastic_searchable(options = {})
26
26
  options.symbolize_keys!
27
- options[:index] ||= self.table_name
28
- options[:type] ||= self.table_name
29
- options[:index_options] ||= {}
30
- options[:mapping] ||= false
31
- options[:json] ||= {}
32
27
  self.elastic_options = options
33
28
 
34
29
  extend ElasticSearchable::ActiveRecord::Index
@@ -46,7 +41,7 @@ module ElasticSearchable
46
41
  self.as_json self.class.elastic_options[:json]
47
42
  end
48
43
  def index_in_elastic_search(lifecycle = nil)
49
- ElasticSearchable.searcher.index self.indexed_json_document, self.class.index_options.merge(:id => self.id.to_s)
44
+ ElasticSearchable.request :put, self.class.index_type_path(self.id), :body => self.indexed_json_document.to_json
50
45
 
51
46
  self.run_callbacks("after_index_on_#{lifecycle}".to_sym) if lifecycle
52
47
  self.run_callbacks(:after_index)
@@ -3,12 +3,15 @@ module ElasticSearchable
3
3
  def self.included(base)
4
4
  base.send :extend, ClassMethods
5
5
  end
6
+ def self.backgrounded_options
7
+ {:queue => 'elasticsearch'}
8
+ end
6
9
 
7
10
  module ClassMethods
8
11
  def add_indexing_callbacks
9
- backgrounded :update_index_on_create => ElasticSearchable.backgrounded_options, :update_index_on_update => ElasticSearchable.backgrounded_options
12
+ backgrounded :update_index_on_create => ElasticSearchable::Callbacks.backgrounded_options, :update_index_on_update => ElasticSearchable::Callbacks.backgrounded_options
10
13
  class << self
11
- backgrounded :delete_id_from_index => ElasticSearchable.backgrounded_options
14
+ backgrounded :delete_id_from_index => ElasticSearchable::Callbacks.backgrounded_options
12
15
  end
13
16
 
14
17
  define_callbacks :after_index_on_create, :after_index_on_update, :after_index
@@ -1,50 +1,73 @@
1
1
  module ElasticSearchable
2
2
  module ActiveRecord
3
3
  module Index
4
- def create_index
5
- self.delete_index
6
- ElasticSearchable.searcher.create_index index_name, self.elastic_options[:index_options]
7
- if mapping = self.elastic_options[:mapping]
8
- ElasticSearchable.searcher.update_mapping mapping, self.index_options
9
- end
10
4
 
5
+ # helper method to clean out existing index and reindex all objects
6
+ def rebuild_index
7
+ self.clean_index
8
+ self.update_index_mapping
11
9
  self.find_each do |record|
12
10
  record.index_in_elastic_search if record.should_index?
13
11
  end
14
12
  self.refresh_index
15
13
  end
14
+
15
+ # delete all documents of this type in the index
16
+ # http://www.elasticsearch.com/docs/elasticsearch/rest_api/admin/indices/delete_mapping/
17
+ def clean_index
18
+ ElasticSearchable.request :delete, index_type_path
19
+ end
20
+
21
+ # configure the index for this type
22
+ # http://www.elasticsearch.com/docs/elasticsearch/rest_api/admin/indices/put_mapping/
23
+ def update_index_mapping
24
+ if mapping = self.elastic_options[:mapping]
25
+ ElasticSearchable.request :put, index_type_path('_mapping'), :body => {index_type => mapping}.to_json
26
+ end
27
+ end
28
+
29
+ # create the index
30
+ # http://www.elasticsearch.com/docs/elasticsearch/rest_api/admin/indices/create_index/
31
+ def create_index
32
+ ElasticSearchable.request :put, index_path
33
+ end
34
+
16
35
  # explicitly refresh the index, making all operations performed since the last refresh
17
36
  # available for search
18
37
  #
19
38
  # http://www.elasticsearch.com/docs/elasticsearch/rest_api/admin/indices/refresh/
20
39
  def refresh_index
21
- ElasticSearchable.searcher.refresh index_name
40
+ ElasticSearchable.request :post, index_path('_refresh')
22
41
  end
23
42
 
24
- # deletes the index for this model
43
+ # deletes the entire index
44
+ # http://www.elasticsearch.com/docs/elasticsearch/rest_api/admin/indices/delete_index/
25
45
  def delete_index
26
- begin
27
- ElasticSearchable.searcher.delete_index index_name
28
- rescue ElasticSearch::RequestError
29
- # it's ok, this means that the index doesn't exist
30
- end
46
+ ElasticSearchable.request :delete, index_path
31
47
  end
32
48
 
33
- #optimize the index
34
- def optimize_index
35
- ElasticSearchable.searcher.optimize index_name
49
+ # delete one record from the index
50
+ # http://www.elasticsearch.com/docs/elasticsearch/rest_api/delete/
51
+ def delete_id_from_index(id)
52
+ ElasticSearchable.request :delete, index_type_path(id)
36
53
  end
37
54
 
38
- #delete one record from the index
39
- def delete_id_from_index(id)
40
- ElasticSearchable.searcher.delete id.to_s, index_options
55
+ # helper method to generate elasticsearch url for this object type
56
+ def index_type_path(action = nil)
57
+ index_path [index_type, action].compact.join('/')
58
+ end
59
+
60
+ # helper method to generate elasticsearch url for this index
61
+ def index_path(action = nil)
62
+ ['', index_name, action].compact.join('/')
41
63
  end
42
64
 
65
+ private
43
66
  def index_name
44
- self.elastic_options[:index]
67
+ self.elastic_options[:index] || ElasticSearchable.default_index
45
68
  end
46
- def index_options
47
- self.elastic_options.slice :index, :type
69
+ def index_type
70
+ self.elastic_options[:type] || self.table_name
48
71
  end
49
72
  end
50
73
  end
@@ -3,59 +3,26 @@ require 'will_paginate/collection'
3
3
  module ElasticSearchable
4
4
  module Queries
5
5
  # search returns a will_paginate collection of ActiveRecord objects for the search results
6
+ # options:
7
+ # :per_page/:limit
8
+ # :page/:offset
6
9
  #
7
- # see ElasticSearch::Api::Index#search for the full list of valid options
8
- #
9
- # note that the collection may include nils if ElasticSearch returns a result hit for a
10
- # record that has been deleted on the database
10
+ # http://www.elasticsearch.com/docs/elasticsearch/rest_api/search/
11
11
  def search(query, options = {})
12
+ page = (options.delete(:page) || 1).to_i
12
13
  options[:fields] ||= '_id'
13
- if query.kind_of?(Hash)
14
- query = {:query => query}
15
- end
16
- hits = ElasticSearchable.searcher.search query, index_options.merge(options)
17
- ids = hits.collect(&:_id)
18
- results = self.find(ids).sort_by {|result| ids.index(result.id.to_s) }
14
+ options[:q] ||= query
15
+ options[:size] ||= (options.delete(:per_page) || 20)
16
+ options[:from] ||= options[:size] * (page - 1)
17
+
18
+ response = ElasticSearchable.request :get, index_type_path('_search'), :query => options
19
+ hits = response['hits']
20
+ ids = hits['hits'].collect {|h| h['_id'].to_i }
21
+ results = self.find(ids).sort_by {|result| ids.index(result.id) }
19
22
 
20
- page = WillPaginate::Collection.new(hits.current_page, hits.per_page, hits.total_entries)
23
+ page = WillPaginate::Collection.new(page, options[:size], hits['total'])
21
24
  page.replace results
22
25
  page
23
26
  end
24
-
25
- # counts the number of results for this query.
26
- def search_count(query = "*", options = {})
27
- if query.kind_of?(Hash)
28
- query = {:query => query}
29
- end
30
- ElasticSearchable.searcher.count query, index_options.merge(options)
31
- end
32
-
33
- def facets(fields_list, options = {})
34
- size = options.delete(:size) || 10
35
- fields_list = [fields_list] unless fields_list.kind_of?(Array)
36
-
37
- if !options[:query]
38
- options[:query] = {:match_all => true}
39
- elsif options[:query].kind_of?(String)
40
- options[:query] = {:query_string => {:query => options[:query]}}
41
- end
42
-
43
- options[:facets] = {}
44
- fields_list.each do |field|
45
- options[:facets][field] = {:terms => {:field => field, :size => size}}
46
- end
47
-
48
- hits = ElasticSearchable.searcher.search options, index_options.merge(options)
49
- out = {}
50
-
51
- fields_list.each do |field|
52
- out[field.to_sym] = {}
53
- hits.facets[field.to_s]["terms"].each do |term|
54
- out[field.to_sym][term["term"]] = term["count"]
55
- end
56
- end
57
-
58
- out
59
- end
60
27
  end
61
28
  end
@@ -1,14 +1,36 @@
1
- require 'rubberband'
1
+ require 'httparty'
2
2
  require 'elastic_searchable/active_record'
3
3
 
4
4
  module ElasticSearchable
5
+ include HTTParty
6
+ format :json
7
+ base_uri 'localhost:9200'
8
+ #debug_output
9
+
10
+ class ElasticError < StandardError; end
5
11
  class << self
6
- attr_accessor :searcher
7
- def searcher
8
- @searcher ||= ElasticSearch.new("localhost:9200")
12
+ # setup the default index to use
13
+ # one index can hold many object 'types'
14
+ @@default_index = nil
15
+ def default_index=(index)
16
+ @@default_index = index
17
+ end
18
+ def default_index
19
+ @@default_index || 'elastic_searchable'
9
20
  end
10
- def backgrounded_options
11
- {:queue => 'elasticsearch'}
21
+
22
+ #perform a request to the elasticsearch server
23
+ def request(method, url, options = {})
24
+ response = self.send(method, url, options)
25
+ puts "elasticsearch request: #{method} #{url} #{" finished in #{response['took']}ms" if response['took']}"
26
+ assert_ok_response response
27
+ response
28
+ end
29
+
30
+ private
31
+ def assert_ok_response(response)
32
+ error = response['error'] || "Error executing request: #{response.inspect}"
33
+ raise ElasticSearchable::ElasticError.new(error) if response['error'] || !response.success?
12
34
  end
13
35
  end
14
36
  end
@@ -55,7 +55,6 @@ class TestElasticSearchable < Test::Unit::TestCase
55
55
  @indexed_on_create
56
56
  end
57
57
  end
58
-
59
58
  context 'Post class with default elastic_searchable config' do
60
59
  setup do
61
60
  @clazz = Post
@@ -66,26 +65,31 @@ class TestElasticSearchable < Test::Unit::TestCase
66
65
  should 'define elastic_options' do
67
66
  assert @clazz.elastic_options
68
67
  end
69
- should 'define index_name' do
70
- assert_equal 'posts', @clazz.index_name
71
- end
72
68
  end
73
69
 
74
- context 'Post.create_index' do
70
+ context 'with empty index' do
75
71
  setup do
76
- Post.create_index
77
- @status = ElasticSearchable.searcher.index_status Post.index_name
72
+ begin
73
+ ElasticSearchable.delete '/elastic_searchable'
74
+ rescue ElasticSearchable::ElasticError
75
+ #already deleted
76
+ end
78
77
  end
79
- should 'have created index' do
80
- assert @status['ok']
78
+
79
+ context 'Post.create_index' do
80
+ setup do
81
+ Post.create_index
82
+ @status = ElasticSearchable.request :get, '/elastic_searchable/_status'
83
+ end
84
+ should 'have created index' do
85
+ assert @status['ok']
86
+ end
81
87
  end
82
88
  end
83
89
 
84
- context 'creating new instance' do
90
+ context 'Post.create' do
85
91
  setup do
86
- Post.delete_all
87
92
  @post = Post.create :title => 'foo', :body => "bar"
88
- Post.create_index
89
93
  end
90
94
  should 'have fired after_index callback' do
91
95
  assert @post.indexed?
@@ -93,31 +97,69 @@ class TestElasticSearchable < Test::Unit::TestCase
93
97
  should 'have fired after_index_on_create callback' do
94
98
  assert @post.indexed_on_create?
95
99
  end
100
+ end
101
+
102
+ context 'with index containing multiple results' do
103
+ setup do
104
+ Post.delete_all
105
+ @first_post = Post.create :title => 'foo', :body => "first bar"
106
+ @second_post = Post.create :title => 'foo', :body => "second bar"
107
+ Post.rebuild_index
108
+ Post.refresh_index
109
+ end
96
110
 
97
111
  context 'searching for results' do
98
112
  setup do
99
- @results = Post.search 'foo'
113
+ @results = Post.search 'first'
100
114
  end
101
115
  should 'find created object' do
102
- assert_equal @post, @results.first
116
+ assert_equal @first_post, @results.first
117
+ end
118
+ should 'be paginated' do
119
+ assert_equal 1, @results.current_page
120
+ assert_equal 20, @results.per_page
121
+ assert_nil @results.previous_page
122
+ assert_nil @results.next_page
123
+ end
124
+ end
125
+
126
+ context 'searching for second page using will_paginate params' do
127
+ setup do
128
+ @results = Post.search 'foo', :page => 2, :per_page => 1, :sort => 'id'
129
+ end
130
+ should 'find object' do
131
+ assert_equal @second_post, @results.first
103
132
  end
104
133
  should 'be paginated' do
105
- assert_equal 1, @results.total_entries
134
+ assert_equal 2, @results.current_page
135
+ assert_equal 1, @results.per_page
136
+ assert_equal 1, @results.previous_page
137
+ assert_nil @results.next_page
106
138
  end
107
139
  end
108
140
 
109
141
  context 'sorting search results' do
110
142
  setup do
111
- @second_post = Post.create :title => 'foo', :body => "second bar"
112
- Post.create_index
113
- @results = Post.search 'foo', :sort => 'id:reverse'
143
+ @results = Post.search 'foo', :sort => 'id:desc'
114
144
  end
115
145
  should 'sort results correctly' do
116
146
  assert_equal @second_post, @results.first
117
147
  end
118
148
  end
149
+
150
+ context 'destroying one object' do
151
+ setup do
152
+ @first_post.destroy
153
+ Post.refresh_index
154
+ end
155
+ should 'be removed from the index' do
156
+ @request = ElasticSearchable.get "/elastic_searchable/posts/#{@first_post.id}"
157
+ assert @request.not_found?, @request.inspect
158
+ end
159
+ end
119
160
  end
120
161
 
162
+
121
163
  class Blog < ActiveRecord::Base
122
164
  elastic_searchable :if => proc {|b| b.should_index? }
123
165
  def should_index?
@@ -128,19 +170,17 @@ class TestElasticSearchable < Test::Unit::TestCase
128
170
  context 'when creating new instance' do
129
171
  setup do
130
172
  Blog.any_instance.expects(:index_in_elastic_search).never
131
- Blog.delete_all
132
- Blog.create_index
133
173
  Blog.create! :title => 'foo'
134
174
  end
135
175
  should 'not index record' do end #see expectations
136
-
137
- context 'recreating new index' do
138
- setup do
139
- Blog.any_instance.expects(:index_in_elastic_search).never
140
- Blog.create_index
141
- end
142
- should 'not index record' do end #see expectations
176
+ end
177
+ context 'rebuilding new index' do
178
+ setup do
179
+ Blog.any_instance.expects(:index_in_elastic_search).never
180
+ Blog.create! :title => 'foo'
181
+ Blog.rebuild_index
143
182
  end
183
+ should 'not index record' do end #see expectations
144
184
  end
145
185
  end
146
186
 
@@ -150,20 +190,18 @@ class TestElasticSearchable < Test::Unit::TestCase
150
190
  context 'activerecord class with :mapping=>{}' do
151
191
  context 'creating index' do
152
192
  setup do
153
- User.create_index
154
- @status = ElasticSearchable.searcher.index_mapping User.index_name
193
+ User.update_index_mapping
194
+ @status = ElasticSearchable.request :get, '/elastic_searchable/users/_mapping'
155
195
  end
156
196
  should 'have set mapping' do
157
197
  expected = {
158
198
  "users"=> {
159
- "users"=> {
160
- "properties"=> {
161
- "name"=> {"type"=>"string", "index"=>"not_analyzed"}
162
- }
199
+ "properties"=> {
200
+ "name"=> {"type"=>"string", "index"=>"not_analyzed"}
163
201
  }
164
202
  }
165
203
  }
166
- assert_equal expected, @status
204
+ assert_equal expected, @status['elastic_searchable'], @status.inspect
167
205
  end
168
206
  end
169
207
  end
@@ -176,13 +214,27 @@ class TestElasticSearchable < Test::Unit::TestCase
176
214
  setup do
177
215
  Friend.delete_all
178
216
  @friend = Friend.create! :name => 'bob', :favorite_color => 'red'
179
- Friend.create_index
217
+ Friend.rebuild_index
180
218
  end
181
219
  should 'index json with configuration' do
182
- @response = ElasticSearchable.searcher.get @friend.id, Friend.index_options
183
- assert_equal 'bob', @response.name
184
- assert_nil @response.favorite_color
220
+ @response = ElasticSearchable.request :get, "/friends/friends/#{@friend.id}"
221
+ expected = {
222
+ "name" => 'bob' #favorite_color should not be indexed
223
+ }
224
+ assert_equal expected, @response['_source'], @response.inspect
185
225
  end
186
226
  end
187
227
  end
228
+
229
+ context 'updating ElasticSearchable.default_index' do
230
+ setup do
231
+ ElasticSearchable.default_index = 'my_new_index'
232
+ end
233
+ teardown do
234
+ ElasticSearchable.default_index = nil
235
+ end
236
+ should 'change default index' do
237
+ assert_equal 'my_new_index', ElasticSearchable.default_index
238
+ end
239
+ end
188
240
  end
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 2
10
- version: 0.2.2
8
+ - 3
9
+ - 0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ryan Sonnek
@@ -15,11 +15,11 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-02-01 00:00:00 -06:00
18
+ date: 2011-02-03 00:00:00 -06:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- type: :runtime
22
+ name: activerecord
23
23
  version_requirements: &id001 !ruby/object:Gem::Requirement
24
24
  none: false
25
25
  requirements:
@@ -31,27 +31,27 @@ dependencies:
31
31
  - 3
32
32
  - 5
33
33
  version: 2.3.5
34
- requirement: *id001
35
34
  prerelease: false
36
- name: activerecord
37
- - !ruby/object:Gem::Dependency
38
35
  type: :runtime
36
+ requirement: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: httparty
39
39
  version_requirements: &id002 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ~>
43
43
  - !ruby/object:Gem::Version
44
- hash: 19
44
+ hash: 5
45
45
  segments:
46
46
  - 0
47
- - 0
48
- - 6
49
- version: 0.0.6
50
- requirement: *id002
47
+ - 7
48
+ - 3
49
+ version: 0.7.3
51
50
  prerelease: false
52
- name: rubberband
53
- - !ruby/object:Gem::Dependency
54
51
  type: :runtime
52
+ requirement: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: backgrounded
55
55
  version_requirements: &id003 !ruby/object:Gem::Requirement
56
56
  none: false
57
57
  requirements:
@@ -63,11 +63,11 @@ dependencies:
63
63
  - 7
64
64
  - 0
65
65
  version: 0.7.0
66
- requirement: *id003
67
66
  prerelease: false
68
- name: backgrounded
69
- - !ruby/object:Gem::Dependency
70
67
  type: :runtime
68
+ requirement: *id003
69
+ - !ruby/object:Gem::Dependency
70
+ name: will_paginate
71
71
  version_requirements: &id004 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
@@ -79,11 +79,11 @@ dependencies:
79
79
  - 3
80
80
  - 15
81
81
  version: 2.3.15
82
- requirement: *id004
83
82
  prerelease: false
84
- name: will_paginate
85
- - !ruby/object:Gem::Dependency
86
83
  type: :runtime
84
+ requirement: *id004
85
+ - !ruby/object:Gem::Dependency
86
+ name: larsklevan-after_commit
87
87
  version_requirements: &id005 !ruby/object:Gem::Requirement
88
88
  none: false
89
89
  requirements:
@@ -95,11 +95,11 @@ dependencies:
95
95
  - 0
96
96
  - 5
97
97
  version: 1.0.5
98
- requirement: *id005
99
98
  prerelease: false
100
- name: larsklevan-after_commit
99
+ type: :runtime
100
+ requirement: *id005
101
101
  - !ruby/object:Gem::Dependency
102
- type: :development
102
+ name: shoulda
103
103
  version_requirements: &id006 !ruby/object:Gem::Requirement
104
104
  none: false
105
105
  requirements:
@@ -109,11 +109,11 @@ dependencies:
109
109
  segments:
110
110
  - 0
111
111
  version: "0"
112
- requirement: *id006
113
112
  prerelease: false
114
- name: shoulda
115
- - !ruby/object:Gem::Dependency
116
113
  type: :development
114
+ requirement: *id006
115
+ - !ruby/object:Gem::Dependency
116
+ name: bundler
117
117
  version_requirements: &id007 !ruby/object:Gem::Requirement
118
118
  none: false
119
119
  requirements:
@@ -125,11 +125,11 @@ dependencies:
125
125
  - 0
126
126
  - 0
127
127
  version: 1.0.0
128
- requirement: *id007
129
128
  prerelease: false
130
- name: bundler
131
- - !ruby/object:Gem::Dependency
132
129
  type: :development
130
+ requirement: *id007
131
+ - !ruby/object:Gem::Dependency
132
+ name: mocha
133
133
  version_requirements: &id008 !ruby/object:Gem::Requirement
134
134
  none: false
135
135
  requirements:
@@ -139,11 +139,11 @@ dependencies:
139
139
  segments:
140
140
  - 0
141
141
  version: "0"
142
- requirement: *id008
143
142
  prerelease: false
144
- name: mocha
145
- - !ruby/object:Gem::Dependency
146
143
  type: :development
144
+ requirement: *id008
145
+ - !ruby/object:Gem::Dependency
146
+ name: jeweler
147
147
  version_requirements: &id009 !ruby/object:Gem::Requirement
148
148
  none: false
149
149
  requirements:
@@ -155,11 +155,11 @@ dependencies:
155
155
  - 5
156
156
  - 2
157
157
  version: 1.5.2
158
- requirement: *id009
159
158
  prerelease: false
160
- name: jeweler
161
- - !ruby/object:Gem::Dependency
162
159
  type: :development
160
+ requirement: *id009
161
+ - !ruby/object:Gem::Dependency
162
+ name: rcov
163
163
  version_requirements: &id010 !ruby/object:Gem::Requirement
164
164
  none: false
165
165
  requirements:
@@ -169,11 +169,11 @@ dependencies:
169
169
  segments:
170
170
  - 0
171
171
  version: "0"
172
- requirement: *id010
173
172
  prerelease: false
174
- name: rcov
175
- - !ruby/object:Gem::Dependency
176
173
  type: :development
174
+ requirement: *id010
175
+ - !ruby/object:Gem::Dependency
176
+ name: sqlite3-ruby
177
177
  version_requirements: &id011 !ruby/object:Gem::Requirement
178
178
  none: false
179
179
  requirements:
@@ -185,9 +185,9 @@ dependencies:
185
185
  - 3
186
186
  - 2
187
187
  version: 1.3.2
188
- requirement: *id011
189
188
  prerelease: false
190
- name: sqlite3-ruby
189
+ type: :development
190
+ requirement: *id011
191
191
  description: integrate the elastic search engine with rails
192
192
  email: ryan@codecrate.com
193
193
  executables: []
@@ -243,7 +243,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
243
243
  requirements: []
244
244
 
245
245
  rubyforge_project:
246
- rubygems_version: 1.4.2
246
+ rubygems_version: 1.5.0
247
247
  signing_key:
248
248
  specification_version: 3
249
249
  summary: elastic search for activerecord