Hello community,
here is the log from the commit of package rubygem-rspec-expectations for
openSUSE:Factory checked in at 2015-12-01 10:02:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rubygem-rspec-expectations (Old)
and /work/SRC/openSUSE:Factory/.rubygem-rspec-expectations.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-rspec-expectations"
Changes:
--------
---
/work/SRC/openSUSE:Factory/rubygem-rspec-expectations/rubygem-rspec-expectations.changes
2015-07-20 11:19:56.000000000 +0200
+++
/work/SRC/openSUSE:Factory/.rubygem-rspec-expectations.new/rubygem-rspec-expectations.changes
2015-12-01 10:02:15.000000000 +0100
@@ -1,0 +2,32 @@
+Fri Nov 13 05:38:50 UTC 2015 - [email protected]
+
+- updated to version 3.4.0
+ see installed Changelog.md
+
+ ### 3.4.0 / 2015-11-11
+ [Full
Changelog](http://github.com/rspec/rspec-expectations/compare/v3.3.1...v3.4.0)
+
+ Enhancements:
+
+ * Warn when `RSpec::Matchers` is included in a superclass after it has
+ already been included in a subclass on MRI 1.9, since that situation
+ can cause uses of `super` to trigger infinite recursion. (Myron Marston,
#816)
+ * Stop rescuing `NoMemoryError`, `SignalExcepetion`, `Interrupt` and
+ `SystemExit`. It is dangerous to interfere with these. (Myron Marston,
#845)
+ * Add `#with_captures` to the
+ [match
matcher](https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/match-matcher)
+ which allows a user to specify expected captures when matching a regex
+ against a string. (Sam Phippen, #848)
+ * Always print compound failure messages in the multi-line form. Trying
+ to print it all on a single line didn't read very well. (Myron Marston,
#859)
+
+ Bug Fixes:
+
+ * Fix failure message from dynamic predicate matchers when the object
+ does not respond to the predicate so that it is inspected rather
+ than relying upon it's `to_s` -- that way for `nil`, `"nil"` is
+ printed rather than an empty string. (Myron Marston, #841)
+ * Fix SystemStackError raised when diffing an Enumerable object
+ whose `#each` includes the object itself. (Yuji Nakayama, #857)
+
+-------------------------------------------------------------------
Old:
----
rspec-expectations-3.3.1.gem
New:
----
rspec-expectations-3.4.0.gem
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ rubygem-rspec-expectations.spec ++++++
--- /var/tmp/diff_new_pack.CcJTmj/_old 2015-12-01 10:02:16.000000000 +0100
+++ /var/tmp/diff_new_pack.CcJTmj/_new 2015-12-01 10:02:16.000000000 +0100
@@ -24,7 +24,7 @@
#
Name: rubygem-rspec-expectations
-Version: 3.3.1
+Version: 3.4.0
Release: 0
%define mod_name rspec-expectations
%define mod_full_name %{mod_name}-%{version}
@@ -50,7 +50,7 @@
%install
%gem_install \
- --doc-files="Changelog.md License.txt README.md" \
+ --doc-files="Changelog.md LICENSE.md README.md" \
-f
%gem_packages
++++++ rspec-expectations-3.3.1.gem -> rspec-expectations-3.4.0.gem ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/.document new/.document
--- old/.document 2015-07-15 19:09:01.000000000 +0200
+++ new/.document 2015-11-12 08:48:14.000000000 +0100
@@ -1,5 +1,5 @@
lib/**/*.rb
-
README.md
-License.txt
+LICENSE.md
Changelog.md
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/.yardopts new/.yardopts
--- old/.yardopts 2015-07-15 19:09:01.000000000 +0200
+++ new/.yardopts 2015-11-12 08:48:14.000000000 +0100
@@ -3,4 +3,4 @@
--markup markdown
-
Changelog.md
-License.txt
+LICENSE.md
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Changelog.md new/Changelog.md
--- old/Changelog.md 2015-07-15 19:09:01.000000000 +0200
+++ new/Changelog.md 2015-11-12 08:48:14.000000000 +0100
@@ -1,3 +1,29 @@
+### 3.4.0 / 2015-11-11
+[Full
Changelog](http://github.com/rspec/rspec-expectations/compare/v3.3.1...v3.4.0)
+
+Enhancements:
+
+* Warn when `RSpec::Matchers` is included in a superclass after it has
+ already been included in a subclass on MRI 1.9, since that situation
+ can cause uses of `super` to trigger infinite recursion. (Myron Marston,
#816)
+* Stop rescuing `NoMemoryError`, `SignalExcepetion`, `Interrupt` and
+ `SystemExit`. It is dangerous to interfere with these. (Myron Marston, #845)
+* Add `#with_captures` to the
+ [match
matcher](https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/match-matcher)
+ which allows a user to specify expected captures when matching a regex
+ against a string. (Sam Phippen, #848)
+* Always print compound failure messages in the multi-line form. Trying
+ to print it all on a single line didn't read very well. (Myron Marston, #859)
+
+Bug Fixes:
+
+* Fix failure message from dynamic predicate matchers when the object
+ does not respond to the predicate so that it is inspected rather
+ than relying upon it's `to_s` -- that way for `nil`, `"nil"` is
+ printed rather than an empty string. (Myron Marston, #841)
+* Fix SystemStackError raised when diffing an Enumerable object
+ whose `#each` includes the object itself. (Yuji Nakayama, #857)
+
### 3.3.1 / 2015-07-15
[Full
Changelog](http://github.com/rspec/rspec-expectations/compare/v3.3.0...v3.3.1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/LICENSE.md new/LICENSE.md
--- old/LICENSE.md 1970-01-01 01:00:00.000000000 +0100
+++ new/LICENSE.md 2015-11-12 08:48:14.000000000 +0100
@@ -0,0 +1,25 @@
+The MIT License (MIT)
+=====================
+
+* Copyright © 2012 David Chelimsky, Myron Marston
+* Copyright © 2006 David Chelimsky, The RSpec Development Team
+* Copyright © 2005 Steven Baker
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/License.txt new/License.txt
--- old/License.txt 2015-07-15 19:09:01.000000000 +0200
+++ new/License.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1,24 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2012 David Chelimsky, Myron Marston
-Copyright (c) 2006 David Chelimsky, The RSpec Development Team
-Copyright (c) 2005 Steven Baker
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/README.md new/README.md
--- old/README.md 2015-07-15 19:09:01.000000000 +0200
+++ new/README.md 2015-11-12 08:48:14.000000000 +0100
@@ -27,6 +27,20 @@
gem install rspec-expectations
+## Contributing
+
+Once you've set up the environment, you'll need to cd into the working
+directory of whichever repo you want to work in. From there you can run the
+specs and cucumber features, and make patches.
+
+NOTE: You do not need to use rspec-dev to work on a specific RSpec repo. You
+can treat each RSpec repo as an independent project.
+
+- [Build details](BUILD_DETAIL.md)
+- [Code of Conduct](CODE_OF_CONDUCT.md)
+- [Detailed contributing guide](CONTRIBUTING.md)
+- [Development setup guide](DEVELOPMENT.md)
+
## Basic usage
Here's an example using rspec-core:
@@ -283,7 +297,7 @@
## Also see
-* [http://github.com/rspec/rspec](http://github.com/rspec/rspec)
-* [http://github.com/rspec/rspec-core](http://github.com/rspec/rspec-core)
-* [http://github.com/rspec/rspec-mocks](http://github.com/rspec/rspec-mocks)
-*
[http://github.com/rspec/rspec-collection_matchers](https://github.com/rspec/rspec-collection_matchers)
+* [https://github.com/rspec/rspec](https://github.com/rspec/rspec)
+* [https://github.com/rspec/rspec-core](https://github.com/rspec/rspec-core)
+* [https://github.com/rspec/rspec-mocks](https://github.com/rspec/rspec-mocks)
+* [https://github.com/rspec/rspec-rails](https://github.com/rspec/rspec-rails)
Files old/checksums.yaml.gz and new/checksums.yaml.gz differ
Files old/checksums.yaml.gz.sig and new/checksums.yaml.gz.sig differ
Files old/data.tar.gz.sig and new/data.tar.gz.sig differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/rspec/expectations/failure_aggregator.rb
new/lib/rspec/expectations/failure_aggregator.rb
--- old/lib/rspec/expectations/failure_aggregator.rb 2015-07-15
19:09:01.000000000 +0200
+++ new/lib/rspec/expectations/failure_aggregator.rb 2015-11-12
08:48:14.000000000 +0100
@@ -15,7 +15,7 @@
# of `failures` rather than letting it fall through and be
categorized as part of
# `other_errors`.
failures << e
- rescue Exception => e
+ rescue Support::AllExceptionsExceptOnesWeMustNotRescue => e
# While it is normally a bad practice to rescue `Exception`, it's
important we do
# so here. It's low risk (`notify_aggregated_failures` below will
re-raise the exception,
# or raise a `MultipleExpectationsNotMetError` that includes the
exception), and it's
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/rspec/expectations/version.rb
new/lib/rspec/expectations/version.rb
--- old/lib/rspec/expectations/version.rb 2015-07-15 19:09:01.000000000
+0200
+++ new/lib/rspec/expectations/version.rb 2015-11-12 08:48:14.000000000
+0100
@@ -2,7 +2,7 @@
module Expectations
# @private
module Version
- STRING = '3.3.1'
+ STRING = '3.4.0'
end
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/rspec/matchers/built_in/base_matcher.rb
new/lib/rspec/matchers/built_in/base_matcher.rb
--- old/lib/rspec/matchers/built_in/base_matcher.rb 2015-07-15
19:09:01.000000000 +0200
+++ new/lib/rspec/matchers/built_in/base_matcher.rb 2015-11-12
08:48:14.000000000 +0100
@@ -8,8 +8,8 @@
#
# ### Warning:
#
- # This class is for internal use, and subject to change without notice.
We
- # strongly recommend that you do not base your custom matchers on this
+ # This class is for internal use, and subject to change without notice.
+ # We strongly recommend that you do not base your custom matchers on this
# class. If/when this changes, we will announce it and remove this
warning.
class BaseMatcher
include RSpec::Matchers::Composable
@@ -92,7 +92,7 @@
# @private
def self.matcher_name
- @matcher_name ||= underscore(name.split("::").last)
+ @matcher_name ||= underscore(name.split('::').last)
end
# @private
@@ -101,7 +101,7 @@
word = camel_cased_word.to_s.dup
word.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
- word.tr!("-", "_")
+ word.tr!('-', '_')
word.downcase!
word
end
@@ -118,7 +118,7 @@
if RUBY_VERSION.to_f < 1.9
# :nocov:
def present_ivars
- instance_variables.map { |v| v.to_sym }
+ instance_variables.map(&:to_sym)
end
# :nocov:
else
@@ -168,7 +168,7 @@
# @private
def self.has_default_failure_messages?(matcher)
matcher.method(:failure_message).owner == self &&
- matcher.method(:failure_message_when_negated).owner == self
+ matcher.method(:failure_message_when_negated).owner == self
rescue NameError
false
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/rspec/matchers/built_in/be.rb
new/lib/rspec/matchers/built_in/be.rb
--- old/lib/rspec/matchers/built_in/be.rb 2015-07-15 19:09:01.000000000
+0200
+++ new/lib/rspec/matchers/built_in/be.rb 2015-11-12 08:48:14.000000000
+0100
@@ -267,7 +267,7 @@
def validity_message
return nil if predicate_accessible?
- msg = "expected #{@actual} to respond to `#{predicate}`"
+ msg = "expected #{actual_formatted} to respond to `#{predicate}`"
if private_predicate?
msg << " but `#{predicate}` is a private method"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/rspec/matchers/built_in/change.rb
new/lib/rspec/matchers/built_in/change.rb
--- old/lib/rspec/matchers/built_in/change.rb 2015-07-15 19:09:01.000000000
+0200
+++ new/lib/rspec/matchers/built_in/change.rb 2015-11-12 08:48:14.000000000
+0100
@@ -58,13 +58,15 @@
# @api private
# @return [String]
def failure_message
- "expected #{@change_details.message} to have changed, but
#{positive_failure_reason}"
+ "expected #{@change_details.message} to have changed, " \
+ "but #{positive_failure_reason}"
end
# @api private
# @return [String]
def failure_message_when_negated
- "expected #{@change_details.message} not to have changed, but
#{negative_failure_reason}"
+ "expected #{@change_details.message} not to have changed, " \
+ "but #{negative_failure_reason}"
end
# @api private
@@ -96,7 +98,8 @@
def negative_failure_reason
return "was not given a block" unless Proc === @event_proc
- "did change from #{description_of @change_details.actual_before} to
#{description_of @change_details.actual_after}"
+ "did change from #{description_of @change_details.actual_before} " \
+ "to #{description_of @change_details.actual_after}"
end
end
@@ -112,7 +115,9 @@
# @private
def failure_message
- "expected #{@change_details.message} to have changed
#{@relativity.to_s.gsub("_", " ")} #{description_of @expected_delta}, but
#{failure_reason}"
+ "expected #{@change_details.message} to have changed " \
+ "#{@relativity.to_s.tr('_', ' ')} " \
+ "#{description_of @expected_delta}, but #{failure_reason}"
end
# @private
@@ -125,12 +130,14 @@
# @private
def does_not_match?(_event_proc)
- raise NotImplementedError, "`expect { }.not_to change {
}.#{@relativity}()` is not supported"
+ raise NotImplementedError, "`expect { }.not_to change " \
+ "{ }.#{@relativity}()` is not supported"
end
# @private
def description
- "change #{@change_details.message} #{@relativity.to_s.gsub("_", "
")} #{description_of @expected_delta}"
+ "change #{@change_details.message} " \
+ "#{@relativity.to_s.tr('_', ' ')} #{description_of @expected_delta}"
end
# @private
@@ -195,23 +202,31 @@
end
def before_value_failure
- "expected #{@change_details.message} to have initially been
#{description_of @expected_before}, but was #{description_of
@change_details.actual_before}"
+ "expected #{@change_details.message} " \
+ "to have initially been #{description_of @expected_before}, " \
+ "but was #{description_of @change_details.actual_before}"
end
def after_value_failure
- "expected #{@change_details.message} to have changed to
#{description_of @expected_after}, but is now #{description_of
@change_details.actual_after}"
+ "expected #{@change_details.message} " \
+ "to have changed to #{description_of @expected_after}, " \
+ "but is now #{description_of @change_details.actual_after}"
end
def did_not_change_failure
- "expected #{@change_details.message} to have changed
#{change_description}, but did not change"
+ "expected #{@change_details.message} " \
+ "to have changed #{change_description}, but did not change"
end
def did_change_failure
- "expected #{@change_details.message} not to have changed, but did
change from #{description_of @change_details.actual_before} to #{description_of
@change_details.actual_after}"
+ "expected #{@change_details.message} not to have changed, but " \
+ "did change from #{description_of @change_details.actual_before} " \
+ "to #{description_of @change_details.actual_after}"
end
def not_given_a_block_failure
- "expected #{@change_details.message} to have changed
#{change_description}, but was not given a block"
+ "expected #{@change_details.message} to have changed " \
+ "#{change_description}, but was not given a block"
end
end
@@ -235,7 +250,8 @@
# @private
def does_not_match?(event_proc)
if @description_suffix
- raise NotImplementedError, "`expect { }.not_to change { }.to()` is
not supported"
+ raise NotImplementedError, "`expect { }.not_to change { }.to()` " \
+ "is not supported"
end
@event_proc = event_proc
@@ -277,7 +293,8 @@
# @private
def does_not_match?(_event_proc)
- raise NotImplementedError, "`expect { }.not_to change { }.to()` is
not supported"
+ raise NotImplementedError, "`expect { }.not_to change { }.to()` " \
+ "is not supported"
end
private
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/rspec/matchers/built_in/compound.rb
new/lib/rspec/matchers/built_in/compound.rb
--- old/lib/rspec/matchers/built_in/compound.rb 2015-07-15 19:09:01.000000000
+0200
+++ new/lib/rspec/matchers/built_in/compound.rb 2015-11-12 08:48:14.000000000
+0100
@@ -24,7 +24,7 @@
# @api private
# @return [String]
def description
- singleline_message(matcher_1.description, matcher_2.description)
+ "#{matcher_1.description} #{conjunction} #{matcher_2.description}"
end
def supports_block_expectations?
@@ -84,30 +84,9 @@
end
def compound_failure_message
- message_1 = matcher_1.failure_message
- message_2 = matcher_2.failure_message
-
- if multiline?(message_1) || multiline?(message_2)
- multiline_message(message_1, message_2)
- else
- singleline_message(message_1, message_2)
- end
- end
-
- def multiline_message(message_1, message_2)
- [
- indent_multiline_message(message_1.sub(/\n+\z/, '')),
- "...#{conjunction}:",
- indent_multiline_message(message_2.sub(/\A\n+/, ''))
- ].join("\n\n")
- end
-
- def multiline?(message)
- message.lines.count > 1
- end
-
- def singleline_message(message_1, message_2)
- [message_1, conjunction, message_2].join(' ')
+ "#{indent_multiline_message(matcher_1.failure_message.sub(/\n+\z/,
''))}" \
+ "\n\n...#{conjunction}:" \
+
"\n\n#{indent_multiline_message(matcher_2.failure_message.sub(/\A\n+/, ''))}"
end
def matcher_1_matches?
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/rspec/matchers/built_in/contain_exactly.rb
new/lib/rspec/matchers/built_in/contain_exactly.rb
--- old/lib/rspec/matchers/built_in/contain_exactly.rb 2015-07-15
19:09:01.000000000 +0200
+++ new/lib/rspec/matchers/built_in/contain_exactly.rb 2015-11-12
08:48:14.000000000 +0100
@@ -9,11 +9,7 @@
# @return [String]
def failure_message
if Array === actual
- message = "expected collection contained:
#{description_of(safe_sort(surface_descriptions_in expected))}\n"
- message += "actual collection contained:
#{description_of(safe_sort(actual))}\n"
- message += "the missing elements were:
#{description_of(safe_sort(surface_descriptions_in missing_items))}\n" unless
missing_items.empty?
- message += "the extra elements were:
#{description_of(safe_sort(extra_items))}\n" unless extra_items.empty?
- message
+ generate_failure_message
else
"expected a collection that can be converted to an array with " \
"`#to_ary` or `#to_a`, but got #{actual_formatted}"
@@ -36,6 +32,43 @@
private
+ def generate_failure_message
+ message = expected_collection_line
+ message += actual_collection_line
+ message += missing_elements_line unless missing_items.empty?
+ message += extra_elements_line unless extra_items.empty?
+ message
+ end
+
+ def expected_collection_line
+ message_line('expected collection contained', expected, true)
+ end
+
+ def actual_collection_line
+ message_line('actual collection contained', actual)
+ end
+
+ def missing_elements_line
+ message_line('the missing elements were', missing_items, true)
+ end
+
+ def extra_elements_line
+ message_line('the extra elements were', extra_items)
+ end
+
+ def describe_collection(collection, surface_descriptions=false)
+ if surface_descriptions
+ "#{description_of(safe_sort(surface_descriptions_in
collection))}\n"
+ else
+ "#{description_of(safe_sort(collection))}\n"
+ end
+ end
+
+ def message_line(prefix, collection, surface_descriptions=false)
+ "%-32s%s" % [prefix + ':',
+ describe_collection(collection, surface_descriptions)]
+ end
+
def match(_expected, _actual)
return false unless convert_actual_to_an_array
match_when_sorted? || (extra_items.empty? && missing_items.empty?)
@@ -61,7 +94,7 @@
def safe_sort(array)
array.sort
- rescue Exception
+ rescue Support::AllExceptionsExceptOnesWeMustNotRescue
array
end
@@ -231,7 +264,7 @@
modified_expecteds.delete(expected_index)
- modified_actuals = apply_pairing_to(
+ modified_actuals = apply_pairing_to(
solution.indeterminate_actual_indexes,
actual_to_expected_matched_indexes, expected_index)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/rspec/matchers/built_in/match.rb
new/lib/rspec/matchers/built_in/match.rb
--- old/lib/rspec/matchers/built_in/match.rb 2015-07-15 19:09:01.000000000
+0200
+++ new/lib/rspec/matchers/built_in/match.rb 2015-11-12 08:48:14.000000000
+0100
@@ -5,10 +5,19 @@
# Provides the implementation for `match`.
# Not intended to be instantiated directly.
class Match < BaseMatcher
+ def initialize(expected)
+ super(expected)
+
+ @expected_captures = nil
+ end
# @api private
# @return [String]
def description
- "match #{surface_descriptions_in(expected).inspect}"
+ if @expected_captures && @expected.match(actual)
+ "match #{surface_descriptions_in(expected).inspect} with captures
#{surface_descriptions_in(@expected_captures).inspect}"
+ else
+ "match #{surface_descriptions_in(expected).inspect}"
+ end
end
# @api private
@@ -17,9 +26,17 @@
true
end
+ # Used to specify the captures we match against
+ # @return [self]
+ def with_captures(*captures)
+ @expected_captures = captures
+ self
+ end
+
private
def match(expected, actual)
+ return match_captures(expected, actual) if @expected_captures
return true if values_match?(expected, actual)
return false unless can_safely_call_match?(expected, actual)
actual.match(expected)
@@ -31,6 +48,58 @@
!(RSpec::Matchers.is_a_matcher?(expected) &&
(String === actual || Regexp === actual))
end
+
+ def match_captures(expected, actual)
+ match = actual.match(expected)
+ if match
+ match = ReliableMatchData.new(match)
+ if match.names.empty?
+ values_match?(@expected_captures, match.captures)
+ else
+ expected_matcher = @expected_captures.last
+ values_match?(expected_matcher,
Hash[match.names.zip(match.captures)]) ||
+ values_match?(expected_matcher,
Hash[match.names.map(&:to_sym).zip(match.captures)]) ||
+ values_match?(@expected_captures, match.captures)
+ end
+ else
+ false
+ end
+ end
+ end
+
+ # @api private
+ # Used to wrap match data and make it reliable for 1.8.7
+ class ReliableMatchData
+ def initialize(match_data)
+ @match_data = match_data
+ end
+
+ if RUBY_VERSION == "1.8.7"
+ # @api private
+ # Returns match data names for named captures
+ # @return Array
+ def names
+ []
+ end
+ else
+ # @api private
+ # Returns match data names for named captures
+ # @return Array
+ def names
+ match_data.names
+ end
+ end
+
+ # @api private
+ # returns an array of captures from the match data
+ # @return Array
+ def captures
+ match_data.captures
+ end
+
+ protected
+
+ attr_reader :match_data
end
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/rspec/matchers/built_in/raise_error.rb
new/lib/rspec/matchers/built_in/raise_error.rb
--- old/lib/rspec/matchers/built_in/raise_error.rb 2015-07-15
19:09:01.000000000 +0200
+++ new/lib/rspec/matchers/built_in/raise_error.rb 2015-11-12
08:48:14.000000000 +0100
@@ -5,6 +5,7 @@
# Provides the implementation for `raise_error`.
# Not intended to be instantiated directly.
# rubocop:disable ClassLength
+ # rubocop:disable RescueException
class RaiseError
include Composable
@@ -15,11 +16,14 @@
case expected_error_or_message
when nil
- @expected_error, @expected_message = Exception, expected_message
+ @expected_error = Exception
+ @expected_message = expected_message
when String
- @expected_error, @expected_message = Exception,
expected_error_or_message
+ @expected_error = Exception
+ @expected_message = expected_error_or_message
else
- @expected_error, @expected_message = expected_error_or_message,
expected_message
+ @expected_error = expected_error_or_message
+ @expected_message = expected_message
end
end
@@ -42,7 +46,6 @@
@eval_block = false
@eval_block_passed = false
- warn_about_bare_error if warning_about_bare_error &&
!negative_expectation
return false unless Proc === given_proc
begin
@@ -55,6 +58,7 @@
end
end
+ warn_about_bare_error if warning_about_bare_error &&
!negative_expectation
eval_block if !negative_expectation && ready_to_eval_block?
expectation_matched?
@@ -156,6 +160,7 @@
"will match when Ruby raises a `NoMethodError`,
`NameError` or " \
"`ArgumentError`, potentially allowing the expectation
to pass " \
"without even executing the method you are intending
to call. " \
+ "#{warning}"\
"Instead consider providing a specific error class or
message. " \
"This message can be supressed by setting: " \
"`RSpec::Expectations.configuration.warn_about_potential_false_positives =
false`")
@@ -207,9 +212,16 @@
end
def raise_message_already_set
- raise "`expect { }.to raise_error(message).with_message(message)` is
not valid. The matcher only allows the expected message to be specified once"
+ raise "`expect { }.to raise_error(message).with_message(message)` is
not valid. " \
+ 'The matcher only allows the expected message to be specified
once'
+ end
+
+ def warning
+ warning = "Actual error raised was #{description_of(@actual_error)}.
"
+ warning if @actual_error
end
end
+ # rubocop:enable RescueException
# rubocop:enable ClassLength
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/rspec/matchers/built_in/yield.rb
new/lib/rspec/matchers/built_in/yield.rb
--- old/lib/rspec/matchers/built_in/yield.rb 2015-07-15 19:09:01.000000000
+0200
+++ new/lib/rspec/matchers/built_in/yield.rb 2015-11-12 08:48:14.000000000
+0100
@@ -1,4 +1,4 @@
-RSpec::Support.require_rspec_support "method_signature_verifier"
+RSpec::Support.require_rspec_support 'method_signature_verifier'
module RSpec
module Matchers
@@ -22,7 +22,8 @@
def initialize(block)
@block = block
@used = false
- self.num_yields, self.yielded_args = 0, []
+ self.num_yields = 0
+ self.yielded_args = []
end
def has_block?
@@ -50,8 +51,8 @@
when 0 then false
else
raise "The #{matcher_name} matcher is not designed to be used with
a " \
- "method that yields multiple times. Use the
yield_successive_args " \
- "matcher for that case."
+ 'method that yields multiple times. Use the
yield_successive_args ' \
+ 'matcher for that case.'
end
end
@@ -63,19 +64,19 @@
def assert_used!
return if @used
- raise "You must pass the argument yielded to your expect block on " \
- "to the method-under-test as a block. It acts as a probe that
" \
- "allows the matcher to detect whether or not the
method-under-test " \
- "yields, and, if so, how many times, and what the yielded
arguments " \
- "are."
+ raise 'You must pass the argument yielded to your expect block on ' \
+ 'to the method-under-test as a block. It acts as a probe that
' \
+ 'allows the matcher to detect whether or not the
method-under-test ' \
+ 'yields, and, if so, how many times, and what the yielded
arguments ' \
+ 'are.'
end
if RUBY_VERSION.to_f > 1.8
def assert_valid_expect_block!
block_signature = RSpec::Support::BlockSignature.new(@block)
return if
RSpec::Support::StrictSignatureVerifier.new(block_signature, [self]).valid?
- raise "Your expect block must accept an argument to be used with
this " \
- "matcher. Pass the argument as a block on to the method you
are testing."
+ raise 'Your expect block must accept an argument to be used with
this ' \
+ 'matcher. Pass the argument as a block on to the method you
are testing.'
end
else
# :nocov:
@@ -190,7 +191,7 @@
end
def failure_reason
- return " but was not a block" unless @probe.has_block?
+ return ' but was not a block' unless @probe.has_block?
return '' unless @expected_yields_count
"
#{human_readable_expectation_type}#{human_readable_count(@expected_yields_count)}"
\
" but yielded #{human_readable_count(@probe.num_yields)}"
@@ -206,8 +207,8 @@
def human_readable_count(count)
case count
- when 1 then "once"
- when 2 then "twice"
+ when 1 then 'once'
+ when 2 then 'twice'
else "#{count} times"
end
end
@@ -247,14 +248,14 @@
private
def positive_failure_reason
- return "was not a block" unless @probe.has_block?
- return "did not yield" if @probe.num_yields.zero?
+ return 'was not a block' unless @probe.has_block?
+ return 'did not yield' if @probe.num_yields.zero?
"yielded with arguments: #{description_of @probe.single_yield_args}"
end
def negative_failure_reason
- return "was not a block" unless @probe.has_block?
- "did"
+ return 'was not a block' unless @probe.has_block?
+ 'did'
end
end
@@ -291,7 +292,7 @@
# @private
def description
- desc = "yield with args"
+ desc = 'yield with args'
desc << "(#{expected_arg_description})" unless @expected.empty?
desc
end
@@ -304,36 +305,36 @@
private
def positive_failure_reason
- return "was not a block" unless @probe.has_block?
- return "did not yield" if @probe.num_yields.zero?
+ return 'was not a block' unless @probe.has_block?
+ return 'did not yield' if @probe.num_yields.zero?
@positive_args_failure
end
def expected_arg_description
- @expected.map { |e| description_of e }.join(", ")
+ @expected.map { |e| description_of e }.join(', ')
end
def negative_failure_reason
if [email protected]_block?
- "was not a block"
+ 'was not a block'
elsif all_args_match?
- "yielded with expected arguments" \
- "\nexpected not: #{surface_descriptions_in(@expected).inspect}" +
+ 'yielded with expected arguments' \
+ "\nexpected not: #{surface_descriptions_in(@expected).inspect}" \
"\n got: #{actual_formatted}"
else
- "did"
+ 'did'
end
end
def args_match?
if @expected.empty? # expect {...}.to yield_with_args
- @positive_args_failure = "yielded with no arguments" if
@actual.empty?
+ @positive_args_failure = 'yielded with no arguments' if
@actual.empty?
return [email protected]?
end
unless (match = all_args_match?)
- @positive_args_failure = "yielded with unexpected arguments" \
- "\nexpected: #{surface_descriptions_in(@expected).inspect}" +
+ @positive_args_failure = 'yielded with unexpected arguments' \
+ "\nexpected: #{surface_descriptions_in(@expected).inspect}" \
"\n got: #{actual_formatted}"
end
@@ -367,19 +368,19 @@
# @private
def failure_message
- "expected given block to yield successively with arguments, but
#{positive_failure_reason}"
+ 'expected given block to yield successively with arguments, ' \
+ "but #{positive_failure_reason}"
end
# @private
def failure_message_when_negated
- "expected given block not to yield successively with arguments, but
#{negative_failure_reason}"
+ 'expected given block not to yield successively with arguments, ' \
+ "but #{negative_failure_reason}"
end
# @private
def description
- desc = "yield successive args"
- desc << "(#{expected_arg_description})"
- desc
+ "yield successive args(#{expected_arg_description})"
end
# @private
@@ -394,21 +395,21 @@
end
def expected_arg_description
- @expected.map { |e| description_of e }.join(", ")
+ @expected.map { |e| description_of e }.join(', ')
end
def positive_failure_reason
- return "was not a block" unless @probe.has_block?
+ return 'was not a block' unless @probe.has_block?
- "yielded with unexpected arguments" \
+ 'yielded with unexpected arguments' \
"\nexpected: #{surface_descriptions_in(@expected).inspect}" \
"\n got: #{actual_formatted}"
end
def negative_failure_reason
- return "was not a block" unless @probe.has_block?
+ return 'was not a block' unless @probe.has_block?
- "yielded with expected arguments" \
+ 'yielded with expected arguments' \
"\nexpected not: #{surface_descriptions_in(@expected).inspect}" \
"\n got: #{actual_formatted}"
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/rspec/matchers/composable.rb
new/lib/rspec/matchers/composable.rb
--- old/lib/rspec/matchers/composable.rb 2015-07-15 19:09:01.000000000
+0200
+++ new/lib/rspec/matchers/composable.rb 2015-11-12 08:48:14.000000000
+0100
@@ -100,14 +100,10 @@
DescribableItem.new(item)
elsif Hash === item
Hash[surface_descriptions_in(item.to_a)]
- elsif Struct === item
+ elsif Struct === item || unreadable_io?(item)
RSpec::Support::ObjectFormatter.format(item)
elsif should_enumerate?(item)
- begin
- item.map { |subitem| surface_descriptions_in(subitem) }
- rescue IOError # STDOUT is enumerable but `map` raises an error
- RSpec::Support::ObjectFormatter.format(item)
- end
+ item.map { |subitem| surface_descriptions_in(subitem) }
else
item
end
@@ -134,14 +130,10 @@
object.clone
elsif Hash === object
Hash[with_matchers_cloned(object.to_a)]
- elsif Struct === object
+ elsif Struct === object || unreadable_io?(object)
object
elsif should_enumerate?(object)
- begin
- object.map { |subobject| with_matchers_cloned(subobject) }
- rescue IOError # STDOUT is enumerable but `map` raises an error
- object
- end
+ object.map { |subobject| with_matchers_cloned(subobject) }
else
object
end
@@ -157,16 +149,25 @@
# @api private
def should_enumerate?(item)
return false if String === item
- Enumerable === item && !(Range === item)
+ Enumerable === item && !(Range === item) && item.none? { |subitem|
subitem.equal?(item) }
end
# :nocov:
else
# @api private
def should_enumerate?(item)
- Enumerable === item && !(Range === item)
+ Enumerable === item && !(Range === item) && item.none? { |subitem|
subitem.equal?(item) }
end
end
- module_function :surface_descriptions_in, :should_enumerate?
+
+ # @api private
+ def unreadable_io?(object)
+ return false unless IO === object
+ object.each {} # STDOUT is enumerable but raises an error
+ false
+ rescue IOError
+ true
+ end
+ module_function :surface_descriptions_in, :should_enumerate?,
:unreadable_io?
# Wraps an item in order to surface its `description` via `inspect`.
# @api private
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/lib/rspec/matchers.rb new/lib/rspec/matchers.rb
--- old/lib/rspec/matchers.rb 2015-07-15 19:09:01.000000000 +0200
+++ new/lib/rspec/matchers.rb 2015-11-12 08:48:14.000000000 +0100
@@ -1005,5 +1005,33 @@
def self.is_a_describable_matcher?(obj)
is_a_matcher?(obj) && obj.respond_to?(:description)
end
+
+ if RSpec::Support::Ruby.mri? && RUBY_VERSION[0, 3] == '1.9'
+ # @api private
+ # Note that `included` doesn't work for this because it is triggered
+ # _after_ `RSpec::Matchers` is an ancestor of the inclusion host, rather
+ # than _before_, like `append_features`. It's important we check this
before
+ # in order to find the cases where it was already previously included.
+ def self.append_features(mod)
+ return super if mod < self # `mod < self` indicates a re-inclusion.
+
+ subclasses = ObjectSpace.each_object(Class).select { |c| c < mod && c
< self }
+ return super unless subclasses.any?
+
+ subclasses.reject! { |s| subclasses.any? { |s2| s < s2 } } # Filter to
the root ancestor.
+ subclasses = subclasses.map { |s| "`#{s}`" }.join(", ")
+
+ RSpec.warning "`#{self}` has been included in a superclass (`#{mod}`)
" \
+ "after previously being included in subclasses
(#{subclasses}), " \
+ "which can trigger infinite recursion from `super` due
to an MRI 1.9 bug " \
+ "(https://redmine.ruby-lang.org/issues/3351). To work
around this, " \
+ "either upgrade to MRI 2.0+, include a dup of the module
(e.g. " \
+ "`include #{self}.dup`), or find a way to include
`#{self}` in `#{mod}` " \
+ "before it is included in subclasses (#{subclasses}).
See " \
+ "https://github.com/rspec/rspec-expectations/issues/814
for more info"
+
+ super
+ end
+ end
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/metadata new/metadata
--- old/metadata 2015-07-15 19:09:01.000000000 +0200
+++ new/metadata 2015-11-12 08:48:14.000000000 +0100
@@ -1,7 +1,7 @@
--- !ruby/object:Gem::Specification
name: rspec-expectations
version: !ruby/object:Gem::Version
- version: 3.3.1
+ version: 3.4.0
platform: ruby
authors:
- Steven Baker
@@ -45,7 +45,7 @@
ZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ
F3MdtaDehhjC
-----END CERTIFICATE-----
-date: 2015-07-15 00:00:00.000000000 Z
+date: 2015-11-12 00:00:00.000000000 Z
dependencies:
- !ruby/object:Gem::Dependency
name: rspec-support
@@ -53,14 +53,14 @@
requirements:
- - "~>"
- !ruby/object:Gem::Version
- version: 3.3.0
+ version: 3.4.0
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - "~>"
- !ruby/object:Gem::Version
- version: 3.3.0
+ version: 3.4.0
- !ruby/object:Gem::Dependency
name: diff-lcs
requirement: !ruby/object:Gem::Requirement
@@ -115,14 +115,14 @@
requirements:
- - "~>"
- !ruby/object:Gem::Version
- version: '0.6'
+ version: 0.6.2
type: :development
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - "~>"
- !ruby/object:Gem::Version
- version: '0.6'
+ version: 0.6.2
- !ruby/object:Gem::Dependency
name: minitest
requirement: !ruby/object:Gem::Requirement
@@ -147,7 +147,7 @@
- ".document"
- ".yardopts"
- Changelog.md
-- License.txt
+- LICENSE.md
- README.md
- lib/rspec/expectations.rb
- lib/rspec/expectations/configuration.rb
@@ -220,6 +220,6 @@
rubygems_version: 2.2.2
signing_key:
specification_version: 4
-summary: rspec-expectations-3.3.1
+summary: rspec-expectations-3.4.0
test_files: []
has_rdoc:
Files old/metadata.gz.sig and new/metadata.gz.sig differ