rspec-activerecord-expectations 1.1.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0ed8bce8c2576663b3d187efc7ae064c239c9ab8f3e6dacae592563ea4c484fb
4
- data.tar.gz: 9e67c875fd8dcab13a8e0ed56b34f842519f1af4f0037f5c8955970cc82f2850
3
+ metadata.gz: a6e24b218adcab0f1e6fb117d66463a2cdf60996fe5c16f60d48f8efd37c3259
4
+ data.tar.gz: 4f0acb5f4c489f4b2ded11b7d27a1bec613d231b04d836f651a26daf1bdb5bb1
5
5
  SHA512:
6
- metadata.gz: 0ea389afd2110fbaca8c2215507874e1fed2ad1e1f5dae167baaf532d56f91bcfa3f7458a88a71e6ce2de341160ba0fe3f3a25c786641204ebda1f3fe2db707c
7
- data.tar.gz: 9ace14690c79ee0ca1e5c9a3841a9769d58b315685e811b253d393c2a5858294153cf1b0e88471b584112391b351173163cd4d6326920654e35d3aac83c6cf77
6
+ metadata.gz: d077a6aa43e9f243a4be0d5b4db338a2aa3272e49974b8cc9b987499571de846e6f5cbc4c9d1f4d3d58d50b1d91ce3d361f2719ee3073ae8eeeee589a62d3e8c
7
+ data.tar.gz: 4473b4f016d10ca617e4ef5b3b1550c44903a170e9fde1291a88097a264028a0e21383fa37324f063c9529412c52e70e6fb24fab9e7a6df2382568f6a763fbc5
@@ -11,22 +11,22 @@ jobs:
11
11
  strategy:
12
12
  matrix:
13
13
  os: [ubuntu-latest, macos-latest]
14
- ruby_version: ['3.0', '2.7']
14
+ ruby-version: ['3.1', '3.0', '2.7']
15
15
  rails: ['5.0', '5.1', '5.2', '6.0', '6.1', '7.0']
16
16
 
17
17
  runs-on: ${{ matrix.os }}
18
- name: Test ruby ${{ matrix.ruby_version }} / rails ${{ matrix.rails }} / ${{ matrix.os }}
18
+ name: ruby ${{ matrix.ruby-version }}, rails ${{ matrix.rails }}, ${{ matrix.os }}
19
19
 
20
20
  steps:
21
21
  - uses: actions/checkout@v2
22
22
 
23
- - name: Set up Ruby ${{ matrix.ruby_version }}
23
+ - name: Set up Ruby ${{ matrix.ruby-version }}
24
24
  uses: ruby/setup-ruby@v1
25
25
  with:
26
- ruby_version: ${{ matrix.ruby_version }}
26
+ ruby-version: ${{ matrix.ruby-version }}
27
27
  bundler-cache: true
28
28
 
29
- - name: Install correct gems / rails version
29
+ - name: Install Gems w/ Rails ${{ matrix.rails }}
30
30
  env:
31
31
  MATRIX_RAILS_VERSION: ${{ matrix.rails }}
32
32
  run: |
@@ -40,23 +40,51 @@ jobs:
40
40
  test_legacy:
41
41
  strategy:
42
42
  matrix:
43
- os: [ubuntu-latest, macos-latest]
44
- ruby_version: ['2.6', '2.5', '2.4', '2.3']
43
+ ruby-version: ['2.6', '2.5']
45
44
  rails: ['5.0', '5.1', '5.2']
46
45
 
47
- runs-on: ${{ matrix.os }}
48
- name: Test Legacy ruby ${{ matrix.ruby }} / rails ${{ matrix.rails }} / ${{ matrix.os }}
46
+ runs-on: ubuntu-latest
47
+ name: ruby ${{ matrix.ruby-version }}, rails ${{ matrix.rails }}
48
+
49
+ steps:
50
+ - uses: actions/checkout@v2
51
+
52
+ - name: Set up Ruby ${{ matrix.ruby-version }}
53
+ uses: ruby/setup-ruby@v1
54
+ with:
55
+ ruby-version: ${{ matrix.ruby-version }}
56
+ bundler-cache: true
57
+
58
+ - name: Install Gems w/ Rails ${{ matrix.rails }}
59
+ env:
60
+ MATRIX_RAILS_VERSION: ${{ matrix.rails }}
61
+ run: |
62
+ export BUNDLE_GEMFILE="${GITHUB_WORKSPACE}/gemfiles/rails_${MATRIX_RAILS_VERSION}.gemfile"
63
+ gem install bundler
64
+ bundle install --jobs 4 --retry 3
65
+
66
+ - name: Run tests
67
+ run: bundle exec rspec
68
+
69
+ test_alt_rubies:
70
+ strategy:
71
+ matrix:
72
+ ruby-version: ['jruby', 'truffleruby']
73
+ rails: ['6.0', '6.1'] # jruby / jdbc-sqlite3 end up tightly bound to rails 6.x
74
+
75
+ runs-on: ubuntu-latest
76
+ name: ${{ matrix.ruby-version }}, rails ${{ matrix.rails }}
49
77
 
50
78
  steps:
51
79
  - uses: actions/checkout@v2
52
80
 
53
- - name: Set up Ruby ${{ matrix.ruby_version }}
81
+ - name: Set up Ruby ${{ matrix.ruby-version }}
54
82
  uses: ruby/setup-ruby@v1
55
83
  with:
56
- ruby_version: ${{ matrix.ruby_version }}
84
+ ruby-version: ${{ matrix.ruby-version }}
57
85
  bundler-cache: true
58
86
 
59
- - name: Install correct gems / rails version
87
+ - name: Install Gems w/ Rails ${{ matrix.rails }}
60
88
  env:
61
89
  MATRIX_RAILS_VERSION: ${{ matrix.rails }}
62
90
  run: |
@@ -66,3 +94,4 @@ jobs:
66
94
 
67
95
  - name: Run tests
68
96
  run: bundle exec rspec
97
+
data/CHANGELOG.md CHANGED
@@ -1,13 +1,37 @@
1
1
  # Changelog
2
2
 
3
- ## [1.1.0] - 2020-12-30
4
- - Add matchers for less_than_or_equal_to, greater_than
3
+ ## [2.1.1] - 2022-01-12
4
+ - Gemspec is really generated using the version of ruby that's locally in use.
5
+ Update that build artifact to use non-java dependencies.
5
6
 
6
- ## [1.0.1] - 2020-12-30
7
+ ## [2.1.0] - 2022-01-12
8
+ - Change CI matrix for more version compatibility
9
+ - Update gemspec to move some deps into development only
10
+ - README changes
11
+
12
+ ## [2.0.0] - 2022-01-07
13
+ - Require much more recent ruby, to use syntax that's been around since 2017
14
+
15
+ ## [1.3.0] - 2021-12-31
16
+ - Add `repeatedly_load` matcher
17
+ - Add query type matchers for `load_queries`, `schema_queries`, `transaction_queries`, `destroy_queries`
18
+ - Allow singular version of all query types (e.g. `transaction_queries` vs `transaction_query`)
19
+ - Fix failure message for `execute.exactly` matcher
20
+
21
+ ## [1.2.0] - 2021-12-31
22
+ - Add `query` as a synonym for `queries`
23
+ - Ignore schema and transaction queries in query count
24
+ - Add beginning of recording specific query types
25
+ - Add query count matcher for `exactly`
26
+
27
+ ## [1.1.0] - 2021-12-30
28
+ - Add query count matchers for e.g. `less_than_or_equal_to`, `greater_than`
29
+
30
+ ## [1.0.1] - 2021-12-30
7
31
  - Pin all the dependencies to a proper working subset
8
32
  - Expand testing to many rails / ruby combinations
9
33
 
10
- ## [1.0.0] - 2020-12-30
34
+ ## [1.0.0] - 2021-12-30
11
35
  - Basic gem w/ all the fixins and README and such
12
36
  - Add `less_than` comparison, and `queries` type
13
37
  - Basic tests in place, and not bad tbh
data/README.md CHANGED
@@ -30,7 +30,8 @@ group 'test' do
30
30
  end
31
31
  ```
32
32
 
33
- Then, include the functionality within your spec helper (or in a support file).
33
+ Then, include the functionality within your `rails_helper.rb` (or in a support
34
+ file).
34
35
 
35
36
  ```ruby
36
37
  RSpec.configure do |config|
@@ -91,9 +92,52 @@ That's it! Refactor your report to be more efficient and then leave the test in
91
92
  place to make sure that future developers don't accidentally cause a
92
93
  performance regression.
93
94
 
94
- ## Supported Matchers
95
+ ## Preventing Repeated Load (N+1) Queries
95
96
 
96
- Listed along with their aliases.
97
+ Reloading, whether by e.g. `Album.find` or `album.tracks` are both antipatterns
98
+ within your code. They will load from the database for every iteration in a
99
+ loop, unless you load records outside the loop, cache responses, or use an
100
+ eager loading mechanism like `includes`. These sorts of queries are often
101
+ referred to as N+1 queries.
102
+
103
+ This sort of query can be prevented using the `repeatedly_load` expectation.
104
+
105
+ ```ruby
106
+ expect {}.not_to repeatedly_load('SomeActiveRecordClass')
107
+ ```
108
+
109
+ This matcher will track ActiveRecord's built in load methods to prevent those
110
+ N+1 situations. Using eager loading (e.g. `Track.all.includes(:album)`) will
111
+ allow these expectations to pass as expected!
112
+
113
+ ### Testing Batch Queries
114
+
115
+ If your code loads records in batches, it may be more difficult to create
116
+ expectations for repeated loading. After all, each batch will execute its own
117
+ queries, which may look like repeated loading.
118
+
119
+ If your test has a small enough number of records that only one batch is
120
+ loaded, your tests may work just fine. But otherwise, you may want to allow
121
+ your code to specify a batch size in order to guarantee only a single batch
122
+ is loaded.
123
+
124
+ ```ruby
125
+ tracks = Track.all
126
+
127
+ expect {
128
+ TrackSerializer.perform(tracks, batch_size: tracks.count)
129
+ }.not_to repeatedly_load('Track')
130
+ ```
131
+
132
+ ## Counting Queries
133
+
134
+ Some services won't necessarily have N+1 issues with records loading, but might
135
+ still have problems with executing too many queries. In this case, the
136
+ `repeatedly_load` matcher might be insufficient.
137
+
138
+ In this case, consider creating an expectation on the total number of queries
139
+ executed by your code. Several comparison types are available, along with some
140
+ aliases to allow for easier to read tests.
97
141
 
98
142
  ```ruby
99
143
  expect {}.to execute.less_than(20).queries
@@ -107,22 +151,47 @@ expect {}.to execute.more_than(20).queries
107
151
 
108
152
  expect {}.to execute.greater_than_or_equal_to(20).queries
109
153
  expect {}.to execute.at_least(20).queries
154
+
155
+ expect {}.to execute.exactly(20).queries
156
+
157
+ expect {}.to execute.at_least(2).queries
158
+ expect {}.to execute.at_least(1).query # singular form also accepted
110
159
  ```
111
160
 
161
+ ### Specific Query Types
162
+
163
+ You can make assertions for the total number of queries executed, but sometimes
164
+ it's more valuable to assert that a particular _type_ of query was executed.
165
+ For example, a particular number of queries to destroy records. There are
166
+ matchers available for that purpose as well!
167
+
168
+ ```ruby
169
+ expect {}.to execute.exactly(20).queries
170
+
171
+ expect {}.to execute.exactly(20).insert_queries
172
+ expect {}.to execute.exactly(20).load_queries
173
+ expect {}.to execute.exactly(20).destroy_queries
174
+ expect {}.to execute.exactly(20).exists_queries
175
+
176
+ expect {}.to execute.exactly(20).schema_queries
177
+ expect {}.to execute.exactly(20).transaction_queries
178
+ ```
179
+
180
+ **Note:** Transaction (for example, `ROLLBACK`) queries are not counted in any of these
181
+ categories, nor are queries that load the DB schema.
182
+
183
+ **Note:** Destroy and delete queries are both condensed into the matcher for
184
+ `destroy_queries`.
185
+
112
186
  ## Future Planned Functionality
113
187
 
114
188
  This gem still has lots of future functionality. See below.
115
189
 
116
190
  ```ruby
117
- expect {}.to execute.exactly(5).queries
191
+ expect {}.to execute.at_least(2).queries_of_type("Audited::Audit Load")
192
+ expect {}.to execute.at_least(2).load_queries("Audited::Audit")
118
193
 
119
194
  expect {}.to execute.at_least(2).activerecord_queries
120
- expect {}.to execute.at_least(2).insert_queries
121
- expect {}.to execute.at_least(2).delete_queries
122
- expect {}.to execute.at_least(2).load_queries
123
- expect {}.to execute.at_least(2).schema_queries
124
- expect {}.to execute.at_least(2).exists_queries
125
- expect {}.to execute.at_least(2).queries_of_type("Audited::Audit Load")
126
195
  expect {}.to execute.at_least(2).hand_rolled_queries
127
196
 
128
197
  expect {}.not_to rollback_transaction.exactly(5).times
@@ -133,17 +202,10 @@ expect {}.to create.exactly(5).of_type(User)
133
202
  expect {}.to insert.exactly(5).subscription_changes
134
203
  expect {}.to update.exactly(2).of_any_type
135
204
  expect {}.to delete.exactly(2).of_any_type
136
-
137
- expect {}.not_to repeatedly_load(Audited::Audit)
138
-
139
- expect {}.to execute.at_least(1).query
140
205
  ```
141
206
 
142
- - ignore transactionals (begin / rollback)
143
- - `name: Foo Load`
144
- - differentiate AR queries from generic ones? arbitrary execution somehow?
145
- - warn about warmup
146
- - make sure we don't smite any built in methods (or from other libs)
207
+ - warn if we smite any built in methods (or methods from other libs)
208
+ - support Rails 6 bulk insert (still one query)
147
209
 
148
210
  ## Development
149
211
 
@@ -1,23 +1,42 @@
1
1
  module RSpec::ActiveRecord::Expectations
2
2
  class Collector
3
3
  def initialize
4
- @counts = {
5
- queries: 0
6
- }
4
+ @inspector = QueryInspector.new
5
+ @by_name = {}
6
+ @counts = QueryInspector.valid_query_types.each_with_object({}) do |query_type, hash|
7
+ hash[query_type] = 0
8
+ end
7
9
 
8
- ActiveSupport::Notifications.subscribe("sql.active_record", method(:record_query))
10
+ @subscription = ActiveSupport::Notifications.subscribe("sql.active_record", method(:record_query))
11
+ end
12
+
13
+ def finalize
14
+ ActiveSupport::Notifications.unsubscribe(@subscription)
9
15
  end
10
16
 
11
17
  def queries_of_type(type)
12
- @counts.fetch(type)
18
+ @counts[type] || (raise ArgumentError, "Sorry, #{type} is not a valid kind of query")
13
19
  end
14
20
 
15
21
  def valid_type?(type)
16
22
  @counts.include? type
17
23
  end
18
24
 
25
+ def calls_by_name(name)
26
+ @by_name.fetch(name, 0)
27
+ end
28
+
19
29
  def record_query(*_unused, data)
20
- @counts[:queries] += 1
30
+ categories = @inspector.categorize(data)
31
+
32
+ categories.each do |category|
33
+ @counts[category] += 1
34
+ rescue NoMethodError
35
+ raise "tried to add to to #{category} but it doesn't exist"
36
+ end
37
+
38
+ @by_name[data[:name]] ||= 0
39
+ @by_name[data[:name]] += 1
21
40
  end
22
41
  end
23
42
  end
@@ -0,0 +1,29 @@
1
+ module RSpec::ActiveRecord::Expectations
2
+ module Matchers
3
+ class LoadMatcher
4
+ def initialize(klass)
5
+ @collector = Collector.new
6
+ @klass = klass.to_s
7
+ end
8
+
9
+ def supports_block_expectations?
10
+ true
11
+ end
12
+
13
+ def matches?(block)
14
+ block.call
15
+
16
+ @count = @collector.calls_by_name("#{@klass} Load")
17
+ @count > 1
18
+ end
19
+
20
+ def failure_message
21
+ "expected block to repeatedly load #{@klass}, but it was loaded #{@count} times"
22
+ end
23
+
24
+ def failure_message_when_negated
25
+ "expected block not to repeatedly load #{@klass}, but it was loaded #{@count} times"
26
+ end
27
+ end
28
+ end
29
+ end
@@ -19,9 +19,11 @@ module RSpec::ActiveRecord::Expectations
19
19
  raise NoComparisonError unless @match_method
20
20
  raise NoQueryTypeError unless @collector.valid_type?(@query_type)
21
21
 
22
- result = block.call
22
+ block.call
23
+ result = @match_method.call
24
+ @collector.finalize
23
25
 
24
- !!@match_method.call
26
+ result
25
27
  end
26
28
 
27
29
  # COMPARISON TYPES
@@ -54,22 +56,45 @@ module RSpec::ActiveRecord::Expectations
54
56
  end
55
57
  alias_method :at_least, :greater_than_or_equal_to
56
58
 
59
+ def exactly(n)
60
+ @comparison = n
61
+ @match_method = method(:compare_exactly)
62
+ self
63
+ end
64
+
57
65
  # TARGET QUERY TYPES
58
66
 
59
- def queries
60
- @query_type = :queries
61
- self
67
+ RSpec::ActiveRecord::Expectations::QueryInspector.valid_query_types.each do |type|
68
+ define_method type do
69
+ @query_type = type
70
+ self
71
+ end
72
+
73
+ singularized_type = type.to_s.gsub('queries', 'query')
74
+ if singularized_type != type.to_s
75
+ define_method singularized_type do
76
+ @query_type = type
77
+ self
78
+ end
79
+ end
62
80
  end
63
81
 
82
+ # TODO singularize everything
83
+ alias_method :query, :queries
84
+
64
85
  private
65
86
 
87
+ def humanized_query_type
88
+ @query_type.to_s.gsub("_", " ")
89
+ end
90
+
66
91
  # MATCHERS
67
92
 
68
93
  def compare_less_than
69
94
  count = @collector.queries_of_type(@query_type)
70
95
 
71
- @failure_message = "expected block to execute fewer than #{@comparison} queries, but it executed #{count}"
72
- @failure_message_when_negated = "expected block not to execute fewer than #{@comparison} queries, but it executed #{count}"
96
+ @failure_message = "expected block to execute fewer than #{@comparison} #{humanized_query_type}, but it executed #{count}"
97
+ @failure_message_when_negated = "expected block not to execute fewer than #{@comparison} #{humanized_query_type}, but it executed #{count}"
73
98
 
74
99
  count < @comparison
75
100
  end
@@ -78,8 +103,8 @@ module RSpec::ActiveRecord::Expectations
78
103
  count = @collector.queries_of_type(@query_type)
79
104
 
80
105
  # boy this negated operator is confusing. don't use that plz.
81
- @failure_message = "expected block to execute at most #{@comparison} queries, but it executed #{count}"
82
- @failure_message_when_negated = "expected block not to execute any less than #{@comparison} queries, but it executed #{count}"
106
+ @failure_message = "expected block to execute at most #{@comparison} #{humanized_query_type}, but it executed #{count}"
107
+ @failure_message_when_negated = "expected block not to execute any less than #{@comparison} #{humanized_query_type}, but it executed #{count}"
83
108
 
84
109
  count <= @comparison
85
110
  end
@@ -87,8 +112,8 @@ module RSpec::ActiveRecord::Expectations
87
112
  def compare_greater_than
88
113
  count = @collector.queries_of_type(@query_type)
89
114
 
90
- @failure_message = "expected block to execute greater than #{@comparison} queries, but it executed #{count}"
91
- @failure_message_when_negated = "expected block not to execute greater than #{@comparison} queries, but it executed #{count}"
115
+ @failure_message = "expected block to execute greater than #{@comparison} #{humanized_query_type}, but it executed #{count}"
116
+ @failure_message_when_negated = "expected block not to execute greater than #{@comparison} #{humanized_query_type}, but it executed #{count}"
92
117
 
93
118
  count > @comparison
94
119
  end
@@ -97,11 +122,20 @@ module RSpec::ActiveRecord::Expectations
97
122
  count = @collector.queries_of_type(@query_type)
98
123
 
99
124
  # see above, negating this matcher is so confusing.
100
- @failure_message = "expected block to execute at least #{@comparison} queries, but it executed #{count}"
101
- @failure_message_when_negated = "expected block not to execute any more than #{@comparison} queries, but it executed #{count}"
125
+ @failure_message = "expected block to execute at least #{@comparison} #{humanized_query_type}, but it executed #{count}"
126
+ @failure_message_when_negated = "expected block not to execute any more than #{@comparison} #{humanized_query_type}, but it executed #{count}"
102
127
 
103
128
  count >= @comparison
104
129
  end
130
+
131
+ def compare_exactly
132
+ count = @collector.queries_of_type(@query_type)
133
+
134
+ @failure_message = "expected block to execute exactly #{@comparison} #{humanized_query_type}, but it executed #{count}"
135
+ @failure_message_when_negated = "expected block not to execute exactly #{@comparison} #{humanized_query_type}, but it executed #{count}"
136
+
137
+ count == @comparison
138
+ end
105
139
  end
106
140
  end
107
141
  end
@@ -0,0 +1,28 @@
1
+ module RSpec::ActiveRecord::Expectations
2
+ class QueryInspector
3
+ def self.valid_query_types
4
+ [:queries, :schema_queries, :transaction_queries, :insert_queries,
5
+ :load_queries, :destroy_queries, :exists_queries]
6
+ end
7
+
8
+ def categorize(query)
9
+ if query[:name] == "SCHEMA"
10
+ [:schema_queries]
11
+ elsif query[:name] == "TRANSACTION" || query[:sql] =~ /^begin/i || query[:sql] =~ /^commit/i
12
+ [:transaction_queries]
13
+ elsif query[:name] =~ /Create$/
14
+ [:queries, :insert_queries]
15
+ elsif query[:name] =~ /Load$/
16
+ [:queries, :load_queries]
17
+ elsif query[:name] =~ /Destroy$/
18
+ [:queries, :destroy_queries]
19
+ elsif query[:name] =~ /Delete All$/
20
+ [:queries, :destroy_queries]
21
+ elsif query[:name] =~ /Exists\??$/
22
+ [:queries, :exists_queries]
23
+ else
24
+ [:queries]
25
+ end
26
+ end
27
+ end
28
+ end
@@ -4,10 +4,16 @@ module RSpec
4
4
  def execute
5
5
  Matchers::QueryCountMatcher.new
6
6
  end
7
+
8
+ def repeatedly_load(klass)
9
+ Matchers::LoadMatcher.new(klass)
10
+ end
7
11
  end
8
12
  end
9
13
  end
10
14
 
11
15
  require_relative 'expectations/errors'
16
+ require_relative 'expectations/query_inspector'
12
17
  require_relative 'expectations/collector'
13
- require_relative 'expectations/matchers/query_count'
18
+ require_relative 'expectations/matchers/query_count_matcher'
19
+ require_relative 'expectations/matchers/load_matcher'
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "rspec-activerecord-expectations"
3
- spec.version = '1.1.0'
3
+ spec.version = '2.1.1'
4
4
  spec.authors = ["Joseph Mastey"]
5
5
  spec.email = ["hello@joemastey.com"]
6
6
 
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.description = %q{Adds new matchers to rspec to help you test whether your code is executing an unreasonable number of queries.}
9
9
  spec.homepage = "https://github.com/jmmastey/rspec-activerecord-expectations"
10
10
  spec.license = "MIT"
11
- spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
11
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
12
12
 
13
13
  spec.metadata["homepage_uri"] = spec.homepage
14
14
  spec.metadata["source_code_uri"] = spec.homepage
@@ -23,7 +23,12 @@ Gem::Specification.new do |spec|
23
23
  spec.require_paths = ["lib"]
24
24
 
25
25
  spec.add_dependency "activerecord", ">= 5.0.0", "< 7.1.0"
26
- spec.add_dependency "sqlite3", "~> 1.0"
26
+
27
+ if RUBY_PLATFORM == 'java'
28
+ spec.add_development_dependency "activerecord-jdbcsqlite3-adapter", '>= 60'
29
+ else
30
+ spec.add_development_dependency "sqlite3", "~> 1.0"
31
+ end
27
32
 
28
33
  spec.add_development_dependency "pry", "~> 0.0"
29
34
  spec.add_development_dependency "appraisal", "~> 2"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-activerecord-expectations
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joseph Mastey
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-12-30 00:00:00.000000000 Z
11
+ date: 2022-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -37,7 +37,7 @@ dependencies:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
39
  version: '1.0'
40
- type: :runtime
40
+ type: :development
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
@@ -102,7 +102,9 @@ files:
102
102
  - lib/rspec/activerecord/expectations.rb
103
103
  - lib/rspec/activerecord/expectations/collector.rb
104
104
  - lib/rspec/activerecord/expectations/errors.rb
105
- - lib/rspec/activerecord/expectations/matchers/query_count.rb
105
+ - lib/rspec/activerecord/expectations/matchers/load_matcher.rb
106
+ - lib/rspec/activerecord/expectations/matchers/query_count_matcher.rb
107
+ - lib/rspec/activerecord/expectations/query_inspector.rb
106
108
  - rspec-activerecord-expectations.gemspec
107
109
  homepage: https://github.com/jmmastey/rspec-activerecord-expectations
108
110
  licenses:
@@ -119,7 +121,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
119
121
  requirements:
120
122
  - - ">="
121
123
  - !ruby/object:Gem::Version
122
- version: 2.3.0
124
+ version: 2.5.0
123
125
  required_rubygems_version: !ruby/object:Gem::Requirement
124
126
  requirements:
125
127
  - - ">="