rspec-change_collection 1.0.0

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
+ SHA1:
3
+ metadata.gz: 35c1ee5d89f409e7c505ae39bbeabbfd5cd24ed2
4
+ data.tar.gz: 8f0ff47697b3bfc820986294caac6ff53e77a150
5
+ SHA512:
6
+ metadata.gz: e5ca1c7ff55c451e9de650af42801839f8932d4e9936f224376b76d2f956731a4d61e60774a5399cf9d93b358bbcfa1a1bd7c6dc9b947961f54abc481da91d06
7
+ data.tar.gz: 125a3c749b10661f0ca74c0f9069d47be24acfd08ec52e026e77b807d8d80439e1c885232b872279594488e634f6c33da6cc0acb848b6eb476c7adc22bd708f3
@@ -0,0 +1,2 @@
1
+ .idea/*
2
+ .ruby-*
@@ -0,0 +1,4 @@
1
+ ### 1.0.0
2
+
3
+ Initial Version
4
+
data/Gemfile ADDED
@@ -0,0 +1,27 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rspec-change_collection.gemspec
4
+ gemspec
5
+
6
+ %w[rspec rspec-core rspec-expectations rspec-mocks rspec-support].each do |lib|
7
+ branch = ENV.fetch('BRANCH','master')
8
+ next if branch == '2-99-maintenance' && lib == 'rspec-support'
9
+ library_path = File.expand_path("../../#{lib}", __FILE__)
10
+ if File.exist?(library_path)
11
+ gem lib, :path => library_path
12
+ else
13
+ gem lib, :git => "git://github.com/rspec/#{lib}.git",
14
+ :branch => branch
15
+ end
16
+ end
17
+
18
+ # test coverage
19
+ # gem 'simplecov', :require => false
20
+
21
+ gem 'coveralls', :require => false, :platform => :mri_20
22
+
23
+ eval File.read('Gemfile-custom') if File.exist?('Gemfile-custom')
24
+
25
+ platform :rbx do
26
+ gem 'rubysl'
27
+ end
@@ -0,0 +1,294 @@
1
+ GIT
2
+ remote: git://github.com/rspec/rspec-core.git
3
+ revision: e0a8404b0ab3f7803eedca9572f3fbfbea915bd6
4
+ branch: master
5
+ specs:
6
+ rspec-core (3.1.0.pre)
7
+ rspec-support (= 3.1.0.pre)
8
+
9
+ GIT
10
+ remote: git://github.com/rspec/rspec-expectations.git
11
+ revision: e4674ca2440d22ecfe59be6fe351396dbe9b4369
12
+ branch: master
13
+ specs:
14
+ rspec-expectations (3.1.0.pre)
15
+ diff-lcs (>= 1.2.0, < 2.0)
16
+ rspec-support (= 3.1.0.pre)
17
+
18
+ GIT
19
+ remote: git://github.com/rspec/rspec-mocks.git
20
+ revision: 873d755efe61d500444c230dc3b7f4f9d24aed43
21
+ branch: master
22
+ specs:
23
+ rspec-mocks (3.1.0.pre)
24
+ rspec-support (= 3.1.0.pre)
25
+
26
+ GIT
27
+ remote: git://github.com/rspec/rspec-support.git
28
+ revision: ba5b67666514d5808da13ddaafefc8c597e553e1
29
+ branch: master
30
+ specs:
31
+ rspec-support (3.1.0.pre)
32
+
33
+ GIT
34
+ remote: git://github.com/rspec/rspec.git
35
+ revision: 2b826653e1f55f63e4f99d8dd1f14b5d35d0a0b7
36
+ branch: master
37
+ specs:
38
+ rspec (3.1.0.pre)
39
+ rspec-core (= 3.1.0.pre)
40
+ rspec-expectations (= 3.1.0.pre)
41
+ rspec-mocks (= 3.1.0.pre)
42
+
43
+ PATH
44
+ remote: .
45
+ specs:
46
+ rspec-change_collection (1.0.0)
47
+ rspec-core (>= 2.99.0.beta1)
48
+ rspec-expectations (>= 2.99.0.beta1)
49
+
50
+ GEM
51
+ remote: https://rubygems.org/
52
+ specs:
53
+ coveralls (0.7.0)
54
+ multi_json (~> 1.3)
55
+ rest-client
56
+ simplecov (>= 0.7)
57
+ term-ansicolor
58
+ thor
59
+ diff-lcs (1.2.5)
60
+ docile (1.1.5)
61
+ ffi2-generators (0.1.1)
62
+ mime-types (2.3)
63
+ multi_json (1.10.1)
64
+ netrc (0.7.7)
65
+ rake (10.1.1)
66
+ rest-client (1.7.2)
67
+ mime-types (>= 1.16, < 3.0)
68
+ netrc (~> 0.7)
69
+ rubysl (2.0.15)
70
+ rubysl-abbrev (~> 2.0)
71
+ rubysl-base64 (~> 2.0)
72
+ rubysl-benchmark (~> 2.0)
73
+ rubysl-bigdecimal (~> 2.0)
74
+ rubysl-cgi (~> 2.0)
75
+ rubysl-cgi-session (~> 2.0)
76
+ rubysl-cmath (~> 2.0)
77
+ rubysl-complex (~> 2.0)
78
+ rubysl-continuation (~> 2.0)
79
+ rubysl-coverage (~> 2.0)
80
+ rubysl-csv (~> 2.0)
81
+ rubysl-curses (~> 2.0)
82
+ rubysl-date (~> 2.0)
83
+ rubysl-delegate (~> 2.0)
84
+ rubysl-digest (~> 2.0)
85
+ rubysl-drb (~> 2.0)
86
+ rubysl-e2mmap (~> 2.0)
87
+ rubysl-english (~> 2.0)
88
+ rubysl-enumerator (~> 2.0)
89
+ rubysl-erb (~> 2.0)
90
+ rubysl-etc (~> 2.0)
91
+ rubysl-expect (~> 2.0)
92
+ rubysl-fcntl (~> 2.0)
93
+ rubysl-fiber (~> 2.0)
94
+ rubysl-fileutils (~> 2.0)
95
+ rubysl-find (~> 2.0)
96
+ rubysl-forwardable (~> 2.0)
97
+ rubysl-getoptlong (~> 2.0)
98
+ rubysl-gserver (~> 2.0)
99
+ rubysl-io-console (~> 2.0)
100
+ rubysl-io-nonblock (~> 2.0)
101
+ rubysl-io-wait (~> 2.0)
102
+ rubysl-ipaddr (~> 2.0)
103
+ rubysl-irb (~> 2.0)
104
+ rubysl-logger (~> 2.0)
105
+ rubysl-mathn (~> 2.0)
106
+ rubysl-matrix (~> 2.0)
107
+ rubysl-mkmf (~> 2.0)
108
+ rubysl-monitor (~> 2.0)
109
+ rubysl-mutex_m (~> 2.0)
110
+ rubysl-net-ftp (~> 2.0)
111
+ rubysl-net-http (~> 2.0)
112
+ rubysl-net-imap (~> 2.0)
113
+ rubysl-net-pop (~> 2.0)
114
+ rubysl-net-protocol (~> 2.0)
115
+ rubysl-net-smtp (~> 2.0)
116
+ rubysl-net-telnet (~> 2.0)
117
+ rubysl-nkf (~> 2.0)
118
+ rubysl-observer (~> 2.0)
119
+ rubysl-open-uri (~> 2.0)
120
+ rubysl-open3 (~> 2.0)
121
+ rubysl-openssl (~> 2.0)
122
+ rubysl-optparse (~> 2.0)
123
+ rubysl-ostruct (~> 2.0)
124
+ rubysl-pathname (~> 2.0)
125
+ rubysl-prettyprint (~> 2.0)
126
+ rubysl-prime (~> 2.0)
127
+ rubysl-profile (~> 2.0)
128
+ rubysl-profiler (~> 2.0)
129
+ rubysl-pstore (~> 2.0)
130
+ rubysl-pty (~> 2.0)
131
+ rubysl-rational (~> 2.0)
132
+ rubysl-readline (~> 2.0)
133
+ rubysl-resolv (~> 2.0)
134
+ rubysl-rexml (~> 2.0)
135
+ rubysl-rinda (~> 2.0)
136
+ rubysl-rss (~> 2.0)
137
+ rubysl-scanf (~> 2.0)
138
+ rubysl-securerandom (~> 2.0)
139
+ rubysl-set (~> 2.0)
140
+ rubysl-shellwords (~> 2.0)
141
+ rubysl-singleton (~> 2.0)
142
+ rubysl-socket (~> 2.0)
143
+ rubysl-stringio (~> 2.0)
144
+ rubysl-strscan (~> 2.0)
145
+ rubysl-sync (~> 2.0)
146
+ rubysl-syslog (~> 2.0)
147
+ rubysl-tempfile (~> 2.0)
148
+ rubysl-thread (~> 2.0)
149
+ rubysl-thwait (~> 2.0)
150
+ rubysl-time (~> 2.0)
151
+ rubysl-timeout (~> 2.0)
152
+ rubysl-tmpdir (~> 2.0)
153
+ rubysl-tsort (~> 2.0)
154
+ rubysl-un (~> 2.0)
155
+ rubysl-uri (~> 2.0)
156
+ rubysl-weakref (~> 2.0)
157
+ rubysl-webrick (~> 2.0)
158
+ rubysl-xmlrpc (~> 2.0)
159
+ rubysl-yaml (~> 2.0)
160
+ rubysl-zlib (~> 2.0)
161
+ rubysl-abbrev (2.0.4)
162
+ rubysl-base64 (2.0.0)
163
+ rubysl-benchmark (2.0.1)
164
+ rubysl-bigdecimal (2.0.2)
165
+ rubysl-cgi (2.0.1)
166
+ rubysl-cgi-session (2.0.1)
167
+ rubysl-cmath (2.0.0)
168
+ rubysl-complex (2.0.0)
169
+ rubysl-continuation (2.0.0)
170
+ rubysl-coverage (2.0.3)
171
+ rubysl-csv (2.0.2)
172
+ rubysl-english (~> 2.0)
173
+ rubysl-curses (2.0.1)
174
+ rubysl-date (2.0.6)
175
+ rubysl-delegate (2.0.1)
176
+ rubysl-digest (2.0.3)
177
+ rubysl-drb (2.0.1)
178
+ rubysl-e2mmap (2.0.0)
179
+ rubysl-english (2.0.0)
180
+ rubysl-enumerator (2.0.0)
181
+ rubysl-erb (2.0.1)
182
+ rubysl-etc (2.0.3)
183
+ ffi2-generators (~> 0.1)
184
+ rubysl-expect (2.0.0)
185
+ rubysl-fcntl (2.0.4)
186
+ ffi2-generators (~> 0.1)
187
+ rubysl-fiber (2.0.0)
188
+ rubysl-fileutils (2.0.3)
189
+ rubysl-find (2.0.1)
190
+ rubysl-forwardable (2.0.1)
191
+ rubysl-getoptlong (2.0.0)
192
+ rubysl-gserver (2.0.0)
193
+ rubysl-socket (~> 2.0)
194
+ rubysl-thread (~> 2.0)
195
+ rubysl-io-console (2.0.0)
196
+ rubysl-io-nonblock (2.0.0)
197
+ rubysl-io-wait (2.0.0)
198
+ rubysl-ipaddr (2.0.0)
199
+ rubysl-irb (2.0.4)
200
+ rubysl-e2mmap (~> 2.0)
201
+ rubysl-mathn (~> 2.0)
202
+ rubysl-readline (~> 2.0)
203
+ rubysl-thread (~> 2.0)
204
+ rubysl-logger (2.0.0)
205
+ rubysl-mathn (2.0.0)
206
+ rubysl-matrix (2.1.0)
207
+ rubysl-e2mmap (~> 2.0)
208
+ rubysl-mkmf (2.0.1)
209
+ rubysl-fileutils (~> 2.0)
210
+ rubysl-shellwords (~> 2.0)
211
+ rubysl-monitor (2.0.0)
212
+ rubysl-mutex_m (2.0.0)
213
+ rubysl-net-ftp (2.0.1)
214
+ rubysl-net-http (2.0.4)
215
+ rubysl-cgi (~> 2.0)
216
+ rubysl-erb (~> 2.0)
217
+ rubysl-singleton (~> 2.0)
218
+ rubysl-net-imap (2.0.1)
219
+ rubysl-net-pop (2.0.1)
220
+ rubysl-net-protocol (2.0.1)
221
+ rubysl-net-smtp (2.0.1)
222
+ rubysl-net-telnet (2.0.0)
223
+ rubysl-nkf (2.0.1)
224
+ rubysl-observer (2.0.0)
225
+ rubysl-open-uri (2.0.0)
226
+ rubysl-open3 (2.0.0)
227
+ rubysl-openssl (2.1.0)
228
+ rubysl-optparse (2.0.1)
229
+ rubysl-shellwords (~> 2.0)
230
+ rubysl-ostruct (2.0.4)
231
+ rubysl-pathname (2.0.0)
232
+ rubysl-prettyprint (2.0.3)
233
+ rubysl-prime (2.0.1)
234
+ rubysl-profile (2.0.0)
235
+ rubysl-profiler (2.0.1)
236
+ rubysl-pstore (2.0.0)
237
+ rubysl-pty (2.0.2)
238
+ rubysl-rational (2.0.1)
239
+ rubysl-readline (2.0.2)
240
+ rubysl-resolv (2.1.0)
241
+ rubysl-rexml (2.0.2)
242
+ rubysl-rinda (2.0.1)
243
+ rubysl-rss (2.0.0)
244
+ rubysl-scanf (2.0.0)
245
+ rubysl-securerandom (2.0.0)
246
+ rubysl-set (2.0.1)
247
+ rubysl-shellwords (2.0.0)
248
+ rubysl-singleton (2.0.0)
249
+ rubysl-socket (2.0.1)
250
+ rubysl-stringio (2.0.0)
251
+ rubysl-strscan (2.0.0)
252
+ rubysl-sync (2.0.0)
253
+ rubysl-syslog (2.0.1)
254
+ ffi2-generators (~> 0.1)
255
+ rubysl-tempfile (2.0.1)
256
+ rubysl-thread (2.0.2)
257
+ rubysl-thwait (2.0.0)
258
+ rubysl-time (2.0.3)
259
+ rubysl-timeout (2.0.0)
260
+ rubysl-tmpdir (2.0.1)
261
+ rubysl-tsort (2.0.1)
262
+ rubysl-un (2.0.0)
263
+ rubysl-fileutils (~> 2.0)
264
+ rubysl-optparse (~> 2.0)
265
+ rubysl-uri (2.0.0)
266
+ rubysl-weakref (2.0.0)
267
+ rubysl-webrick (2.0.0)
268
+ rubysl-xmlrpc (2.0.0)
269
+ rubysl-yaml (2.0.4)
270
+ rubysl-zlib (2.0.1)
271
+ simplecov (0.8.2)
272
+ docile (~> 1.1.0)
273
+ multi_json
274
+ simplecov-html (~> 0.8.0)
275
+ simplecov-html (0.8.0)
276
+ term-ansicolor (1.3.0)
277
+ tins (~> 1.0)
278
+ thor (0.19.1)
279
+ tins (1.3.0)
280
+
281
+ PLATFORMS
282
+ ruby
283
+
284
+ DEPENDENCIES
285
+ bundler (~> 1.3)
286
+ coveralls
287
+ rake (~> 10.1.0)
288
+ rspec!
289
+ rspec-change_collection!
290
+ rspec-core!
291
+ rspec-expectations!
292
+ rspec-mocks!
293
+ rspec-support!
294
+ rubysl
@@ -0,0 +1,28 @@
1
+ (The MIT License)
2
+
3
+ Copyright (c) 2014 Andrew Brown
4
+ Copyright (c) 2013 Peter Alfvin
5
+ Copyright (c) 2012 David Chelimsky, Myron Marston
6
+ Copyright (c) 2006 David Chelimsky, The RSpec Development Team
7
+ Copyright (c) 2005 Steven Baker
8
+
9
+ MIT License
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining
12
+ a copy of this software and associated documentation files (the
13
+ "Software"), to deal in the Software without restriction, including
14
+ without limitation the rights to use, copy, modify, merge, publish,
15
+ distribute, sublicense, and/or sell copies of the Software, and to
16
+ permit persons to whom the Software is furnished to do so, subject to
17
+ the following conditions:
18
+
19
+ The above copyright notice and this permission notice shall be
20
+ included in all copies or substantial portions of the Software.
21
+
22
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,43 @@
1
+ # RSpec::ChangeCollection [![Build Status](https://travis-ci.org/dontfidget/rspec-change_collection.png)](https://travis-ci.org/dontfidget/rspec-change_collection)
2
+
3
+ RSpec::ChangeCollection provides the `to_include` and `to_exclude` methods to the `change` for blocks that return a collection.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'rspec-change_collection'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install rspec-change_collection
18
+
19
+ And require it as:
20
+
21
+ require 'rspec/change_collection'
22
+
23
+ ## Usage
24
+
25
+ Use the `to_include` and `to_exclude` methods to make assertions about the effect of an rspec `change` block.
26
+
27
+ Both `to_include` and `to_exclude` accept objects or blocks. You can pass it a list of objects:
28
+
29
+ array = []
30
+ expect { array << 1 << 2 }.to change { array }.to_include 1, 2
31
+
32
+ And you can use block to make claims about any of the items before and after the change:
33
+
34
+ array = [1]
35
+ expect { array << 2 }.to change { array }.to_include(&:even?)
36
+
37
+ ## Contributing
38
+
39
+ 1. Fork it
40
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
41
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
42
+ 4. Push to the branch (`git push origin my-new-feature`)
43
+ 5. Create new Pull Request
@@ -0,0 +1,13 @@
1
+ require "bundler"
2
+ Bundler.setup
3
+ Bundler::GemHelper.install_tasks
4
+
5
+ require "rake"
6
+ require "rspec/core/rake_task"
7
+
8
+ desc "Run all examples"
9
+ RSpec::Core::RakeTask.new(:spec) do |t|
10
+ t.ruby_opts = %w[-w]
11
+ end
12
+
13
+ task :default => :spec
@@ -0,0 +1,172 @@
1
+ require 'rspec/change_collection/version'
2
+ require 'rspec/core'
3
+ require 'rspec/expectations'
4
+
5
+ module RSpec::Matchers
6
+ module ChangeCollection
7
+ class Change < RSpec::Matchers::BuiltIn::Change
8
+ def initialize(receiver=nil, message=nil, &block)
9
+ @expected_to_include = []
10
+ @expected_to_exclude = []
11
+
12
+ @missing_original_items = []
13
+ @extra_original_items = []
14
+
15
+ @missing_final_items = []
16
+ @extra_final_items = []
17
+
18
+ super
19
+ end
20
+
21
+ def matches?(*)
22
+ @parent_matches = super
23
+
24
+ if expect_collection_to_change?
25
+ actual_before = @change_details.actual_before
26
+ actual_after = @change_details.actual_after
27
+
28
+ if actual_before.respond_to?(:to_ary)
29
+ @missing_original_items = extract_items(@expected_to_exclude) - actual_before
30
+ @missing_original_items += reject_procs(actual_before, @expected_to_exclude)
31
+ @extra_original_items = select_items(actual_before, @expected_to_include) & actual_before
32
+ end
33
+
34
+ if actual_after.respond_to?(:to_ary)
35
+ @missing_final_items = extract_items(@expected_to_include) - actual_after
36
+ @missing_final_items += reject_procs(actual_after, @expected_to_include)
37
+ @extra_final_items = select_items(actual_after, @expected_to_exclude) & actual_after
38
+ end
39
+ end
40
+
41
+ @parent_matches && ![
42
+ @missing_original_items,
43
+ @extra_original_items,
44
+ @missing_final_items,
45
+ @extra_final_items
46
+ ].map(&:empty?).include?(false)
47
+ end
48
+
49
+ def failure_message
50
+ if @parent_matches
51
+ message = ""
52
+ else
53
+ message = super
54
+ end
55
+
56
+ if expect_collection_to_change?
57
+ array_messages = []
58
+ append_array_message = lambda do |message, values|
59
+ array_messages << "#{message}#{values.inspect}" if values.length > 0
60
+ end
61
+ append_array_message.call(
62
+ "the original collection should have included: ",
63
+ @missing_original_items
64
+ )
65
+ append_array_message.call(
66
+ "the original collection should not have included: ",
67
+ @extra_original_items
68
+ )
69
+ append_array_message.call(
70
+ "the final collection should have included: ",
71
+ @missing_final_items
72
+ )
73
+ append_array_message.call(
74
+ "the final collection should not have included: ",
75
+ @extra_final_items
76
+ )
77
+ append_array_message.call(
78
+ "the original collection was: ",
79
+ @change_details.actual_before
80
+ )
81
+ append_array_message.call(
82
+ "the final collection was: ",
83
+ @change_details.actual_after
84
+ )
85
+ message << "\n#{array_messages.join "\n"}\n" unless array_messages.empty?
86
+ message
87
+ end
88
+
89
+ message
90
+ end
91
+
92
+ def failure_message_when_negated
93
+ return "Matcher does not support negation" if expect_collection_to_change?
94
+ super
95
+ end
96
+
97
+ def to_include(*items, &block)
98
+ check_arguments(__method__, *items, &block)
99
+ @expected_to_include << items
100
+ @expected_to_include << block if block
101
+ self
102
+ end
103
+
104
+ def to_exclude(*items, &block)
105
+ check_arguments(__method__, *items, &block)
106
+ @expected_to_exclude << items
107
+ @expected_to_exclude << block if block
108
+ self
109
+ end
110
+
111
+ private
112
+
113
+ def callable?(rule)
114
+ rule.respond_to?(:call)
115
+ end
116
+
117
+ def extract_items(rules)
118
+ rules.reject { |rule| callable?(rule) }.flatten(1)
119
+ end
120
+
121
+ def reject_procs(items, rules)
122
+ rules.select { |rule| callable?(rule) }.reject { |proc| items.any? { |item| proc.call(item) }}
123
+ end
124
+
125
+ def select_items(items, rules)
126
+ items.select { |item| item_in_rules?(item, rules) }
127
+ end
128
+
129
+ def item_in_rules?(item, rules)
130
+ rules.any? do |rule|
131
+ if callable?(rule)
132
+ rule.call(item)
133
+ else
134
+ rule.include?(item)
135
+ end
136
+ end
137
+ end
138
+
139
+ def expect_collection_to_change?
140
+ [@expected_to_include, @expected_to_exclude].map(&:empty?).include?(false)
141
+ end
142
+
143
+ def safe_sort(array)
144
+ array.sort rescue array
145
+ end
146
+
147
+ def check_arguments(method, *items, &block)
148
+ if block && !items.empty?
149
+ raise(
150
+ ArgumentError,
151
+ "`#{method}` requires either objects " \
152
+ "(`to_include(obj1, obj2, ...)`) or a block (`to_include { }`) but not both. "
153
+ )
154
+ end
155
+ end
156
+ end
157
+ end
158
+
159
+ def change_with_collection(receiver=nil, message=nil, &block)
160
+ RSpec::Matchers::ChangeCollection::Change.new(receiver, message, &block)
161
+ end
162
+
163
+ alias_method :change_without_collection, :change_with_collection
164
+ alias_method :change, :change_with_collection
165
+ end
166
+
167
+ RSpec.configure do |rspec|
168
+ rspec.extend RSpec::Matchers::ChangeCollection
169
+ rspec.backtrace_exclusion_patterns << %r(/lib/rspec/change_collection)
170
+ end
171
+
172
+ RSpec::SharedContext.send(:include, RSpec::Matchers::ChangeCollection)
@@ -0,0 +1,5 @@
1
+ module RSpec
2
+ module ChangeCollection
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rspec/change_collection/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rspec-change_collection"
8
+ spec.version = RSpec::ChangeCollection::VERSION
9
+ spec.authors = ["Andrew S. Brown"]
10
+ spec.email = ["andrew@dontfidget.com"]
11
+ spec.description = %q{RSpec extension gem for attribute matching}
12
+ spec.summary = %q{Provides "change_collection" method formally part of rspec-core}
13
+ spec.homepage = "https://github.com/dontfidget/rspec-change_collection"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency 'rspec-core', '>= 2.99.0.beta1'
22
+ spec.add_runtime_dependency 'rspec-expectations', '>= 2.99.0.beta1'
23
+ spec.add_development_dependency 'bundler', '~> 1.3'
24
+ spec.add_development_dependency 'rake', '~> 10.1.0'
25
+
26
+ end
@@ -0,0 +1,13 @@
1
+ #!/bin/bash
2
+
3
+ set -e -x
4
+
5
+ # idea taken from: http://blog.headius.com/2010/03/jruby-startup-time-tips.html
6
+ export JRUBY_OPTS='-X-C' # disable JIT since these processes are so short lived
7
+
8
+ # force jRuby to use client mode JVM or a compilation mode thats as close as possible,
9
+ # idea taken from https://github.com/jruby/jruby/wiki/Improving-startup-time
10
+ export JAVA_OPTS='-client -XX:+TieredCompilation -XX:TieredStopAtLevel=1'
11
+
12
+ echo "Running rspec specs"
13
+ bin/rspec spec --format progress --profile
@@ -0,0 +1,233 @@
1
+ require 'spec_helper'
2
+
3
+ module RSpec
4
+ describe ChangeCollection do
5
+ shared_examples_for :original_change do
6
+ it "detects simple changes" do
7
+ array = []
8
+ expect {
9
+ array = [1]
10
+ }.to change { array }
11
+ end
12
+
13
+ it "raises exceptions when expectations are not met" do
14
+ array = []
15
+ expect {
16
+ expect {
17
+ array << 1
18
+ }.not_to change { array.length }
19
+ }.to raise_exception(RSpec::Expectations::ExpectationNotMetError)
20
+ end
21
+
22
+ it "provides the 'from' and 'to' change helpers" do
23
+ array = []
24
+ expect {
25
+ expect {
26
+ array << 1
27
+ }.to change { array.length }.from(0).to(2)
28
+ }.to raise_error(RSpec::Expectations::ExpectationNotMetError)
29
+ end
30
+
31
+ it "provides the 'by' change helper" do
32
+ array = []
33
+ expect {
34
+ expect {
35
+ array << 1
36
+ }.to change { array.length }.by(2)
37
+ }.to raise_error(RSpec::Expectations::ExpectationNotMetError)
38
+ end
39
+ end
40
+
41
+ describe "#to_include" do
42
+ it_behaves_like :original_change
43
+
44
+ it "succeeds when items have been added to the collection" do
45
+ array = []
46
+ expect {
47
+ array += [1]
48
+ }.to change { array} .to_include(1)
49
+ end
50
+ it "succeeds when multiple items have been added to the collection" do
51
+ array = []
52
+ expect {
53
+ array += [1, 2]
54
+ }.to change { array }.to_include(1,2)
55
+ end
56
+ it "still succeeds when the items are arrays" do
57
+ array = []
58
+ expect {
59
+ array << [1]
60
+ }.to change { array }.to_include([1])
61
+ end
62
+ it "fails when items have not been added to the collection" do
63
+ array = []
64
+ expect {
65
+ expect {
66
+ }.to change { array }.to_include(1)
67
+ }.to raise_error(RSpec::Expectations::ExpectationNotMetError,
68
+ /the final collection should have included.*\[1\]/)
69
+ end
70
+ it "fails when any item has not been added to the collection" do
71
+ array = []
72
+ expect {
73
+ expect {
74
+ array += [1]
75
+ }.to change { array }.to_include(1,2)
76
+ }.to raise_error(RSpec::Expectations::ExpectationNotMetError,
77
+ /the final collection should have included.*\[2\]/)
78
+ end
79
+ it "fails when an item to include was already included" do
80
+ array = [1]
81
+ expect {
82
+ expect {
83
+ }.to change { array }.to_include(1)
84
+ }.to raise_error(RSpec::Expectations::ExpectationNotMetError,
85
+ /the original collection should not have included.*\[1\]/)
86
+ end
87
+
88
+ describe "with a block" do
89
+ it "passes if initial condition is not met by non-empty-array and final condition is met" do
90
+ array = [1,3]
91
+ expect {
92
+ array << 2
93
+ }.to change { array }.to_include(&:even?)
94
+ end
95
+
96
+ it "passes if initial condition is not met by empty array and final condition is met" do
97
+ array = []
98
+ expect {
99
+ array << 2
100
+ }.to change { array }.to_include(&:even?)
101
+ end
102
+
103
+ it "fails if initial condition is not met and final condition is still not met" do
104
+ array = [1,3]
105
+ expect {
106
+ expect {
107
+ array << 5
108
+ }.to change { array }.to_include(&:even?)
109
+ }.to raise_error(RSpec::Expectations::ExpectationNotMetError)
110
+ end
111
+
112
+ it "fails if there is no change in array" do
113
+ array = [1,3]
114
+ expect {
115
+ expect {
116
+ # nop
117
+ }.to change { array }.to_include(&:even?)
118
+ }.to raise_error(RSpec::Expectations::ExpectationNotMetError)
119
+ end
120
+
121
+ it "fails if also passed an item" do
122
+ array = []
123
+ expect {
124
+ expect {
125
+ # nop
126
+ }.to change { array }.to_include(1, &:even?)
127
+ }.to raise_error(ArgumentError)
128
+ end
129
+ end
130
+ end
131
+
132
+ describe "#to_exclude" do
133
+ it_behaves_like :original_change
134
+
135
+ it "passes if the specified item has been removed from the collection" do
136
+ array = [1]
137
+ expect {
138
+ array = []
139
+ }.to change { array }.to_exclude(1)
140
+ end
141
+
142
+ it "passes if all of multiple specified items have been removed from the collection" do
143
+ array = [1,2]
144
+ expect {
145
+ array = []
146
+ }.to change { array }.to_exclude(1,2)
147
+ end
148
+
149
+ it "fails if any specified item has not been removed from the collection" do
150
+ array = [1,2]
151
+ expect {
152
+ expect {
153
+ array = [1]
154
+ }.to change { array }.to_exclude(1,2)
155
+ }.to raise_error(RSpec::Expectations::ExpectationNotMetError,
156
+ /the final collection should not have included.*\[1\]/)
157
+ end
158
+
159
+ it "fails if a specified item was never in the collection" do
160
+ array = []
161
+ expect {
162
+ expect {
163
+ }.to change { array }.to_exclude(1)
164
+ }.to raise_error(RSpec::Expectations::ExpectationNotMetError,
165
+ /the original collection should have included.*\[1\]/)
166
+ end
167
+
168
+ it "fails if any specified item was never in the collection" do
169
+ array = [1]
170
+ expect {
171
+ expect {
172
+ array = []
173
+ }.to change { array }.to_exclude(1,2)
174
+ }.to raise_error(RSpec::Expectations::ExpectationNotMetError,
175
+ /the original collection should have included.*\[2\]/)
176
+ end
177
+
178
+ describe "with a block" do
179
+ it "passes if initial condition is met and final condition is met" do
180
+ array = [1,2,3]
181
+ expect {
182
+ array -= [2]
183
+ }.to change { array }.to_exclude(&:even?)
184
+ end
185
+
186
+ it "fails if initial condition is not met by non-empty collection" do
187
+ array = [1,3]
188
+ expect {
189
+ expect {
190
+ array -= [3]
191
+ }.to change { array }.to_exclude(&:even?)
192
+ }.to raise_error(RSpec::Expectations::ExpectationNotMetError)
193
+ end
194
+
195
+ it "fails if initial condition is not met by empty collection" do
196
+ array = []
197
+ expect {
198
+ expect {
199
+ array << 3
200
+ }.to change { array }.to_exclude(&:even?)
201
+ }.to raise_error(RSpec::Expectations::ExpectationNotMetError)
202
+ end
203
+
204
+ it "fails if final condition is not met" do
205
+ array = [1,2,3]
206
+ expect {
207
+ expect {
208
+ array -= [3]
209
+ }.to change { array }.to_exclude(&:even?)
210
+ }.to raise_error(RSpec::Expectations::ExpectationNotMetError)
211
+ end
212
+
213
+ it "fails if there is no change" do
214
+ array = [2]
215
+ expect {
216
+ expect {
217
+ # nop
218
+ }.to change { array }.to_exclude(&:even?)
219
+ }.to raise_error(RSpec::Expectations::ExpectationNotMetError)
220
+ end
221
+
222
+ it "fails if also passed an item" do
223
+ array = []
224
+ expect {
225
+ expect {
226
+ # nop
227
+ }.to change { array }.to_include(1, &:even?)
228
+ }.to raise_error(ArgumentError)
229
+ end
230
+ end
231
+ end
232
+ end
233
+ end
@@ -0,0 +1,15 @@
1
+ require 'rspec/change_collection'
2
+
3
+ Dir['./spec/support/**/*'].each {|f| require f}
4
+
5
+ class NullFormatter
6
+ private
7
+ def method_missing(method, *args, &block)
8
+ # ignore
9
+ end
10
+ end
11
+
12
+ RSpec.configure do |config|
13
+ config.run_all_when_everything_filtered = true
14
+ config.order = 'random'
15
+ end
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rspec-change_collection
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Andrew S. Brown
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-07-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec-core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.99.0.beta1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.99.0.beta1
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec-expectations
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.99.0.beta1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 2.99.0.beta1
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 10.1.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 10.1.0
69
+ description: RSpec extension gem for attribute matching
70
+ email:
71
+ - andrew@dontfidget.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - Changelog.md
78
+ - Gemfile
79
+ - Gemfile.lock
80
+ - LICENSE.txt
81
+ - README.md
82
+ - Rakefile
83
+ - lib/rspec/change_collection.rb
84
+ - lib/rspec/change_collection/version.rb
85
+ - rspec-change_collection.gemspec
86
+ - script/test_all
87
+ - spec/rspec/change_collection_spec.rb
88
+ - spec/spec_helper.rb
89
+ homepage: https://github.com/dontfidget/rspec-change_collection
90
+ licenses:
91
+ - MIT
92
+ metadata: {}
93
+ post_install_message:
94
+ rdoc_options: []
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ requirements: []
108
+ rubyforge_project:
109
+ rubygems_version: 2.2.2
110
+ signing_key:
111
+ specification_version: 4
112
+ summary: Provides "change_collection" method formally part of rspec-core
113
+ test_files:
114
+ - spec/rspec/change_collection_spec.rb
115
+ - spec/spec_helper.rb