chewy 0.8.3 → 0.8.4

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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +43 -11
  3. data/Appraisals +39 -12
  4. data/CHANGELOG.md +42 -0
  5. data/Gemfile +1 -1
  6. data/README.md +60 -7
  7. data/chewy.gemspec +12 -5
  8. data/gemfiles/{rails.4.0.mongoid.gemfile → rails.4.0.mongoid.4.0.0.gemfile} +1 -1
  9. data/gemfiles/{rails.4.0.mongoid.kaminari.gemfile → rails.4.0.mongoid.4.0.0.kaminari.gemfile} +1 -1
  10. data/gemfiles/{rails.4.0.mongoid.will_paginate.gemfile → rails.4.0.mongoid.4.0.0.will_paginate.gemfile} +1 -1
  11. data/gemfiles/rails.4.0.mongoid.5.1.0.gemfile +15 -0
  12. data/gemfiles/rails.4.0.mongoid.5.1.0.kaminari.gemfile +14 -0
  13. data/gemfiles/rails.4.0.mongoid.5.1.0.will_paginate.gemfile +14 -0
  14. data/gemfiles/{rails.4.1.mongoid.gemfile → rails.4.1.mongoid.4.0.0.gemfile} +1 -1
  15. data/gemfiles/{rails.4.1.mongoid.kaminari.gemfile → rails.4.1.mongoid.4.0.0.kaminari.gemfile} +1 -1
  16. data/gemfiles/{rails.4.1.mongoid.will_paginate.gemfile → rails.4.1.mongoid.4.0.0.will_paginate.gemfile} +1 -1
  17. data/gemfiles/rails.4.1.mongoid.5.1.0.gemfile +15 -0
  18. data/gemfiles/rails.4.1.mongoid.5.1.0.kaminari.gemfile +14 -0
  19. data/gemfiles/rails.4.1.mongoid.5.1.0.will_paginate.gemfile +14 -0
  20. data/gemfiles/{rails.4.2.mongoid.gemfile → rails.4.2.mongoid.4.0.0.gemfile} +1 -1
  21. data/gemfiles/{rails.4.2.mongoid.kaminari.gemfile → rails.4.2.mongoid.4.0.0.kaminari.gemfile} +1 -1
  22. data/gemfiles/{rails.4.2.mongoid.will_paginate.gemfile → rails.4.2.mongoid.4.0.0.will_paginate.gemfile} +1 -1
  23. data/gemfiles/rails.4.2.mongoid.5.1.0.gemfile +15 -0
  24. data/gemfiles/rails.4.2.mongoid.5.1.0.kaminari.gemfile +14 -0
  25. data/gemfiles/rails.4.2.mongoid.5.1.0.will_paginate.gemfile +14 -0
  26. data/gemfiles/rails.5.0.0.beta3.activerecord.gemfile +16 -0
  27. data/gemfiles/rails.5.0.0.beta3.activerecord.kaminari.gemfile +16 -0
  28. data/gemfiles/rails.5.0.0.beta3.activerecord.will_paginate.gemfile +15 -0
  29. data/gemfiles/{sequel.4.28.gemfile → sequel.4.31.gemfile} +1 -1
  30. data/lib/chewy.rb +7 -1
  31. data/lib/chewy/errors.rb +6 -0
  32. data/lib/chewy/fields/base.rb +12 -8
  33. data/lib/chewy/fields/root.rb +1 -1
  34. data/lib/chewy/index.rb +17 -8
  35. data/lib/chewy/index/actions.rb +4 -4
  36. data/lib/chewy/query.rb +8 -13
  37. data/lib/chewy/query/compose.rb +2 -2
  38. data/lib/chewy/query/criteria.rb +2 -2
  39. data/lib/chewy/query/loading.rb +1 -1
  40. data/lib/chewy/query/nodes/bool.rb +1 -1
  41. data/lib/chewy/query/nodes/regexp.rb +2 -2
  42. data/lib/chewy/railtie.rb +15 -3
  43. data/lib/chewy/rake_helper.rb +5 -2
  44. data/lib/chewy/rspec/update_index.rb +17 -6
  45. data/lib/chewy/strategy.rb +7 -3
  46. data/lib/chewy/strategy/active_job.rb +2 -2
  47. data/lib/chewy/strategy/resque.rb +2 -2
  48. data/lib/chewy/strategy/sidekiq.rb +2 -2
  49. data/lib/chewy/type.rb +14 -0
  50. data/lib/chewy/type/adapter/active_record.rb +11 -1
  51. data/lib/chewy/type/adapter/orm.rb +13 -11
  52. data/lib/chewy/type/adapter/sequel.rb +10 -12
  53. data/lib/chewy/type/import.rb +53 -22
  54. data/lib/chewy/type/witchcraft.rb +208 -0
  55. data/lib/chewy/type/wrapper.rb +25 -7
  56. data/lib/chewy/version.rb +1 -1
  57. data/lib/tasks/chewy.rake +22 -14
  58. data/spec/chewy/fields/base_spec.rb +6 -2
  59. data/spec/chewy/fields/time_fields_spec.rb +4 -4
  60. data/spec/chewy/index/actions_spec.rb +32 -18
  61. data/spec/chewy/index_spec.rb +19 -0
  62. data/spec/chewy/query/pagination_spec.rb +1 -1
  63. data/spec/chewy/query_spec.rb +77 -21
  64. data/spec/chewy/rspec/update_index_spec.rb +75 -62
  65. data/spec/chewy/runtime_spec.rb +1 -1
  66. data/spec/chewy/strategy/active_job_spec.rb +6 -1
  67. data/spec/chewy/strategy/atomic_spec.rb +5 -5
  68. data/spec/chewy/strategy/resque_spec.rb +7 -2
  69. data/spec/chewy/strategy/sidekiq_spec.rb +6 -1
  70. data/spec/chewy/strategy_spec.rb +13 -1
  71. data/spec/chewy/type/actions_spec.rb +4 -1
  72. data/spec/chewy/type/import_spec.rb +71 -2
  73. data/spec/chewy/type/observe_spec.rb +9 -9
  74. data/spec/chewy/type/witchcraft_spec.rb +154 -0
  75. data/spec/chewy/type/wrapper_spec.rb +30 -5
  76. data/spec/chewy/type_spec.rb +10 -0
  77. data/spec/chewy_spec.rb +29 -5
  78. data/spec/spec_helper.rb +2 -0
  79. data/spec/support/class_helpers.rb +15 -0
  80. data/spec/support/mongoid.rb +5 -0
  81. metadata +64 -21
@@ -0,0 +1,208 @@
1
+ def try_require lib
2
+ require lib
3
+ rescue LoadError
4
+ end
5
+
6
+ %w[method_source parser/current unparser].each { |lib| try_require lib }
7
+
8
+ module Chewy
9
+ class Type
10
+ module Witchcraft
11
+ extend ActiveSupport::Concern
12
+
13
+ included do
14
+ class_attribute :_witchcraft, instance_reader: false, instance_writer: false
15
+ end
16
+
17
+ module ClassMethods
18
+ def witchcraft!
19
+ self._witchcraft = true
20
+ check_requirements!
21
+ end
22
+
23
+ def check_requirements!
24
+ messages = []
25
+ messages << "MethodSource gem is required for the Witchcraft™, please add `gem 'method_source'` to your Gemfile" unless Proc.method_defined?(:source)
26
+ messages << "Parser gem is required for the Witchcraft™, please add `gem 'parser'` to your Gemfile" unless '::Parser'.safe_constantize
27
+ messages << "Unparser gem is required for the Witchcraft™, please add `gem 'unparser'` to your Gemfile" unless '::Unparser'.safe_constantize
28
+ messages = messages.join("\n")
29
+
30
+ raise messages if messages.present?
31
+ end
32
+
33
+ def witchcraft?
34
+ !!_witchcraft
35
+ end
36
+
37
+ def cauldron
38
+ @cauldron ||= Cauldron.new(self)
39
+ end
40
+ end
41
+
42
+ class Cauldron
43
+ def initialize(type)
44
+ @type = type
45
+ end
46
+
47
+ def brew(object, crutches = nil)
48
+ alicorn.call(object, crutches).as_json
49
+ end
50
+
51
+ private
52
+
53
+ def alicorn
54
+ @alicorn ||= class_eval <<-RUBY
55
+ -> (object0, crutches) do
56
+ #{composed_values(@type.root_object, 0)}
57
+ end
58
+ RUBY
59
+ end
60
+
61
+ def composed_values(field, nesting)
62
+ source = <<-RUBY
63
+ non_proc_values#{nesting} = #{non_proc_values(field, nesting)}
64
+ proc_values#{nesting} = #{proc_values(field, nesting)}
65
+ non_proc_values#{nesting}.merge!(proc_values#{nesting})
66
+ RUBY
67
+ source.gsub("\n,", ',')
68
+ end
69
+
70
+ def composed_value(field, fetcher, nesting)
71
+ nesting = nesting.next
72
+ if field.children.present? && !field.multi_field?
73
+ <<-RUBY
74
+ (result#{nesting} = #{fetcher}
75
+ if result#{nesting}.respond_to?(:to_ary)
76
+ result#{nesting}.map do |object#{nesting}|
77
+ #{composed_values(field, nesting)}
78
+ end
79
+ else
80
+ object#{nesting} = result#{nesting}
81
+ #{composed_values(field, nesting)}
82
+ end)
83
+ RUBY
84
+ else
85
+ fetcher
86
+ end
87
+ end
88
+
89
+ def non_proc_values(field, nesting)
90
+ non_proc_fields = non_proc_fields_for(field)
91
+ object = "object#{nesting}"
92
+
93
+ if non_proc_fields.present?
94
+ <<-RUBY
95
+ (if #{object}.is_a?(Hash)
96
+ {
97
+ #{non_proc_fields.map do |field|
98
+ fetcher = "#{object}.has_key?(:#{field.name}) ? #{object}[:#{field.name}] : #{object}['#{field.name}']"
99
+ "#{field.name}: #{composed_value(field, fetcher, nesting)}"
100
+ end.join(', ')}
101
+ }
102
+ else
103
+ {
104
+ #{non_proc_fields.map do |field|
105
+ "#{field.name}: #{composed_value(field, "#{object}.#{field.name}", nesting)}"
106
+ end.join(', ')}
107
+ }
108
+ end)
109
+ RUBY
110
+ else
111
+ "{}"
112
+ end
113
+ end
114
+
115
+ def proc_values(field, nesting)
116
+ proc_fields = proc_fields_for(field)
117
+
118
+ if proc_fields.present?
119
+ <<-RUBY
120
+ {
121
+ #{proc_fields.map do |field|
122
+ "#{field.name}: (#{composed_value(field, source_for(field.value, nesting), nesting)})"
123
+ end.join(', ')}
124
+ }
125
+ RUBY
126
+ else
127
+ "{}"
128
+ end
129
+ end
130
+
131
+ def non_proc_fields_for(parent)
132
+ return [] unless parent
133
+ (parent.children || []).select { |field| !(field.value && field.value.is_a?(Proc)) }
134
+ end
135
+
136
+ def proc_fields_for(parent)
137
+ return [] unless parent
138
+ (parent.children || []).select { |field| field.value && field.value.is_a?(Proc) }
139
+ end
140
+
141
+ def source_for(proc, nesting)
142
+ ast = Parser::CurrentRuby.parse(proc.source)
143
+ lambdas = exctract_lambdas(ast)
144
+
145
+ raise "No lambdas found, try to reformat your code:\n`#{proc.source}`" unless lambdas
146
+
147
+ source = lambdas.first
148
+ if proc.arity == 0
149
+ source = replace_self(source, :"object#{nesting}")
150
+ source = replace_send(source, :"object#{nesting}")
151
+ elsif proc.arity < 0
152
+ raise "Splat arguments are unsupported by witchcraft:\n`#{proc.source}"
153
+ else
154
+ (nesting + 1).times do |n|
155
+ source = replace_lvar(source, proc.parameters[n][1], :"object#{n}") if proc.parameters[n]
156
+ end
157
+ source = replace_lvar(source, proc.parameters[nesting + 1][1], :crutches) if proc.parameters[nesting + 1]
158
+ end
159
+ Unparser.unparse(source)
160
+ end
161
+
162
+ def exctract_lambdas(node)
163
+ if node.type == :block && node.children[0].type == :send && node.children[0].to_a == [nil, :lambda]
164
+ node.children[2]
165
+ else
166
+ node.children.map { |child| exctract_lambdas(child) }.flatten.compact
167
+ end if node.is_a?(Parser::AST::Node)
168
+ end
169
+
170
+ def replace_lvar(node, old_variable, new_variable)
171
+ if node.is_a?(Parser::AST::Node)
172
+ if node.type == :lvar && node.children.to_a == [old_variable]
173
+ node.updated(nil, [new_variable])
174
+ else
175
+ node.updated(nil, node.children.map { |child| replace_lvar(child, old_variable, new_variable) })
176
+ end
177
+ else
178
+ node
179
+ end
180
+ end
181
+
182
+ def replace_send(node, variable)
183
+ if node.is_a?(Parser::AST::Node)
184
+ if node.type == :send && node.children[0].nil?
185
+ node.updated(nil, [Parser::AST::Node.new(:lvar, [variable]), *node.children[1..-1]])
186
+ else
187
+ node.updated(nil, node.children.map { |child| replace_send(child, variable) })
188
+ end
189
+ else
190
+ node
191
+ end
192
+ end
193
+
194
+ def replace_self(node, variable)
195
+ if node.is_a?(Parser::AST::Node)
196
+ if node.type == :self
197
+ Parser::AST::Node.new(:lvar, [variable])
198
+ else
199
+ node.updated(nil, node.children.map { |child| replace_self(child, variable) })
200
+ end
201
+ else
202
+ node
203
+ end
204
+ end
205
+ end
206
+ end
207
+ end
208
+ end
@@ -19,16 +19,34 @@ module Chewy
19
19
  end
20
20
  end
21
21
 
22
- def method_missing(method, *args, &block)
23
- if @attributes.key?(method.to_s)
24
- @attributes[method.to_s]
25
- else
26
- nil
22
+ def method_missing(method_name, *args, &block)
23
+ method_name.to_s.match(/_highlight\z/) do |match|
24
+ return highlight(match.pre_match) if highlight?(match.pre_match)
27
25
  end
26
+ return @attributes[method_name.to_s] if @attributes.key?(method_name.to_s)
27
+ return nil if attribute_defined?(method_name.to_s)
28
+ super
29
+ end
30
+
31
+ def respond_to_missing?(method_name, include_private = false)
32
+ method_name.to_s.match(/_highlight\z/) { |m| highlight?(m.pre_match) } ||
33
+ @attributes.key?(method_name.to_s) ||
34
+ attribute_defined?(method_name.to_s) ||
35
+ super
36
+ end
37
+
38
+ private
39
+
40
+ def attribute_defined?(attribute)
41
+ self.class.root_object && self.class.root_object.children.find { |a| a.name.to_s == attribute }.present?
42
+ end
43
+
44
+ def highlight(attribute)
45
+ _data["highlight"][attribute].first
28
46
  end
29
47
 
30
- def respond_to_missing?(method, _)
31
- @attributes.key?(method.to_s) || super
48
+ def highlight?(attribute)
49
+ _data.key?("highlight") && _data["highlight"].key?(attribute)
32
50
  end
33
51
  end
34
52
  end
@@ -1,3 +1,3 @@
1
1
  module Chewy
2
- VERSION = '0.8.3'
2
+ VERSION = '0.8.4'
3
3
  end
@@ -3,39 +3,47 @@ require 'chewy/rake_helper'
3
3
  namespace :chewy do
4
4
  desc 'Destroy, recreate and import data to specified index'
5
5
  task :reset, [:index] => :environment do |task, args|
6
- Chewy::RakeHelper.subscribe_task_stats!
6
+ Chewy::RakeHelper.subscribed_task_stats do
7
7
 
8
- if args[:index].present?
9
- Chewy::RakeHelper.reset_index(args[:index])
10
- else
11
- Chewy::RakeHelper.reset_all
8
+ if args[:index].present?
9
+ Chewy::RakeHelper.reset_index(args[:index])
10
+ else
11
+ Chewy::RakeHelper.reset_all
12
+ end
12
13
  end
13
14
  end
14
15
 
15
16
  namespace :reset do
16
17
  desc 'Destroy, recreate and import data for all found indexes'
17
18
  task all: :environment do
18
- Chewy::RakeHelper.subscribe_task_stats!
19
- Chewy::RakeHelper.reset_all
19
+ ActiveSupport::Deprecation.warn('`rake chewy:reset:all` is deprecated and will be removed soon. Use `rake chewy:reset` instead')
20
+
21
+ Chewy::RakeHelper.subscribed_task_stats do
22
+ Chewy::RakeHelper.reset_all
23
+ end
20
24
  end
21
25
  end
22
26
 
23
27
  desc 'Updates data specified index'
24
28
  task :update, [:index] => :environment do |task, args|
25
- Chewy::RakeHelper.subscribe_task_stats!
29
+ Chewy::RakeHelper.subscribed_task_stats do
26
30
 
27
- if args[:index].present?
28
- Chewy::RakeHelper.update_index(args[:index])
29
- else
30
- Chewy::RakeHelper.update_all
31
+ if args[:index].present?
32
+ Chewy::RakeHelper.update_index(args[:index])
33
+ else
34
+ Chewy::RakeHelper.update_all
35
+ end
31
36
  end
32
37
  end
33
38
 
34
39
  namespace :update do
35
40
  desc 'Updates data for all found indexes'
36
41
  task all: :environment do
37
- Chewy::RakeHelper.subscribe_task_stats!
38
- Chewy::RakeHelper.update_all
42
+ ActiveSupport::Deprecation.warn('`rake chewy:update:all` is deprecated and will be removed soon. Use `rake chewy:update` instead')
43
+
44
+ Chewy::RakeHelper.subscribed_task_stats do
45
+ Chewy::RakeHelper.update_all
46
+ end
39
47
  end
40
48
  end
41
49
  end
@@ -11,6 +11,10 @@ describe Chewy::Fields::Base do
11
11
  specify { expect(field.compose(double(value: ['hello', 'world']))).to eq({name: ['hello', 'world']}) }
12
12
 
13
13
  specify { expect(described_class.new(:name).compose(double(name: 'hello'))).to eq({name: 'hello'}) }
14
+ specify { expect(described_class.new(:false_value).compose({false_value: false})).to eq({false_value: false}) }
15
+ specify { expect(described_class.new(:true_value).compose({true_value: true})).to eq({true_value: true}) }
16
+ specify { expect(described_class.new(:nil_value).compose({nil_value: nil})).to eq({nil_value: nil}) }
17
+
14
18
 
15
19
  context 'nested fields' do
16
20
  before do
@@ -62,14 +66,14 @@ describe Chewy::Fields::Base do
62
66
 
63
67
  context 'hash values' do
64
68
  let(:field) { described_class.new(:name, type: 'object') }
65
- let(:object) { double(name: { key1: 'value1', key2: 'value2' }) }
69
+ let(:object) { double(name: { key1: 'value1', key2: 'value2'}) }
66
70
 
67
71
  before do
68
72
  field.children.push(described_class.new(:key1, value: ->(h){ h[:key1] }))
69
73
  field.children.push(described_class.new(:key2, value: ->(h){ h[:key2] }))
70
74
  end
71
75
 
72
- specify{ expect(field.compose(object)).to eq({ name: { 'key1' => 'value1', 'key2' => 'value2' } }) }
76
+ specify{ expect(field.compose(object)).to eq({ name: { 'key1' => 'value1', 'key2' => 'value2'} }) }
73
77
  end
74
78
  end
75
79
 
@@ -12,7 +12,7 @@ describe 'Time fields' do
12
12
  end
13
13
 
14
14
  before { PostsIndex::Post.import(
15
- double(published_at: ActiveSupport::TimeZone[-28800].parse('2014/12/18 18:00')),
15
+ double(published_at: ActiveSupport::TimeZone[-28800].parse('2014/12/18 19:00')),
16
16
  double(published_at: ActiveSupport::TimeZone[-21600].parse('2014/12/18 20:00')),
17
17
  double(published_at: ActiveSupport::TimeZone[-21600].parse('2014/12/17 20:00')),
18
18
  ) }
@@ -21,7 +21,7 @@ describe 'Time fields' do
21
21
  let(:range) { (time - 1.minute)..(time + 1.minute) }
22
22
 
23
23
  specify { expect(PostsIndex.total).to eq(3) }
24
- specify { expect(PostsIndex.filter { published_at == o{range} }.count).to eq(2) }
25
- specify { expect(PostsIndex.filter { published_at == o{range.min.utc..range.max.utc} }.count).to eq(2) }
26
- specify { expect(PostsIndex.filter { published_at == o{[range.min.to_date..range.max.to_date]} }.count).to eq(1) }
24
+ specify { expect(PostsIndex.filter { published_at == o{range} }.count).to eq(1) }
25
+ specify { expect(PostsIndex.filter { published_at == o{range.min.utc..(range.max + 1.hour).utc} }.count).to eq(2) }
26
+ specify { expect(PostsIndex.filter { published_at == o{[range.min..range.max]} }.count).to eq(1) }
27
27
  end
@@ -15,8 +15,8 @@ describe Chewy::Index::Actions do
15
15
  end
16
16
 
17
17
  describe '.create' do
18
- specify { expect(DummiesIndex.create["acknowledged"]).to eq(true) }
19
- specify { expect(DummiesIndex.create('2013')["acknowledged"]).to eq(true) }
18
+ specify { expect(DummiesIndex.create['acknowledged']).to eq(true) }
19
+ specify { expect(DummiesIndex.create('2013')['acknowledged']).to eq(true) }
20
20
 
21
21
  context do
22
22
  before { DummiesIndex.create }
@@ -31,7 +31,7 @@ describe Chewy::Index::Actions do
31
31
  specify { expect(DummiesIndex.aliases).to eq([]) }
32
32
  specify { expect(DummiesIndex.indexes).to eq(['dummies_2013']) }
33
33
  specify { expect(DummiesIndex.create('2013')).to eq(false) }
34
- specify { expect(DummiesIndex.create('2014')["acknowledged"]).to eq(true) }
34
+ specify { expect(DummiesIndex.create('2014')['acknowledged']).to eq(true) }
35
35
 
36
36
  context do
37
37
  before { DummiesIndex.create '2014' }
@@ -49,12 +49,19 @@ describe Chewy::Index::Actions do
49
49
  end
50
50
 
51
51
  describe '.create!' do
52
- specify { expect(DummiesIndex.create!["acknowledged"]).to eq(true) }
53
- specify { expect(DummiesIndex.create!('2013')["acknowledged"]).to eq(true) }
52
+ specify { expect(DummiesIndex.create!['acknowledged']).to eq(true) }
53
+ specify { expect(DummiesIndex.create!('2013')['acknowledged']).to eq(true) }
54
54
 
55
55
  context do
56
56
  before { DummiesIndex.create }
57
- specify { expect { DummiesIndex.create! }.to raise_error(Elasticsearch::Transport::Transport::Errors::BadRequest).with_message(/\[\[dummies\] already exists\]/) }
57
+ specify do
58
+ skip_on_version_gte('2.0', 'format of exception changed in 2.x')
59
+ expect { DummiesIndex.create! }.to raise_error(Elasticsearch::Transport::Transport::Errors::BadRequest).with_message(/\[\[dummies\] already exists\]/)
60
+ end
61
+ specify do
62
+ skip_on_version_lt('2.0', 'format of exception was changed')
63
+ expect { DummiesIndex.create! }.to raise_error(Elasticsearch::Transport::Transport::Errors::BadRequest).with_message(/index_already_exists_exception.*dummies/)
64
+ end
58
65
  specify { expect { DummiesIndex.create!('2013') }.to raise_error(Elasticsearch::Transport::Transport::Errors::BadRequest).with_message(/Invalid alias name \[dummies\]/) }
59
66
  end
60
67
 
@@ -64,8 +71,15 @@ describe Chewy::Index::Actions do
64
71
  specify { expect(Chewy.client.indices.exists(index: 'dummies_2013')).to eq(true) }
65
72
  specify { expect(DummiesIndex.aliases).to eq([]) }
66
73
  specify { expect(DummiesIndex.indexes).to eq(['dummies_2013']) }
67
- specify { expect { DummiesIndex.create!('2013') }.to raise_error(Elasticsearch::Transport::Transport::Errors::BadRequest).with_message(/\[\[dummies_2013\] already exists\]/) }
68
- specify { expect(DummiesIndex.create!('2014')["acknowledged"]).to eq(true) }
74
+ specify do
75
+ skip_on_version_gte('2.0', 'format of exception changed in 2.x')
76
+ expect { DummiesIndex.create!('2013') }.to raise_error(Elasticsearch::Transport::Transport::Errors::BadRequest).with_message(/\[\[dummies_2013\] already exists\]/)
77
+ end
78
+ specify do
79
+ skip_on_version_lt('2.0', 'format of exception was changed')
80
+ expect { DummiesIndex.create!('2013') }.to raise_error(Elasticsearch::Transport::Transport::Errors::BadRequest).with_message(/index_already_exists_exception.*dummies_2013/)
81
+ end
82
+ specify { expect(DummiesIndex.create!('2014')['acknowledged']).to eq(true) }
69
83
 
70
84
  context do
71
85
  before { DummiesIndex.create! '2014' }
@@ -88,7 +102,7 @@ describe Chewy::Index::Actions do
88
102
 
89
103
  context do
90
104
  before { DummiesIndex.create }
91
- specify { expect(DummiesIndex.delete["acknowledged"]).to eq(true) }
105
+ specify { expect(DummiesIndex.delete['acknowledged']).to eq(true) }
92
106
 
93
107
  context do
94
108
  before { DummiesIndex.delete }
@@ -98,7 +112,7 @@ describe Chewy::Index::Actions do
98
112
 
99
113
  context do
100
114
  before { DummiesIndex.create '2013' }
101
- specify { expect(DummiesIndex.delete('2013')["acknowledged"]).to eq(true) }
115
+ specify { expect(DummiesIndex.delete('2013')['acknowledged']).to eq(true) }
102
116
 
103
117
  context do
104
118
  before { DummiesIndex.delete('2013') }
@@ -108,7 +122,7 @@ describe Chewy::Index::Actions do
108
122
 
109
123
  context do
110
124
  before { DummiesIndex.create '2014' }
111
- specify { expect(DummiesIndex.delete["acknowledged"]).to eq(true) }
125
+ specify { expect(DummiesIndex.delete['acknowledged']).to eq(true) }
112
126
 
113
127
  context do
114
128
  before { DummiesIndex.delete }
@@ -133,7 +147,7 @@ describe Chewy::Index::Actions do
133
147
 
134
148
  context do
135
149
  before { DummiesIndex.create }
136
- specify { expect(DummiesIndex.delete!["acknowledged"]).to eq(true) }
150
+ specify { expect(DummiesIndex.delete!['acknowledged']).to eq(true) }
137
151
 
138
152
  context do
139
153
  before { DummiesIndex.delete! }
@@ -143,7 +157,7 @@ describe Chewy::Index::Actions do
143
157
 
144
158
  context do
145
159
  before { DummiesIndex.create '2013' }
146
- specify { expect(DummiesIndex.delete!('2013')["acknowledged"]).to eq(true) }
160
+ specify { expect(DummiesIndex.delete!('2013')['acknowledged']).to eq(true) }
147
161
 
148
162
  context do
149
163
  before { DummiesIndex.delete!('2013') }
@@ -153,7 +167,7 @@ describe Chewy::Index::Actions do
153
167
 
154
168
  context do
155
169
  before { DummiesIndex.create '2014' }
156
- specify { expect(DummiesIndex.delete!["acknowledged"]).to eq(true) }
170
+ specify { expect(DummiesIndex.delete!['acknowledged']).to eq(true) }
157
171
 
158
172
  context do
159
173
  before { DummiesIndex.delete! }
@@ -173,8 +187,8 @@ describe Chewy::Index::Actions do
173
187
  end
174
188
 
175
189
  describe '.purge' do
176
- specify { expect(DummiesIndex.purge["acknowledged"]).to eq(true) }
177
- specify { expect(DummiesIndex.purge('2013')["acknowledged"]).to eq(true) }
190
+ specify { expect(DummiesIndex.purge['acknowledged']).to eq(true) }
191
+ specify { expect(DummiesIndex.purge('2013')['acknowledged']).to eq(true) }
178
192
 
179
193
  context do
180
194
  before { DummiesIndex.purge }
@@ -220,8 +234,8 @@ describe Chewy::Index::Actions do
220
234
  end
221
235
 
222
236
  describe '.purge!' do
223
- specify { expect(DummiesIndex.purge!["acknowledged"]).to eq(true) }
224
- specify { expect(DummiesIndex.purge!('2013')["acknowledged"]).to eq(true) }
237
+ specify { expect(DummiesIndex.purge!['acknowledged']).to eq(true) }
238
+ specify { expect(DummiesIndex.purge!('2013')['acknowledged']).to eq(true) }
225
239
 
226
240
  context do
227
241
  before { DummiesIndex.purge! }