elasticsearch-model 5.0.1 → 5.0.2
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.
- 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.
|