elasticsearch-model 6.0.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 (118) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +5 -0
  3. data/README.md +14 -7
  4. data/Rakefile +27 -36
  5. data/elasticsearch-model.gemspec +1 -1
  6. data/examples/activerecord_mapping_completion.rb +2 -15
  7. data/gemfiles/3.0.gemfile +6 -1
  8. data/gemfiles/4.0.gemfile +7 -1
  9. data/gemfiles/5.0.gemfile +6 -0
  10. data/lib/elasticsearch/model.rb +15 -8
  11. data/lib/elasticsearch/model/adapters/active_record.rb +7 -26
  12. data/lib/elasticsearch/model/indexing.rb +5 -3
  13. data/lib/elasticsearch/model/naming.rb +6 -1
  14. data/lib/elasticsearch/model/response.rb +2 -2
  15. data/lib/elasticsearch/model/response/pagination.rb +2 -192
  16. data/lib/elasticsearch/model/response/pagination/kaminari.rb +109 -0
  17. data/lib/elasticsearch/model/response/pagination/will_paginate.rb +95 -0
  18. data/lib/elasticsearch/model/response/result.rb +1 -1
  19. data/lib/elasticsearch/model/version.rb +1 -1
  20. data/spec/elasticsearch/model/adapter_spec.rb +119 -0
  21. data/spec/elasticsearch/model/adapters/active_record/associations_spec.rb +334 -0
  22. data/spec/elasticsearch/model/adapters/active_record/basic_spec.rb +340 -0
  23. data/spec/elasticsearch/model/adapters/active_record/dynamic_index_name_spec.rb +18 -0
  24. data/spec/elasticsearch/model/adapters/active_record/import_spec.rb +187 -0
  25. data/spec/elasticsearch/model/adapters/active_record/multi_model_spec.rb +110 -0
  26. data/spec/elasticsearch/model/adapters/active_record/namespaced_model_spec.rb +38 -0
  27. data/spec/elasticsearch/model/adapters/active_record/pagination_spec.rb +315 -0
  28. data/spec/elasticsearch/model/adapters/active_record/parent_child_spec.rb +75 -0
  29. data/spec/elasticsearch/model/adapters/active_record/serialization_spec.rb +61 -0
  30. data/spec/elasticsearch/model/adapters/active_record_spec.rb +207 -0
  31. data/spec/elasticsearch/model/adapters/default_spec.rb +41 -0
  32. data/spec/elasticsearch/model/adapters/mongoid/basic_spec.rb +267 -0
  33. data/spec/elasticsearch/model/adapters/mongoid/multi_model_spec.rb +66 -0
  34. data/spec/elasticsearch/model/adapters/mongoid_spec.rb +235 -0
  35. data/spec/elasticsearch/model/adapters/multiple_spec.rb +125 -0
  36. data/spec/elasticsearch/model/callbacks_spec.rb +33 -0
  37. data/spec/elasticsearch/model/client_spec.rb +66 -0
  38. data/spec/elasticsearch/model/hash_wrapper_spec.rb +12 -0
  39. data/spec/elasticsearch/model/importing_spec.rb +214 -0
  40. data/spec/elasticsearch/model/indexing_spec.rb +918 -0
  41. data/spec/elasticsearch/model/module_spec.rb +101 -0
  42. data/spec/elasticsearch/model/multimodel_spec.rb +55 -0
  43. data/spec/elasticsearch/model/naming_inheritance_spec.rb +184 -0
  44. data/spec/elasticsearch/model/naming_spec.rb +186 -0
  45. data/spec/elasticsearch/model/proxy_spec.rb +107 -0
  46. data/spec/elasticsearch/model/response/aggregations_spec.rb +66 -0
  47. data/spec/elasticsearch/model/response/base_spec.rb +90 -0
  48. data/spec/elasticsearch/model/response/pagination/kaminari_spec.rb +410 -0
  49. data/spec/elasticsearch/model/response/pagination/will_paginate_spec.rb +262 -0
  50. data/spec/elasticsearch/model/response/records_spec.rb +118 -0
  51. data/spec/elasticsearch/model/response/response_spec.rb +131 -0
  52. data/spec/elasticsearch/model/response/result_spec.rb +122 -0
  53. data/spec/elasticsearch/model/response/results_spec.rb +56 -0
  54. data/spec/elasticsearch/model/searching_search_request_spec.rb +112 -0
  55. data/spec/elasticsearch/model/searching_spec.rb +49 -0
  56. data/spec/elasticsearch/model/serializing_spec.rb +22 -0
  57. data/spec/spec_helper.rb +161 -0
  58. data/spec/support/app.rb +21 -0
  59. data/spec/support/app/answer.rb +33 -0
  60. data/spec/support/app/article.rb +22 -0
  61. data/spec/support/app/article_for_pagination.rb +12 -0
  62. data/spec/support/app/article_with_custom_serialization.rb +13 -0
  63. data/spec/support/app/article_with_dynamic_index_name.rb +15 -0
  64. data/spec/support/app/author.rb +9 -0
  65. data/spec/support/app/authorship.rb +4 -0
  66. data/spec/support/app/category.rb +3 -0
  67. data/spec/support/app/comment.rb +3 -0
  68. data/spec/support/app/episode.rb +11 -0
  69. data/spec/support/app/image.rb +19 -0
  70. data/spec/support/app/import_article.rb +12 -0
  71. data/spec/support/app/mongoid_article.rb +21 -0
  72. data/spec/support/app/namespaced_book.rb +10 -0
  73. data/spec/support/app/parent_and_child_searchable.rb +24 -0
  74. data/spec/support/app/post.rb +14 -0
  75. data/spec/support/app/question.rb +27 -0
  76. data/spec/support/app/searchable.rb +48 -0
  77. data/spec/support/app/series.rb +11 -0
  78. data/spec/support/model.json +1 -0
  79. data/{test → spec}/support/model.yml +0 -0
  80. metadata +129 -86
  81. data/test/integration/active_record_associations_parent_child_test.rb +0 -188
  82. data/test/integration/active_record_associations_test.rb +0 -339
  83. data/test/integration/active_record_basic_test.rb +0 -255
  84. data/test/integration/active_record_custom_serialization_test.rb +0 -67
  85. data/test/integration/active_record_import_test.rb +0 -168
  86. data/test/integration/active_record_namespaced_model_test.rb +0 -56
  87. data/test/integration/active_record_pagination_test.rb +0 -149
  88. data/test/integration/dynamic_index_name_test.rb +0 -52
  89. data/test/integration/mongoid_basic_test.rb +0 -240
  90. data/test/integration/multiple_models_test.rb +0 -176
  91. data/test/support/model.json +0 -1
  92. data/test/test_helper.rb +0 -92
  93. data/test/unit/adapter_active_record_test.rb +0 -157
  94. data/test/unit/adapter_default_test.rb +0 -41
  95. data/test/unit/adapter_mongoid_test.rb +0 -161
  96. data/test/unit/adapter_multiple_test.rb +0 -106
  97. data/test/unit/adapter_test.rb +0 -69
  98. data/test/unit/callbacks_test.rb +0 -31
  99. data/test/unit/client_test.rb +0 -27
  100. data/test/unit/hash_wrapper_test.rb +0 -13
  101. data/test/unit/importing_test.rb +0 -224
  102. data/test/unit/indexing_test.rb +0 -720
  103. data/test/unit/module_test.rb +0 -68
  104. data/test/unit/multimodel_test.rb +0 -38
  105. data/test/unit/naming_inheritance_test.rb +0 -94
  106. data/test/unit/naming_test.rb +0 -103
  107. data/test/unit/proxy_test.rb +0 -98
  108. data/test/unit/response_aggregations_test.rb +0 -46
  109. data/test/unit/response_base_test.rb +0 -40
  110. data/test/unit/response_pagination_kaminari_test.rb +0 -433
  111. data/test/unit/response_pagination_will_paginate_test.rb +0 -398
  112. data/test/unit/response_records_test.rb +0 -91
  113. data/test/unit/response_result_test.rb +0 -90
  114. data/test/unit/response_results_test.rb +0 -34
  115. data/test/unit/response_test.rb +0 -104
  116. data/test/unit/searching_search_request_test.rb +0 -78
  117. data/test/unit/searching_test.rb +0 -41
  118. data/test/unit/serializing_test.rb +0 -17
@@ -1,398 +0,0 @@
1
- require 'test_helper'
2
- require 'will_paginate'
3
- require 'will_paginate/collection'
4
-
5
- class Elasticsearch::Model::ResponsePaginationWillPaginateTest < Test::Unit::TestCase
6
- class ModelClass
7
- def self.index_name; 'foo'; end
8
- def self.document_type; 'bar'; end
9
-
10
- # WillPaginate adds this method to models (see WillPaginate::PerPage module)
11
- def self.per_page
12
- 33
13
- end
14
- end
15
-
16
- # Subsclass Response so we can include WillPaginate module without conflicts with Kaminari.
17
- class WillPaginateResponse < Elasticsearch::Model::Response::Response
18
- include Elasticsearch::Model::Response::Pagination::WillPaginate
19
- end
20
-
21
- RESPONSE = { 'took' => '5', 'timed_out' => false, '_shards' => {'one' => 'OK'},
22
- 'hits' => { 'total' => 100, 'hits' => (1..100).to_a.map { |i| { _id: i } } } }
23
-
24
- context "Response pagination" do
25
-
26
- setup do
27
- @search = Elasticsearch::Model::Searching::SearchRequest.new ModelClass, '*'
28
- @response = WillPaginateResponse.new ModelClass, @search, RESPONSE
29
- @response.klass.stubs(:client).returns mock('client')
30
-
31
- @expected_methods = [
32
- # methods needed by WillPaginate::CollectionMethods
33
- :current_page,
34
- :offset,
35
- :per_page,
36
- :total_entries,
37
- :length,
38
-
39
- # methods defined by WillPaginate::CollectionMethods
40
- :total_pages,
41
- :previous_page,
42
- :next_page,
43
- :out_of_bounds?,
44
- ]
45
- end
46
-
47
- should "have pagination methods" do
48
- assert_respond_to @response, :paginate
49
-
50
- @expected_methods.each do |method|
51
- assert_respond_to @response, method
52
- end
53
- end
54
-
55
- context "response.results" do
56
- should "have pagination methods" do
57
- @expected_methods.each do |method|
58
- assert_respond_to @response.results, method
59
- end
60
- end
61
- end
62
-
63
- context "response.records" do
64
- should "have pagination methods" do
65
- @expected_methods.each do |method|
66
- @response.klass.stubs(:find).returns([])
67
- assert_respond_to @response.records, method
68
- end
69
- end
70
- end
71
-
72
- context "#offset method" do
73
- should "calculate offset using current_page and per_page" do
74
- @response.per_page(3).page(3)
75
- assert_equal 6, @response.offset
76
- end
77
- end
78
- context "#length method" do
79
- should "return count of paginated results" do
80
- @response.per_page(3).page(3)
81
- assert_equal 3, @response.length
82
- end
83
- end
84
-
85
- context "#paginate method" do
86
- should "set from/size using defaults" do
87
- @response.klass.client
88
- .expects(:search)
89
- .with do |definition|
90
- assert_equal 0, definition[:from]
91
- assert_equal 33, definition[:size]
92
- true
93
- end
94
- .returns(RESPONSE)
95
-
96
- assert_nil @response.search.definition[:from]
97
- assert_nil @response.search.definition[:size]
98
-
99
- @response.paginate(page: nil).to_a
100
- assert_equal 0, @response.search.definition[:from]
101
- assert_equal 33, @response.search.definition[:size]
102
- end
103
-
104
- should "set from/size using default per_page" do
105
- @response.klass.client
106
- .expects(:search)
107
- .with do |definition|
108
- assert_equal 33, definition[:from]
109
- assert_equal 33, definition[:size]
110
- true
111
- end
112
- .returns(RESPONSE)
113
-
114
- assert_nil @response.search.definition[:from]
115
- assert_nil @response.search.definition[:size]
116
-
117
- @response.paginate(page: 2).to_a
118
- assert_equal 33, @response.search.definition[:from]
119
- assert_equal 33, @response.search.definition[:size]
120
- end
121
-
122
- should "set from/size using custom page and per_page" do
123
- @response.klass.client
124
- .expects(:search)
125
- .with do |definition|
126
- assert_equal 18, definition[:from]
127
- assert_equal 9, definition[:size]
128
- true
129
- end
130
- .returns(RESPONSE)
131
-
132
- assert_nil @response.search.definition[:from]
133
- assert_nil @response.search.definition[:size]
134
-
135
- @response.paginate(page: 3, per_page: 9).to_a
136
- assert_equal 18, @response.search.definition[:from]
137
- assert_equal 9, @response.search.definition[:size]
138
- end
139
-
140
- should "search for first page if specified page is < 1" do
141
- @response.klass.client
142
- .expects(:search)
143
- .with do |definition|
144
- assert_equal 0, definition[:from]
145
- assert_equal 33, definition[:size]
146
- true
147
- end
148
- .returns(RESPONSE)
149
-
150
- assert_nil @response.search.definition[:from]
151
- assert_nil @response.search.definition[:size]
152
-
153
- @response.paginate(page: "-1").to_a
154
- assert_equal 0, @response.search.definition[:from]
155
- assert_equal 33, @response.search.definition[:size]
156
- end
157
-
158
- should "use the param_name" do
159
- @response.klass.client
160
- .expects(:search)
161
- .with do |definition|
162
- assert_equal 10, definition[:from]
163
- true
164
- end
165
- .returns(RESPONSE)
166
-
167
- @response.paginate(my_page: 2, per_page: 10, param_name: :my_page).to_a
168
- end
169
- end
170
-
171
- context "#page and #per_page shorthand methods" do
172
- should "set from/size using default per_page" do
173
- @response.page(5)
174
- assert_equal 132, @response.search.definition[:from]
175
- assert_equal 33, @response.search.definition[:size]
176
- end
177
-
178
- should "set from/size when calling #page then #per_page" do
179
- @response.page(5).per_page(3)
180
- assert_equal 12, @response.search.definition[:from]
181
- assert_equal 3, @response.search.definition[:size]
182
- end
183
-
184
- should "set from/size when calling #per_page then #page" do
185
- @response.per_page(3).page(5)
186
- assert_equal 12, @response.search.definition[:from]
187
- assert_equal 3, @response.search.definition[:size]
188
- end
189
- end
190
-
191
- context "#current_page method" do
192
- should "return 1 by default" do
193
- @response.paginate({})
194
- assert_equal 1, @response.current_page
195
- end
196
-
197
- should "return current page number" do
198
- @response.paginate(page: 3, per_page: 9)
199
- assert_equal 3, @response.current_page
200
- end
201
-
202
- should "return nil if not pagination set" do
203
- assert_equal nil, @response.current_page
204
- end
205
- end
206
-
207
- context "#per_page method" do
208
- should "return value set in paginate call" do
209
- @response.paginate(per_page: 8)
210
- assert_equal 8, @response.per_page
211
- end
212
- end
213
-
214
- context "#total_entries method" do
215
- should "return total from response" do
216
- @response.expects(:results).returns(mock('results', total: 100))
217
- assert_equal 100, @response.total_entries
218
- end
219
- end
220
- end
221
-
222
- context "Multimodel response pagination" do
223
- setup do
224
- @multimodel = Elasticsearch::Model::Multimodel.new ModelClass
225
- @search = Elasticsearch::Model::Searching::SearchRequest.new @multimodel, '*'
226
- @response = WillPaginateResponse.new @multimodel, @search, RESPONSE
227
- @response.klass.stubs(:client).returns mock('client')
228
-
229
- @expected_methods = [
230
- # methods needed by WillPaginate::CollectionMethods
231
- :current_page,
232
- :offset,
233
- :per_page,
234
- :total_entries,
235
- :length,
236
-
237
- # methods defined by WillPaginate::CollectionMethods
238
- :total_pages,
239
- :previous_page,
240
- :next_page,
241
- :out_of_bounds?,
242
- ]
243
- end
244
-
245
- should "have pagination methods" do
246
- assert_respond_to @response, :paginate
247
-
248
- @expected_methods.each do |method|
249
- assert_respond_to @response, method
250
- end
251
- end
252
-
253
- context "response.results" do
254
- should "have pagination methods" do
255
- @expected_methods.each do |method|
256
- assert_respond_to @response.results, method
257
- end
258
- end
259
- end
260
-
261
- context "#offset method" do
262
- should "calculate offset using current_page and per_page" do
263
- @response.per_page(3).page(3)
264
- assert_equal 6, @response.offset
265
- end
266
- end
267
- context "#length method" do
268
- should "return count of paginated results" do
269
- @response.per_page(3).page(3)
270
- assert_equal 3, @response.length
271
- end
272
- end
273
-
274
- context "#paginate method" do
275
- should "set from/size using WillPaginate defaults, ignoring aggregated models configuration" do
276
- @response.klass.client
277
- .expects(:search)
278
- .with do |definition|
279
- assert_equal 0, definition[:from]
280
- assert_equal ::WillPaginate.per_page, definition[:size]
281
- true
282
- end
283
- .returns(RESPONSE)
284
-
285
- assert_nil @response.search.definition[:from]
286
- assert_nil @response.search.definition[:size]
287
-
288
- @response.paginate(page: nil).to_a
289
- assert_equal 0, @response.search.definition[:from]
290
- assert_equal ::WillPaginate.per_page, @response.search.definition[:size]
291
- end
292
-
293
- should "set from/size using default per_page, ignoring aggregated models' configuration" do
294
- @response.klass.client
295
- .expects(:search)
296
- .with do |definition|
297
- assert_equal ::WillPaginate.per_page, definition[:from]
298
- assert_equal ::WillPaginate.per_page, definition[:size]
299
- true
300
- end
301
- .returns(RESPONSE)
302
-
303
- assert_nil @response.search.definition[:from]
304
- assert_nil @response.search.definition[:size]
305
-
306
- @response.paginate(page: 2).to_a
307
- assert_equal ::WillPaginate.per_page, @response.search.definition[:from]
308
- assert_equal ::WillPaginate.per_page, @response.search.definition[:size]
309
- end
310
-
311
- should "set from/size using custom page and per_page" do
312
- @response.klass.client
313
- .expects(:search)
314
- .with do |definition|
315
- assert_equal 18, definition[:from]
316
- assert_equal 9, definition[:size]
317
- true
318
- end
319
- .returns(RESPONSE)
320
-
321
- assert_nil @response.search.definition[:from]
322
- assert_nil @response.search.definition[:size]
323
-
324
- @response.paginate(page: 3, per_page: 9).to_a
325
- assert_equal 18, @response.search.definition[:from]
326
- assert_equal 9, @response.search.definition[:size]
327
- end
328
-
329
- should "search for first page if specified page is < 1" do
330
- @response.klass.client
331
- .expects(:search)
332
- .with do |definition|
333
- assert_equal 0, definition[:from]
334
- assert_equal ::WillPaginate.per_page, definition[:size]
335
- true
336
- end
337
- .returns(RESPONSE)
338
-
339
- assert_nil @response.search.definition[:from]
340
- assert_nil @response.search.definition[:size]
341
-
342
- @response.paginate(page: "-1").to_a
343
- assert_equal 0, @response.search.definition[:from]
344
- assert_equal ::WillPaginate.per_page, @response.search.definition[:size]
345
- end
346
- end
347
-
348
- context "#page and #per_page shorthand methods" do
349
- should "set from/size using default per_page" do
350
- @response.page(5)
351
- assert_equal 120, @response.search.definition[:from]
352
- assert_equal ::WillPaginate.per_page, @response.search.definition[:size]
353
- end
354
-
355
- should "set from/size when calling #page then #per_page" do
356
- @response.page(5).per_page(3)
357
- assert_equal 12, @response.search.definition[:from]
358
- assert_equal 3, @response.search.definition[:size]
359
- end
360
-
361
- should "set from/size when calling #per_page then #page" do
362
- @response.per_page(3).page(5)
363
- assert_equal 12, @response.search.definition[:from]
364
- assert_equal 3, @response.search.definition[:size]
365
- end
366
- end
367
-
368
- context "#current_page method" do
369
- should "return 1 by default" do
370
- @response.paginate({})
371
- assert_equal 1, @response.current_page
372
- end
373
-
374
- should "return current page number" do
375
- @response.paginate(page: 3, per_page: 9)
376
- assert_equal 3, @response.current_page
377
- end
378
-
379
- should "return nil if not pagination set" do
380
- assert_equal nil, @response.current_page
381
- end
382
- end
383
-
384
- context "#per_page method" do
385
- should "return value set in paginate call" do
386
- @response.paginate(per_page: 8)
387
- assert_equal 8, @response.per_page
388
- end
389
- end
390
-
391
- context "#total_entries method" do
392
- should "return total from response" do
393
- @response.expects(:results).returns(mock('results', total: 100))
394
- assert_equal 100, @response.total_entries
395
- end
396
- end
397
- end
398
- end
@@ -1,91 +0,0 @@
1
- require 'test_helper'
2
-
3
- class Elasticsearch::Model::RecordsTest < Test::Unit::TestCase
4
- context "Response records" do
5
- class DummyCollection
6
- include Enumerable
7
-
8
- def each(&block); ['FOO'].each(&block); end
9
- def size; ['FOO'].size; end
10
- def empty?; ['FOO'].empty?; end
11
- def foo; 'BAR'; end
12
- end
13
-
14
- class DummyModel
15
- def self.index_name; 'foo'; end
16
- def self.document_type; 'bar'; end
17
-
18
- def self.find(*args)
19
- DummyCollection.new
20
- end
21
- end
22
-
23
- RESPONSE = { 'hits' => { 'total' => 123, 'max_score' => 456, 'hits' => [{'_id' => '1', 'foo' => 'bar'}] } }
24
- RESULTS = Elasticsearch::Model::Response::Results.new DummyModel, RESPONSE
25
-
26
- setup do
27
- search = Elasticsearch::Model::Searching::SearchRequest.new DummyModel, '*'
28
- search.stubs(:execute!).returns RESPONSE
29
-
30
- response = Elasticsearch::Model::Response::Response.new DummyModel, search
31
- @records = Elasticsearch::Model::Response::Records.new DummyModel, response
32
- end
33
-
34
- should "access the records" do
35
- assert_respond_to @records, :records
36
- assert_equal 1, @records.records.size
37
- assert_equal 'FOO', @records.records.first
38
- end
39
-
40
- should "delegate Enumerable methods to records" do
41
- assert ! @records.empty?
42
- assert_equal 'FOO', @records.first
43
- end
44
-
45
- should "delegate methods to records" do
46
- assert_respond_to @records, :foo
47
- assert_equal 'BAR', @records.foo
48
- end
49
-
50
- should "have each_with_hit method" do
51
- @records.each_with_hit do |record, hit|
52
- assert_equal 'FOO', record
53
- assert_equal 'bar', hit.foo
54
- end
55
- end
56
-
57
- should "have map_with_hit method" do
58
- assert_equal ['FOO---bar'], @records.map_with_hit { |record, hit| "#{record}---#{hit.foo}" }
59
- end
60
-
61
- should "return the IDs" do
62
- assert_equal ['1'], @records.ids
63
- end
64
-
65
- context "with adapter" do
66
- module DummyAdapter
67
- module RecordsMixin
68
- def records
69
- ['FOOBAR']
70
- end
71
- end
72
-
73
- def records_mixin
74
- RecordsMixin
75
- end; module_function :records_mixin
76
- end
77
-
78
- should "delegate the records method to the adapter" do
79
- Elasticsearch::Model::Adapter.expects(:from_class)
80
- .with(DummyModel)
81
- .returns(DummyAdapter)
82
-
83
- @records = Elasticsearch::Model::Response::Records.new DummyModel,
84
- RESPONSE
85
-
86
- assert_equal ['FOOBAR'], @records.records
87
- end
88
- end
89
-
90
- end
91
- end