elasticsearch-model 5.1.0 → 6.1.0

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 (125) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +5 -0
  3. data/README.md +18 -11
  4. data/Rakefile +27 -36
  5. data/elasticsearch-model.gemspec +5 -5
  6. data/examples/activerecord_custom_analyzer.rb +135 -0
  7. data/examples/activerecord_mapping_completion.rb +3 -18
  8. data/examples/datamapper_article.rb +11 -1
  9. data/gemfiles/3.0.gemfile +6 -1
  10. data/gemfiles/4.0.gemfile +7 -1
  11. data/gemfiles/5.0.gemfile +7 -1
  12. data/lib/elasticsearch/model/adapters/active_record.rb +7 -23
  13. data/lib/elasticsearch/model/adapters/mongoid.rb +10 -3
  14. data/lib/elasticsearch/model/importing.rb +1 -1
  15. data/lib/elasticsearch/model/indexing.rb +6 -4
  16. data/lib/elasticsearch/model/naming.rb +9 -2
  17. data/lib/elasticsearch/model/response/aggregations.rb +1 -1
  18. data/lib/elasticsearch/model/response/base.rb +3 -2
  19. data/lib/elasticsearch/model/response/pagination/kaminari.rb +109 -0
  20. data/lib/elasticsearch/model/response/pagination/will_paginate.rb +95 -0
  21. data/lib/elasticsearch/model/response/pagination.rb +2 -192
  22. data/lib/elasticsearch/model/response/result.rb +1 -1
  23. data/lib/elasticsearch/model/response/suggestions.rb +1 -1
  24. data/lib/elasticsearch/model/response.rb +11 -10
  25. data/lib/elasticsearch/model/version.rb +1 -1
  26. data/lib/elasticsearch/model.rb +15 -8
  27. data/spec/elasticsearch/model/adapter_spec.rb +119 -0
  28. data/spec/elasticsearch/model/adapters/active_record/associations_spec.rb +334 -0
  29. data/spec/elasticsearch/model/adapters/active_record/basic_spec.rb +340 -0
  30. data/spec/elasticsearch/model/adapters/active_record/dynamic_index_name_spec.rb +18 -0
  31. data/spec/elasticsearch/model/adapters/active_record/import_spec.rb +187 -0
  32. data/spec/elasticsearch/model/adapters/active_record/multi_model_spec.rb +110 -0
  33. data/spec/elasticsearch/model/adapters/active_record/namespaced_model_spec.rb +38 -0
  34. data/spec/elasticsearch/model/adapters/active_record/pagination_spec.rb +315 -0
  35. data/spec/elasticsearch/model/adapters/active_record/parent_child_spec.rb +75 -0
  36. data/spec/elasticsearch/model/adapters/active_record/serialization_spec.rb +61 -0
  37. data/spec/elasticsearch/model/adapters/active_record_spec.rb +207 -0
  38. data/spec/elasticsearch/model/adapters/default_spec.rb +41 -0
  39. data/spec/elasticsearch/model/adapters/mongoid/basic_spec.rb +267 -0
  40. data/spec/elasticsearch/model/adapters/mongoid/multi_model_spec.rb +66 -0
  41. data/spec/elasticsearch/model/adapters/mongoid_spec.rb +235 -0
  42. data/spec/elasticsearch/model/adapters/multiple_spec.rb +125 -0
  43. data/spec/elasticsearch/model/callbacks_spec.rb +33 -0
  44. data/spec/elasticsearch/model/client_spec.rb +66 -0
  45. data/spec/elasticsearch/model/hash_wrapper_spec.rb +12 -0
  46. data/spec/elasticsearch/model/importing_spec.rb +214 -0
  47. data/spec/elasticsearch/model/indexing_spec.rb +918 -0
  48. data/spec/elasticsearch/model/module_spec.rb +101 -0
  49. data/spec/elasticsearch/model/multimodel_spec.rb +55 -0
  50. data/spec/elasticsearch/model/naming_inheritance_spec.rb +184 -0
  51. data/spec/elasticsearch/model/naming_spec.rb +186 -0
  52. data/spec/elasticsearch/model/proxy_spec.rb +107 -0
  53. data/spec/elasticsearch/model/response/aggregations_spec.rb +66 -0
  54. data/spec/elasticsearch/model/response/base_spec.rb +90 -0
  55. data/spec/elasticsearch/model/response/pagination/kaminari_spec.rb +410 -0
  56. data/spec/elasticsearch/model/response/pagination/will_paginate_spec.rb +262 -0
  57. data/spec/elasticsearch/model/response/records_spec.rb +118 -0
  58. data/spec/elasticsearch/model/response/response_spec.rb +131 -0
  59. data/spec/elasticsearch/model/response/result_spec.rb +122 -0
  60. data/spec/elasticsearch/model/response/results_spec.rb +56 -0
  61. data/spec/elasticsearch/model/searching_search_request_spec.rb +112 -0
  62. data/spec/elasticsearch/model/searching_spec.rb +49 -0
  63. data/spec/elasticsearch/model/serializing_spec.rb +22 -0
  64. data/spec/spec_helper.rb +161 -0
  65. data/spec/support/app/answer.rb +33 -0
  66. data/spec/support/app/article.rb +22 -0
  67. data/spec/support/app/article_for_pagination.rb +12 -0
  68. data/spec/support/app/article_with_custom_serialization.rb +13 -0
  69. data/spec/support/app/article_with_dynamic_index_name.rb +15 -0
  70. data/spec/support/app/author.rb +9 -0
  71. data/spec/support/app/authorship.rb +4 -0
  72. data/spec/support/app/category.rb +3 -0
  73. data/spec/support/app/comment.rb +3 -0
  74. data/spec/support/app/episode.rb +11 -0
  75. data/spec/support/app/image.rb +19 -0
  76. data/spec/support/app/import_article.rb +12 -0
  77. data/spec/support/app/mongoid_article.rb +21 -0
  78. data/spec/support/app/namespaced_book.rb +10 -0
  79. data/spec/support/app/parent_and_child_searchable.rb +24 -0
  80. data/spec/support/app/post.rb +14 -0
  81. data/spec/support/app/question.rb +27 -0
  82. data/spec/support/app/searchable.rb +48 -0
  83. data/spec/support/app/series.rb +11 -0
  84. data/spec/support/app.rb +21 -0
  85. data/spec/support/model.json +1 -0
  86. metadata +134 -90
  87. data/test/integration/active_record_associations_parent_child_test.rb +0 -147
  88. data/test/integration/active_record_associations_test.rb +0 -339
  89. data/test/integration/active_record_basic_test.rb +0 -251
  90. data/test/integration/active_record_custom_serialization_test.rb +0 -67
  91. data/test/integration/active_record_import_test.rb +0 -115
  92. data/test/integration/active_record_namespaced_model_test.rb +0 -54
  93. data/test/integration/active_record_pagination_test.rb +0 -149
  94. data/test/integration/dynamic_index_name_test.rb +0 -52
  95. data/test/integration/mongoid_basic_test.rb +0 -176
  96. data/test/integration/multiple_models_test.rb +0 -176
  97. data/test/support/model.json +0 -1
  98. data/test/test_helper.rb +0 -92
  99. data/test/unit/adapter_active_record_test.rb +0 -157
  100. data/test/unit/adapter_default_test.rb +0 -41
  101. data/test/unit/adapter_mongoid_test.rb +0 -104
  102. data/test/unit/adapter_multiple_test.rb +0 -106
  103. data/test/unit/adapter_test.rb +0 -69
  104. data/test/unit/callbacks_test.rb +0 -31
  105. data/test/unit/client_test.rb +0 -27
  106. data/test/unit/hash_wrapper_test.rb +0 -13
  107. data/test/unit/importing_test.rb +0 -203
  108. data/test/unit/indexing_test.rb +0 -687
  109. data/test/unit/module_test.rb +0 -68
  110. data/test/unit/multimodel_test.rb +0 -38
  111. data/test/unit/naming_inheritance_test.rb +0 -94
  112. data/test/unit/naming_test.rb +0 -103
  113. data/test/unit/proxy_test.rb +0 -98
  114. data/test/unit/response_aggregations_test.rb +0 -46
  115. data/test/unit/response_base_test.rb +0 -40
  116. data/test/unit/response_pagination_kaminari_test.rb +0 -433
  117. data/test/unit/response_pagination_will_paginate_test.rb +0 -398
  118. data/test/unit/response_records_test.rb +0 -91
  119. data/test/unit/response_result_test.rb +0 -90
  120. data/test/unit/response_results_test.rb +0 -31
  121. data/test/unit/response_test.rb +0 -104
  122. data/test/unit/searching_search_request_test.rb +0 -78
  123. data/test/unit/searching_test.rb +0 -41
  124. data/test/unit/serializing_test.rb +0 -17
  125. /data/{test → spec}/support/model.yml +0 -0
@@ -1,69 +0,0 @@
1
- require 'test_helper'
2
-
3
- class Elasticsearch::Model::AdapterTest < Test::Unit::TestCase
4
- context "Adapter module" do
5
- class ::DummyAdapterClass; end
6
- class ::DummyAdapterClassWithAdapter; end
7
- class ::DummyAdapter
8
- Records = Module.new
9
- Callbacks = Module.new
10
- Importing = Module.new
11
- end
12
-
13
- should "return an Adapter instance" do
14
- assert_instance_of Elasticsearch::Model::Adapter::Adapter,
15
- Elasticsearch::Model::Adapter.from_class(DummyAdapterClass)
16
- end
17
-
18
- should "return a list of adapters" do
19
- Elasticsearch::Model::Adapter::Adapter.expects(:adapters)
20
- Elasticsearch::Model::Adapter.adapters
21
- end
22
-
23
- should "register an adapter" do
24
- begin
25
- Elasticsearch::Model::Adapter::Adapter.expects(:register)
26
- Elasticsearch::Model::Adapter.register(:foo, lambda { |c| false })
27
- ensure
28
- Elasticsearch::Model::Adapter::Adapter.instance_variable_set(:@adapters, {})
29
- end
30
- end
31
- end
32
-
33
- context "Adapter class" do
34
- should "register an adapter" do
35
- begin
36
- Elasticsearch::Model::Adapter::Adapter.register(:foo, lambda { |c| false })
37
- assert Elasticsearch::Model::Adapter::Adapter.adapters[:foo]
38
- ensure
39
- Elasticsearch::Model::Adapter::Adapter.instance_variable_set(:@adapters, {})
40
- end
41
- end
42
-
43
- should "return the default adapter" do
44
- adapter = Elasticsearch::Model::Adapter::Adapter.new(DummyAdapterClass)
45
- assert_equal Elasticsearch::Model::Adapter::Default, adapter.adapter
46
- end
47
-
48
- should "return a specific adapter" do
49
- Elasticsearch::Model::Adapter::Adapter.register(DummyAdapter,
50
- lambda { |c| c == DummyAdapterClassWithAdapter })
51
-
52
- adapter = Elasticsearch::Model::Adapter::Adapter.new(DummyAdapterClassWithAdapter)
53
- assert_equal DummyAdapter, adapter.adapter
54
- end
55
-
56
- should "return the modules" do
57
- assert_nothing_raised do
58
- Elasticsearch::Model::Adapter::Adapter.register(DummyAdapter,
59
- lambda { |c| c == DummyAdapterClassWithAdapter })
60
-
61
- adapter = Elasticsearch::Model::Adapter::Adapter.new(DummyAdapterClassWithAdapter)
62
-
63
- assert_instance_of Module, adapter.records_mixin
64
- assert_instance_of Module, adapter.callbacks_mixin
65
- assert_instance_of Module, adapter.importing_mixin
66
- end
67
- end
68
- end
69
- end
@@ -1,31 +0,0 @@
1
- require 'test_helper'
2
-
3
- class Elasticsearch::Model::CallbacksTest < Test::Unit::TestCase
4
- context "Callbacks module" do
5
- class ::DummyCallbacksModel
6
- end
7
-
8
- module DummyCallbacksAdapter
9
- module CallbacksMixin
10
- end
11
-
12
- def callbacks_mixin
13
- CallbacksMixin
14
- end; module_function :callbacks_mixin
15
- end
16
-
17
- should "include the callbacks mixin from adapter" do
18
- Elasticsearch::Model::Adapter.expects(:from_class)
19
- .with(DummyCallbacksModel)
20
- .returns(DummyCallbacksAdapter)
21
-
22
- ::DummyCallbacksModel.expects(:__send__).with do |method, parameter|
23
- assert_equal :include, method
24
- assert_equal DummyCallbacksAdapter::CallbacksMixin, parameter
25
- true
26
- end
27
-
28
- Elasticsearch::Model::Callbacks.included(DummyCallbacksModel)
29
- end
30
- end
31
- end
@@ -1,27 +0,0 @@
1
- require 'test_helper'
2
-
3
- class Elasticsearch::Model::ClientTest < Test::Unit::TestCase
4
- context "Client module" do
5
- class ::DummyClientModel
6
- extend Elasticsearch::Model::Client::ClassMethods
7
- include Elasticsearch::Model::Client::InstanceMethods
8
- end
9
-
10
- should "have the default client method" do
11
- assert_instance_of Elasticsearch::Transport::Client, DummyClientModel.client
12
- assert_instance_of Elasticsearch::Transport::Client, DummyClientModel.new.client
13
- end
14
-
15
- should "set the client for the model" do
16
- DummyClientModel.client = 'foobar'
17
- assert_equal 'foobar', DummyClientModel.client
18
- assert_equal 'foobar', DummyClientModel.new.client
19
- end
20
-
21
- should "set the client for a model instance" do
22
- instance = DummyClientModel.new
23
- instance.client = 'moobam'
24
- assert_equal 'moobam', instance.client
25
- end
26
- end
27
- end
@@ -1,13 +0,0 @@
1
- require 'test_helper'
2
-
3
- require 'hashie/version'
4
-
5
- class Elasticsearch::Model::HashWrapperTest < Test::Unit::TestCase
6
- context "The HashWrapper class" do
7
- should "not print the warning for re-defined methods" do
8
- Hashie.logger.expects(:warn).never
9
-
10
- subject = Elasticsearch::Model::HashWrapper.new(:foo => 'bar', :sort => true)
11
- end if Hashie::VERSION >= '3.5.3'
12
- end
13
- end
@@ -1,203 +0,0 @@
1
- require 'test_helper'
2
-
3
- class Elasticsearch::Model::ImportingTest < Test::Unit::TestCase
4
- context "Importing module" do
5
- class ::DummyImportingModel
6
- end
7
-
8
- module ::DummyImportingAdapter
9
- module ImportingMixin
10
- def __find_in_batches(options={}, &block)
11
- yield if block_given?
12
- end
13
- def __transform
14
- lambda {|a|}
15
- end
16
- end
17
-
18
- def importing_mixin
19
- ImportingMixin
20
- end; module_function :importing_mixin
21
- end
22
-
23
- should "include methods from the module and adapter" do
24
- Elasticsearch::Model::Adapter.expects(:from_class)
25
- .with(DummyImportingModel)
26
- .returns(DummyImportingAdapter)
27
-
28
- DummyImportingModel.__send__ :include, Elasticsearch::Model::Importing
29
-
30
- assert_respond_to DummyImportingModel, :import
31
- assert_respond_to DummyImportingModel, :__find_in_batches
32
- end
33
-
34
- should "call the client when importing" do
35
- Elasticsearch::Model::Adapter.expects(:from_class)
36
- .with(DummyImportingModel)
37
- .returns(DummyImportingAdapter)
38
-
39
- DummyImportingModel.__send__ :include, Elasticsearch::Model::Importing
40
-
41
- client = mock('client')
42
- client.expects(:bulk).returns({'items' => []})
43
-
44
- DummyImportingModel.expects(:client).returns(client)
45
- DummyImportingModel.expects(:index_name).returns('foo')
46
- DummyImportingModel.expects(:document_type).returns('foo')
47
- DummyImportingModel.stubs(:index_exists?).returns(true)
48
- DummyImportingModel.stubs(:__batch_to_bulk)
49
- assert_equal 0, DummyImportingModel.import
50
- end
51
-
52
- should "return the number of errors" do
53
- Elasticsearch::Model::Adapter.expects(:from_class)
54
- .with(DummyImportingModel)
55
- .returns(DummyImportingAdapter)
56
-
57
- DummyImportingModel.__send__ :include, Elasticsearch::Model::Importing
58
-
59
- client = mock('client')
60
- client.expects(:bulk).returns({'items' => [ {'index' => {}}, {'index' => {'error' => 'FAILED'}} ]})
61
-
62
- DummyImportingModel.stubs(:client).returns(client)
63
- DummyImportingModel.stubs(:index_name).returns('foo')
64
- DummyImportingModel.stubs(:document_type).returns('foo')
65
- DummyImportingModel.stubs(:index_exists?).returns(true)
66
- DummyImportingModel.stubs(:__batch_to_bulk)
67
-
68
- assert_equal 1, DummyImportingModel.import
69
- end
70
-
71
- should "return an array of error elements" do
72
- Elasticsearch::Model::Adapter.expects(:from_class)
73
- .with(DummyImportingModel)
74
- .returns(DummyImportingAdapter)
75
-
76
- DummyImportingModel.__send__ :include, Elasticsearch::Model::Importing
77
-
78
- client = mock('client')
79
- client.expects(:bulk).returns({'items' => [ {'index' => {}}, {'index' => {'error' => 'FAILED'}} ]})
80
-
81
- DummyImportingModel.stubs(:client).returns(client)
82
- DummyImportingModel.stubs(:index_name).returns('foo')
83
- DummyImportingModel.stubs(:document_type).returns('foo')
84
- DummyImportingModel.stubs(:index_exists?).returns(true)
85
- DummyImportingModel.stubs(:__batch_to_bulk)
86
-
87
- assert_equal [{'index' => {'error' => 'FAILED'}}], DummyImportingModel.import(return: 'errors')
88
- end
89
-
90
- should "yield the response" do
91
- Elasticsearch::Model::Adapter.expects(:from_class)
92
- .with(DummyImportingModel)
93
- .returns(DummyImportingAdapter)
94
-
95
- DummyImportingModel.__send__ :include, Elasticsearch::Model::Importing
96
-
97
- client = mock('client')
98
- client.expects(:bulk).returns({'items' => [ {'index' => {}}, {'index' => {'error' => 'FAILED'}} ]})
99
-
100
- DummyImportingModel.stubs(:client).returns(client)
101
- DummyImportingModel.stubs(:index_name).returns('foo')
102
- DummyImportingModel.stubs(:document_type).returns('foo')
103
- DummyImportingModel.stubs(:index_exists?).returns(true)
104
- DummyImportingModel.stubs(:__batch_to_bulk)
105
-
106
- DummyImportingModel.import do |response|
107
- assert_equal 2, response['items'].size
108
- end
109
- end
110
-
111
- context "when the index does not exist" do
112
- should "raise an exception" do
113
- Elasticsearch::Model::Adapter.expects(:from_class)
114
- .with(DummyImportingModel)
115
- .returns(DummyImportingAdapter)
116
-
117
- DummyImportingModel.__send__ :include, Elasticsearch::Model::Importing
118
-
119
- DummyImportingModel.expects(:index_name).returns('foo')
120
- DummyImportingModel.expects(:document_type).returns('foo')
121
- DummyImportingModel.expects(:index_exists?).returns(false)
122
-
123
- assert_raise ArgumentError do
124
- DummyImportingModel.import
125
- end
126
- end
127
- end
128
-
129
- context "with the force option" do
130
- should "delete and create the index" do
131
- DummyImportingModel.expects(:__find_in_batches).with do |options|
132
- assert_equal 'bar', options[:foo]
133
- assert_nil options[:force]
134
- true
135
- end
136
-
137
- DummyImportingModel.expects(:create_index!).with do |options|
138
- assert_equal true, options[:force]
139
- true
140
- end
141
-
142
- DummyImportingModel.expects(:index_name).returns('foo')
143
- DummyImportingModel.expects(:document_type).returns('foo')
144
-
145
- DummyImportingModel.import force: true, foo: 'bar'
146
- end
147
- end
148
-
149
- should "allow passing a different index / type" do
150
- Elasticsearch::Model::Adapter.expects(:from_class)
151
- .with(DummyImportingModel)
152
- .returns(DummyImportingAdapter)
153
-
154
- DummyImportingModel.__send__ :include, Elasticsearch::Model::Importing
155
-
156
- client = mock('client')
157
-
158
- client
159
- .expects(:bulk)
160
- .with do |options|
161
- assert_equal 'my-new-index', options[:index]
162
- assert_equal 'my-other-type', options[:type]
163
- true
164
- end
165
- .returns({'items' => [ {'index' => {} }]})
166
-
167
- DummyImportingModel.stubs(:client).returns(client)
168
- DummyImportingModel.stubs(:index_exists?).returns(true)
169
- DummyImportingModel.stubs(:__batch_to_bulk)
170
-
171
- DummyImportingModel.import index: 'my-new-index', type: 'my-other-type'
172
- end
173
-
174
- should "use the default transform from adapter" do
175
- client = mock('client', bulk: {'items' => []})
176
- transform = lambda {|a|}
177
-
178
- DummyImportingModel.stubs(:client).returns(client)
179
- DummyImportingModel.stubs(:index_exists?).returns(true)
180
- DummyImportingModel.expects(:__transform).returns(transform)
181
- DummyImportingModel.expects(:__batch_to_bulk).with(anything, transform)
182
-
183
- DummyImportingModel.import index: 'foo', type: 'bar'
184
- end
185
-
186
- should "use the transformer from options" do
187
- client = mock('client', bulk: {'items' => []})
188
- transform = lambda {|a|}
189
-
190
- DummyImportingModel.stubs(:client).returns(client)
191
- DummyImportingModel.stubs(:index_exists?).returns(true)
192
- DummyImportingModel.expects(:__batch_to_bulk).with(anything, transform)
193
-
194
- DummyImportingModel.import index: 'foo', type: 'bar', transform: transform
195
- end
196
-
197
- should "raise an ArgumentError if transform doesn't respond to the call method" do
198
- assert_raise ArgumentError do
199
- DummyImportingModel.import index: 'foo', type: 'bar', transform: "not_callable"
200
- end
201
- end
202
- end
203
- end