chewy 8.0.0 → 8.1.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 (144) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -0
  3. data/README.md +30 -16
  4. data/lib/chewy/errors.rb +3 -0
  5. data/lib/chewy/fields/root.rb +3 -3
  6. data/lib/chewy/index/crutch.rb +12 -2
  7. data/lib/chewy/index/import/bulk_builder.rb +4 -3
  8. data/lib/chewy/index/import/routine.rb +2 -1
  9. data/lib/chewy/index/import.rb +4 -4
  10. data/lib/chewy/index/witchcraft.rb +24 -8
  11. data/lib/chewy/multi_search.rb +1 -1
  12. data/lib/chewy/search/parameters/runtime_mappings.rb +14 -0
  13. data/lib/chewy/search/request.rb +18 -2
  14. data/lib/chewy/search/scrolling.rb +14 -6
  15. data/lib/chewy/stash.rb +10 -6
  16. data/lib/chewy/version.rb +1 -1
  17. metadata +5 -131
  18. data/.github/CODEOWNERS +0 -1
  19. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -39
  20. data/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  21. data/.github/PULL_REQUEST_TEMPLATE.md +0 -16
  22. data/.github/dependabot.yml +0 -42
  23. data/.github/workflows/ruby.yml +0 -61
  24. data/.gitignore +0 -22
  25. data/.rspec +0 -2
  26. data/.rubocop.yml +0 -64
  27. data/.rubocop_todo.yml +0 -225
  28. data/.yardopts +0 -5
  29. data/CODE_OF_CONDUCT.md +0 -14
  30. data/CONTRIBUTING.md +0 -63
  31. data/Gemfile +0 -22
  32. data/Guardfile +0 -25
  33. data/Rakefile +0 -17
  34. data/chewy.gemspec +0 -24
  35. data/docker-compose.yml +0 -14
  36. data/docs/README.md +0 -16
  37. data/docs/configuration.md +0 -440
  38. data/docs/import.md +0 -122
  39. data/docs/indexing.md +0 -329
  40. data/docs/querying.md +0 -72
  41. data/docs/rake_tasks.md +0 -108
  42. data/docs/testing.md +0 -41
  43. data/docs/troubleshooting.md +0 -101
  44. data/filters +0 -78
  45. data/gemfiles/base.gemfile +0 -12
  46. data/gemfiles/rails.7.2.activerecord.gemfile +0 -14
  47. data/gemfiles/rails.8.0.activerecord.gemfile +0 -14
  48. data/migration_guide.md +0 -56
  49. data/spec/chewy/config_spec.rb +0 -110
  50. data/spec/chewy/elastic_client_spec.rb +0 -26
  51. data/spec/chewy/fields/base_spec.rb +0 -700
  52. data/spec/chewy/fields/root_spec.rb +0 -142
  53. data/spec/chewy/fields/time_fields_spec.rb +0 -28
  54. data/spec/chewy/index/actions_spec.rb +0 -851
  55. data/spec/chewy/index/adapter/active_record_spec.rb +0 -663
  56. data/spec/chewy/index/adapter/object_spec.rb +0 -243
  57. data/spec/chewy/index/aliases_spec.rb +0 -49
  58. data/spec/chewy/index/import/bulk_builder_spec.rb +0 -494
  59. data/spec/chewy/index/import/bulk_request_spec.rb +0 -95
  60. data/spec/chewy/index/import/journal_builder_spec.rb +0 -87
  61. data/spec/chewy/index/import/routine_spec.rb +0 -110
  62. data/spec/chewy/index/import_spec.rb +0 -615
  63. data/spec/chewy/index/mapping_spec.rb +0 -135
  64. data/spec/chewy/index/observe/active_record_methods_spec.rb +0 -68
  65. data/spec/chewy/index/observe/callback_spec.rb +0 -139
  66. data/spec/chewy/index/observe_spec.rb +0 -143
  67. data/spec/chewy/index/settings_spec.rb +0 -136
  68. data/spec/chewy/index/specification_spec.rb +0 -156
  69. data/spec/chewy/index/syncer_spec.rb +0 -118
  70. data/spec/chewy/index/witchcraft_spec.rb +0 -245
  71. data/spec/chewy/index/wrapper_spec.rb +0 -100
  72. data/spec/chewy/index_spec.rb +0 -269
  73. data/spec/chewy/journal_spec.rb +0 -223
  74. data/spec/chewy/minitest/helpers_spec.rb +0 -194
  75. data/spec/chewy/minitest/search_index_receiver_spec.rb +0 -120
  76. data/spec/chewy/multi_search_spec.rb +0 -84
  77. data/spec/chewy/rake_helper_spec.rb +0 -656
  78. data/spec/chewy/repository_spec.rb +0 -50
  79. data/spec/chewy/rspec/build_query_spec.rb +0 -34
  80. data/spec/chewy/rspec/helpers_spec.rb +0 -61
  81. data/spec/chewy/rspec/update_index_spec.rb +0 -313
  82. data/spec/chewy/runtime/version_spec.rb +0 -48
  83. data/spec/chewy/runtime_spec.rb +0 -9
  84. data/spec/chewy/search/loader_spec.rb +0 -83
  85. data/spec/chewy/search/pagination/kaminari_examples.rb +0 -69
  86. data/spec/chewy/search/pagination/kaminari_spec.rb +0 -21
  87. data/spec/chewy/search/parameters/aggs_spec.rb +0 -5
  88. data/spec/chewy/search/parameters/bool_storage_examples.rb +0 -53
  89. data/spec/chewy/search/parameters/collapse_spec.rb +0 -5
  90. data/spec/chewy/search/parameters/docvalue_fields_spec.rb +0 -5
  91. data/spec/chewy/search/parameters/explain_spec.rb +0 -5
  92. data/spec/chewy/search/parameters/filter_spec.rb +0 -5
  93. data/spec/chewy/search/parameters/hash_storage_examples.rb +0 -59
  94. data/spec/chewy/search/parameters/highlight_spec.rb +0 -5
  95. data/spec/chewy/search/parameters/ignore_unavailable_spec.rb +0 -67
  96. data/spec/chewy/search/parameters/indices_spec.rb +0 -99
  97. data/spec/chewy/search/parameters/integer_storage_examples.rb +0 -32
  98. data/spec/chewy/search/parameters/knn_spec.rb +0 -5
  99. data/spec/chewy/search/parameters/limit_spec.rb +0 -5
  100. data/spec/chewy/search/parameters/load_spec.rb +0 -60
  101. data/spec/chewy/search/parameters/min_score_spec.rb +0 -32
  102. data/spec/chewy/search/parameters/none_spec.rb +0 -5
  103. data/spec/chewy/search/parameters/offset_spec.rb +0 -5
  104. data/spec/chewy/search/parameters/order_spec.rb +0 -72
  105. data/spec/chewy/search/parameters/post_filter_spec.rb +0 -5
  106. data/spec/chewy/search/parameters/preference_spec.rb +0 -5
  107. data/spec/chewy/search/parameters/profile_spec.rb +0 -5
  108. data/spec/chewy/search/parameters/query_spec.rb +0 -5
  109. data/spec/chewy/search/parameters/query_storage_examples.rb +0 -434
  110. data/spec/chewy/search/parameters/request_cache_spec.rb +0 -67
  111. data/spec/chewy/search/parameters/rescore_spec.rb +0 -62
  112. data/spec/chewy/search/parameters/script_fields_spec.rb +0 -5
  113. data/spec/chewy/search/parameters/search_after_spec.rb +0 -35
  114. data/spec/chewy/search/parameters/search_type_spec.rb +0 -5
  115. data/spec/chewy/search/parameters/source_spec.rb +0 -162
  116. data/spec/chewy/search/parameters/storage_spec.rb +0 -60
  117. data/spec/chewy/search/parameters/stored_fields_spec.rb +0 -126
  118. data/spec/chewy/search/parameters/string_array_storage_examples.rb +0 -63
  119. data/spec/chewy/search/parameters/string_storage_examples.rb +0 -32
  120. data/spec/chewy/search/parameters/suggest_spec.rb +0 -5
  121. data/spec/chewy/search/parameters/terminate_after_spec.rb +0 -5
  122. data/spec/chewy/search/parameters/timeout_spec.rb +0 -5
  123. data/spec/chewy/search/parameters/track_scores_spec.rb +0 -5
  124. data/spec/chewy/search/parameters/track_total_hits_spec.rb +0 -5
  125. data/spec/chewy/search/parameters/version_spec.rb +0 -5
  126. data/spec/chewy/search/parameters_spec.rb +0 -161
  127. data/spec/chewy/search/query_proxy_spec.rb +0 -95
  128. data/spec/chewy/search/request_spec.rb +0 -886
  129. data/spec/chewy/search/response_spec.rb +0 -180
  130. data/spec/chewy/search/scrolling_spec.rb +0 -171
  131. data/spec/chewy/search_spec.rb +0 -127
  132. data/spec/chewy/stash_spec.rb +0 -85
  133. data/spec/chewy/strategy/active_job_spec.rb +0 -73
  134. data/spec/chewy/strategy/atomic_no_refresh_spec.rb +0 -60
  135. data/spec/chewy/strategy/atomic_spec.rb +0 -61
  136. data/spec/chewy/strategy/delayed_sidekiq_spec.rb +0 -225
  137. data/spec/chewy/strategy/lazy_sidekiq_spec.rb +0 -214
  138. data/spec/chewy/strategy/sidekiq_spec.rb +0 -52
  139. data/spec/chewy/strategy_spec.rb +0 -125
  140. data/spec/chewy_spec.rb +0 -100
  141. data/spec/spec_helper.rb +0 -69
  142. data/spec/support/active_record.rb +0 -124
  143. data/spec/support/class_helpers.rb +0 -16
  144. data/spec/support/fail_helpers.rb +0 -13
@@ -1,243 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Chewy::Index::Adapter::Object do
4
- before { stub_class(:product) }
5
- subject { described_class.new(:product) }
6
-
7
- describe '#name' do
8
- specify { expect(described_class.new('product').name).to eq('Product') }
9
- specify { expect(described_class.new(:products).name).to eq('Products') }
10
- specify { expect(described_class.new(Product).name).to eq('Product') }
11
- specify { expect(described_class.new(Product, name: 'house').name).to eq('House') }
12
-
13
- context do
14
- before { stub_class('namespace/product') }
15
-
16
- specify { expect(described_class.new(Namespace::Product).name).to eq('Product') }
17
- end
18
- end
19
-
20
- describe '#type_name' do
21
- specify { expect(described_class.new('product').type_name).to eq('product') }
22
- specify { expect(described_class.new(:products).type_name).to eq('products') }
23
- specify { expect(described_class.new(Product).type_name).to eq('product') }
24
- specify { expect(described_class.new(Product, name: 'house').type_name).to eq('house') }
25
-
26
- context do
27
- before { stub_class('namespace/product') }
28
-
29
- specify { expect(described_class.new(Namespace::Product).type_name).to eq('product') }
30
- end
31
- end
32
-
33
- describe '#identify' do
34
- let!(:objects) { Array.new(3) { double } }
35
-
36
- specify { expect(subject.identify(objects)).to eq(objects) }
37
- specify { expect(subject.identify(objects.first)).to eq([objects.first]) }
38
- end
39
-
40
- describe '#import' do
41
- def import(*args)
42
- result = []
43
- subject.import(*args) { |data| result.push data }
44
- result
45
- end
46
-
47
- specify { expect(subject.import(Array.new(3) { double }) { |_data| true }).to eq(true) }
48
- specify { expect(subject.import(Array.new(3) { double }) { |_data| false }).to eq(false) }
49
-
50
- context do
51
- let(:objects) { Array.new(3) { double } }
52
- let(:deleted) { Array.new(2) { double(destroyed?: true) } }
53
- subject { described_class.new('product') }
54
-
55
- specify { expect(import).to eq([]) }
56
- specify { expect(import(nil)).to eq([]) }
57
-
58
- specify { expect(import(objects)).to eq([{index: objects}]) }
59
- specify do
60
- expect(import(objects, batch_size: 2))
61
- .to eq([{index: objects.first(2)}, {index: objects.last(1)}])
62
- end
63
- specify { expect(import(objects, deleted)).to eq([{index: objects, delete: deleted}]) }
64
- specify do
65
- expect(import(objects, deleted, batch_size: 2)).to eq([
66
- {index: objects.first(2)},
67
- {index: objects.last(1), delete: deleted.first(1)},
68
- {delete: deleted.last(1)}
69
- ])
70
- end
71
-
72
- specify { expect(import(objects.first, nil)).to eq([{index: [objects.first]}]) }
73
-
74
- context 'initial data' do
75
- subject { described_class.new -> { objects } }
76
-
77
- specify { expect(import).to eq([{index: objects}]) }
78
- specify { expect(import(nil)).to eq([]) }
79
-
80
- specify { expect(import(objects[0..1])).to eq([{index: objects[0..1]}]) }
81
- specify do
82
- expect(import(batch_size: 2))
83
- .to eq([{index: objects.first(2)}, {index: objects.last(1)}])
84
- end
85
- end
86
-
87
- context do
88
- subject { described_class.new('product', delete_if: :delete?) }
89
- let(:deleted) do
90
- [
91
- double(delete?: true, destroyed?: true),
92
- double(delete?: true, destroyed?: false),
93
- double(delete?: false, destroyed?: true),
94
- double(delete?: false, destroyed?: false)
95
- ]
96
- end
97
-
98
- specify do
99
- expect(import(deleted)).to eq([
100
- {delete: deleted[0..2], index: deleted.last(1)}
101
- ])
102
- end
103
- end
104
- end
105
-
106
- context 'error handling' do
107
- let(:products) do
108
- Array.new(3) do |i|
109
- double.tap do |product|
110
- allow(product).to receive_messages(rating: i.next)
111
- end
112
- end
113
- end
114
- let(:deleted) { Array.new(2) { |i| double(destroyed?: true, rating: i + 4) } }
115
- subject { described_class.new('product') }
116
-
117
- let(:data_comparer) do
118
- ->(n, data) { (data[:index] || data[:delete]).first.rating != n }
119
- end
120
-
121
- specify { expect(subject.import(products, deleted) { |_data| true }).to eq(true) }
122
- specify { expect(subject.import(products, deleted) { |_data| false }).to eq(false) }
123
- specify { expect(subject.import(products, deleted, batch_size: 1, &data_comparer.curry[1])).to eq(false) }
124
- specify { expect(subject.import(products, deleted, batch_size: 1, &data_comparer.curry[2])).to eq(false) }
125
- specify { expect(subject.import(products, deleted, batch_size: 1, &data_comparer.curry[3])).to eq(false) }
126
- specify { expect(subject.import(products, deleted, batch_size: 1, &data_comparer.curry[4])).to eq(false) }
127
- specify { expect(subject.import(products, deleted, batch_size: 1, &data_comparer.curry[5])).to eq(false) }
128
- end
129
- end
130
-
131
- describe '#import_fields' do
132
- let!(:objects) { Array.new(3) { |i| double(id: i + 1, name: "Name#{i}") } }
133
- let!(:hashes) { Array.new(3) { |i| {id: i + 1, 'name' => "Name#{i}"} } }
134
-
135
- context do
136
- subject { described_class.new(-> { objects }) }
137
- specify { expect(subject.import_fields).to match([[1, 2, 3]]) }
138
- specify { expect(subject.import_fields(fields: [:name])).to match([[[1, 'Name0'], [2, 'Name1'], [3, 'Name2']]]) }
139
- end
140
-
141
- context do
142
- subject { described_class.new(-> { objects }) }
143
- specify { expect(subject.import_fields(batch_size: 2)).to match([[1, 2], [3]]) }
144
- specify do
145
- expect(subject.import_fields(fields: [:name], batch_size: 2))
146
- .to match([[[1, 'Name0'], [2, 'Name1']], [[3, 'Name2']]])
147
- end
148
- end
149
-
150
- context do
151
- subject { described_class.new(-> { objects }) }
152
- specify { expect(subject.import_fields(objects.first(2))).to match([[1, 2]]) }
153
- specify do
154
- expect(subject.import_fields(objects.first(2), fields: [:name])).to match([[[1, 'Name0'], [2, 'Name1']]])
155
- end
156
- end
157
-
158
- context do
159
- subject { described_class.new(-> { hashes }) }
160
- specify { expect(subject.import_fields).to match([[1, 2, 3]]) }
161
- specify { expect(subject.import_fields(fields: [:name])).to match([[[1, 'Name0'], [2, 'Name1'], [3, 'Name2']]]) }
162
- end
163
-
164
- context do
165
- subject { described_class.new(-> { [1, 2, 3] }) }
166
- specify { expect(subject.import_fields).to match([[1, 2, 3]]) }
167
- specify { expect(subject.import_fields(fields: [:name])).to match([[[1, nil], [2, nil], [3, nil]]]) }
168
- end
169
-
170
- context do
171
- before do
172
- stub_class(:product) do
173
- def self.pluck(*fields)
174
- if fields == [:id]
175
- [1, 2, 3]
176
- elsif fields.size > 1
177
- [4, 5, 6]
178
- end
179
- end
180
- end
181
- end
182
-
183
- context do
184
- subject { described_class.new(Product) }
185
- specify { expect(subject.import_fields).to match([[1, 2, 3]]) }
186
- specify { expect(subject.import_fields(fields: [:name])).to match([[4, 5, 6]]) }
187
- end
188
-
189
- context do
190
- subject { described_class.new(Product) }
191
- specify { expect(subject.import_fields(objects.first(2))).to match([[1, 2]]) }
192
- specify do
193
- expect(subject.import_fields(objects.first(2), fields: [:name])).to match([[[1, 'Name0'], [2, 'Name1']]])
194
- end
195
- end
196
-
197
- context 'batch_size' do
198
- subject { described_class.new(Product) }
199
- specify { expect(subject.import_fields(batch_size: 2)).to match([[1, 2], [3]]) }
200
- specify { expect(subject.import_fields(fields: [:name], batch_size: 2)).to match([[4, 5], [6]]) }
201
- end
202
- end
203
- end
204
-
205
- describe '#import_references' do
206
- let!(:objects) { Array.new(3) { |i| double(id: i + 1, name: "Name#{i}") } }
207
-
208
- subject { described_class.new(-> { objects }) }
209
- specify { expect(subject.import_references).to match([objects]) }
210
- specify { expect(subject.import_references(batch_size: 2)).to match([objects.first(2), objects.last(1)]) }
211
- specify { expect(subject.import_references(objects.first(2))).to match([objects.first(2)]) }
212
- specify do
213
- expect(subject.import_references(objects.first(2), batch_size: 1)).to match([objects.first(1), [objects[1]]])
214
- end
215
- end
216
-
217
- describe '#load' do
218
- subject { described_class.new(Product) }
219
- let(:objects) { (1..3).to_a }
220
-
221
- specify { expect(subject.load(objects)).to be_nil }
222
-
223
- context do
224
- before { allow(Product).to receive(:load_all) { |objects| objects.map { |i| i * 3 } } }
225
- specify { expect(subject.load(objects, value: 42)).to eq([3, 6, 9]) }
226
- end
227
-
228
- context do
229
- before { allow(Product).to receive(:load_all) { |objects, options| objects.map { |i| i * options[:value] } } }
230
- specify { expect(subject.load(objects, value: 2)).to eq([2, 4, 6]) }
231
- end
232
-
233
- context do
234
- before { allow(Product).to receive(:load_one) { |object| object + 2 } }
235
- specify { expect(subject.load(objects)).to eq((3..5).to_a) }
236
- end
237
-
238
- context do
239
- before { allow(Product).to receive(:load_one) { |object, options| object + options[:value] } }
240
- specify { expect(subject.load(objects, value: 42)).to eq((43..45).to_a) }
241
- end
242
- end
243
- end
@@ -1,49 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Chewy::Index::Aliases do
4
- before { drop_indices }
5
-
6
- before { stub_index :dummies }
7
-
8
- describe '.indexes' do
9
- specify { expect(DummiesIndex.indexes).to eq([]) }
10
-
11
- context do
12
- before { DummiesIndex.create! }
13
- specify { expect(DummiesIndex.indexes).to eq(['dummies']) }
14
- end
15
-
16
- context do
17
- before { DummiesIndex.create! }
18
- before { Chewy.client.indices.put_alias index: 'dummies', name: 'dummies_2013' }
19
- specify { expect(DummiesIndex.indexes).to eq(['dummies']) }
20
- end
21
-
22
- context do
23
- before { DummiesIndex.create! '2013' }
24
- before { DummiesIndex.create! '2014' }
25
- specify { expect(DummiesIndex.indexes).to match_array(%w[dummies_2013 dummies_2014]) }
26
- end
27
- end
28
-
29
- describe '.aliases' do
30
- specify { expect(DummiesIndex.aliases).to eq([]) }
31
-
32
- context do
33
- before { DummiesIndex.create! }
34
- specify { expect(DummiesIndex.aliases).to eq([]) }
35
- end
36
-
37
- context do
38
- before { DummiesIndex.create! }
39
- before { Chewy.client.indices.put_alias index: 'dummies', name: 'dummies_2013' }
40
- before { Chewy.client.indices.put_alias index: 'dummies', name: 'dummies_2014' }
41
- specify { expect(DummiesIndex.aliases).to match_array(%w[dummies_2013 dummies_2014]) }
42
- end
43
-
44
- context do
45
- before { DummiesIndex.create! '2013' }
46
- specify { expect(DummiesIndex.aliases).to eq(['dummies']) }
47
- end
48
- end
49
- end