rspec-expect_to_make_changes 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/Changelog.md +0 -0
- data/Gemfile +6 -0
- data/License +18 -0
- data/Rakefile +6 -0
- data/Readme.md +213 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/rspec/expect_to_make_changes.rb +10 -0
- data/lib/rspec/expect_to_make_changes/version.rb +7 -0
- data/lib/rspec/matchers/before_and_after.rb +64 -0
- data/lib/rspec/matchers/fail_matchers.rb +44 -0
- data/lib/rspec/matchers/make_changes.rb +52 -0
- data/rspec-expect_to_make_changes.gemspec +35 -0
- metadata +162 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: bd5da54d4ca2fcb7f6a69d1a012bf919fc758195f42ce0bc1ef8c444e16f4925
|
4
|
+
data.tar.gz: 0c4f8c24bdae746382847c209b3016e79cc0b0f291eb67ae5fdde4b0150c8682
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: eb980db8d9d35ae30be288a4ab686c12f9755d1883853236ef810f93dbc89a45cdb85be97a8b1622d3cc8f4268751145ca7343e4376739616ea775ed5c30692b
|
7
|
+
data.tar.gz: ca024259d1e22c325103cb633cc73c3f60108c64fb1a4b919e524865f26b2d1b64ca47744074a88ebe7968749e756f3c397fc7dde153526fa551d25e4a9f37d3
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Changelog.md
ADDED
File without changes
|
data/Gemfile
ADDED
data/License
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Copyright (c) 2020 Tyler Rick and contributors
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
4
|
+
associated documentation files (the "Software"), to deal in the Software without restriction,
|
5
|
+
including without limitation the rights to use, copy, modify, merge, publish, distribute,
|
6
|
+
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
|
7
|
+
furnished to do so, subject to the following conditions:
|
8
|
+
|
9
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial
|
10
|
+
portions of the Software.
|
11
|
+
|
12
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
13
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
14
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
15
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
16
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
17
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
18
|
+
SOFTWARE.
|
data/Rakefile
ADDED
data/Readme.md
ADDED
@@ -0,0 +1,213 @@
|
|
1
|
+
# RSpec `expect {…}.to make_changes(…)`
|
2
|
+
|
3
|
+
This small library makes it easy to test that a block makes a number of changes, without requiring
|
4
|
+
you to deeply nest a bunch of `expect { }` blocks within each other or rewrite them as `change`
|
5
|
+
matchers.
|
6
|
+
|
7
|
+
Sure, you could just write add a list of regular RSpec expectations about how the state should be
|
8
|
+
_before_ your action, and another list of expectations about how the state should be _after_ your
|
9
|
+
action, and call that a "test for how your action changes the state".
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
expect(thing.a).to eq 1
|
13
|
+
expect(thing.b).to eq 2
|
14
|
+
expect(thing.c).to eq 3
|
15
|
+
perform_change
|
16
|
+
expect(thing.c).to eq 9
|
17
|
+
expect(thing.b).to eq -2
|
18
|
+
expect(thing.a).to eq 0
|
19
|
+
```
|
20
|
+
|
21
|
+
But often your expectations occur in _pairs_: a "before" and an "after": one for the state of
|
22
|
+
something _before_ the action and a matching expectation for the state of the same thing _after_
|
23
|
+
the action.
|
24
|
+
|
25
|
+
As the number of pairs grows, it can be quite hard for the reader of your test to see which
|
26
|
+
expectations are related, and how. It can also be hard for the writer of the test to maintain, esp.
|
27
|
+
if they are relying on things like the order and proximity of the expectations alone to indicate a
|
28
|
+
connection between related before/after expectations.
|
29
|
+
|
30
|
+
The `make_changes` (and `before_and_after`) matchers provided by this library give you a tool to
|
31
|
+
make it explicit and _extremely_ clear that those 2 expectations are a pair that are very tightly
|
32
|
+
related.
|
33
|
+
|
34
|
+
So instead of the above, you can rewrite it as explicit pairs like this:
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
expect {
|
38
|
+
perform_change
|
39
|
+
}.to make_changes([
|
40
|
+
->{ expect(thing.a).to eq 1 },
|
41
|
+
->{ expect(thing.a).to eq 0 },
|
42
|
+
], [
|
43
|
+
->{ expect(thing.b).to eq 2 },
|
44
|
+
->{ expect(thing.b).to eq -2 },
|
45
|
+
], [
|
46
|
+
->{ expect(thing.c).to eq 9 },
|
47
|
+
->{ expect(thing.c).to eq 9 },
|
48
|
+
])
|
49
|
+
```
|
50
|
+
|
51
|
+
or, using `change` matchers, like this:
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
expect {
|
55
|
+
perform_change
|
56
|
+
}.to make_changes(
|
57
|
+
change { thing.a }.from(1).to(0),
|
58
|
+
change { thing.b }.from(2).to(-2),
|
59
|
+
change { thing.c }.from(3).to(9),
|
60
|
+
)
|
61
|
+
```
|
62
|
+
|
63
|
+
(or any combination of `[before_proc, after_proc]` arrays and `change` matchers)
|
64
|
+
|
65
|
+
RSpec already provides a built-in matcher for expressing changes expected as a result of executing a
|
66
|
+
block. And it works great for specifying single changes. You can even use it for specifying multiple
|
67
|
+
changes:
|
68
|
+
|
69
|
+
```ruby
|
70
|
+
expect {
|
71
|
+
expect {
|
72
|
+
expect {
|
73
|
+
perform_change
|
74
|
+
}.to change { thing.a }.from(1).to(0)
|
75
|
+
}.to change { thing.b }.from(2).to(-2)
|
76
|
+
}.to change { thing.c }.from(3).to(9)
|
77
|
+
```
|
78
|
+
|
79
|
+
Granted, that makes it _much_ clearer at a quick glance what changes are expected by your action.
|
80
|
+
But it also has some drawbacks:
|
81
|
+
|
82
|
+
1. You have to completely rewrite your expectations — which may have started out (as in our example)
|
83
|
+
as good old plain `expect(something).to eq something` expectations — into a _very_ different
|
84
|
+
`change()` matcher style.
|
85
|
+
2. You end up with extra nesting, which can make your tests look a bit unwieldy and harder to read
|
86
|
+
than it needs to be.
|
87
|
+
|
88
|
+
RSpec provides a pretty good solution to the nesting problem via its compound (`and`/`&`) matchers
|
89
|
+
that let you combine several matchers together and treat them as one, so you can actually simplify
|
90
|
+
that to just a single event block using just built-in RSpec:
|
91
|
+
```ruby
|
92
|
+
expect {
|
93
|
+
perform_change
|
94
|
+
}.to (
|
95
|
+
change { thing.a }.from(1).to(0) &
|
96
|
+
change { thing.b }.from(2).to(-2) &
|
97
|
+
change { thing.c }.from(3).to(9)
|
98
|
+
)
|
99
|
+
```
|
100
|
+
|
101
|
+
`change` is often all you need for changes to primitive values. But it isn't always enough for
|
102
|
+
doing more complex before/after checks. And it's not always convenient to rewrite existing
|
103
|
+
expectations to a different (`change`) syntax.
|
104
|
+
|
105
|
+
`make_changes` gives you the flexibility to either leave your before/after expectations as "regular"
|
106
|
+
`expect`s or use the `change()` matcher style of expecting changes.
|
107
|
+
|
108
|
+
This flexibility gives you the power and flexibility to lets you express some things that you simply
|
109
|
+
couldn't express if you were limited to only the `change` matcher, such as things that you would
|
110
|
+
normally use another specialized matcher for, such as expectations on arrays or hashes:
|
111
|
+
|
112
|
+
```ruby
|
113
|
+
expect {
|
114
|
+
perform_change
|
115
|
+
}.to make_changes([
|
116
|
+
->{ expect_too_close_to_pedestrians(car) },
|
117
|
+
->{ expect_sufficient_proximity_from_pedestrians(car) },
|
118
|
+
], [
|
119
|
+
->{ expect(instance.tags).to match_array [:old_tag] },
|
120
|
+
->{ expect(instance.tags).to match_array [:new_tag] },
|
121
|
+
], [
|
122
|
+
->{
|
123
|
+
expect(team.members).to include user_1
|
124
|
+
expect(team.members).to_not include user_2
|
125
|
+
},
|
126
|
+
->{ expect(team.members).to include user_1, user_2 },
|
127
|
+
])
|
128
|
+
```
|
129
|
+
|
130
|
+
Although you _can_ define aliases and negated matchers to do things like this:
|
131
|
+
|
132
|
+
```ruby
|
133
|
+
RSpec::Matchers.alias_matcher :an_array_including, :include
|
134
|
+
RSpec::Matchers.define_negated_matcher :an_array_excluding, :include
|
135
|
+
|
136
|
+
array = ['food', 'water']
|
137
|
+
expect { array << 'spinach' }.to change { array }
|
138
|
+
.from( an_array_excluding('spinach') )
|
139
|
+
.to( an_array_including('spinach') )
|
140
|
+
```
|
141
|
+
|
142
|
+
, it may not _always_ be possible, and requires you to define the needed matchers. Whereas
|
143
|
+
`make_changes` allows you to simply use the "regular" matchers that you already know and love:
|
144
|
+
|
145
|
+
```ruby
|
146
|
+
array = ['food', 'water']
|
147
|
+
expect { array << 'spinach' }.to make_changes([
|
148
|
+
->{ expect(array).not_to include 'spinach' },
|
149
|
+
->{ expect(array).to include 'spinach' },
|
150
|
+
])
|
151
|
+
```
|
152
|
+
|
153
|
+
It can sometimes be more readable or maintainable if you can just use/reuse regular expectations for
|
154
|
+
your before/after checks.
|
155
|
+
|
156
|
+
You might not even be checking for a change. You might simply want to assert that some invariant
|
157
|
+
still holds both before _and_ after your action is performed.
|
158
|
+
|
159
|
+
```ruby
|
160
|
+
expect {
|
161
|
+
perform_change
|
162
|
+
}.to check_all_before_and_after([
|
163
|
+
->{ expect(car).to_not be_too_close },
|
164
|
+
->{ expect(car).to_not be_too_close },
|
165
|
+
])
|
166
|
+
```
|
167
|
+
|
168
|
+
That would be difficult or impossible to express using `change` matchers, since it's not a change.
|
169
|
+
|
170
|
+
|
171
|
+
## `before_and_after` matcher
|
172
|
+
|
173
|
+
In the examples above, if you pass an array to `make_changes` as one of the "expected changes", it
|
174
|
+
actually converts that to a `before_and_after` matcher, and then `and`s together all of the
|
175
|
+
"expected changes" into a single `Compound::And` matcher.
|
176
|
+
|
177
|
+
If you wanted to, you can also use `before_and_after` directly, like:
|
178
|
+
|
179
|
+
```ruby
|
180
|
+
expect { @instance.some_value = 6 }.to before_and_after(
|
181
|
+
-> { expect(@instance.some_value).to eq 5 },
|
182
|
+
-> { expect(@instance.some_value).to eq 6 }
|
183
|
+
)
|
184
|
+
```
|
185
|
+
|
186
|
+
|
187
|
+
|
188
|
+
## Installation
|
189
|
+
|
190
|
+
Add this line to your application's Gemfile:
|
191
|
+
|
192
|
+
```ruby
|
193
|
+
gem 'rspec-make_changes'
|
194
|
+
```
|
195
|
+
|
196
|
+
And then execute:
|
197
|
+
|
198
|
+
$ bundle
|
199
|
+
|
200
|
+
Or install it yourself as:
|
201
|
+
|
202
|
+
$ gem install rspec-make_changes
|
203
|
+
|
204
|
+
|
205
|
+
## Development
|
206
|
+
|
207
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
208
|
+
|
209
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
210
|
+
|
211
|
+
## Contributing
|
212
|
+
|
213
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/TylerRick/rspec-make_changes.
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "rspec/expect_to_make_changes"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'rspec/matchers'
|
2
|
+
|
3
|
+
module RSpec::Matchers
|
4
|
+
# Applied to a proc, specifies that its execution will cause some value to
|
5
|
+
# change.
|
6
|
+
#
|
7
|
+
# Allows you to run a pair of related checks — one before the change and one after the change.
|
8
|
+
# The checks can be any arbitrary RSpec expectations.
|
9
|
+
#
|
10
|
+
# @param [Proc] before_proc The expectation to check before making the change.
|
11
|
+
# @param [Proc] after_proc The expectation to check after making the change.
|
12
|
+
def before_and_after(before_proc, after_proc)
|
13
|
+
BeforeAndAfter.new(before_proc, after_proc)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
RSpec::Matchers.alias_matcher :expect_before_and_after, :before_and_after
|
17
|
+
RSpec::Matchers.alias_matcher :check_before_and_after, :before_and_after
|
18
|
+
|
19
|
+
# Modeled after RSpec::Matchers::BuiltIn::Change
|
20
|
+
class BeforeAndAfter < RSpec::Matchers::BuiltIn::BaseMatcher
|
21
|
+
def initialize(before_proc, after_proc)
|
22
|
+
@before_proc = before_proc
|
23
|
+
@after_proc = after_proc
|
24
|
+
end
|
25
|
+
|
26
|
+
def matches?(event_proc)
|
27
|
+
@event_proc = event_proc
|
28
|
+
perform_change(event_proc)
|
29
|
+
end
|
30
|
+
|
31
|
+
def supports_block_expectations?
|
32
|
+
true
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def perform_change(event_proc)
|
38
|
+
reraise_with_prefix 'before making the change:' do
|
39
|
+
@before_proc.call
|
40
|
+
end
|
41
|
+
|
42
|
+
return false unless Proc === event_proc
|
43
|
+
event_proc.call
|
44
|
+
|
45
|
+
reraise_with_prefix 'after making the change:' do
|
46
|
+
@after_proc.call
|
47
|
+
end
|
48
|
+
true
|
49
|
+
end
|
50
|
+
|
51
|
+
def reraise_with_prefix(prefix)
|
52
|
+
begin
|
53
|
+
yield
|
54
|
+
rescue RSpec::Expectations::ExpectationNotMetError
|
55
|
+
raise $!, "#{prefix}\n#{indent_multiline_message($!.message)}", $!.backtrace
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def indent_multiline_message(message)
|
60
|
+
message.lines.map do |line|
|
61
|
+
line =~ /\S/ ? ' ' + line : line
|
62
|
+
end.join
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Copied from rspec-expectations
|
2
|
+
|
3
|
+
require 'rspec/expectations'
|
4
|
+
|
5
|
+
module RSpec
|
6
|
+
module Matchers
|
7
|
+
# Matchers for testing RSpec matchers. Include them with:
|
8
|
+
#
|
9
|
+
# require 'rspec/matchers/fail_matchers'
|
10
|
+
# RSpec.configure do |config|
|
11
|
+
# config.include RSpec::Matchers::FailMatchers
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
module FailMatchers
|
15
|
+
# Matches if an expectation fails
|
16
|
+
#
|
17
|
+
# @example
|
18
|
+
# expect { some_expectation }.to fail
|
19
|
+
def fail(&block)
|
20
|
+
raise_error(RSpec::Expectations::ExpectationNotMetError, &block)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Matches if an expectation fails with the provided message
|
24
|
+
#
|
25
|
+
# @example
|
26
|
+
# expect { some_expectation }.to fail_with("some failure message")
|
27
|
+
# expect { some_expectation }.to fail_with(/some failure message/)
|
28
|
+
def fail_with(message)
|
29
|
+
raise_error(RSpec::Expectations::ExpectationNotMetError, message)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Matches if an expectation fails including the provided message
|
33
|
+
#
|
34
|
+
# @example
|
35
|
+
# expect { some_expectation }.to fail_including("portion of some failure message")
|
36
|
+
def fail_including(*snippets)
|
37
|
+
raise_error(
|
38
|
+
RSpec::Expectations::ExpectationNotMetError,
|
39
|
+
a_string_including(*snippets)
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'rspec/matchers'
|
2
|
+
require 'rspec/matchers/before_and_after'
|
3
|
+
|
4
|
+
RSpec::Matchers.define :make_changes do |*expected_changes|
|
5
|
+
match(notify_expectation_failures: true) do |change_proc|
|
6
|
+
expected_changes.map! do |expected_change|
|
7
|
+
if Array === expected_change
|
8
|
+
before_and_after(*expected_change)
|
9
|
+
else
|
10
|
+
expected_change
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
compound = expected_changes.inject do |compound, expected_change|
|
15
|
+
compound & expected_change
|
16
|
+
end
|
17
|
+
|
18
|
+
# TODO: aggregate_failures do
|
19
|
+
expect(&change_proc).to compound
|
20
|
+
#end
|
21
|
+
end
|
22
|
+
|
23
|
+
failure_message do |subject|
|
24
|
+
" expected block to make changes:\n" +
|
25
|
+
" but it did not."
|
26
|
+
end
|
27
|
+
|
28
|
+
def description
|
29
|
+
super.sub(/\Amake changes */, '')
|
30
|
+
end
|
31
|
+
|
32
|
+
supports_block_expectations
|
33
|
+
end
|
34
|
+
|
35
|
+
RSpec::Matchers.alias_matcher :change_all, :check_all_before_and_after
|
36
|
+
RSpec::Matchers.alias_matcher :check_all, :check_all_before_and_after
|
37
|
+
RSpec::Matchers.alias_matcher :check_all_before_and_after, :make_changes
|
38
|
+
|
39
|
+
=begin
|
40
|
+
Original version before converting to an RSpec matcher, for posterity:
|
41
|
+
|
42
|
+
def expect_changes(action_proc, *expected_changes)
|
43
|
+
expected_changes.each.with_index do |expected_change, i|
|
44
|
+
expected_change.size == 2 or raise "expected expected_changes[#{i}] to be an array of 2 procs but its size was #{expected_change.size}"
|
45
|
+
expected_change[0].()
|
46
|
+
end
|
47
|
+
action_proc.()
|
48
|
+
expected_changes.each.with_index do |expected_change, i|
|
49
|
+
expected_change[1].()
|
50
|
+
end
|
51
|
+
end
|
52
|
+
=end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
lib = File.expand_path("../lib", __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "rspec/expect_to_make_changes/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "rspec-expect_to_make_changes"
|
7
|
+
spec.version = Rspec::ExpectToMakeChanges.version
|
8
|
+
spec.authors = ["Tyler Rick"]
|
9
|
+
spec.email = ["tyler@tylerrick.com"]
|
10
|
+
spec.license = "MIT"
|
11
|
+
|
12
|
+
spec.summary = %q{expect {…}.to make_changes(…)}
|
13
|
+
spec.description = %q{Makes it easy to test that a block makes a number of changes, without requiring you to deeply nest a bunch of `expect { }` blocks within each other or rewrite them as `change` matchers.}
|
14
|
+
spec.homepage = "https://github.com/TylerRick/rspec-expect_to_make_changes"
|
15
|
+
|
16
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
17
|
+
spec.metadata["source_code_uri"] = spec.homepage
|
18
|
+
spec.metadata["changelog_uri"] = "#{spec.metadata["source_code_uri"]}/blob/master/Changelog.md"
|
19
|
+
|
20
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
21
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
22
|
+
end
|
23
|
+
spec.bindir = "exe"
|
24
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
25
|
+
spec.require_paths = ["lib"]
|
26
|
+
|
27
|
+
spec.add_dependency "rspec-expectations"
|
28
|
+
|
29
|
+
spec.add_development_dependency "bundler", "~> 1.17"
|
30
|
+
spec.add_development_dependency "byebug"
|
31
|
+
spec.add_development_dependency "pry"
|
32
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
33
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
34
|
+
spec.add_development_dependency "rspec-support"
|
35
|
+
end
|
metadata
ADDED
@@ -0,0 +1,162 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rspec-expect_to_make_changes
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tyler Rick
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-04-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec-expectations
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.17'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.17'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: byebug
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '10.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '10.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec-support
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: Makes it easy to test that a block makes a number of changes, without
|
112
|
+
requiring you to deeply nest a bunch of `expect { }` blocks within each other or
|
113
|
+
rewrite them as `change` matchers.
|
114
|
+
email:
|
115
|
+
- tyler@tylerrick.com
|
116
|
+
executables: []
|
117
|
+
extensions: []
|
118
|
+
extra_rdoc_files: []
|
119
|
+
files:
|
120
|
+
- ".gitignore"
|
121
|
+
- ".rspec"
|
122
|
+
- ".travis.yml"
|
123
|
+
- Changelog.md
|
124
|
+
- Gemfile
|
125
|
+
- License
|
126
|
+
- Rakefile
|
127
|
+
- Readme.md
|
128
|
+
- bin/console
|
129
|
+
- bin/setup
|
130
|
+
- lib/rspec/expect_to_make_changes.rb
|
131
|
+
- lib/rspec/expect_to_make_changes/version.rb
|
132
|
+
- lib/rspec/matchers/before_and_after.rb
|
133
|
+
- lib/rspec/matchers/fail_matchers.rb
|
134
|
+
- lib/rspec/matchers/make_changes.rb
|
135
|
+
- rspec-expect_to_make_changes.gemspec
|
136
|
+
homepage: https://github.com/TylerRick/rspec-expect_to_make_changes
|
137
|
+
licenses:
|
138
|
+
- MIT
|
139
|
+
metadata:
|
140
|
+
homepage_uri: https://github.com/TylerRick/rspec-expect_to_make_changes
|
141
|
+
source_code_uri: https://github.com/TylerRick/rspec-expect_to_make_changes
|
142
|
+
changelog_uri: https://github.com/TylerRick/rspec-expect_to_make_changes/blob/master/Changelog.md
|
143
|
+
post_install_message:
|
144
|
+
rdoc_options: []
|
145
|
+
require_paths:
|
146
|
+
- lib
|
147
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - ">="
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
|
+
requirements:
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: '0'
|
157
|
+
requirements: []
|
158
|
+
rubygems_version: 3.0.3
|
159
|
+
signing_key:
|
160
|
+
specification_version: 4
|
161
|
+
summary: expect {…}.to make_changes(…)
|
162
|
+
test_files: []
|