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.
@@ -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: []