chewy 6.0.0 → 7.5.1

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 +48 -0
  8. data/.rubocop.yml +16 -8
  9. data/.rubocop_todo.yml +110 -22
  10. data/CHANGELOG.md +385 -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 +494 -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 +58 -50
  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 +151 -0
  81. data/lib/chewy/strategy/delayed_sidekiq/worker.rb +52 -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 +14 -39
  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 +202 -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
data/spec/chewy_spec.rb CHANGED
@@ -5,115 +5,29 @@ describe Chewy do
5
5
  expect(Chewy::VERSION).not_to be nil
6
6
  end
7
7
 
8
- describe '.derive_type' do
8
+ describe '.derive_name' do
9
9
  before do
10
10
  stub_const('SomeIndex', Class.new)
11
11
 
12
- stub_index(:developers) do
13
- define_type :developer
14
- end
15
-
16
- stub_index('namespace/autocomplete') do
17
- define_type :developer
18
- end
19
- end
20
-
21
- specify { expect { described_class.derive_type('some#developers') }.to raise_error(Chewy::UnderivableType, /SomeIndex/) }
22
- specify { expect { described_class.derive_type('borogoves#developers') }.to raise_error(Chewy::UnderivableType, /Borogoves/) }
23
- specify { expect { described_class.derive_type('developers#borogoves') }.to raise_error(Chewy::UnderivableType, /DevelopersIndex.*borogoves/) }
24
-
25
- specify { expect(described_class.derive_type(DevelopersIndex::Developer)).to eq(DevelopersIndex::Developer) }
26
- specify { expect(described_class.derive_type('developers_index')).to eq(DevelopersIndex::Developer) }
27
- specify { expect(described_class.derive_type('developers')).to eq(DevelopersIndex::Developer) }
28
- specify { expect(described_class.derive_type('developers#developer')).to eq(DevelopersIndex::Developer) }
29
- specify { expect(described_class.derive_type('namespace/autocomplete#developer')).to eq(Namespace::AutocompleteIndex::Developer) }
30
- end
31
-
32
- describe '.derive_types' do
33
- before do
34
- stub_const('SomeIndex', Class.new)
35
-
36
- stub_index(:developers) do
37
- define_type :developer
38
- end
39
-
40
- stub_index('namespace/autocomplete') do
41
- define_type :developer
42
- end
43
- end
44
-
45
- specify { expect { described_class.derive_types('some#developers') }.to raise_error(Chewy::UnderivableType, /SomeIndex/) }
46
- specify { expect { described_class.derive_types('borogoves#developers') }.to raise_error(Chewy::UnderivableType, /Borogoves/) }
47
- specify { expect { described_class.derive_types('developers#borogoves') }.to raise_error(Chewy::UnderivableType, /DevelopersIndex.*borogoves/) }
48
-
49
- specify { expect(described_class.derive_types(Namespace::AutocompleteIndex)).to match_array(Namespace::AutocompleteIndex.types) }
50
- specify { expect(described_class.derive_types(DevelopersIndex::Developer)).to eq([DevelopersIndex::Developer]) }
51
-
52
- specify { expect(described_class.derive_types('developers_index')).to eq([DevelopersIndex::Developer]) }
53
- specify { expect(described_class.derive_types('developers')).to eq([DevelopersIndex::Developer]) }
54
- specify { expect(described_class.derive_types('developers#developer')).to eq([DevelopersIndex::Developer]) }
55
- specify { expect(described_class.derive_types('namespace/autocomplete')).to match_array(Namespace::AutocompleteIndex.types) }
56
- specify { expect(described_class.derive_types('namespace/autocomplete#developer')).to eq([Namespace::AutocompleteIndex::Developer]) }
57
- end
12
+ stub_index(:developers)
58
13
 
59
- describe '.create_type' do
60
- before { stub_index(:cities) }
61
-
62
- context 'Symbol' do
63
- subject { described_class.create_type(CitiesIndex, :city) }
64
-
65
- it { is_expected.to be_a Class }
66
- it { is_expected.to be < Chewy::Type }
67
- its(:name) { should == 'CitiesIndex::City' }
68
- its(:index) { should == CitiesIndex }
69
- its(:type_name) { should == 'city' }
70
- end
71
-
72
- context 'simple model' do
73
- before { stub_class(:city) }
74
- subject { described_class.create_type(CitiesIndex, City) }
75
-
76
- it { is_expected.to be_a Class }
77
- it { is_expected.to be < Chewy::Type }
78
- its(:name) { should == 'CitiesIndex::City' }
79
- its(:index) { should == CitiesIndex }
80
- its(:type_name) { should == 'city' }
14
+ stub_index('namespace/autocomplete')
81
15
  end
82
16
 
83
- context 'model scope', :orm do
84
- before { stub_model(:city) }
85
- subject { described_class.create_type(CitiesIndex, City.where(rating: 1)) }
86
-
87
- it { is_expected.to be_a Class }
88
- it { is_expected.to be < Chewy::Type }
89
- its(:name) { should == 'CitiesIndex::City' }
90
- its(:index) { should == CitiesIndex }
91
- its(:type_name) { should == 'city' }
17
+ specify do
18
+ expect { described_class.derive_name('some') }
19
+ .to raise_error(Chewy::UndefinedIndex, /SomeIndex/)
92
20
  end
93
-
94
- context 'Namespaced index' do
95
- before { stub_class(:city) }
96
- before { stub_index('namespace/cities') }
97
-
98
- subject { described_class.create_type(Namespace::CitiesIndex, City) }
99
-
100
- it { is_expected.to be_a Class }
101
- it { is_expected.to be < Chewy::Type }
102
- its(:name) { should == 'Namespace::CitiesIndex::City' }
103
- its(:index) { should == Namespace::CitiesIndex }
104
- its(:type_name) { should == 'city' }
21
+ specify do
22
+ expect { described_class.derive_name('borogoves') }
23
+ .to raise_error(Chewy::UndefinedIndex, /Borogoves/)
105
24
  end
106
25
 
107
- context 'Namespaced model' do
108
- before { stub_class('namespace/city') }
109
-
110
- subject { described_class.create_type(CitiesIndex, Namespace::City) }
111
-
112
- it { is_expected.to be_a Class }
113
- it { is_expected.to be < Chewy::Type }
114
- its(:name) { should == 'CitiesIndex::City' }
115
- its(:index) { should == CitiesIndex }
116
- its(:type_name) { should == 'city' }
26
+ specify { expect(described_class.derive_name(DevelopersIndex)).to eq(DevelopersIndex) }
27
+ specify { expect(described_class.derive_name('developers_index')).to eq(DevelopersIndex) }
28
+ specify { expect(described_class.derive_name('developers')).to eq(DevelopersIndex) }
29
+ specify do
30
+ expect(described_class.derive_name('namespace/autocomplete')).to eq(Namespace::AutocompleteIndex)
117
31
  end
118
32
  end
119
33
 
@@ -136,27 +50,30 @@ describe Chewy do
136
50
  end
137
51
 
138
52
  describe '.client' do
139
- let!(:initial_client) { Thread.current[:chewy_client] }
53
+ let!(:initial_client) { Chewy.current[:chewy_client] }
140
54
  let(:faraday_block) { proc {} }
141
55
  let(:mock_client) { double(:client) }
142
56
  let(:expected_client_config) { {transport_options: {}} }
143
57
 
144
58
  before do
145
- Thread.current[:chewy_client] = nil
146
- allow(Chewy).to receive_messages(configuration: {transport_options: {proc: faraday_block}})
59
+ Chewy.current[:chewy_client] = nil
60
+ end
147
61
 
148
- allow(::Elasticsearch::Client).to receive(:new).with(expected_client_config) do |*_args, &passed_block|
62
+ specify do
63
+ expect(Chewy).to receive_messages(configuration: {transport_options: {proc: faraday_block}})
64
+
65
+ expect(Elasticsearch::Client).to receive(:new).with(expected_client_config) do |*_args, &passed_block|
149
66
  # RSpec's `with(..., &block)` was used previously, but doesn't actually do
150
67
  # any verification of the passed block (even of its presence).
151
68
  expect(passed_block.source_location).to eq(faraday_block.source_location)
152
69
 
153
70
  mock_client
154
71
  end
155
- end
156
72
 
157
- its(:client) { is_expected.to eq(mock_client) }
73
+ expect(Chewy.client).to be_a(Chewy::ElasticClient)
74
+ end
158
75
 
159
- after { Thread.current[:chewy_client] = initial_client }
76
+ after { Chewy.current[:chewy_client] = initial_client }
160
77
  end
161
78
 
162
79
  describe '.create_indices' do
data/spec/spec_helper.rb CHANGED
@@ -2,19 +2,14 @@ require 'bundler'
2
2
 
3
3
  Bundler.require
4
4
 
5
- begin
6
- require 'active_record'
7
- require 'sequel'
8
- rescue LoadError
9
- nil
10
- end
5
+ require 'active_record'
11
6
 
12
7
  require 'rspec/its'
13
8
  require 'rspec/collection_matchers'
14
9
 
15
10
  require 'timecop'
16
11
 
17
- Kaminari::Hooks.init if defined?(::Kaminari::Hooks)
12
+ Kaminari::Hooks.init if defined?(Kaminari::Hooks)
18
13
 
19
14
  require 'support/fail_helpers'
20
15
  require 'support/class_helpers'
@@ -43,20 +38,6 @@ RSpec.configure do |config|
43
38
 
44
39
  config.include FailHelpers
45
40
  config.include ClassHelpers
46
-
47
- Aws.config.update(stub_responses: true) if defined?(::Aws)
48
41
  end
49
42
 
50
- if defined?(::ActiveRecord)
51
- require 'support/active_record'
52
- elsif defined?(::Mongoid)
53
- require 'support/mongoid'
54
- elsif defined?(::Sequel)
55
- require 'support/sequel'
56
- else
57
- RSpec.configure do |config|
58
- %i[orm mongoid active_record sequel].each do |group|
59
- config.filter_run_excluding(group)
60
- end
61
- end
62
- end
43
+ require 'support/active_record'
@@ -1,11 +1,14 @@
1
1
  require 'database_cleaner'
2
2
 
3
- ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: 'file::memory:?cache=shared', pool: 10)
3
+ ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:', pool: 10)
4
4
  ActiveRecord::Base.logger = Logger.new('/dev/null')
5
- ActiveRecord::Base.raise_in_transactional_callbacks = true if ActiveRecord::Base.respond_to?(:raise_in_transactional_callbacks)
5
+ if ActiveRecord::Base.respond_to?(:raise_in_transactional_callbacks)
6
+ ActiveRecord::Base.raise_in_transactional_callbacks = true
7
+ end
6
8
 
7
9
  ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS 'countries'")
8
10
  ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS 'cities'")
11
+ ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS 'locations'")
9
12
  ActiveRecord::Schema.define do
10
13
  create_table :countries do |t|
11
14
  t.column :name, :string
@@ -17,9 +20,24 @@ ActiveRecord::Schema.define do
17
20
  create_table :cities do |t|
18
21
  t.column :country_id, :integer
19
22
  t.column :name, :string
23
+ t.column :historical_name, :string
24
+ t.column :description, :string
20
25
  t.column :rating, :integer
21
26
  t.column :updated_at, :datetime
22
27
  end
28
+
29
+ create_table :locations do |t|
30
+ t.column :city_id, :integer
31
+ t.column :lat, :string
32
+ t.column :lon, :string
33
+ end
34
+
35
+ create_table :comments do |t|
36
+ t.column :content, :string
37
+ t.column :comment_type, :string
38
+ t.column :commented_id, :integer
39
+ t.column :updated_at, :datetime
40
+ end
23
41
  end
24
42
 
25
43
  module ActiveRecordClassHelpers
@@ -39,14 +57,17 @@ module ActiveRecordClassHelpers
39
57
  raise 'Expected some db queries, but none were made' unless have_queries
40
58
  end
41
59
 
42
- def expects_no_query(&block)
60
+ def expects_no_query(except: nil, &block)
43
61
  queries = []
44
62
  ActiveSupport::Notifications.subscribed(
45
63
  ->(*args) { queries << args[4][:sql] },
46
64
  'sql.active_record',
47
65
  &block
48
66
  )
49
- raise "Expected no DB queries, but the following ones were made: #{queries.join(', ')}" if queries.present?
67
+ ofending_queries = except ? queries.find_all { |query| !query.match(except) } : queries
68
+ if ofending_queries.present?
69
+ raise "Expected no DB queries, but the following ones were made: #{ofending_queries.join(', ')}"
70
+ end
50
71
  end
51
72
 
52
73
  def stub_model(name, superclass = nil, &block)
@@ -57,9 +78,6 @@ end
57
78
  RSpec.configure do |config|
58
79
  config.include ActiveRecordClassHelpers
59
80
 
60
- config.filter_run_excluding :mongoid
61
- config.filter_run_excluding :sequel
62
-
63
81
  config.before(:suite) do
64
82
  DatabaseCleaner.clean_with :truncation
65
83
  DatabaseCleaner.strategy = :truncation