chewy 6.0.0 → 7.6.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 (188) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +1 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +16 -0
  6. data/.github/dependabot.yml +42 -0
  7. data/.github/workflows/ruby.yml +60 -0
  8. data/.rubocop.yml +16 -8
  9. data/.rubocop_todo.yml +110 -22
  10. data/CHANGELOG.md +396 -105
  11. data/CODE_OF_CONDUCT.md +14 -0
  12. data/CONTRIBUTING.md +63 -0
  13. data/Gemfile +4 -10
  14. data/Guardfile +3 -1
  15. data/README.md +497 -275
  16. data/chewy.gemspec +5 -20
  17. data/gemfiles/base.gemfile +12 -0
  18. data/gemfiles/rails.6.1.activerecord.gemfile +10 -15
  19. data/gemfiles/rails.7.0.activerecord.gemfile +14 -0
  20. data/gemfiles/rails.7.1.activerecord.gemfile +14 -0
  21. data/lib/chewy/config.rb +60 -52
  22. data/lib/chewy/elastic_client.rb +31 -0
  23. data/lib/chewy/errors.rb +7 -10
  24. data/lib/chewy/fields/base.rb +79 -13
  25. data/lib/chewy/fields/root.rb +4 -14
  26. data/lib/chewy/index/actions.rb +54 -37
  27. data/lib/chewy/{type → index}/adapter/active_record.rb +30 -6
  28. data/lib/chewy/{type → index}/adapter/base.rb +2 -3
  29. data/lib/chewy/{type → index}/adapter/object.rb +27 -31
  30. data/lib/chewy/{type → index}/adapter/orm.rb +17 -18
  31. data/lib/chewy/index/aliases.rb +14 -5
  32. data/lib/chewy/index/crutch.rb +40 -0
  33. data/lib/chewy/index/import/bulk_builder.rb +311 -0
  34. data/lib/chewy/{type → index}/import/bulk_request.rb +6 -7
  35. data/lib/chewy/{type → index}/import/journal_builder.rb +11 -12
  36. data/lib/chewy/{type → index}/import/routine.rb +18 -17
  37. data/lib/chewy/{type → index}/import.rb +76 -32
  38. data/lib/chewy/{type → index}/mapping.rb +29 -34
  39. data/lib/chewy/index/observe/active_record_methods.rb +87 -0
  40. data/lib/chewy/index/observe/callback.rb +34 -0
  41. data/lib/chewy/index/observe.rb +17 -0
  42. data/lib/chewy/index/specification.rb +1 -0
  43. data/lib/chewy/{type → index}/syncer.rb +59 -59
  44. data/lib/chewy/{type → index}/witchcraft.rb +11 -7
  45. data/lib/chewy/{type → index}/wrapper.rb +2 -2
  46. data/lib/chewy/index.rb +67 -94
  47. data/lib/chewy/journal.rb +25 -14
  48. data/lib/chewy/log_subscriber.rb +5 -1
  49. data/lib/chewy/minitest/helpers.rb +86 -13
  50. data/lib/chewy/minitest/search_index_receiver.rb +24 -26
  51. data/lib/chewy/railtie.rb +6 -20
  52. data/lib/chewy/rake_helper.rb +169 -113
  53. data/lib/chewy/rspec/build_query.rb +12 -0
  54. data/lib/chewy/rspec/helpers.rb +55 -0
  55. data/lib/chewy/rspec/update_index.rb +55 -44
  56. data/lib/chewy/rspec.rb +2 -0
  57. data/lib/chewy/runtime/version.rb +1 -1
  58. data/lib/chewy/runtime.rb +1 -1
  59. data/lib/chewy/search/loader.rb +19 -41
  60. data/lib/chewy/search/parameters/collapse.rb +16 -0
  61. data/lib/chewy/search/parameters/concerns/query_storage.rb +2 -2
  62. data/lib/chewy/search/parameters/ignore_unavailable.rb +27 -0
  63. data/lib/chewy/search/parameters/indices.rb +13 -58
  64. data/lib/chewy/search/parameters/knn.rb +16 -0
  65. data/lib/chewy/search/parameters/order.rb +6 -19
  66. data/lib/chewy/search/parameters/source.rb +5 -1
  67. data/lib/chewy/search/parameters/storage.rb +1 -1
  68. data/lib/chewy/search/parameters/track_total_hits.rb +16 -0
  69. data/lib/chewy/search/parameters.rb +6 -4
  70. data/lib/chewy/search/query_proxy.rb +9 -2
  71. data/lib/chewy/search/request.rb +169 -134
  72. data/lib/chewy/search/response.rb +5 -5
  73. data/lib/chewy/search/scoping.rb +7 -8
  74. data/lib/chewy/search/scrolling.rb +13 -13
  75. data/lib/chewy/search.rb +9 -19
  76. data/lib/chewy/stash.rb +19 -30
  77. data/lib/chewy/strategy/active_job.rb +1 -1
  78. data/lib/chewy/strategy/atomic_no_refresh.rb +18 -0
  79. data/lib/chewy/strategy/base.rb +10 -0
  80. data/lib/chewy/strategy/delayed_sidekiq/scheduler.rb +168 -0
  81. data/lib/chewy/strategy/delayed_sidekiq/worker.rb +76 -0
  82. data/lib/chewy/strategy/delayed_sidekiq.rb +30 -0
  83. data/lib/chewy/strategy/lazy_sidekiq.rb +64 -0
  84. data/lib/chewy/strategy/sidekiq.rb +2 -1
  85. data/lib/chewy/strategy.rb +6 -19
  86. data/lib/chewy/version.rb +1 -1
  87. data/lib/chewy.rb +39 -86
  88. data/lib/generators/chewy/install_generator.rb +1 -1
  89. data/lib/tasks/chewy.rake +36 -32
  90. data/migration_guide.md +46 -8
  91. data/spec/chewy/config_spec.rb +16 -41
  92. data/spec/chewy/elastic_client_spec.rb +26 -0
  93. data/spec/chewy/fields/base_spec.rb +432 -147
  94. data/spec/chewy/fields/root_spec.rb +20 -28
  95. data/spec/chewy/fields/time_fields_spec.rb +5 -5
  96. data/spec/chewy/index/actions_spec.rb +368 -59
  97. data/spec/chewy/{type → index}/adapter/active_record_spec.rb +156 -40
  98. data/spec/chewy/{type → index}/adapter/object_spec.rb +21 -6
  99. data/spec/chewy/index/aliases_spec.rb +3 -3
  100. data/spec/chewy/index/import/bulk_builder_spec.rb +494 -0
  101. data/spec/chewy/{type → index}/import/bulk_request_spec.rb +5 -12
  102. data/spec/chewy/{type → index}/import/journal_builder_spec.rb +9 -19
  103. data/spec/chewy/{type → index}/import/routine_spec.rb +19 -19
  104. data/spec/chewy/{type → index}/import_spec.rb +164 -98
  105. data/spec/chewy/index/mapping_spec.rb +135 -0
  106. data/spec/chewy/index/observe/active_record_methods_spec.rb +68 -0
  107. data/spec/chewy/index/observe/callback_spec.rb +139 -0
  108. data/spec/chewy/index/observe_spec.rb +143 -0
  109. data/spec/chewy/index/settings_spec.rb +3 -1
  110. data/spec/chewy/index/specification_spec.rb +20 -30
  111. data/spec/chewy/{type → index}/syncer_spec.rb +14 -19
  112. data/spec/chewy/{type → index}/witchcraft_spec.rb +20 -22
  113. data/spec/chewy/index/wrapper_spec.rb +100 -0
  114. data/spec/chewy/index_spec.rb +60 -105
  115. data/spec/chewy/journal_spec.rb +25 -74
  116. data/spec/chewy/minitest/helpers_spec.rb +123 -15
  117. data/spec/chewy/minitest/search_index_receiver_spec.rb +28 -30
  118. data/spec/chewy/multi_search_spec.rb +4 -5
  119. data/spec/chewy/rake_helper_spec.rb +315 -55
  120. data/spec/chewy/rspec/build_query_spec.rb +34 -0
  121. data/spec/chewy/rspec/helpers_spec.rb +61 -0
  122. data/spec/chewy/rspec/update_index_spec.rb +74 -71
  123. data/spec/chewy/runtime_spec.rb +2 -2
  124. data/spec/chewy/search/loader_spec.rb +19 -53
  125. data/spec/chewy/search/pagination/kaminari_examples.rb +4 -6
  126. data/spec/chewy/search/pagination/kaminari_spec.rb +2 -2
  127. data/spec/chewy/search/parameters/collapse_spec.rb +5 -0
  128. data/spec/chewy/search/parameters/ignore_unavailable_spec.rb +67 -0
  129. data/spec/chewy/search/parameters/indices_spec.rb +26 -117
  130. data/spec/chewy/search/parameters/knn_spec.rb +5 -0
  131. data/spec/chewy/search/parameters/order_spec.rb +18 -11
  132. data/spec/chewy/search/parameters/query_storage_examples.rb +67 -21
  133. data/spec/chewy/search/parameters/search_after_spec.rb +4 -1
  134. data/spec/chewy/search/parameters/source_spec.rb +8 -2
  135. data/spec/chewy/search/parameters/track_total_hits_spec.rb +5 -0
  136. data/spec/chewy/search/parameters_spec.rb +18 -4
  137. data/spec/chewy/search/query_proxy_spec.rb +68 -17
  138. data/spec/chewy/search/request_spec.rb +292 -110
  139. data/spec/chewy/search/response_spec.rb +12 -12
  140. data/spec/chewy/search/scrolling_spec.rb +10 -17
  141. data/spec/chewy/search_spec.rb +40 -34
  142. data/spec/chewy/stash_spec.rb +9 -21
  143. data/spec/chewy/strategy/active_job_spec.rb +16 -16
  144. data/spec/chewy/strategy/atomic_no_refresh_spec.rb +60 -0
  145. data/spec/chewy/strategy/atomic_spec.rb +9 -10
  146. data/spec/chewy/strategy/delayed_sidekiq_spec.rb +208 -0
  147. data/spec/chewy/strategy/lazy_sidekiq_spec.rb +214 -0
  148. data/spec/chewy/strategy/sidekiq_spec.rb +12 -12
  149. data/spec/chewy/strategy_spec.rb +19 -15
  150. data/spec/chewy_spec.rb +24 -107
  151. data/spec/spec_helper.rb +3 -22
  152. data/spec/support/active_record.rb +25 -7
  153. metadata +78 -339
  154. data/.circleci/config.yml +0 -240
  155. data/Appraisals +0 -81
  156. data/gemfiles/rails.5.2.activerecord.gemfile +0 -17
  157. data/gemfiles/rails.5.2.mongoid.6.4.gemfile +0 -17
  158. data/gemfiles/rails.6.0.activerecord.gemfile +0 -17
  159. data/gemfiles/sequel.4.45.gemfile +0 -11
  160. data/lib/chewy/backports/deep_dup.rb +0 -46
  161. data/lib/chewy/backports/duplicable.rb +0 -91
  162. data/lib/chewy/search/pagination/will_paginate.rb +0 -43
  163. data/lib/chewy/search/parameters/types.rb +0 -20
  164. data/lib/chewy/strategy/resque.rb +0 -27
  165. data/lib/chewy/strategy/shoryuken.rb +0 -40
  166. data/lib/chewy/type/actions.rb +0 -43
  167. data/lib/chewy/type/adapter/mongoid.rb +0 -67
  168. data/lib/chewy/type/adapter/sequel.rb +0 -93
  169. data/lib/chewy/type/crutch.rb +0 -32
  170. data/lib/chewy/type/import/bulk_builder.rb +0 -122
  171. data/lib/chewy/type/observe.rb +0 -82
  172. data/lib/chewy/type.rb +0 -120
  173. data/lib/sequel/plugins/chewy_observe.rb +0 -63
  174. data/spec/chewy/search/pagination/will_paginate_examples.rb +0 -63
  175. data/spec/chewy/search/pagination/will_paginate_spec.rb +0 -23
  176. data/spec/chewy/search/parameters/types_spec.rb +0 -5
  177. data/spec/chewy/strategy/resque_spec.rb +0 -46
  178. data/spec/chewy/strategy/shoryuken_spec.rb +0 -70
  179. data/spec/chewy/type/actions_spec.rb +0 -50
  180. data/spec/chewy/type/adapter/mongoid_spec.rb +0 -372
  181. data/spec/chewy/type/adapter/sequel_spec.rb +0 -472
  182. data/spec/chewy/type/import/bulk_builder_spec.rb +0 -194
  183. data/spec/chewy/type/mapping_spec.rb +0 -175
  184. data/spec/chewy/type/observe_spec.rb +0 -137
  185. data/spec/chewy/type/wrapper_spec.rb +0 -100
  186. data/spec/chewy/type_spec.rb +0 -55
  187. data/spec/support/mongoid.rb +0 -93
  188. data/spec/support/sequel.rb +0 -80
@@ -13,7 +13,7 @@ describe Chewy::Fields::Root do
13
13
  field.dynamic_template template_42: {mapping: {}, match: ''}
14
14
  field.dynamic_template(/hello\..*/)
15
15
 
16
- expect(field.mappings_hash).to eq(product: {dynamic_templates: [
16
+ expect(field.mappings_hash).to eq(dynamic_templates: [
17
17
  {template_1: {mapping: {type: 'keyword'}, match: 'hello'}},
18
18
  {template_2: {mapping: {}, match_mapping_type: 'integer', match: 'hello*'}},
19
19
  {template_3: {mapping: {}, path_match: 'hello.*'}},
@@ -21,7 +21,7 @@ describe Chewy::Fields::Root do
21
21
  {template_5: {mapping: {}, match: 'hello.*', match_pattern: 'regexp'}},
22
22
  {template_42: {mapping: {}, match: ''}},
23
23
  {template_7: {mapping: {}, path_match: 'hello\..*', match_pattern: 'regexp'}}
24
- ]})
24
+ ])
25
25
  end
26
26
 
27
27
  context do
@@ -33,10 +33,10 @@ describe Chewy::Fields::Root do
33
33
 
34
34
  specify do
35
35
  field.dynamic_template 'hello', type: 'keyword'
36
- expect(field.mappings_hash).to eq(product: {dynamic_templates: [
36
+ expect(field.mappings_hash).to eq(dynamic_templates: [
37
37
  {template_42: {mapping: {}, match: ''}},
38
38
  {template_1: {mapping: {type: 'keyword'}, match: 'hello'}}
39
- ]})
39
+ ])
40
40
  end
41
41
  end
42
42
  end
@@ -46,18 +46,18 @@ describe Chewy::Fields::Root do
46
46
  before do
47
47
  stub_model(:city)
48
48
  stub_index(:places) do
49
- define_type City
49
+ index_scope City
50
50
  end
51
51
  end
52
52
 
53
53
  let(:city) { City.new(name: 'London', rating: 100) }
54
54
 
55
55
  specify do
56
- expect(PlacesIndex::City.root.compose(city))
56
+ expect(PlacesIndex.root.compose(city))
57
57
  .to match(hash_including('name' => 'London', 'rating' => 100))
58
58
  end
59
59
  specify do
60
- expect(PlacesIndex::City.root.compose(city, fields: %i[name borogoves]))
60
+ expect(PlacesIndex.root.compose(city, fields: %i[name borogoves]))
61
61
  .to eq('name' => 'London')
62
62
  end
63
63
  end
@@ -65,20 +65,18 @@ describe Chewy::Fields::Root do
65
65
  context 'has children' do
66
66
  before do
67
67
  stub_index(:places) do
68
- define_type :city do
69
- field :name, :rating
70
- end
68
+ field :name, :rating
71
69
  end
72
70
  end
73
71
 
74
72
  let(:city) { double(name: 'London', rating: 100) }
75
73
 
76
74
  specify do
77
- expect(PlacesIndex::City.root.compose(city))
75
+ expect(PlacesIndex.root.compose(city))
78
76
  .to eq('name' => 'London', 'rating' => 100)
79
77
  end
80
78
  specify do
81
- expect(PlacesIndex::City.root.compose(city, fields: %i[name borogoves]))
79
+ expect(PlacesIndex.root.compose(city, fields: %i[name borogoves]))
82
80
  .to eq('name' => 'London')
83
81
  end
84
82
  end
@@ -86,21 +84,19 @@ describe Chewy::Fields::Root do
86
84
  context 'root value provided' do
87
85
  before do
88
86
  stub_index(:places) do
89
- define_type :city do
90
- root value: ->(o) { {name: o.name + 'Modified', rating: o.rating.next} }
91
- end
87
+ root value: ->(o) { {name: "#{o.name}Modified", rating: o.rating.next} }
92
88
  end
93
89
  end
94
90
 
95
91
  let(:city) { double(name: 'London', rating: 100) }
96
92
 
97
93
  specify do
98
- expect(PlacesIndex::City.root.compose(city))
94
+ expect(PlacesIndex.root.compose(city))
99
95
  .to eq('name' => 'LondonModified', 'rating' => 101)
100
96
  end
101
97
 
102
98
  specify do
103
- expect(PlacesIndex::City.root.compose(city, fields: %i[name borogoves]))
99
+ expect(PlacesIndex.root.compose(city, fields: %i[name borogoves]))
104
100
  .to eq('name' => 'LondonModified')
105
101
  end
106
102
  end
@@ -108,11 +104,9 @@ describe Chewy::Fields::Root do
108
104
  context 'complex evaluations' do
109
105
  before do
110
106
  stub_index(:places) do
111
- define_type :city do
112
- root value: ->(o) { {name: o.name + 'Modified', rating: o.rating.next} } do
113
- field :name, value: ->(o) { o[:name] + 'Modified' }
114
- field :rating
115
- end
107
+ root value: ->(o) { {name: "#{o.name}Modified", rating: o.rating.next} } do
108
+ field :name, value: ->(o) { "#{o[:name]}Modified" }
109
+ field :rating
116
110
  end
117
111
  end
118
112
  end
@@ -120,12 +114,12 @@ describe Chewy::Fields::Root do
120
114
  let(:city) { double(name: 'London', rating: 100) }
121
115
 
122
116
  specify do
123
- expect(PlacesIndex::City.root.compose(city))
117
+ expect(PlacesIndex.root.compose(city))
124
118
  .to eq('name' => 'LondonModifiedModified', 'rating' => 101)
125
119
  end
126
120
 
127
121
  specify do
128
- expect(PlacesIndex::City.root.compose(city, fields: %i[name borogoves]))
122
+ expect(PlacesIndex.root.compose(city, fields: %i[name borogoves]))
129
123
  .to eq('name' => 'LondonModifiedModified')
130
124
  end
131
125
  end
@@ -134,14 +128,12 @@ describe Chewy::Fields::Root do
134
128
  describe '#child_hash' do
135
129
  before do
136
130
  stub_index(:places) do
137
- define_type :city do
138
- field :name, :rating
139
- end
131
+ field :name, :rating
140
132
  end
141
133
  end
142
134
 
143
135
  specify do
144
- expect(PlacesIndex::City.root.child_hash).to match(
136
+ expect(PlacesIndex.root.child_hash).to match(
145
137
  name: an_instance_of(Chewy::Fields::Base).and(have_attributes(name: :name)),
146
138
  rating: an_instance_of(Chewy::Fields::Base).and(have_attributes(name: :rating))
147
139
  )
@@ -5,14 +5,12 @@ describe 'Time fields' do
5
5
 
6
6
  before do
7
7
  stub_index(:posts) do
8
- define_type :post do
9
- field :published_at, type: 'date'
10
- end
8
+ field :published_at, type: 'date'
11
9
  end
12
10
  end
13
11
 
14
12
  before do
15
- PostsIndex::Post.import(
13
+ PostsIndex.import(
16
14
  double(published_at: ActiveSupport::TimeZone[-28_800].parse('2014/12/18 19:00')),
17
15
  double(published_at: ActiveSupport::TimeZone[-21_600].parse('2014/12/18 20:00')),
18
16
  double(published_at: ActiveSupport::TimeZone[-21_600].parse('2014/12/17 20:00'))
@@ -24,5 +22,7 @@ describe 'Time fields' do
24
22
 
25
23
  specify { expect(PostsIndex.total).to eq(3) }
26
24
  specify { expect(PostsIndex.filter(range: {published_at: {gte: range.min, lte: range.max}}).size).to eq(1) }
27
- specify { expect(PostsIndex.filter(range: {published_at: {gt: range.min.utc, lt: (range.max + 1.hour).utc}}).size).to eq(2) }
25
+ specify do
26
+ expect(PostsIndex.filter(range: {published_at: {gt: range.min.utc, lt: (range.max + 1.hour).utc}}).size).to eq(2)
27
+ end
28
28
  end