elasticsearch-model 6.0.0 → 6.1.0

Sign up to get free protection for your applications and to get access to all the features.
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