sunspot_suggest 0.0.1

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 (37) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +32 -0
  5. data/Rakefile +1 -0
  6. data/lib/sunspot_suggest/plugin.rb +20 -0
  7. data/lib/sunspot_suggest/sunspot/dsl/standard_query.rb +15 -0
  8. data/lib/sunspot_suggest/sunspot/query/common_query.rb +16 -0
  9. data/lib/sunspot_suggest/sunspot/query/spellcheck.rb +22 -0
  10. data/lib/sunspot_suggest/sunspot/query/suggest.rb +28 -0
  11. data/lib/sunspot_suggest/sunspot/search/abstract_search.rb +130 -0
  12. data/lib/sunspot_suggest/version.rb +3 -0
  13. data/lib/sunspot_suggest.rb +6 -0
  14. data/spec/api/query/spellcheck_spec.rb +21 -0
  15. data/spec/api/search/spellcheck_search_spec.rb +116 -0
  16. data/spec/article.rb +12 -0
  17. data/spec/helpers/indexer_helper.rb +17 -0
  18. data/spec/helpers/integration_helper.rb +8 -0
  19. data/spec/helpers/mock_session_helper.rb +13 -0
  20. data/spec/helpers/query_helper.rb +26 -0
  21. data/spec/helpers/search_helper.rb +68 -0
  22. data/spec/helpers/spellcheck_helper.rb +66 -0
  23. data/spec/mocks/adapters.rb +36 -0
  24. data/spec/mocks/blog.rb +3 -0
  25. data/spec/mocks/comment.rb +21 -0
  26. data/spec/mocks/connection.rb +128 -0
  27. data/spec/mocks/mock_adapter.rb +30 -0
  28. data/spec/mocks/mock_class_sharding_session_proxy.rb +24 -0
  29. data/spec/mocks/mock_record.rb +52 -0
  30. data/spec/mocks/mock_sharding_session_proxy.rb +15 -0
  31. data/spec/mocks/photo.rb +11 -0
  32. data/spec/mocks/post.rb +86 -0
  33. data/spec/mocks/super_class.rb +2 -0
  34. data/spec/mocks/user.rb +13 -0
  35. data/spec/spec_helper.rb +50 -0
  36. data/sunspot_suggest.gemspec +26 -0
  37. metadata +184 -0
@@ -0,0 +1,36 @@
1
+ class AbstractModel
2
+ end
3
+
4
+ class Model < AbstractModel
5
+ end
6
+
7
+ class UnseenModel < AbstractModel
8
+ end
9
+
10
+ class AbstractModelInstanceAdapter < Sunspot::Adapters::InstanceAdapter
11
+ end
12
+
13
+ class AbstractModelDataAccessor < Sunspot::Adapters::DataAccessor
14
+ attr_accessor :to_be_injected
15
+ end
16
+
17
+ Sunspot::Adapters::InstanceAdapter.register(AbstractModelInstanceAdapter, AbstractModel)
18
+ Sunspot::Adapters::DataAccessor.register(AbstractModelDataAccessor, AbstractModel)
19
+
20
+
21
+ module MixInModel
22
+ end
23
+
24
+ class MixModel
25
+ include MixInModel
26
+ end
27
+
28
+ class MixInModelInstanceAdapter < Sunspot::Adapters::InstanceAdapter
29
+ end
30
+
31
+ class MixInModelDataAccessor < Sunspot::Adapters::DataAccessor
32
+ end
33
+
34
+ Sunspot::Adapters::InstanceAdapter.register(MixInModelInstanceAdapter, MixInModel)
35
+ Sunspot::Adapters::DataAccessor.register(MixInModelDataAccessor, MixInModel)
36
+
@@ -0,0 +1,3 @@
1
+ class Blog < MockRecord
2
+ attr_accessor :name
3
+ end
@@ -0,0 +1,21 @@
1
+ module Namespaced
2
+ class Comment < MockRecord
3
+ attr_reader :id
4
+ attr_accessor :author_name, :published_at, :body, :average_rating, :boost,
5
+ :hash
6
+
7
+ def custom_float
8
+ @custom_float ||= {}
9
+ end
10
+ end
11
+ end
12
+
13
+ Sunspot.setup(Namespaced::Comment) do
14
+ text :body, :author_name
15
+ string :author_name
16
+ time :published_at, :trie => true
17
+ long :hash
18
+ double :average_rating
19
+ dynamic_float :custom_float, :multiple => true
20
+ boost :boost
21
+ end
@@ -0,0 +1,128 @@
1
+ module Mock
2
+ class ConnectionFactory
3
+ def connect(opts)
4
+ if @instance
5
+ raise('Factory can only create an instance once!')
6
+ else
7
+ @instance = Connection.new(opts)
8
+ end
9
+ end
10
+
11
+ def new(url = nil)
12
+ if @instance
13
+ raise('Factory can only create an instance once!')
14
+ else
15
+ @instance = Connection.new(url)
16
+ end
17
+ end
18
+
19
+ def instance
20
+ @instance ||= Connection.new
21
+ end
22
+ end
23
+
24
+ class Connection
25
+ attr_reader :adds, :commits, :optims, :searches, :message, :opts, :deletes_by_query
26
+ attr_accessor :response
27
+ attr_writer :expected_handler
28
+ attr_reader :last_search
29
+
30
+ undef_method :select # annoyingly defined on Object
31
+
32
+ def initialize(opts = {})
33
+ @opts = opts
34
+ @message = OpenStruct.new
35
+ @adds, @deletes, @deletes_by_query, @commits, @optims, @searches = Array.new(6) { [] }
36
+ @expected_handler = :select
37
+ end
38
+
39
+ def add(documents)
40
+ @adds << Array(documents)
41
+ end
42
+
43
+ def delete_by_id(ids)
44
+ @deletes << Array(ids)
45
+ end
46
+
47
+ def delete_by_query(query)
48
+ @deletes_by_query << query
49
+ end
50
+
51
+ def commit
52
+ @commits << Time.now
53
+ end
54
+
55
+ def optimize
56
+ @optims << Time.now
57
+ end
58
+
59
+ def post(path, params)
60
+ unless path == "#{@expected_handler}"
61
+ raise ArgumentError, "Expected request to #{@expected_handler} request handler"
62
+ end
63
+ @searches << @last_search = params[:data]
64
+ @response || {}
65
+ end
66
+
67
+ def method_missing(method, *args, &block)
68
+ get("#{method}", *args)
69
+ end
70
+
71
+ def has_add_with?(*documents)
72
+ @adds.any? do |add|
73
+ documents.all? do |document|
74
+ add.any? do |added|
75
+ if document.is_a?(Hash)
76
+ document.all? do |field, value|
77
+ added.fields_by_name(field).map do |field|
78
+ field.value.to_s
79
+ end == Array(value).map { |v| v.to_s }
80
+ end
81
+ else
82
+ !added.fields_by_name(document).empty?
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ def has_delete?(*ids)
90
+ @deletes.any? do |delete|
91
+ delete & ids == ids
92
+ end
93
+ end
94
+
95
+ def has_delete_by_query?(query)
96
+ @deletes_by_query.include?(query)
97
+ end
98
+
99
+ def has_last_search_with?(params)
100
+ with?(@last_search, params) if @last_search
101
+ end
102
+
103
+ def has_last_search_including?(key, *values)
104
+ return unless @last_search
105
+ if @last_search.has_key?(key)
106
+ if @last_search[key].is_a?(Array)
107
+ (@last_search[key] & values).length == values.length
108
+ elsif values.length == 1
109
+ @last_search[key] == values.first
110
+ end
111
+ end
112
+ end
113
+
114
+ private
115
+
116
+ def with?(request, params)
117
+ if params.respond_to?(:all?)
118
+ params.all? do |key, value|
119
+ if request.has_key?(key)
120
+ request[key] == value
121
+ end
122
+ end
123
+ else
124
+ request.has_key?(params)
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,30 @@
1
+ require File.join(File.dirname(__FILE__), 'post')
2
+
3
+ module MockAdapter
4
+ class InstanceAdapter < Sunspot::Adapters::InstanceAdapter
5
+ def id
6
+ @instance.id
7
+ end
8
+ end
9
+
10
+ class DataAccessor < Sunspot::Adapters::DataAccessor
11
+ def load(id)
12
+ @clazz.get(id.to_i)
13
+ end
14
+
15
+ def load_all(ids)
16
+ all = @clazz.get_all(ids.map { |id| id.to_i })
17
+ if @custom_title
18
+ all.each { |item| item.title = @custom_title }
19
+ end
20
+ all
21
+ end
22
+
23
+ def custom_title=(custom_title)
24
+ @custom_title = custom_title
25
+ end
26
+ end
27
+ end
28
+
29
+ Sunspot::Adapters::DataAccessor.register(MockAdapter::DataAccessor, MockRecord)
30
+ Sunspot::Adapters::InstanceAdapter.register(MockAdapter::InstanceAdapter, MockRecord)
@@ -0,0 +1,24 @@
1
+ class MockClassShardingSessionProxy < Sunspot::SessionProxy::ClassShardingSessionProxy
2
+ attr_reader :post_session, :photo_session
3
+
4
+ def initialize(search_session)
5
+ super
6
+ @post_session, @photo_session = Sunspot::Session.new, Sunspot::Session.new
7
+ @post_session.config.solr.url = 'http://posts.solr.local/solr'
8
+ @photo_session.config.solr.url = 'http://photos.solr.local/solr'
9
+ @sessions = {
10
+ Post => @post_session,
11
+ Photo => @photo_session
12
+ }
13
+ end
14
+
15
+ def session_for_class(clazz)
16
+ @sessions[clazz]
17
+ end
18
+
19
+ def all_sessions
20
+ @sessions.values.sort do |lsession, rsession|
21
+ lsession.config.solr.url <=> rsession.config.solr.url
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,52 @@
1
+ class MockRecord
2
+ IDS = Hash.new { |h, k| h[k] = 0 }
3
+ QUERY_COUNTS = Hash.new { |h, k| h[k] = 0 }
4
+ INSTANCES = Hash.new { |h, k| h[k] = {} }
5
+
6
+ attr_reader :id
7
+
8
+ class <<self
9
+ def reset!
10
+ IDS[name.to_sym] = 0
11
+ INSTANCES[name.to_sym] = {}
12
+ end
13
+ end
14
+
15
+ def initialize(attrs = {})
16
+ @id = attrs.delete(:id) || IDS[self.class.name.to_sym] += 1
17
+ INSTANCES[self.class.name.to_sym][@id] = self
18
+ attrs.each_pair do |name, value|
19
+ send(:"#{name}=", value)
20
+ end
21
+ end
22
+
23
+ def self.inherited(base)
24
+ base.extend(ClassMethods)
25
+ end
26
+
27
+ module ClassMethods
28
+ def get(id)
29
+ QUERY_COUNTS[self.name.to_sym] += 1
30
+ get_instance(id)
31
+ end
32
+
33
+ def get_all(ids)
34
+ QUERY_COUNTS[self.name.to_sym] += 1
35
+ ids.map { |id| get_instance(id) }.compact.sort_by { |instance| instance.id }
36
+ end
37
+
38
+ def query_count
39
+ QUERY_COUNTS[self.name.to_sym]
40
+ end
41
+
42
+ private
43
+
44
+ def get_instance(id)
45
+ INSTANCES[self.name.to_sym][id]
46
+ end
47
+ end
48
+
49
+ def destroy
50
+ INSTANCES[self.class.name.to_sym].delete(@id)
51
+ end
52
+ end
@@ -0,0 +1,15 @@
1
+ class MockShardingSessionProxy < Sunspot::SessionProxy::ShardingSessionProxy
2
+ attr_reader :sessions
3
+ alias_method :all_sessions, :sessions
4
+
5
+ def initialize(search_session)
6
+ super
7
+ @sessions = Array.new(2) { Sunspot::Session.new }.each_with_index do |session, i|
8
+ session.config.solr.url = "http://localhost:898#{i}/solr"
9
+ end
10
+ end
11
+
12
+ def session_for(object)
13
+ @sessions[object.blog_id.to_i % 2]
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ class Photo < MockRecord
2
+ attr_accessor :caption, :lat, :lng, :size, :average_rating, :created_at
3
+ end
4
+
5
+ Sunspot.setup(Photo) do
6
+ text :caption, :default_boost => 1.5
7
+ boost 0.75
8
+ integer :size, :trie => true
9
+ float :average_rating, :trie => true
10
+ time :created_at, :trie => true
11
+ end
@@ -0,0 +1,86 @@
1
+ require File.join(File.dirname(__FILE__), 'blog')
2
+ require File.join(File.dirname(__FILE__), 'super_class')
3
+
4
+ class Post < SuperClass
5
+ attr_accessor :title, :body, :blog_id, :published_at, :ratings_average,
6
+ :author_name, :featured, :expire_date, :coordinates, :tags
7
+ alias_method :featured?, :featured
8
+
9
+ def category_ids
10
+ @category_ids ||= []
11
+ end
12
+
13
+ def custom_string
14
+ @custom_string ||= {}
15
+ end
16
+
17
+ def custom_fl
18
+ @custom_fl ||= {}
19
+ end
20
+
21
+ def custom_time
22
+ @custom_time ||= {}
23
+ end
24
+
25
+ def custom_boolean
26
+ @custom_boolean ||= {}
27
+ end
28
+
29
+ private
30
+ attr_writer :category_ids, :custom_string, :custom_fl, :custom_time, :custom_boolean
31
+ end
32
+
33
+ Sunspot.setup(Post) do
34
+ text :title, :boost => 2
35
+ text :body, :stored => true, :more_like_this => true
36
+ text :backwards_title do
37
+ title.reverse if title
38
+ end
39
+ text :tags, :more_like_this => true
40
+ string :title, :stored => true
41
+ integer :blog_id, :references => Blog
42
+ integer :category_ids, :multiple => true
43
+ float :average_rating, :using => :ratings_average, :trie => true
44
+ time :published_at, :trie => true
45
+ date :expire_date
46
+ boolean :featured, :using => :featured?, :stored => true
47
+ string :sort_title do
48
+ title.downcase.sub(/^(a|an|the)\W+/, '') if title
49
+ end
50
+ integer :primary_category_id do |post|
51
+ post.category_ids.first
52
+ end
53
+ time :last_indexed_at, :stored => true do
54
+ Time.now
55
+ end
56
+ location :coordinates
57
+ latlon(:coordinates_new) { coordinates }
58
+
59
+ dynamic_string :custom_string, :stored => true
60
+ dynamic_float :custom_float, :multiple => true, :using => :custom_fl
61
+ dynamic_integer :custom_integer do
62
+ category_ids.inject({}) do |hash, category_id|
63
+ hash.merge(category_id => 1)
64
+ end
65
+ end
66
+ dynamic_time :custom_time
67
+ dynamic_boolean :custom_boolean
68
+
69
+ boost do
70
+ if ratings_average
71
+ 1 + (ratings_average - 3.0) / 4.0
72
+ end
73
+ end
74
+
75
+ string :legacy, :as => :legacy_field_s do
76
+ "legacy #{title}"
77
+ end
78
+
79
+ string :legacy_array, :as => :legacy_array_field_sm, :multiple => true do
80
+ ['first string', 'second string']
81
+ end
82
+ end
83
+
84
+ class PhotoPost < Post
85
+ end
86
+
@@ -0,0 +1,2 @@
1
+ class SuperClass < MockRecord
2
+ end
@@ -0,0 +1,13 @@
1
+ class User
2
+ attr_accessor :name, :roles
3
+
4
+ def id
5
+ 1
6
+ end
7
+ end
8
+
9
+ Sunspot.setup(User) do
10
+ text :name
11
+ string :name
12
+ integer :role_ids, :multiple => true, :stored => true
13
+ end
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+
3
+ require 'pry'
4
+ require 'ostruct'
5
+ require 'forwardable'
6
+ require 'sunspot'
7
+ require 'sunspot_suggest'
8
+
9
+ require File.join(File.dirname(__FILE__), 'mocks', 'mock_record.rb')
10
+ Dir.glob(File.join(File.dirname(__FILE__), 'mocks', '**', '*.rb')).each do |file|
11
+ require file unless File.basename(file) == 'mock_record.rb'
12
+ end
13
+ Dir.glob(File.join(File.dirname(__FILE__), "helpers", "*.rb")).each do |file|
14
+ require file
15
+ end
16
+
17
+ require_relative 'article'
18
+
19
+ RSpec.configure do |config|
20
+ config.include SpellcheckHelper
21
+
22
+
23
+ # config.filter_run :focus => true
24
+
25
+ # Mock session available to all spec/api tests
26
+ config.include MockSessionHelper,
27
+ :type => :api,
28
+ :example_group => {:file_path => /spec[\\\/]api/}
29
+
30
+ # Real Solr instance is available to integration tests
31
+ config.include IntegrationHelper,
32
+ :type => :integration,
33
+ :example_group => {:file_path => /spec[\\\/]integration/}
34
+
35
+ # Nested under spec/api
36
+ [:indexer, :query, :search].each do |spec_type|
37
+ helper_name = "#{spec_type}_helper"
38
+
39
+ config.include Sunspot::Util.full_const_get(Sunspot::Util.camel_case(helper_name)),
40
+ :type => spec_type,
41
+ :example_group => {:file_path => /spec[\\\/]api[\\\/]#{spec_type}/}
42
+ end
43
+
44
+ end
45
+
46
+ def without_class(clazz)
47
+ Object.class_eval { remove_const(clazz.name.to_sym) }
48
+ yield
49
+ Object.class_eval { const_set(clazz.name.to_sym, clazz) }
50
+ end
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'sunspot_suggest/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "sunspot_suggest"
8
+ spec.version = SunspotSuggest::VERSION
9
+ spec.authors = ["rainkinz"]
10
+ spec.email = ["brendan.grainger@gmail.com"]
11
+ spec.description = %q{Adds suggest and spellcheck DSL methods}
12
+ spec.summary = %q{Adds suggest and spellcheck DSL methods}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "sunspot", "~> 2.0"
22
+ spec.add_development_dependency "bundler", "~> 1.3"
23
+ spec.add_development_dependency "rake"
24
+ spec.add_development_dependency 'rspec', '~>2.6.0'
25
+ spec.add_development_dependency 'pry'
26
+ end
metadata ADDED
@@ -0,0 +1,184 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sunspot_suggest
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - rainkinz
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-07-24 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sunspot
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '2.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '2.0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: bundler
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '1.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: '1.3'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
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: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 2.6.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: 2.6.0
78
+ - !ruby/object:Gem::Dependency
79
+ name: pry
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ description: Adds suggest and spellcheck DSL methods
95
+ email:
96
+ - brendan.grainger@gmail.com
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - .gitignore
102
+ - Gemfile
103
+ - LICENSE.txt
104
+ - README.md
105
+ - Rakefile
106
+ - lib/sunspot_suggest.rb
107
+ - lib/sunspot_suggest/plugin.rb
108
+ - lib/sunspot_suggest/sunspot/dsl/standard_query.rb
109
+ - lib/sunspot_suggest/sunspot/query/common_query.rb
110
+ - lib/sunspot_suggest/sunspot/query/spellcheck.rb
111
+ - lib/sunspot_suggest/sunspot/query/suggest.rb
112
+ - lib/sunspot_suggest/sunspot/search/abstract_search.rb
113
+ - lib/sunspot_suggest/version.rb
114
+ - spec/api/query/spellcheck_spec.rb
115
+ - spec/api/search/spellcheck_search_spec.rb
116
+ - spec/article.rb
117
+ - spec/helpers/indexer_helper.rb
118
+ - spec/helpers/integration_helper.rb
119
+ - spec/helpers/mock_session_helper.rb
120
+ - spec/helpers/query_helper.rb
121
+ - spec/helpers/search_helper.rb
122
+ - spec/helpers/spellcheck_helper.rb
123
+ - spec/mocks/adapters.rb
124
+ - spec/mocks/blog.rb
125
+ - spec/mocks/comment.rb
126
+ - spec/mocks/connection.rb
127
+ - spec/mocks/mock_adapter.rb
128
+ - spec/mocks/mock_class_sharding_session_proxy.rb
129
+ - spec/mocks/mock_record.rb
130
+ - spec/mocks/mock_sharding_session_proxy.rb
131
+ - spec/mocks/photo.rb
132
+ - spec/mocks/post.rb
133
+ - spec/mocks/super_class.rb
134
+ - spec/mocks/user.rb
135
+ - spec/spec_helper.rb
136
+ - sunspot_suggest.gemspec
137
+ homepage: ''
138
+ licenses:
139
+ - MIT
140
+ post_install_message:
141
+ rdoc_options: []
142
+ require_paths:
143
+ - lib
144
+ required_ruby_version: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ required_rubygems_version: !ruby/object:Gem::Requirement
151
+ none: false
152
+ requirements:
153
+ - - ! '>='
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ requirements: []
157
+ rubyforge_project:
158
+ rubygems_version: 1.8.23
159
+ signing_key:
160
+ specification_version: 3
161
+ summary: Adds suggest and spellcheck DSL methods
162
+ test_files:
163
+ - spec/api/query/spellcheck_spec.rb
164
+ - spec/api/search/spellcheck_search_spec.rb
165
+ - spec/article.rb
166
+ - spec/helpers/indexer_helper.rb
167
+ - spec/helpers/integration_helper.rb
168
+ - spec/helpers/mock_session_helper.rb
169
+ - spec/helpers/query_helper.rb
170
+ - spec/helpers/search_helper.rb
171
+ - spec/helpers/spellcheck_helper.rb
172
+ - spec/mocks/adapters.rb
173
+ - spec/mocks/blog.rb
174
+ - spec/mocks/comment.rb
175
+ - spec/mocks/connection.rb
176
+ - spec/mocks/mock_adapter.rb
177
+ - spec/mocks/mock_class_sharding_session_proxy.rb
178
+ - spec/mocks/mock_record.rb
179
+ - spec/mocks/mock_sharding_session_proxy.rb
180
+ - spec/mocks/photo.rb
181
+ - spec/mocks/post.rb
182
+ - spec/mocks/super_class.rb
183
+ - spec/mocks/user.rb
184
+ - spec/spec_helper.rb