rspec-expect_to_make_changes 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+ Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.6.3
7
+ before_install: gem install bundler -v 1.17.3
File without changes
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in rspec-expect_to_make_changes.gemspec
6
+ gemspec
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.
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -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.
@@ -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__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,10 @@
1
+ require 'rspec/expect_to_make_changes/version'
2
+ require 'rspec/matchers/make_changes'
3
+ require 'rspec/matchers/before_and_after'
4
+
5
+ module Rspec
6
+ module ExpectToMakeChanges
7
+ class Error < StandardError; end
8
+ # Your code goes here...
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ module Rspec
2
+ module ExpectToMakeChanges
3
+ def self.version
4
+ "0.1.1"
5
+ end
6
+ end
7
+ end
@@ -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: []