chewy 5.1.0 → 5.2.0

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