chewy 7.1.0 → 7.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 (131) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +58 -0
  3. data/.rubocop.yml +13 -8
  4. data/.rubocop_todo.yml +110 -22
  5. data/CHANGELOG.md +53 -0
  6. data/Gemfile +0 -7
  7. data/Guardfile +3 -1
  8. data/README.md +282 -245
  9. data/chewy.gemspec +3 -5
  10. data/gemfiles/rails.5.2.activerecord.gemfile +8 -14
  11. data/gemfiles/rails.6.0.activerecord.gemfile +8 -14
  12. data/gemfiles/rails.6.1.activerecord.gemfile +8 -14
  13. data/lib/chewy.rb +21 -75
  14. data/lib/chewy/config.rb +40 -40
  15. data/lib/chewy/errors.rb +0 -12
  16. data/lib/chewy/fields/base.rb +11 -1
  17. data/lib/chewy/fields/root.rb +3 -4
  18. data/lib/chewy/index.rb +46 -87
  19. data/lib/chewy/index/actions.rb +51 -32
  20. data/lib/chewy/{type → index}/adapter/active_record.rb +12 -3
  21. data/lib/chewy/{type → index}/adapter/base.rb +2 -3
  22. data/lib/chewy/{type → index}/adapter/object.rb +27 -31
  23. data/lib/chewy/{type → index}/adapter/orm.rb +11 -14
  24. data/lib/chewy/{type → index}/crutch.rb +5 -5
  25. data/lib/chewy/{type → index}/import.rb +36 -27
  26. data/lib/chewy/{type → index}/import/bulk_builder.rb +15 -13
  27. data/lib/chewy/{type → index}/import/bulk_request.rb +6 -6
  28. data/lib/chewy/{type → index}/import/journal_builder.rb +10 -10
  29. data/lib/chewy/{type → index}/import/routine.rb +15 -14
  30. data/lib/chewy/{type → index}/mapping.rb +26 -31
  31. data/lib/chewy/{type → index}/observe.rb +9 -19
  32. data/lib/chewy/index/specification.rb +1 -0
  33. data/lib/chewy/{type → index}/syncer.rb +60 -57
  34. data/lib/chewy/{type → index}/witchcraft.rb +11 -7
  35. data/lib/chewy/{type → index}/wrapper.rb +2 -2
  36. data/lib/chewy/journal.rb +8 -8
  37. data/lib/chewy/minitest/helpers.rb +9 -13
  38. data/lib/chewy/minitest/search_index_receiver.rb +22 -26
  39. data/lib/chewy/railtie.rb +4 -2
  40. data/lib/chewy/rake_helper.rb +82 -107
  41. data/lib/chewy/rspec/update_index.rb +47 -43
  42. data/lib/chewy/search.rb +4 -17
  43. data/lib/chewy/search/loader.rb +18 -30
  44. data/lib/chewy/search/parameters.rb +4 -2
  45. data/lib/chewy/search/parameters/concerns/query_storage.rb +2 -2
  46. data/lib/chewy/search/parameters/source.rb +5 -1
  47. data/lib/chewy/search/query_proxy.rb +9 -2
  48. data/lib/chewy/search/request.rb +82 -86
  49. data/lib/chewy/search/response.rb +4 -4
  50. data/lib/chewy/search/scoping.rb +6 -7
  51. data/lib/chewy/search/scrolling.rb +11 -11
  52. data/lib/chewy/stash.rb +14 -22
  53. data/lib/chewy/strategy.rb +3 -19
  54. data/lib/chewy/strategy/sidekiq.rb +1 -0
  55. data/lib/chewy/version.rb +1 -1
  56. data/lib/generators/chewy/install_generator.rb +1 -1
  57. data/lib/tasks/chewy.rake +10 -22
  58. data/migration_guide.md +14 -0
  59. data/spec/chewy/config_spec.rb +14 -39
  60. data/spec/chewy/fields/base_spec.rb +412 -148
  61. data/spec/chewy/fields/root_spec.rb +16 -24
  62. data/spec/chewy/fields/time_fields_spec.rb +5 -5
  63. data/spec/chewy/index/actions_spec.rb +270 -24
  64. data/spec/chewy/{type → index}/adapter/active_record_spec.rb +68 -40
  65. data/spec/chewy/{type → index}/adapter/object_spec.rb +21 -6
  66. data/spec/chewy/{type → index}/import/bulk_builder_spec.rb +23 -31
  67. data/spec/chewy/{type → index}/import/bulk_request_spec.rb +5 -6
  68. data/spec/chewy/{type → index}/import/journal_builder_spec.rb +9 -15
  69. data/spec/chewy/{type → index}/import/routine_spec.rb +16 -16
  70. data/spec/chewy/{type → index}/import_spec.rb +102 -98
  71. data/spec/chewy/{type → index}/mapping_spec.rb +46 -54
  72. data/spec/chewy/index/observe_spec.rb +116 -0
  73. data/spec/chewy/index/settings_spec.rb +3 -1
  74. data/spec/chewy/index/specification_spec.rb +7 -17
  75. data/spec/chewy/{type → index}/syncer_spec.rb +14 -19
  76. data/spec/chewy/{type → index}/witchcraft_spec.rb +20 -22
  77. data/spec/chewy/index/wrapper_spec.rb +100 -0
  78. data/spec/chewy/index_spec.rb +59 -102
  79. data/spec/chewy/journal_spec.rb +9 -22
  80. data/spec/chewy/minitest/helpers_spec.rb +13 -15
  81. data/spec/chewy/minitest/search_index_receiver_spec.rb +22 -26
  82. data/spec/chewy/multi_search_spec.rb +4 -5
  83. data/spec/chewy/rake_helper_spec.rb +145 -55
  84. data/spec/chewy/rspec/update_index_spec.rb +74 -71
  85. data/spec/chewy/search/loader_spec.rb +19 -37
  86. data/spec/chewy/search/pagination/kaminari_examples.rb +3 -5
  87. data/spec/chewy/search/pagination/kaminari_spec.rb +1 -1
  88. data/spec/chewy/search/parameters/indices_spec.rb +2 -8
  89. data/spec/chewy/search/parameters/order_spec.rb +1 -1
  90. data/spec/chewy/search/parameters/query_storage_examples.rb +67 -21
  91. data/spec/chewy/search/parameters/search_after_spec.rb +4 -1
  92. data/spec/chewy/search/parameters/source_spec.rb +8 -2
  93. data/spec/chewy/search/parameters_spec.rb +12 -3
  94. data/spec/chewy/search/query_proxy_spec.rb +68 -17
  95. data/spec/chewy/search/request_spec.rb +222 -74
  96. data/spec/chewy/search/response_spec.rb +12 -12
  97. data/spec/chewy/search/scrolling_spec.rb +7 -9
  98. data/spec/chewy/search_spec.rb +32 -35
  99. data/spec/chewy/stash_spec.rb +9 -21
  100. data/spec/chewy/strategy/active_job_spec.rb +8 -8
  101. data/spec/chewy/strategy/atomic_spec.rb +9 -10
  102. data/spec/chewy/strategy/sidekiq_spec.rb +8 -8
  103. data/spec/chewy/strategy_spec.rb +19 -15
  104. data/spec/chewy_spec.rb +14 -100
  105. data/spec/spec_helper.rb +2 -21
  106. data/spec/support/active_record.rb +15 -5
  107. metadata +44 -103
  108. data/.circleci/config.yml +0 -214
  109. data/Appraisals +0 -81
  110. data/gemfiles/rails.5.2.mongoid.6.4.gemfile +0 -17
  111. data/gemfiles/sequel.4.45.gemfile +0 -11
  112. data/lib/chewy/search/pagination/will_paginate.rb +0 -43
  113. data/lib/chewy/strategy/resque.rb +0 -27
  114. data/lib/chewy/strategy/shoryuken.rb +0 -40
  115. data/lib/chewy/type.rb +0 -120
  116. data/lib/chewy/type/actions.rb +0 -43
  117. data/lib/chewy/type/adapter/mongoid.rb +0 -67
  118. data/lib/chewy/type/adapter/sequel.rb +0 -93
  119. data/lib/sequel/plugins/chewy_observe.rb +0 -63
  120. data/spec/chewy/search/pagination/will_paginate_examples.rb +0 -63
  121. data/spec/chewy/search/pagination/will_paginate_spec.rb +0 -23
  122. data/spec/chewy/strategy/resque_spec.rb +0 -46
  123. data/spec/chewy/strategy/shoryuken_spec.rb +0 -70
  124. data/spec/chewy/type/actions_spec.rb +0 -50
  125. data/spec/chewy/type/adapter/mongoid_spec.rb +0 -372
  126. data/spec/chewy/type/adapter/sequel_spec.rb +0 -472
  127. data/spec/chewy/type/observe_spec.rb +0 -137
  128. data/spec/chewy/type/wrapper_spec.rb +0 -100
  129. data/spec/chewy/type_spec.rb +0 -55
  130. data/spec/support/mongoid.rb +0 -93
  131. data/spec/support/sequel.rb +0 -80
@@ -1,14 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  # TODO: add more specs here later
4
- describe Chewy::Type::Import::Routine do
4
+ describe Chewy::Index::Import::Routine do
5
5
  before { Chewy.massacre }
6
6
  before do
7
7
  stub_index(:cities) do
8
- define_type :city do
9
- field :name
10
- field :object, type: 'object'
11
- end
8
+ field :name
9
+ field :object, type: 'object'
12
10
  end
13
11
  CitiesIndex.create!
14
12
  end
@@ -18,7 +16,7 @@ describe Chewy::Type::Import::Routine do
18
16
 
19
17
  describe '#options' do
20
18
  specify do
21
- expect(described_class.new(CitiesIndex::City).options).to eq(
19
+ expect(described_class.new(CitiesIndex).options).to eq(
22
20
  journal: nil,
23
21
  refresh: true,
24
22
  update_failover: true,
@@ -29,7 +27,7 @@ describe Chewy::Type::Import::Routine do
29
27
 
30
28
  specify do
31
29
  expect(described_class.new(
32
- CitiesIndex::City, batch_size: 100, bulk_size: 1.megabyte, refresh: false
30
+ CitiesIndex, batch_size: 100, bulk_size: 1.megabyte, refresh: false
33
31
  ).options).to eq(
34
32
  journal: nil,
35
33
  refresh: false,
@@ -43,7 +41,7 @@ describe Chewy::Type::Import::Routine do
43
41
  context do
44
42
  before { allow(Chewy).to receive_messages(configuration: Chewy.configuration.merge(journal: true)) }
45
43
  specify do
46
- expect(described_class.new(CitiesIndex::City).options).to eq(
44
+ expect(described_class.new(CitiesIndex).options).to eq(
47
45
  journal: true,
48
46
  refresh: true,
49
47
  update_failover: true,
@@ -55,24 +53,26 @@ describe Chewy::Type::Import::Routine do
55
53
 
56
54
  specify do
57
55
  expect(CitiesIndex.client).to receive(:bulk).with(hash_including(refresh: true))
58
- described_class.new(CitiesIndex::City).process(index: index)
56
+ described_class.new(CitiesIndex).process(index: index)
59
57
  end
60
58
 
61
59
  specify do
62
60
  expect(CitiesIndex.client).to receive(:bulk).with(hash_including(refresh: false))
63
- described_class.new(CitiesIndex::City, refresh: false).process(index: index)
61
+ described_class.new(CitiesIndex, refresh: false).process(index: index)
64
62
  end
65
63
  end
66
64
 
67
65
  describe '#parallel_options' do
68
- specify { expect(described_class.new(CitiesIndex::City).parallel_options).to be_nil }
69
- specify { expect(described_class.new(CitiesIndex::City, parallel: true).parallel_options).to eq({}) }
70
- specify { expect(described_class.new(CitiesIndex::City, parallel: 3).parallel_options).to eq(in_processes: 3) }
71
- specify { expect(described_class.new(CitiesIndex::City, parallel: {in_threads: 2}).parallel_options).to eq(in_threads: 2) }
66
+ specify { expect(described_class.new(CitiesIndex).parallel_options).to be_nil }
67
+ specify { expect(described_class.new(CitiesIndex, parallel: true).parallel_options).to eq({}) }
68
+ specify { expect(described_class.new(CitiesIndex, parallel: 3).parallel_options).to eq(in_processes: 3) }
69
+ specify do
70
+ expect(described_class.new(CitiesIndex, parallel: {in_threads: 2}).parallel_options).to eq(in_threads: 2)
71
+ end
72
72
  end
73
73
 
74
74
  describe '#stats' do
75
- subject { described_class.new(CitiesIndex::City) }
75
+ subject { described_class.new(CitiesIndex) }
76
76
 
77
77
  specify { expect(subject.stats).to eq({}) }
78
78
  specify do
@@ -92,7 +92,7 @@ describe Chewy::Type::Import::Routine do
92
92
  end
93
93
 
94
94
  describe '#errors' do
95
- subject { described_class.new(CitiesIndex::City) }
95
+ subject { described_class.new(CitiesIndex) }
96
96
  let(:index) { [double(id: 1, name: 'Name', object: ''), double(id: 2, name: 'Name', object: {})] }
97
97
 
98
98
  specify { expect(subject.errors).to eq([]) }
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Chewy::Type::Import do
3
+ describe Chewy::Index::Import do
4
4
  before { Chewy.massacre }
5
5
 
6
6
  before do
@@ -9,14 +9,13 @@ describe Chewy::Type::Import do
9
9
 
10
10
  before do
11
11
  stub_index(:cities) do
12
- define_type City do
13
- field :name
14
- end
12
+ index_scope City
13
+ field :name
15
14
  end
16
15
  end
17
16
 
18
17
  def imported_cities
19
- CitiesIndex::City.all.map do |city|
18
+ CitiesIndex.all.map do |city|
20
19
  city.attributes.except('_score', '_explanation')
21
20
  end
22
21
  end
@@ -37,13 +36,13 @@ describe Chewy::Type::Import do
37
36
  specify 'lazy (default)' do
38
37
  expect(CitiesIndex).to receive(:exists?).and_call_original
39
38
  expect(CitiesIndex).to receive(:create!).and_call_original
40
- CitiesIndex::City.import(dummy_city)
39
+ CitiesIndex.import(dummy_city)
41
40
  end
42
41
 
43
42
  specify 'lazy without objects' do
44
43
  expect(CitiesIndex).not_to receive(:exists?)
45
44
  expect(CitiesIndex).not_to receive(:create!)
46
- CitiesIndex::City.import([])
45
+ CitiesIndex.import([])
47
46
  end
48
47
 
49
48
  context 'skip' do
@@ -58,7 +57,7 @@ describe Chewy::Type::Import do
58
57
  specify do
59
58
  expect(CitiesIndex).not_to receive(:exists?)
60
59
  expect(CitiesIndex).not_to receive(:create!)
61
- CitiesIndex::City.import(dummy_city)
60
+ CitiesIndex.import(dummy_city)
62
61
  end
63
62
  end
64
63
  end
@@ -69,35 +68,36 @@ describe Chewy::Type::Import do
69
68
  specify { expect(import(dummy_cities)).to eq(true) }
70
69
  specify { expect(import(dummy_cities.map(&:id))).to eq(true) }
71
70
 
72
- specify { expect { import([]) }.not_to update_index(CitiesIndex::City) }
73
- specify { expect { import }.to update_index(CitiesIndex::City).and_reindex(dummy_cities) }
74
- specify { expect { import dummy_cities }.to update_index(CitiesIndex::City).and_reindex(dummy_cities) }
75
- specify { expect { import dummy_cities.map(&:id) }.to update_index(CitiesIndex::City).and_reindex(dummy_cities) }
71
+ specify { expect { import([]) }.not_to update_index(CitiesIndex) }
72
+ specify { expect { import }.to update_index(CitiesIndex).and_reindex(dummy_cities) }
73
+ specify { expect { import dummy_cities }.to update_index(CitiesIndex).and_reindex(dummy_cities) }
74
+ specify { expect { import dummy_cities.map(&:id) }.to update_index(CitiesIndex).and_reindex(dummy_cities) }
76
75
 
77
76
  describe 'criteria-driven importing' do
78
77
  let(:names) { %w[name0 name1] }
79
78
 
80
- context 'mongoid', :mongoid do
81
- specify { expect { import(City.where(:name.in => names)) }.to update_index(CitiesIndex::City).and_reindex(dummy_cities.first(2)) }
82
- specify { expect { import(City.where(:name.in => names).map(&:id)) }.to update_index(CitiesIndex::City).and_reindex(dummy_cities.first(2)) }
83
- end
84
-
85
79
  context 'active record', :active_record do
86
- specify { expect { import(City.where(name: names)) }.to update_index(CitiesIndex::City).and_reindex(dummy_cities.first(2)) }
87
- specify { expect { import(City.where(name: names).map(&:id)) }.to update_index(CitiesIndex::City).and_reindex(dummy_cities.first(2)) }
80
+ specify do
81
+ expect { import(City.where(name: names)) }
82
+ .to update_index(CitiesIndex).and_reindex(dummy_cities.first(2))
83
+ end
84
+ specify do
85
+ expect { import(City.where(name: names).map(&:id)) }
86
+ .to update_index(CitiesIndex).and_reindex(dummy_cities.first(2))
87
+ end
88
88
  end
89
89
  end
90
90
 
91
91
  specify do
92
92
  dummy_cities.first.destroy
93
93
  expect { import dummy_cities }
94
- .to update_index(CitiesIndex::City).and_reindex(dummy_cities.from(1)).and_delete(dummy_cities.first)
94
+ .to update_index(CitiesIndex).and_reindex(dummy_cities.from(1)).and_delete(dummy_cities.first)
95
95
  end
96
96
 
97
97
  specify do
98
98
  dummy_cities.first.destroy
99
99
  expect { import dummy_cities.map(&:id) }
100
- .to update_index(CitiesIndex::City).and_reindex(dummy_cities.from(1)).and_delete(dummy_cities.first)
100
+ .to update_index(CitiesIndex).and_reindex(dummy_cities.from(1)).and_delete(dummy_cities.first)
101
101
  end
102
102
 
103
103
  specify do
@@ -120,7 +120,10 @@ describe Chewy::Type::Import do
120
120
  context ':bulk_size' do
121
121
  let!(:dummy_cities) { Array.new(3) { |i| City.create(id: i + 1, name: "name#{i}" * 20) } }
122
122
 
123
- specify { expect { import(dummy_cities, bulk_size: 1.2.kilobyte) }.to update_index(CitiesIndex::City).and_reindex(dummy_cities) }
123
+ specify do
124
+ expect { import(dummy_cities, bulk_size: 1.2.kilobyte) }
125
+ .to update_index(CitiesIndex).and_reindex(dummy_cities)
126
+ end
124
127
 
125
128
  context do
126
129
  before { expect(Chewy.client).to receive(:bulk).exactly(3).times.and_call_original }
@@ -132,36 +135,25 @@ describe Chewy::Type::Import do
132
135
  before do
133
136
  names = %w[name0 name1]
134
137
 
135
- criteria = case adapter
136
- when :mongoid
137
- {:name.in => names}
138
- else
139
- {name: names}
140
- end
138
+ criteria = {name: names}
141
139
 
142
140
  stub_index(:cities) do
143
- define_type City.where(criteria) do
144
- field :name
145
- end
141
+ index_scope City.where(criteria)
142
+ field :name
146
143
  end
147
144
  end
148
145
 
149
- specify { expect { import }.to update_index(CitiesIndex::City).and_reindex(dummy_cities.first(2)) }
150
-
151
- context 'mongoid', :mongoid do
152
- specify do
153
- expect { import City.where(_id: dummy_cities.first.id) }.to update_index(CitiesIndex::City).and_reindex(dummy_cities.first).only
154
- end
155
- end
146
+ specify { expect { import }.to update_index(CitiesIndex).and_reindex(dummy_cities.first(2)) }
156
147
 
157
148
  context 'active record', :active_record do
158
149
  specify do
159
- expect { import City.where(id: dummy_cities.first.id) }.to update_index(CitiesIndex::City).and_reindex(dummy_cities.first).only
150
+ expect { import City.where(id: dummy_cities.first.id) }
151
+ .to update_index(CitiesIndex).and_reindex(dummy_cities.first).only
160
152
  end
161
153
 
162
154
  specify do
163
- allow(CitiesIndex::City).to receive(:import_linear).and_return(double(present?: false))
164
- allow(CitiesIndex::City).to receive(:import_parallel).and_return(double(present?: false))
155
+ allow(CitiesIndex).to receive(:import_linear).and_return(double(present?: false))
156
+ allow(CitiesIndex).to receive(:import_parallel).and_return(double(present?: false))
165
157
 
166
158
  expects_no_query(except: /SELECT\s+1\s+AS\s+one\s+FROM/) do
167
159
  import City.where(id: dummy_cities.first.id)
@@ -175,28 +167,27 @@ describe Chewy::Type::Import do
175
167
  payload = subscribe_notification
176
168
  dummy_cities.first.destroy
177
169
  import dummy_cities
178
- expect(payload).to eq(type: CitiesIndex::City, import: {delete: 1, index: 2})
170
+ expect(payload).to eq(index: CitiesIndex, import: {delete: 1, index: 2})
179
171
  end
180
172
 
181
173
  specify do
182
174
  payload = subscribe_notification
183
175
  dummy_cities.first.destroy
184
176
  import dummy_cities, batch_size: 2
185
- expect(payload).to eq(type: CitiesIndex::City, import: {delete: 1, index: 2})
177
+ expect(payload).to eq(index: CitiesIndex, import: {delete: 1, index: 2})
186
178
  end
187
179
 
188
180
  specify do
189
181
  payload = subscribe_notification
190
182
  import dummy_cities, batch_size: 2
191
- expect(payload).to eq(type: CitiesIndex::City, import: {index: 3})
183
+ expect(payload).to eq(index: CitiesIndex, import: {index: 3})
192
184
  end
193
185
 
194
186
  context do
195
187
  before do
196
188
  stub_index(:cities) do
197
- define_type City do
198
- field :name, type: 'object'
199
- end
189
+ index_scope City
190
+ field :name, type: 'object'
200
191
  end
201
192
  end
202
193
 
@@ -210,7 +201,7 @@ describe Chewy::Type::Import do
210
201
  specify do
211
202
  payload = subscribe_notification
212
203
  import dummy_cities, batch_size: 2
213
- expect(payload).to eq(type: CitiesIndex::City,
204
+ expect(payload).to eq(index: CitiesIndex,
214
205
  errors: {index: {mapper_parsing_exception => %w[1 2 3]}},
215
206
  import: {index: 3})
216
207
  end
@@ -218,7 +209,7 @@ describe Chewy::Type::Import do
218
209
  end
219
210
 
220
211
  context 'fields' do
221
- before { CitiesIndex::City.import!(dummy_cities.first(2)) }
212
+ before { CitiesIndex.import!(dummy_cities.first(2)) }
222
213
 
223
214
  context do
224
215
  before { expect(Chewy.client).to receive(:bulk).twice.and_call_original }
@@ -226,7 +217,7 @@ describe Chewy::Type::Import do
226
217
  end
227
218
 
228
219
  context do
229
- before { CitiesIndex::City.import!(dummy_cities.last) }
220
+ before { CitiesIndex.import!(dummy_cities.last) }
230
221
  before { expect(Chewy.client).to receive(:bulk).once.and_call_original }
231
222
  specify { expect(import(dummy_cities, update_fields: [:name])).to eq(true) }
232
223
  end
@@ -235,10 +226,8 @@ describe Chewy::Type::Import do
235
226
  context 'fields integrational' do
236
227
  before do
237
228
  stub_index(:cities) do
238
- define_type :city do
239
- field :name
240
- field :object, type: 'object'
241
- end
229
+ field :name
230
+ field :object, type: 'object'
242
231
  end
243
232
  end
244
233
 
@@ -266,9 +255,14 @@ describe Chewy::Type::Import do
266
255
  import(objects, update_fields: %i[name])
267
256
 
268
257
  expect(payload).to eq(
269
- errors: {index: {{'type' => 'mapper_parsing_exception', 'reason' => 'object mapping for [object] tried to parse field [object] as object, but found a concrete value'} => %w[2 4]}},
258
+ errors: {
259
+ index: {{
260
+ 'type' => 'mapper_parsing_exception',
261
+ 'reason' => 'object mapping for [object] tried to parse field [object] as object, but found a concrete value'
262
+ } => %w[2 4]}
263
+ },
270
264
  import: {index: 6},
271
- type: CitiesIndex::City
265
+ index: CitiesIndex
272
266
  )
273
267
  expect(imported_cities).to match_array([
274
268
  {'id' => '1', 'name' => 'Name11', 'object' => {'foo' => 11}},
@@ -284,9 +278,14 @@ describe Chewy::Type::Import do
284
278
  import(objects, batch_size: 2, update_fields: %i[name])
285
279
 
286
280
  expect(payload).to eq(
287
- errors: {index: {{'type' => 'mapper_parsing_exception', 'reason' => 'object mapping for [object] tried to parse field [object] as object, but found a concrete value'} => %w[2 4]}},
281
+ errors: {
282
+ index: {{
283
+ 'type' => 'mapper_parsing_exception',
284
+ 'reason' => 'object mapping for [object] tried to parse field [object] as object, but found a concrete value'
285
+ } => %w[2 4]}
286
+ },
288
287
  import: {index: 6},
289
- type: CitiesIndex::City
288
+ index: CitiesIndex
290
289
  )
291
290
  expect(imported_cities).to match_array([
292
291
  {'id' => '1', 'name' => 'Name11', 'object' => {'foo' => 11}},
@@ -296,7 +295,7 @@ describe Chewy::Type::Import do
296
295
  end
297
296
 
298
297
  context do
299
- before { CitiesIndex::City.import!(objects[4]) }
298
+ before { CitiesIndex.import!(objects[4]) }
300
299
 
301
300
  specify do
302
301
  payload = subscribe_notification
@@ -305,9 +304,14 @@ describe Chewy::Type::Import do
305
304
  import(objects, batch_size: 2, update_fields: %i[name])
306
305
 
307
306
  expect(payload).to eq(
308
- errors: {index: {{'type' => 'mapper_parsing_exception', 'reason' => 'object mapping for [object] tried to parse field [object] as object, but found a concrete value'} => %w[2 4]}},
307
+ errors: {
308
+ index: {{
309
+ 'type' => 'mapper_parsing_exception',
310
+ 'reason' => 'object mapping for [object] tried to parse field [object] as object, but found a concrete value'
311
+ } => %w[2 4]}
312
+ },
309
313
  import: {index: 6},
310
- type: CitiesIndex::City
314
+ index: CitiesIndex
311
315
  )
312
316
  expect(imported_cities).to match_array([
313
317
  {'id' => '1', 'name' => 'Name11', 'object' => {'foo' => 11}},
@@ -318,7 +322,7 @@ describe Chewy::Type::Import do
318
322
  end
319
323
 
320
324
  context do
321
- before { CitiesIndex::City.import!(old_objects[1], old_objects[3], objects[4]) }
325
+ before { CitiesIndex.import!(old_objects[1], old_objects[3], objects[4]) }
322
326
 
323
327
  specify do
324
328
  payload = subscribe_notification
@@ -328,7 +332,7 @@ describe Chewy::Type::Import do
328
332
 
329
333
  expect(payload).to eq(
330
334
  import: {index: 6},
331
- type: CitiesIndex::City
335
+ index: CitiesIndex
332
336
  )
333
337
  expect(imported_cities).to match_array([
334
338
  {'id' => '1', 'name' => 'Name11', 'object' => {'foo' => 11}},
@@ -347,7 +351,7 @@ describe Chewy::Type::Import do
347
351
 
348
352
  expect(payload).to eq(
349
353
  import: {index: 6},
350
- type: CitiesIndex::City
354
+ index: CitiesIndex
351
355
  )
352
356
  expect(imported_cities).to match_array([
353
357
  {'id' => '1', 'name' => 'Name11', 'object' => {'foo' => 11}},
@@ -379,7 +383,7 @@ describe Chewy::Type::Import do
379
383
  end
380
384
 
381
385
  context do
382
- before { CitiesIndex::City.import!(old_objects) }
386
+ before { CitiesIndex.import!(old_objects) }
383
387
 
384
388
  specify do
385
389
  payload = subscribe_notification
@@ -389,7 +393,7 @@ describe Chewy::Type::Import do
389
393
 
390
394
  expect(payload).to eq(
391
395
  import: {index: 6},
392
- type: CitiesIndex::City
396
+ index: CitiesIndex
393
397
  )
394
398
  expect(imported_cities).to match_array([
395
399
  {'id' => '1', 'name' => 'Name11', 'object' => {'foo' => 1}},
@@ -403,7 +407,7 @@ describe Chewy::Type::Import do
403
407
  end
404
408
 
405
409
  context do
406
- before { CitiesIndex::City.import!(old_objects) }
410
+ before { CitiesIndex.import!(old_objects) }
407
411
 
408
412
  specify do
409
413
  payload = subscribe_notification
@@ -412,9 +416,14 @@ describe Chewy::Type::Import do
412
416
  import(objects, update_fields: %i[object])
413
417
 
414
418
  expect(payload).to eq(
415
- errors: {update: {{'type' => 'mapper_parsing_exception', 'reason' => 'object mapping for [object] tried to parse field [object] as object, but found a concrete value'} => %w[2 4]}},
419
+ errors: {
420
+ update: {{
421
+ 'type' => 'mapper_parsing_exception',
422
+ 'reason' => 'object mapping for [object] tried to parse field [object] as object, but found a concrete value'
423
+ } => %w[2 4]}
424
+ },
416
425
  import: {index: 6},
417
- type: CitiesIndex::City
426
+ index: CitiesIndex
418
427
  )
419
428
  expect(imported_cities).to match_array([
420
429
  {'id' => '1', 'name' => 'Name1', 'object' => {'foo' => 11}},
@@ -432,9 +441,8 @@ describe Chewy::Type::Import do
432
441
  context do
433
442
  before do
434
443
  stub_index(:cities) do
435
- define_type City do
436
- field :name, type: 'object'
437
- end
444
+ index_scope City
445
+ field :name, type: 'object'
438
446
  end
439
447
  end
440
448
 
@@ -446,9 +454,8 @@ describe Chewy::Type::Import do
446
454
  context do
447
455
  before do
448
456
  stub_index(:cities) do
449
- define_type City do
450
- field :name, type: 'object', value: -> { name == 'name1' ? name : {name: name} }
451
- end
457
+ index_scope City
458
+ field :name, type: 'object', value: -> { name == 'name1' ? name : {name: name} }
452
459
  end
453
460
  end
454
461
 
@@ -460,19 +467,19 @@ describe Chewy::Type::Import do
460
467
 
461
468
  context 'default_import_options are set' do
462
469
  before do
463
- CitiesIndex::City.default_import_options(batch_size: 500)
470
+ CitiesIndex.default_import_options(batch_size: 500)
464
471
  end
465
472
 
466
473
  specify do
467
- expect(CitiesIndex::City.adapter).to receive(:import).with(any_args, hash_including(batch_size: 500))
468
- CitiesIndex::City.import
474
+ expect(CitiesIndex.adapter).to receive(:import).with(any_args, hash_including(batch_size: 500))
475
+ CitiesIndex.import
469
476
  end
470
477
  end
471
478
  end
472
479
 
473
480
  describe '.import', :orm do
474
481
  def import(*args)
475
- CitiesIndex::City.import(*args)
482
+ CitiesIndex.import(*args)
476
483
  end
477
484
 
478
485
  it_behaves_like 'importing'
@@ -481,7 +488,7 @@ describe Chewy::Type::Import do
481
488
  def import(*args)
482
489
  options = args.extract_options!
483
490
  options[:parallel] = 0
484
- CitiesIndex::City.import(*args, options)
491
+ CitiesIndex.import(*args, options)
485
492
  end
486
493
 
487
494
  it_behaves_like 'importing'
@@ -489,54 +496,51 @@ describe Chewy::Type::Import do
489
496
  end
490
497
 
491
498
  describe '.import!', :orm do
492
- specify { expect { CitiesIndex::City.import! }.not_to raise_error }
499
+ specify { expect { CitiesIndex.import! }.not_to raise_error }
493
500
 
494
501
  context do
495
502
  before do
496
503
  stub_index(:cities) do
497
- define_type City do
498
- field :name, type: 'object'
499
- end
504
+ index_scope City
505
+ field :name, type: 'object'
500
506
  end
501
507
  end
502
508
 
503
- specify { expect { CitiesIndex::City.import!(dummy_cities) }.to raise_error Chewy::ImportFailed }
509
+ specify { expect { CitiesIndex.import!(dummy_cities) }.to raise_error Chewy::ImportFailed }
504
510
  end
505
511
  end
506
512
 
507
513
  describe '.compose' do
508
514
  before do
509
515
  stub_index(:cities) do
510
- define_type :city do
511
- crutch :names do |collection|
512
- collection.map { |o| [o.name, o.name + '42'] }.to_h
513
- end
514
- field :name, value: ->(o, c) { c.names[o.name] }
515
- field :rating
516
+ crutch :names do |collection|
517
+ collection.map { |o| [o.name, "#{o.name}42"] }.to_h
516
518
  end
519
+ field :name, value: ->(o, c) { c.names[o.name] }
520
+ field :rating
517
521
  end
518
522
  end
519
523
 
520
524
  specify do
521
- expect(CitiesIndex::City.compose(double(name: 'Name', rating: 42)))
525
+ expect(CitiesIndex.compose(double(name: 'Name', rating: 42)))
522
526
  .to eq('name' => 'Name42', 'rating' => 42)
523
527
  end
524
528
 
525
529
  specify do
526
- expect(CitiesIndex::City.compose(double(name: 'Name', rating: 42), fields: %i[name]))
530
+ expect(CitiesIndex.compose(double(name: 'Name', rating: 42), fields: %i[name]))
527
531
  .to eq('name' => 'Name42')
528
532
  end
529
533
 
530
534
  context 'witchcraft' do
531
- before { CitiesIndex::City.witchcraft! }
535
+ before { CitiesIndex.witchcraft! }
532
536
 
533
537
  specify do
534
- expect(CitiesIndex::City.compose(double(name: 'Name', rating: 42)))
538
+ expect(CitiesIndex.compose(double(name: 'Name', rating: 42)))
535
539
  .to eq('name' => 'Name42', 'rating' => 42)
536
540
  end
537
541
 
538
542
  specify do
539
- expect(CitiesIndex::City.compose(double(name: 'Name', rating: 42), fields: %i[name]))
543
+ expect(CitiesIndex.compose(double(name: 'Name', rating: 42), fields: %i[name]))
540
544
  .to eq('name' => 'Name42')
541
545
  end
542
546
  end
@@ -545,12 +549,12 @@ describe Chewy::Type::Import do
545
549
  let(:crutches) { double(names: {'Name' => 'Name43'}) }
546
550
 
547
551
  specify do
548
- expect(CitiesIndex::City.compose(double(name: 'Name', rating: 42), crutches))
552
+ expect(CitiesIndex.compose(double(name: 'Name', rating: 42), crutches))
549
553
  .to eq('name' => 'Name43', 'rating' => 42)
550
554
  end
551
555
 
552
556
  specify do
553
- expect(CitiesIndex::City.compose(double(name: 'Name', rating: 42), crutches, fields: %i[name]))
557
+ expect(CitiesIndex.compose(double(name: 'Name', rating: 42), crutches, fields: %i[name]))
554
558
  .to eq('name' => 'Name43')
555
559
  end
556
560
  end