chewy 5.1.0 → 5.2.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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +214 -0
  3. data/CHANGELOG.md +26 -0
  4. data/Gemfile +2 -0
  5. data/LICENSE.txt +1 -1
  6. data/README.md +60 -34
  7. data/chewy.gemspec +4 -4
  8. data/gemfiles/rails.5.2.activerecord.gemfile +1 -0
  9. data/gemfiles/{rails.5.0.activerecord.gemfile → rails.5.2.mongoid.6.4.gemfile} +4 -3
  10. data/gemfiles/{rails.5.0.mongoid.6.1.gemfile → rails.6.0.activerecord.gemfile} +4 -3
  11. data/gemfiles/{rails.5.1.activerecord.gemfile → rails.6.1.activerecord.gemfile} +6 -3
  12. data/gemfiles/ruby3.gemfile +10 -0
  13. data/lib/chewy.rb +1 -1
  14. data/lib/chewy/backports/duplicable.rb +1 -1
  15. data/lib/chewy/fields/base.rb +1 -1
  16. data/lib/chewy/fields/root.rb +2 -2
  17. data/lib/chewy/index/actions.rb +9 -3
  18. data/lib/chewy/query/loading.rb +1 -1
  19. data/lib/chewy/query/nodes/field.rb +1 -1
  20. data/lib/chewy/search/loader.rb +1 -1
  21. data/lib/chewy/search/parameters.rb +2 -1
  22. data/lib/chewy/search/request.rb +1 -0
  23. data/lib/chewy/strategy/active_job.rb +1 -1
  24. data/lib/chewy/strategy/sidekiq.rb +1 -1
  25. data/lib/chewy/type/adapter/active_record.rb +1 -1
  26. data/lib/chewy/type/adapter/mongoid.rb +1 -1
  27. data/lib/chewy/type/adapter/orm.rb +1 -1
  28. data/lib/chewy/type/adapter/sequel.rb +1 -1
  29. data/lib/chewy/type/import.rb +3 -3
  30. data/lib/chewy/type/import/routine.rb +1 -1
  31. data/lib/chewy/type/mapping.rb +4 -4
  32. data/lib/chewy/type/observe.rb +3 -3
  33. data/lib/chewy/type/witchcraft.rb +1 -1
  34. data/lib/chewy/version.rb +1 -1
  35. data/spec/chewy/config_spec.rb +1 -1
  36. data/spec/chewy/fields/base_spec.rb +11 -9
  37. data/spec/chewy/index/actions_spec.rb +2 -2
  38. data/spec/chewy/journal_spec.rb +1 -1
  39. data/spec/chewy/search/parameters_spec.rb +4 -2
  40. data/spec/chewy/search/response_spec.rb +8 -2
  41. data/spec/chewy/search_spec.rb +2 -2
  42. data/spec/chewy/strategy/active_job_spec.rb +15 -2
  43. data/spec/chewy/strategy/shoryuken_spec.rb +6 -2
  44. data/spec/chewy/strategy/sidekiq_spec.rb +6 -2
  45. data/spec/chewy/type/adapter/active_record_spec.rb +3 -3
  46. data/spec/chewy/type/import/bulk_builder_spec.rb +1 -1
  47. data/spec/chewy/type/observe_spec.rb +4 -4
  48. data/spec/spec_helper.rb +4 -1
  49. metadata +17 -19
  50. data/.travis.yml +0 -45
  51. data/gemfiles/rails.4.0.activerecord.gemfile +0 -15
  52. data/gemfiles/rails.4.1.activerecord.gemfile +0 -15
  53. data/gemfiles/rails.4.2.activerecord.gemfile +0 -16
  54. data/gemfiles/rails.4.2.mongoid.5.2.gemfile +0 -16
  55. data/gemfiles/rails.5.1.mongoid.6.3.gemfile +0 -16
@@ -12,5 +12,6 @@ gem "sidekiq", require: false
12
12
  gem "kaminari-core", "~> 1.1.0", require: false
13
13
  gem "will_paginate", require: false
14
14
  gem "parallel", require: false
15
+ gem 'rspec_junit_formatter', '~> 0.4.1'
15
16
 
16
17
  gemspec path: "../"
@@ -2,9 +2,9 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "activerecord", "~> 5.0.0"
6
- gem "activesupport", "~> 5.0.0"
7
- gem "activejob", "~> 5.0.0"
5
+ gem "mongoid", "~> 6.4.0"
6
+ gem "activesupport", "~> 5.2.0"
7
+ gem "activejob", "~> 5.2.0"
8
8
  gem "resque", require: false
9
9
  gem "shoryuken", require: false
10
10
  gem "aws-sdk-sqs", require: false
@@ -12,5 +12,6 @@ gem "sidekiq", require: false
12
12
  gem "kaminari-core", "~> 1.1.0", require: false
13
13
  gem "will_paginate", require: false
14
14
  gem "parallel", require: false
15
+ gem 'rspec_junit_formatter', '~> 0.4.1'
15
16
 
16
17
  gemspec path: "../"
@@ -2,9 +2,9 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "mongoid", "~> 6.1.0"
6
- gem "activesupport", "~> 5.0.0"
7
- gem "activejob", "~> 5.0.0"
5
+ gem "activerecord", "~> 6.0.0"
6
+ gem "activesupport", "~> 6.0.0"
7
+ gem "activejob", "~> 6.0.0"
8
8
  gem "resque", require: false
9
9
  gem "shoryuken", require: false
10
10
  gem "aws-sdk-sqs", require: false
@@ -12,5 +12,6 @@ gem "sidekiq", require: false
12
12
  gem "kaminari-core", "~> 1.1.0", require: false
13
13
  gem "will_paginate", require: false
14
14
  gem "parallel", require: false
15
+ gem 'rspec_junit_formatter', '~> 0.4.1'
15
16
 
16
17
  gemspec path: "../"
@@ -2,9 +2,9 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "activerecord", "~> 5.1.0"
6
- gem "activesupport", "~> 5.1.0"
7
- gem "activejob", "~> 5.1.0"
5
+ gem "activerecord", "~> 6.1.0"
6
+ gem "activesupport", "~> 6.1.0"
7
+ gem "activejob", "~> 6.1.0"
8
8
  gem "resque", require: false
9
9
  gem "shoryuken", require: false
10
10
  gem "aws-sdk-sqs", require: false
@@ -12,5 +12,8 @@ gem "sidekiq", require: false
12
12
  gem "kaminari-core", "~> 1.1.0", require: false
13
13
  gem "will_paginate", require: false
14
14
  gem "parallel", require: false
15
+ gem 'rspec_junit_formatter', '~> 0.4.1'
16
+
17
+ eval(File.read('gemfiles/ruby3.gemfile'), nil, 'gemfiles/ruby3.gemfile') if RUBY_VERSION >= '3.0.0'
15
18
 
16
19
  gemspec path: "../"
@@ -0,0 +1,10 @@
1
+ # kwargs support was added here:
2
+ # https://github.com/rspec/rspec-mocks/blob/main/lib/rspec/mocks/method_double.rb#L66
3
+ # but this change was not released yet so for the time being use main branch
4
+ gem 'rspec', github: 'rspec/rspec', branch: 'main'
5
+ gem 'rspec-core', github: 'rspec/rspec-core', branch: 'main'
6
+ gem 'rspec-expectations', github: 'rspec/rspec-expectations', branch: 'main'
7
+ gem 'rspec-mocks', github: 'rspec/rspec-mocks', branch: 'main'
8
+ gem 'rspec-support', github: 'rspec/rspec-support', branch: 'main'
9
+ # extracted from stdlib
10
+ gem 'rexml'
@@ -132,7 +132,7 @@ module Chewy
132
132
  def create_type(index, target, options = {}, &block)
133
133
  type = Class.new(Chewy::Type)
134
134
 
135
- adapter = adapters.find { |klass| klass.accepts?(target) }.new(target, options)
135
+ adapter = adapters.find { |klass| klass.accepts?(target) }.new(target, **options)
136
136
 
137
137
  index.const_set(adapter.name, type)
138
138
  type.send(:define_singleton_method, :index) { index }
@@ -79,7 +79,7 @@ end
79
79
  require 'bigdecimal'
80
80
  class BigDecimal
81
81
  begin
82
- BigDecimal.new('4.56').dup
82
+ BigDecimal('4.56').dup
83
83
 
84
84
  def duplicable?
85
85
  true
@@ -7,7 +7,7 @@ module Chewy
7
7
  def initialize(name, value: nil, **options)
8
8
  @name = name.to_sym
9
9
  @options = {}
10
- update_options!(options)
10
+ update_options!(**options)
11
11
  @value = value
12
12
  @children = []
13
13
  end
@@ -6,8 +6,8 @@ module Chewy
6
6
  attr_reader :parent
7
7
  attr_reader :parent_id
8
8
 
9
- def initialize(*)
10
- super
9
+ def initialize(name, **options)
10
+ super(name, **options)
11
11
 
12
12
  @value ||= -> { self }
13
13
  @dynamic_templates = []
@@ -30,8 +30,8 @@ module Chewy
30
30
  # Suffixed index names might be used for zero-downtime mapping change, for example.
31
31
  # Description: (http://www.elasticsearch.org/blog/changing-mapping-with-zero-downtime/).
32
32
  #
33
- def create(*args)
34
- create!(*args)
33
+ def create(*args, **kwargs)
34
+ create!(*args, **kwargs)
35
35
  rescue Elasticsearch::Transport::Transport::Errors::BadRequest
36
36
  false
37
37
  end
@@ -74,7 +74,13 @@ module Chewy
74
74
  # UsersIndex.delete '01-2014' # deletes `users_01-2014` index
75
75
  #
76
76
  def delete(suffix = nil)
77
- result = client.indices.delete index: index_name(suffix: suffix)
77
+ # Verify that the index_name is really the index_name and not an alias.
78
+ #
79
+ # "The index parameter in the delete index API no longer accepts alias names.
80
+ # Instead, it accepts only index names (or wildcards which will expand to matching indices)."
81
+ # https://www.elastic.co/guide/en/elasticsearch/reference/6.8/breaking-changes-6.0.html#_delete_index_api_resolves_indices_expressions_only_against_indices
82
+ index_names = client.indices.get_alias(index: index_name(suffix: suffix)).keys
83
+ result = client.indices.delete index: index_names.join(',')
78
84
  Chewy.wait_for_status if result
79
85
  result
80
86
  # es-ruby >= 1.0.10 handles Elasticsearch::Transport::Transport::Errors::NotFound
@@ -94,7 +94,7 @@ module Chewy
94
94
  loaded_objects = Hash[_results.group_by(&:class).map do |type, objects|
95
95
  next if except.include?(type.type_name)
96
96
  next if only.present? && !only.include?(type.type_name)
97
- loaded = type.adapter.load(objects.map(&:id), options.merge(_type: type)) || objects
97
+ loaded = type.adapter.load(objects.map(&:id), **options.merge(_type: type)) || objects
98
98
  [type, loaded.index_by.with_index do |loaded_object, i|
99
99
  objects[i]._object = loaded_object
100
100
  objects[i]
@@ -39,7 +39,7 @@ module Chewy
39
39
  when ::Regexp
40
40
  Nodes::Regexp.new @name, other, *@args
41
41
  when ::Range
42
- Nodes::Range.new @name, *__options_merge__(gt: other.first, lt: other.last)
42
+ Nodes::Range.new @name, *__options_merge__(gt: other.begin, lt: other.end)
43
43
  else
44
44
  if other.is_a?(Array) && other.first.is_a?(::Range)
45
45
  Nodes::Range.new @name, *__options_merge__(
@@ -52,7 +52,7 @@ module Chewy
52
52
 
53
53
  type = derive_type(index_name, type_name)
54
54
  ids = hit_group.map { |hit| hit['_id'] }
55
- loaded = type.adapter.load(ids, @options.merge(_type: type))
55
+ loaded = type.adapter.load(ids, **@options.merge(_type: type))
56
56
  loaded ||= hit_group.map { |hit| type.build(hit) }
57
57
 
58
58
  result.merge!(hit_group.zip(loaded).to_h)
@@ -35,10 +35,11 @@ module Chewy
35
35
  # limit: Chewy::Search::Parameters::Offset.new(10)
36
36
  # )
37
37
  # @param initial [{Symbol => Object, Chewy::Search::Parameters::Storage}]
38
- def initialize(initial = {})
38
+ def initialize(initial = {}, **kinitial)
39
39
  @storages = Hash.new do |hash, name|
40
40
  hash[name] = self.class.storages[name].new
41
41
  end
42
+ initial = initial.deep_dup.merge(kinitial)
42
43
  initial.each_with_object(@storages) do |(name, value), result|
43
44
  storage_class = self.class.storages[name]
44
45
  storage = value.is_a?(storage_class) ? value : storage_class.new(value)
@@ -943,6 +943,7 @@ module Chewy
943
943
  if Runtime.version < '5.0'
944
944
  delete_by_query_plugin(request_body)
945
945
  else
946
+ request_body[:body] = {query: {match_all: {}}} if request_body[:body].empty?
946
947
  Chewy.client.delete_by_query(request_body)
947
948
  end
948
949
  end
@@ -11,7 +11,7 @@ module Chewy
11
11
  #
12
12
  class ActiveJob < Atomic
13
13
  class Worker < ::ActiveJob::Base
14
- queue_as :chewy
14
+ queue_as { Chewy.settings.dig(:active_job, :queue) || 'chewy' }
15
15
 
16
16
  def perform(type, ids, options = {})
17
17
  options[:refresh] = !Chewy.disable_refresh_async if Chewy.disable_refresh_async
@@ -33,7 +33,7 @@ module Chewy
33
33
  private
34
34
 
35
35
  def sidekiq_queue
36
- Chewy.settings.fetch(:sidekiq, {})[:queue] || 'chewy'
36
+ Chewy.settings.dig(:sidekiq, :queue) || 'chewy'
37
37
  end
38
38
  end
39
39
  end
@@ -22,7 +22,7 @@ module Chewy
22
22
  end
23
23
 
24
24
  def import_scope(scope, options)
25
- pluck_in_batches(scope, options.slice(:batch_size)).inject(true) do |result, ids|
25
+ pluck_in_batches(scope, **options.slice(:batch_size)).inject(true) do |result, ids|
26
26
  objects = if options[:raw_import]
27
27
  raw_default_scope_where_ids_in(ids, options[:raw_import])
28
28
  else
@@ -25,7 +25,7 @@ module Chewy
25
25
  end
26
26
 
27
27
  def import_scope(scope, options)
28
- pluck_in_batches(scope, options.slice(:batch_size)).map do |ids|
28
+ pluck_in_batches(scope, **options.slice(:batch_size)).map do |ids|
29
29
  yield grouped_objects(default_scope_where_ids_in(ids))
30
30
  end.all?
31
31
  end
@@ -89,7 +89,7 @@ module Chewy
89
89
 
90
90
  if options[:fields].present? || collection.is_a?(relation_class)
91
91
  collection = all_scope_where_ids_in(identify(collection)) unless collection.is_a?(relation_class)
92
- pluck_in_batches(collection, options.slice(:fields, :batch_size, :typecast), &block)
92
+ pluck_in_batches(collection, **options.slice(:fields, :batch_size, :typecast), &block)
93
93
  else
94
94
  identify(collection).each_slice(options[:batch_size]) do |batch|
95
95
  yield batch
@@ -22,7 +22,7 @@ module Chewy
22
22
  end
23
23
 
24
24
  def import_scope(scope, options)
25
- pluck_in_batches(scope, options.slice(:batch_size)).inject(true) do |result, ids|
25
+ pluck_in_batches(scope, **options.slice(:batch_size)).inject(true) do |result, ids|
26
26
  result & yield(grouped_objects(default_scope_where_ids_in(ids).all))
27
27
  end
28
28
  end
@@ -10,7 +10,7 @@ module Chewy
10
10
 
11
11
  IMPORT_WORKER = lambda do |type, options, total, ids, index|
12
12
  ::Process.setproctitle("chewy [#{type}]: import data (#{index + 1}/#{total})")
13
- routine = Routine.new(type, options)
13
+ routine = Routine.new(type, **options)
14
14
  type.adapter.import(*ids, routine.options) do |action_objects|
15
15
  routine.process(**action_objects)
16
16
  end
@@ -19,7 +19,7 @@ module Chewy
19
19
 
20
20
  LEFTOVERS_WORKER = lambda do |type, options, total, body, index|
21
21
  ::Process.setproctitle("chewy [#{type}]: import leftovers (#{index + 1}/#{total})")
22
- routine = Routine.new(type, options)
22
+ routine = Routine.new(type, **options)
23
23
  routine.perform_bulk(body)
24
24
  routine.errors
25
25
  end
@@ -127,7 +127,7 @@ module Chewy
127
127
 
128
128
  def import_routine(*args)
129
129
  return if args.first.blank? && !args.first.nil?
130
- routine = Routine.new(self, args.extract_options!)
130
+ routine = Routine.new(self, **args.extract_options!)
131
131
  routine.create_indexes!
132
132
 
133
133
  if routine.parallel_options
@@ -66,7 +66,7 @@ module Chewy
66
66
  def create_indexes!
67
67
  Chewy::Stash::Journal.create if @options[:journal]
68
68
  return if Chewy.configuration[:skip_index_creation_on_import]
69
- @type.index.create!(@bulk_options.slice(:suffix)) unless @type.index.exists?
69
+ @type.index.create!(**@bulk_options.slice(:suffix)) unless @type.index.exists?
70
70
  end
71
71
 
72
72
  # The main process method. Converts passed objects to thr bulk request body,
@@ -35,8 +35,8 @@ module Chewy
35
35
  # end
36
36
  #
37
37
  def root(**options)
38
- self.root_object ||= Chewy::Fields::Root.new(type_name, Chewy.default_root_options.merge(options))
39
- root_object.update_options!(options)
38
+ self.root_object ||= Chewy::Fields::Root.new(type_name, **Chewy.default_root_options.merge(options))
39
+ root_object.update_options!(**options)
40
40
  yield if block_given?
41
41
  root_object
42
42
  end
@@ -126,9 +126,9 @@ module Chewy
126
126
  #
127
127
  def field(*args, **options, &block)
128
128
  if args.size > 1
129
- args.map { |name| field(name, options) }
129
+ args.map { |name| field(name, **options) }
130
130
  else
131
- expand_nested(Chewy::Fields::Base.new(args.first, options), &block)
131
+ expand_nested(Chewy::Fields::Base.new(args.first, **options), &block)
132
132
  end
133
133
  end
134
134
 
@@ -63,10 +63,10 @@ module Chewy
63
63
  update_proc = Observe.update_proc(type_name, *args, &block)
64
64
 
65
65
  if Chewy.use_after_commit_callbacks
66
- after_commit(callback_options, &update_proc)
66
+ after_commit(**callback_options, &update_proc)
67
67
  else
68
- after_save(callback_options, &update_proc)
69
- after_destroy(callback_options, &update_proc)
68
+ after_save(**callback_options, &update_proc)
69
+ after_destroy(**callback_options, &update_proc)
70
70
  end
71
71
  end
72
72
  end
@@ -58,7 +58,7 @@ module Chewy
58
58
  private
59
59
 
60
60
  def alicorn
61
- @alicorn ||= class_eval <<-RUBY, __FILE__, __LINE__ + 1
61
+ @alicorn ||= singleton_class.class_eval <<-RUBY, __FILE__, __LINE__ + 1
62
62
  -> (locals, object0, crutches) do
63
63
  #{composed_values(@type.root, 0)}
64
64
  end
@@ -1,3 +1,3 @@
1
1
  module Chewy
2
- VERSION = '5.1.0'.freeze
2
+ VERSION = '5.2.0'.freeze
3
3
  end
@@ -141,7 +141,7 @@ describe Chewy::Config do
141
141
  context 'when Rails::VERSION constant is defined' do
142
142
  it 'looks for configuration in "config/chewy.yml"' do
143
143
  module Rails
144
- VERSION = '5.1.0'.freeze
144
+ VERSION = '5.1.1'.freeze
145
145
 
146
146
  def self.root
147
147
  Pathname.new(__dir__)
@@ -180,43 +180,45 @@ describe Chewy::Fields::Base do
180
180
  end
181
181
  end
182
182
 
183
+ # rubocop:disable Style/BracesAroundHashParameters
183
184
  specify do
184
- expect(EventsIndex::Event.root.compose(
185
- id: 1, category: {id: 2, licenses: {id: 3, name: 'Name'}}
186
- )).to eq('id' => 1, 'category' => {'id' => 2, 'licenses' => {'id' => 3, 'name' => 'Name'}})
185
+ expect(EventsIndex::Event.root.compose({
186
+ id: 1, category: {id: 2, licenses: {id: 3, name: 'Name'}}
187
+ })).to eq('id' => 1, 'category' => {'id' => 2, 'licenses' => {'id' => 3, 'name' => 'Name'}})
187
188
  end
188
189
 
189
190
  specify do
190
- expect(EventsIndex::Event.root.compose(id: 1, category: [
191
+ expect(EventsIndex::Event.root.compose({id: 1, category: [
191
192
  {id: 2, 'licenses' => {id: 3, name: 'Name1'}},
192
193
  {id: 4, licenses: nil}
193
- ])).to eq('id' => 1, 'category' => [
194
+ ]})).to eq('id' => 1, 'category' => [
194
195
  {'id' => 2, 'licenses' => {'id' => 3, 'name' => 'Name1'}},
195
196
  {'id' => 4, 'licenses' => nil.as_json}
196
197
  ])
197
198
  end
198
199
 
199
200
  specify do
200
- expect(EventsIndex::Event.root.compose('id' => 1, category: {id: 2, licenses: [
201
+ expect(EventsIndex::Event.root.compose({'id' => 1, category: {id: 2, licenses: [
201
202
  {id: 3, name: 'Name1'}, {id: 4, name: 'Name2'}
202
- ]})).to eq('id' => 1, 'category' => {'id' => 2, 'licenses' => [
203
+ ]}})).to eq('id' => 1, 'category' => {'id' => 2, 'licenses' => [
203
204
  {'id' => 3, 'name' => 'Name1'}, {'id' => 4, 'name' => 'Name2'}
204
205
  ]})
205
206
  end
206
207
 
207
208
  specify do
208
- expect(EventsIndex::Event.root.compose(id: 1, category: [
209
+ expect(EventsIndex::Event.root.compose({id: 1, category: [
209
210
  {id: 2, licenses: [
210
211
  {id: 3, 'name' => 'Name1'}, {id: 4, name: 'Name2'}
211
212
  ]},
212
213
  {id: 5, licenses: []}
213
- ])).to eq('id' => 1, 'category' => [
214
+ ]})).to eq('id' => 1, 'category' => [
214
215
  {'id' => 2, 'licenses' => [
215
216
  {'id' => 3, 'name' => 'Name1'}, {'id' => 4, 'name' => 'Name2'}
216
217
  ]},
217
218
  {'id' => 5, 'licenses' => []}
218
219
  ])
219
220
  end
221
+ # rubocop:enable Style/BracesAroundHashParameters
220
222
 
221
223
  specify do
222
224
  expect(EventsIndex::Event.root.compose(
@@ -55,7 +55,7 @@ describe Chewy::Index::Actions do
55
55
  context do
56
56
  before { DummiesIndex.create }
57
57
  specify do
58
- expect { DummiesIndex.create! }.to raise_error(Elasticsearch::Transport::Transport::Errors::BadRequest).with_message(/index_already_exists_exception.*dummies/)
58
+ expect { DummiesIndex.create! }.to raise_error(Elasticsearch::Transport::Transport::Errors::BadRequest).with_message(/already exists.*dummies/)
59
59
  end
60
60
  specify { expect { DummiesIndex.create!('2013') }.to raise_error(Elasticsearch::Transport::Transport::Errors::BadRequest).with_message(/Invalid alias name \[dummies\]/) }
61
61
  end
@@ -67,7 +67,7 @@ describe Chewy::Index::Actions do
67
67
  specify { expect(DummiesIndex.aliases).to eq([]) }
68
68
  specify { expect(DummiesIndex.indexes).to eq(['dummies_2013']) }
69
69
  specify do
70
- expect { DummiesIndex.create!('2013') }.to raise_error(Elasticsearch::Transport::Transport::Errors::BadRequest).with_message(/index_already_exists_exception.*dummies_2013/)
70
+ expect { DummiesIndex.create!('2013') }.to raise_error(Elasticsearch::Transport::Transport::Errors::BadRequest).with_message(/already exists.*dummies_2013/)
71
71
  end
72
72
  specify { expect(DummiesIndex.create!('2014')['acknowledged']).to eq(true) }
73
73
 
@@ -54,7 +54,7 @@ describe Chewy::Journal do
54
54
  expect(Chewy::Stash::Journal.exists?).to eq true
55
55
 
56
56
  Timecop.freeze(update_time)
57
- cities.first.update_attributes!(name: 'Supername')
57
+ cities.first.update!(name: 'Supername')
58
58
 
59
59
  Timecop.freeze(destroy_time)
60
60
  countries.last.destroy
@@ -72,18 +72,20 @@ describe Chewy::Search::Parameters do
72
72
  describe '#merge!' do
73
73
  let(:first) { described_class.new(offset: 10, order: 'foo') }
74
74
  let(:second) { described_class.new(limit: 20, offset: 20, order: 'bar') }
75
+ let(:first_clone) { first.clone }
76
+ let(:second_clone) { second.clone }
75
77
 
76
78
  specify do
77
79
  expect { first.merge!(second) }.to change { first.clone }
78
80
  .to(described_class.new(limit: 20, offset: 20, order: %w[foo bar]))
79
81
  end
80
- specify { expect { first.merge!(second) }.not_to change { second.clone } }
82
+ specify { expect { first.merge!(second) }.not_to change { second_clone } }
81
83
 
82
84
  specify do
83
85
  expect { second.merge!(first) }.to change { second.clone }
84
86
  .to(described_class.new(limit: 20, offset: 10, order: %w[bar foo]))
85
87
  end
86
- specify { expect { second.merge!(first) }.not_to change { first.clone } }
88
+ specify { expect { second.merge!(first) }.not_to change { first_clone } }
87
89
 
88
90
  context 'spawns new storages for the merge' do
89
91
  let(:names) { %i[limit offset order] }