elasticsearch-model 5.0.1 → 5.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/elasticsearch/model/indexing.rb +14 -8
- data/lib/elasticsearch/model/proxy.rb +11 -5
- data/lib/elasticsearch/model/version.rb +1 -1
- data/test/unit/indexing_test.rb +39 -13
- data/test/unit/proxy_test.rb +3 -5
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b1f416db5d498101719140c9fbfc19ac0f6c5ad
|
4
|
+
data.tar.gz: 617646d010a2b7f51ae5e11bf6bccca5836d815a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 99f3847abe5159e91a74c178c0682c309bebe0d31af0bc5eab5cca21a2cb379e0c4f011c58fc73536c72ff0942ecaabac1c25db61c1c51f496405fa399426556
|
7
|
+
data.tar.gz: 1cc772377f57523268cf6767e833869719e25e5ba30c64b870ddeceb2550a55ce619dac5fb1a06349066d36662dbd2cedad6b087f5f26ddbbf535c7d663b93e2
|
@@ -307,17 +307,23 @@ module Elasticsearch
|
|
307
307
|
|
308
308
|
def self.included(base)
|
309
309
|
# Register callback for storing changed attributes for models
|
310
|
-
# which implement `before_save` and
|
310
|
+
# which implement `before_save` and return changed attributes
|
311
|
+
# (ie. when `Elasticsearch::Model` is included)
|
311
312
|
#
|
312
313
|
# @note This is typically triggered only when the module would be
|
313
314
|
# included in the model directly, not within the proxy.
|
314
315
|
#
|
315
316
|
# @see #update_document
|
316
317
|
#
|
317
|
-
base.before_save do |
|
318
|
-
|
319
|
-
|
320
|
-
|
318
|
+
base.before_save do |i|
|
319
|
+
if i.class.instance_methods.include?(:changes_to_save) # Rails 5.1
|
320
|
+
i.instance_variable_set(:@__changed_model_attributes,
|
321
|
+
Hash[ i.changes_to_save.map { |key, value| [key, value.last] } ])
|
322
|
+
elsif i.class.instance_methods.include?(:changes)
|
323
|
+
i.instance_variable_set(:@__changed_model_attributes,
|
324
|
+
Hash[ i.changes.map { |key, value| [key, value.last] } ])
|
325
|
+
end
|
326
|
+
end if base.respond_to?(:before_save)
|
321
327
|
end
|
322
328
|
|
323
329
|
# Serializes the model instance into JSON (by calling `as_indexed_json`),
|
@@ -391,11 +397,11 @@ module Elasticsearch
|
|
391
397
|
# @see http://rubydoc.info/gems/elasticsearch-api/Elasticsearch/API/Actions:update
|
392
398
|
#
|
393
399
|
def update_document(options={})
|
394
|
-
if
|
400
|
+
if attributes_in_database = self.instance_variable_get(:@__changed_model_attributes)
|
395
401
|
attributes = if respond_to?(:as_indexed_json)
|
396
|
-
self.as_indexed_json.select { |k,v|
|
402
|
+
self.as_indexed_json.select { |k,v| attributes_in_database.keys.map(&:to_s).include? k.to_s }
|
397
403
|
else
|
398
|
-
|
404
|
+
attributes_in_database
|
399
405
|
end
|
400
406
|
|
401
407
|
client.update(
|
@@ -54,15 +54,21 @@ module Elasticsearch
|
|
54
54
|
end
|
55
55
|
|
56
56
|
# Register a callback for storing changed attributes for models which implement
|
57
|
-
# `before_save` and
|
57
|
+
# `before_save` method and return changed attributes (ie. when `Elasticsearch::Model` is included)
|
58
58
|
#
|
59
59
|
# @see http://api.rubyonrails.org/classes/ActiveModel/Dirty.html
|
60
60
|
#
|
61
61
|
before_save do |i|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
62
|
+
if i.class.instance_methods.include?(:changes_to_save) # Rails 5.1
|
63
|
+
a = i.__elasticsearch__.instance_variable_get(:@__changed_model_attributes) || {}
|
64
|
+
i.__elasticsearch__.instance_variable_set(:@__changed_model_attributes,
|
65
|
+
a.merge(Hash[ i.changes_to_save.map { |key, value| [key, value.last] } ]))
|
66
|
+
elsif i.class.instance_methods.include?(:changes)
|
67
|
+
a = i.__elasticsearch__.instance_variable_get(:@__changed_model_attributes) || {}
|
68
|
+
i.__elasticsearch__.instance_variable_set(:@__changed_model_attributes,
|
69
|
+
a.merge(Hash[ i.changes.map { |key, value| [key, value.last] } ]))
|
70
|
+
end
|
71
|
+
end if respond_to?(:before_save)
|
66
72
|
end
|
67
73
|
end
|
68
74
|
|
data/test/unit/indexing_test.rb
CHANGED
@@ -171,9 +171,7 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
171
171
|
(@callbacks ||= {})[block.hash] = block
|
172
172
|
end
|
173
173
|
|
174
|
-
def
|
175
|
-
|
176
|
-
def changes
|
174
|
+
def changes_to_save
|
177
175
|
{:foo => ['One', 'Two']}
|
178
176
|
end
|
179
177
|
end
|
@@ -186,9 +184,7 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
186
184
|
(@callbacks ||= {})[block.hash] = block
|
187
185
|
end
|
188
186
|
|
189
|
-
def
|
190
|
-
|
191
|
-
def changes
|
187
|
+
def changes_to_save
|
192
188
|
{:foo => ['A', 'B'], :bar => ['C', 'D']}
|
193
189
|
end
|
194
190
|
|
@@ -197,15 +193,28 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
197
193
|
end
|
198
194
|
end
|
199
195
|
|
196
|
+
class ::DummyIndexingModelWithOldDirty
|
197
|
+
extend Elasticsearch::Model::Indexing::ClassMethods
|
198
|
+
include Elasticsearch::Model::Indexing::InstanceMethods
|
199
|
+
|
200
|
+
def self.before_save(&block)
|
201
|
+
(@callbacks ||= {})[block.hash] = block
|
202
|
+
end
|
203
|
+
|
204
|
+
def changes
|
205
|
+
{:foo => ['One', 'Two']}
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
200
209
|
should "register before_save callback when included" do
|
201
210
|
::DummyIndexingModelWithCallbacks.expects(:before_save).returns(true)
|
202
211
|
::DummyIndexingModelWithCallbacks.__send__ :include, Elasticsearch::Model::Indexing::InstanceMethods
|
203
212
|
end
|
204
213
|
|
205
|
-
should "set the @
|
214
|
+
should "set the @__changed_model_attributes variable before save" do
|
206
215
|
instance = ::DummyIndexingModelWithCallbacks.new
|
207
216
|
instance.expects(:instance_variable_set).with do |name, value|
|
208
|
-
assert_equal :@
|
217
|
+
assert_equal :@__changed_model_attributes, name
|
209
218
|
assert_equal({foo: 'Two'}, value)
|
210
219
|
true
|
211
220
|
end
|
@@ -217,6 +226,23 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
217
226
|
end
|
218
227
|
end
|
219
228
|
|
229
|
+
# https://github.com/elastic/elasticsearch-rails/issues/714
|
230
|
+
# https://github.com/rails/rails/pull/25337#issuecomment-225166796
|
231
|
+
should "set the @__changed_model_attributes variable before save for old ActiveModel::Dirty" do
|
232
|
+
instance = ::DummyIndexingModelWithOldDirty.new
|
233
|
+
instance.expects(:instance_variable_set).with do |name, value|
|
234
|
+
assert_equal :@__changed_model_attributes, name
|
235
|
+
assert_equal({foo: 'Two'}, value)
|
236
|
+
true
|
237
|
+
end
|
238
|
+
|
239
|
+
::DummyIndexingModelWithOldDirty.__send__ :include, Elasticsearch::Model::Indexing::InstanceMethods
|
240
|
+
|
241
|
+
::DummyIndexingModelWithOldDirty.instance_variable_get(:@callbacks).each do |n,b|
|
242
|
+
instance.instance_eval(&b)
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
220
246
|
should "have the index_document method" do
|
221
247
|
client = mock('client')
|
222
248
|
instance = ::DummyIndexingModelWithCallbacks.new
|
@@ -297,7 +323,7 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
297
323
|
instance = ::DummyIndexingModelWithCallbacks.new
|
298
324
|
|
299
325
|
# Reset the fake `changes`
|
300
|
-
instance.instance_variable_set(:@
|
326
|
+
instance.instance_variable_set(:@__changed_model_attributes, nil)
|
301
327
|
|
302
328
|
instance.expects(:index_document)
|
303
329
|
instance.update_document
|
@@ -308,7 +334,7 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
308
334
|
instance = ::DummyIndexingModelWithCallbacks.new
|
309
335
|
|
310
336
|
# Set the fake `changes` hash
|
311
|
-
instance.instance_variable_set(:@
|
337
|
+
instance.instance_variable_set(:@__changed_model_attributes, {foo: 'bar'})
|
312
338
|
|
313
339
|
client.expects(:update).with do |payload|
|
314
340
|
assert_equal 'foo', payload[:index]
|
@@ -331,7 +357,7 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
331
357
|
instance = ::DummyIndexingModelWithCallbacksAndCustomAsIndexedJson.new
|
332
358
|
|
333
359
|
# Set the fake `changes` hash
|
334
|
-
instance.instance_variable_set(:@
|
360
|
+
instance.instance_variable_set(:@__changed_model_attributes, {'foo' => 'B', 'bar' => 'D' })
|
335
361
|
|
336
362
|
client.expects(:update).with do |payload|
|
337
363
|
assert_equal({:foo => 'B'}, payload[:body][:doc])
|
@@ -350,7 +376,7 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
350
376
|
client = mock('client')
|
351
377
|
instance = ::DummyIndexingModelWithCallbacksAndCustomAsIndexedJson.new
|
352
378
|
|
353
|
-
instance.instance_variable_set(:@
|
379
|
+
instance.instance_variable_set(:@__changed_model_attributes, { 'foo' => { 'bar' => 'BAR'} })
|
354
380
|
# Overload as_indexed_json
|
355
381
|
instance.expects(:as_indexed_json).returns({ 'foo' => 'BAR' })
|
356
382
|
|
@@ -372,7 +398,7 @@ class Elasticsearch::Model::IndexingTest < Test::Unit::TestCase
|
|
372
398
|
instance = ::DummyIndexingModelWithCallbacks.new
|
373
399
|
|
374
400
|
# Set the fake `changes` hash
|
375
|
-
instance.instance_variable_set(:@
|
401
|
+
instance.instance_variable_set(:@__changed_model_attributes, {author: 'john'})
|
376
402
|
|
377
403
|
client.expects(:update).with do |payload|
|
378
404
|
assert_equal 'foo', payload[:index]
|
data/test/unit/proxy_test.rb
CHANGED
@@ -23,9 +23,7 @@ class Elasticsearch::Model::SearchTest < Test::Unit::TestCase
|
|
23
23
|
(@callbacks ||= {})[block.hash] = block
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
27
|
-
|
28
|
-
def changes
|
26
|
+
def changes_to_save
|
29
27
|
{:foo => ['One', 'Two']}
|
30
28
|
end
|
31
29
|
end
|
@@ -43,10 +41,10 @@ class Elasticsearch::Model::SearchTest < Test::Unit::TestCase
|
|
43
41
|
DummyProxyModelWithCallbacks.__send__ :include, Elasticsearch::Model::Proxy
|
44
42
|
end
|
45
43
|
|
46
|
-
should "set the @
|
44
|
+
should "set the @__changed_model_attributes variable before save" do
|
47
45
|
instance = ::DummyProxyModelWithCallbacks.new
|
48
46
|
instance.__elasticsearch__.expects(:instance_variable_set).with do |name, value|
|
49
|
-
assert_equal :@
|
47
|
+
assert_equal :@__changed_model_attributes, name
|
50
48
|
assert_equal({foo: 'Two'}, value)
|
51
49
|
true
|
52
50
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elasticsearch-model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.
|
4
|
+
version: 5.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karel Minarik
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: elasticsearch
|
@@ -432,7 +432,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
432
432
|
version: '0'
|
433
433
|
requirements: []
|
434
434
|
rubyforge_project:
|
435
|
-
rubygems_version: 2.
|
435
|
+
rubygems_version: 2.5.2
|
436
436
|
signing_key:
|
437
437
|
specification_version: 4
|
438
438
|
summary: ActiveModel/Record integrations for Elasticsearch.
|