rspec-expectations 3.8.6 → 3.12.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/Changelog.md +147 -1
- data/README.md +35 -20
- data/lib/rspec/expectations/configuration.rb +15 -0
- data/lib/rspec/expectations/expectation_target.rb +42 -6
- data/lib/rspec/expectations/failure_aggregator.rb +41 -6
- data/lib/rspec/expectations/handler.rb +20 -8
- data/lib/rspec/expectations/version.rb +1 -1
- data/lib/rspec/matchers/aliased_matcher.rb +3 -3
- data/lib/rspec/matchers/built_in/base_matcher.rb +5 -0
- data/lib/rspec/matchers/built_in/be.rb +10 -107
- data/lib/rspec/matchers/built_in/be_within.rb +2 -2
- data/lib/rspec/matchers/built_in/change.rb +22 -0
- data/lib/rspec/matchers/built_in/compound.rb +20 -1
- data/lib/rspec/matchers/built_in/contain_exactly.rb +10 -2
- data/lib/rspec/matchers/built_in/count_expectation.rb +169 -0
- data/lib/rspec/matchers/built_in/exist.rb +1 -1
- data/lib/rspec/matchers/built_in/has.rb +88 -24
- data/lib/rspec/matchers/built_in/have_attributes.rb +1 -1
- data/lib/rspec/matchers/built_in/include.rb +72 -15
- data/lib/rspec/matchers/built_in/output.rb +7 -0
- data/lib/rspec/matchers/built_in/raise_error.rb +63 -22
- data/lib/rspec/matchers/built_in/respond_to.rb +53 -18
- data/lib/rspec/matchers/built_in/throw_symbol.rb +10 -4
- data/lib/rspec/matchers/built_in/yield.rb +26 -83
- data/lib/rspec/matchers/built_in.rb +2 -1
- data/lib/rspec/matchers/composable.rb +1 -1
- data/lib/rspec/matchers/dsl.rb +29 -11
- data/lib/rspec/matchers/english_phrasing.rb +1 -1
- data/lib/rspec/matchers/expecteds_for_multiple_diffs.rb +16 -7
- data/lib/rspec/matchers/matcher_protocol.rb +6 -0
- data/lib/rspec/matchers.rb +75 -65
- data.tar.gz.sig +0 -0
- metadata +27 -12
- metadata.gz.sig +0 -0
data/lib/rspec/matchers/dsl.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
RSpec::Support.require_rspec_support "with_keywords_when_needed"
|
2
|
+
|
1
3
|
module RSpec
|
2
4
|
module Matchers
|
3
5
|
# Defines the custom matcher DSL.
|
4
6
|
module DSL
|
5
|
-
# Defines a matcher alias. The returned matcher's `description` will be
|
7
|
+
# Defines a matcher alias. The returned matcher's `description` will be overridden
|
6
8
|
# to reflect the phrasing of the new name, which will be used in failure messages
|
7
9
|
# when passed as an argument to another matcher in a composed matcher expression.
|
8
10
|
#
|
@@ -23,7 +25,7 @@ module RSpec
|
|
23
25
|
# @param old_name [Symbol] the original name for the matcher
|
24
26
|
# @param options [Hash] options for the aliased matcher
|
25
27
|
# @option options [Class] :klass the ruby class to use as the decorator. (Not normally used).
|
26
|
-
# @yield [String] optional block that, when given, is used to define the
|
28
|
+
# @yield [String] optional block that, when given, is used to define the overridden
|
27
29
|
# logic. The yielded arg is the original description or failure message. If no
|
28
30
|
# block is provided, a default override is used based on the old and new names.
|
29
31
|
# @see RSpec::Matchers
|
@@ -38,10 +40,11 @@ module RSpec
|
|
38
40
|
matcher.matcher_name = new_name if matcher.respond_to?(:matcher_name=)
|
39
41
|
klass.new(matcher, description_override)
|
40
42
|
end
|
43
|
+
ruby2_keywords new_name if respond_to?(:ruby2_keywords, true)
|
41
44
|
end
|
42
45
|
|
43
46
|
# Defines a negated matcher. The returned matcher's `description` and `failure_message`
|
44
|
-
# will be
|
47
|
+
# will be overridden to reflect the phrasing of the new name, and the match logic will
|
45
48
|
# be based on the original matcher but negated.
|
46
49
|
#
|
47
50
|
# @example
|
@@ -51,7 +54,7 @@ module RSpec
|
|
51
54
|
#
|
52
55
|
# @param negated_name [Symbol] the name for the negated matcher
|
53
56
|
# @param base_name [Symbol] the name of the original matcher that will be negated
|
54
|
-
# @yield [String] optional block that, when given, is used to define the
|
57
|
+
# @yield [String] optional block that, when given, is used to define the overridden
|
55
58
|
# logic. The yielded arg is the original description or failure message. If no
|
56
59
|
# block is provided, a default override is used based on the old and new names.
|
57
60
|
# @see RSpec::Matchers
|
@@ -120,7 +123,7 @@ module RSpec
|
|
120
123
|
#
|
121
124
|
# By default the match block will swallow expectation errors (e.g.
|
122
125
|
# caused by using an expectation such as `expect(1).to eq 2`), if you
|
123
|
-
#
|
126
|
+
# wish to allow these to bubble up, pass in the option
|
124
127
|
# `:notify_expectation_failures => true`.
|
125
128
|
#
|
126
129
|
# @param [Hash] options for defining the behavior of the match block.
|
@@ -147,8 +150,14 @@ module RSpec
|
|
147
150
|
# is rarely necessary, but can be helpful, for example, when specifying
|
148
151
|
# asynchronous processes that require different timeouts.
|
149
152
|
#
|
153
|
+
# By default the match block will swallow expectation errors (e.g.
|
154
|
+
# caused by using an expectation such as `expect(1).to eq 2`), if you
|
155
|
+
# wish to allow these to bubble up, pass in the option
|
156
|
+
# `:notify_expectation_failures => true`.
|
157
|
+
#
|
158
|
+
# @param [Hash] options for defining the behavior of the match block.
|
150
159
|
# @yield [Object] actual the actual value (i.e. the value wrapped by `expect`)
|
151
|
-
def match_when_negated(&match_block)
|
160
|
+
def match_when_negated(options={}, &match_block)
|
152
161
|
define_user_override(:does_not_match?, match_block) do |actual|
|
153
162
|
begin
|
154
163
|
@actual = actual
|
@@ -156,6 +165,7 @@ module RSpec
|
|
156
165
|
super(*actual_arg_for(match_block))
|
157
166
|
end
|
158
167
|
rescue RSpec::Expectations::ExpectationNotMetError
|
168
|
+
raise if options[:notify_expectation_failures]
|
159
169
|
false
|
160
170
|
end
|
161
171
|
end
|
@@ -188,7 +198,7 @@ module RSpec
|
|
188
198
|
end
|
189
199
|
end
|
190
200
|
|
191
|
-
# Customizes the failure
|
201
|
+
# Customizes the failure message to use when this matcher is
|
192
202
|
# asked to positively match. Only use this when the message
|
193
203
|
# generated by default doesn't suit your needs.
|
194
204
|
#
|
@@ -207,7 +217,7 @@ module RSpec
|
|
207
217
|
define_user_override(__method__, definition)
|
208
218
|
end
|
209
219
|
|
210
|
-
# Customize the failure
|
220
|
+
# Customize the failure message to use when this matcher is asked
|
211
221
|
# to negatively match. Only use this when the message generated by
|
212
222
|
# default doesn't suit your needs.
|
213
223
|
#
|
@@ -321,7 +331,7 @@ module RSpec
|
|
321
331
|
# - Defines the named method using a user-provided block
|
322
332
|
# in @user_method_defs, which is included as an ancestor
|
323
333
|
# in the singleton class in which we eval the `define` block.
|
324
|
-
# - Defines an
|
334
|
+
# - Defines an overridden definition for the same method
|
325
335
|
# usign the provided `our_def` block.
|
326
336
|
# - Provides a default `our_def` block for the common case
|
327
337
|
# of needing to call the user's definition with `@actual`
|
@@ -394,6 +404,10 @@ module RSpec
|
|
394
404
|
false
|
395
405
|
end
|
396
406
|
|
407
|
+
def supports_value_expectations?
|
408
|
+
true
|
409
|
+
end
|
410
|
+
|
397
411
|
# Most matchers do not expect call stack jumps.
|
398
412
|
def expects_call_stack_jump?
|
399
413
|
false
|
@@ -453,11 +467,12 @@ module RSpec
|
|
453
467
|
@chained_method_clauses = []
|
454
468
|
@block_arg = block_arg
|
455
469
|
|
456
|
-
class << self
|
470
|
+
klass = class << self
|
457
471
|
# See `Macros#define_user_override` above, for an explanation.
|
458
472
|
include(@user_method_defs = Module.new)
|
459
473
|
self
|
460
|
-
end
|
474
|
+
end
|
475
|
+
RSpec::Support::WithKeywordsWhenNeeded.class_exec(klass, *expected, &declarations)
|
461
476
|
end
|
462
477
|
|
463
478
|
# Provides the expected value. This will return an array if
|
@@ -521,6 +536,9 @@ module RSpec
|
|
521
536
|
super(method, *args, &block)
|
522
537
|
end
|
523
538
|
end
|
539
|
+
# The method_missing method should be refactored to pass kw args in RSpec 4
|
540
|
+
# then this can be removed
|
541
|
+
ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true)
|
524
542
|
end
|
525
543
|
end
|
526
544
|
end
|
@@ -24,7 +24,7 @@ module RSpec
|
|
24
24
|
# list([]) #=> ""
|
25
25
|
#
|
26
26
|
def self.list(obj)
|
27
|
-
return " #{RSpec::Support::ObjectFormatter.format(obj)}" if !obj || Struct === obj
|
27
|
+
return " #{RSpec::Support::ObjectFormatter.format(obj)}" if !obj || Struct === obj || Hash === obj
|
28
28
|
items = Array(obj).map { |w| RSpec::Support::ObjectFormatter.format(w) }
|
29
29
|
case items.length
|
30
30
|
when 0
|
@@ -52,20 +52,29 @@ module RSpec
|
|
52
52
|
|
53
53
|
private
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
class << self
|
56
|
+
private
|
57
|
+
|
58
|
+
def diff_label_for(matcher)
|
59
|
+
"Diff for (#{truncated(RSpec::Support::ObjectFormatter.format(matcher))}):"
|
60
|
+
end
|
58
61
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
+
def truncated(description)
|
63
|
+
return description if description.length <= DESCRIPTION_MAX_LENGTH
|
64
|
+
description[0...DESCRIPTION_MAX_LENGTH - 3] << "..."
|
65
|
+
end
|
62
66
|
end
|
63
67
|
|
64
68
|
def diffs(differ, actual)
|
65
69
|
@expected_list.map do |(expected, diff_label)|
|
66
70
|
diff = differ.diff(actual, expected)
|
67
71
|
next if diff.strip.empty?
|
68
|
-
|
72
|
+
if diff == "\e[0m\n\e[0m"
|
73
|
+
"#{diff_label}\n" \
|
74
|
+
" <The diff is empty, are your objects producing identical `#inspect` output?>"
|
75
|
+
else
|
76
|
+
"#{diff_label}#{diff}"
|
77
|
+
end
|
69
78
|
end.compact.join("\n")
|
70
79
|
end
|
71
80
|
end
|
@@ -60,6 +60,12 @@ module RSpec
|
|
60
60
|
# @return [Boolean] true if this matcher can be used in block expressions.
|
61
61
|
# @note If not defined, RSpec assumes a value of `false` for this method.
|
62
62
|
|
63
|
+
# @!method supports_value_expectations?
|
64
|
+
# Indicates that this matcher can be used in a value expectation expression,
|
65
|
+
# such as `expect(foo).to eq(bar)`.
|
66
|
+
# @return [Boolean] true if this matcher can be used in value expressions.
|
67
|
+
# @note If not defined, RSpec assumes a value of `true` for this method.
|
68
|
+
|
63
69
|
# @!method expects_call_stack_jump?
|
64
70
|
# Indicates that when this matcher is used in a block expectation
|
65
71
|
# expression, it expects the block to use a ruby construct that causes
|
data/lib/rspec/matchers.rb
CHANGED
@@ -36,7 +36,7 @@ module RSpec
|
|
36
36
|
# expect([]).to be_empty # => [].empty?() | passes
|
37
37
|
# expect([]).not_to be_empty # => [].empty?() | fails
|
38
38
|
#
|
39
|
-
# In
|
39
|
+
# In addition to prefixing the predicate matchers with "be_", you can also use "be_a_"
|
40
40
|
# and "be_an_", making your specs read much more naturally:
|
41
41
|
#
|
42
42
|
# expect("a string").to be_an_instance_of(String) # =>"a string".instance_of?(String) # passes
|
@@ -238,7 +238,7 @@ module RSpec
|
|
238
238
|
# best to find a more positive name for the negated form, such as
|
239
239
|
# `avoid_changing` rather than `not_change`.
|
240
240
|
#
|
241
|
-
module Matchers
|
241
|
+
module Matchers # rubocop:disable Metrics/ModuleLength
|
242
242
|
extend ::RSpec::Matchers::DSL
|
243
243
|
|
244
244
|
# @!macro [attach] alias_matcher
|
@@ -316,9 +316,9 @@ module RSpec
|
|
316
316
|
def be_falsey
|
317
317
|
BuiltIn::BeFalsey.new
|
318
318
|
end
|
319
|
-
alias_matcher :be_falsy,
|
319
|
+
alias_matcher :be_falsy, :be_falsey
|
320
320
|
alias_matcher :a_falsey_value, :be_falsey
|
321
|
-
alias_matcher :a_falsy_value,
|
321
|
+
alias_matcher :a_falsy_value, :be_falsey
|
322
322
|
|
323
323
|
# Passes if actual is nil
|
324
324
|
def be_nil
|
@@ -379,7 +379,7 @@ module RSpec
|
|
379
379
|
BuiltIn::BeAKindOf.new(expected)
|
380
380
|
end
|
381
381
|
alias_method :be_kind_of, :be_a_kind_of
|
382
|
-
alias_matcher :a_kind_of,
|
382
|
+
alias_matcher :a_kind_of, :be_a_kind_of
|
383
383
|
|
384
384
|
# Passes if actual.between?(min, max). Works with any Comparable object,
|
385
385
|
# including String, Symbol, Time, or Numeric (Fixnum, Bignum, Integer,
|
@@ -406,7 +406,7 @@ module RSpec
|
|
406
406
|
BuiltIn::BeWithin.new(delta)
|
407
407
|
end
|
408
408
|
alias_matcher :a_value_within, :be_within
|
409
|
-
alias_matcher :within,
|
409
|
+
alias_matcher :within, :be_within
|
410
410
|
|
411
411
|
# Applied to a proc, specifies that its execution will cause some value to
|
412
412
|
# change.
|
@@ -492,8 +492,8 @@ module RSpec
|
|
492
492
|
def change(receiver=nil, message=nil, &block)
|
493
493
|
BuiltIn::Change.new(receiver, message, &block)
|
494
494
|
end
|
495
|
-
alias_matcher :a_block_changing,
|
496
|
-
alias_matcher :changing,
|
495
|
+
alias_matcher :a_block_changing, :change
|
496
|
+
alias_matcher :changing, :change
|
497
497
|
|
498
498
|
# Passes if actual contains all of the expected regardless of order.
|
499
499
|
# This works for collections. Pass in multiple args and it will only
|
@@ -511,7 +511,7 @@ module RSpec
|
|
511
511
|
BuiltIn::ContainExactly.new(items)
|
512
512
|
end
|
513
513
|
alias_matcher :a_collection_containing_exactly, :contain_exactly
|
514
|
-
alias_matcher :containing_exactly,
|
514
|
+
alias_matcher :containing_exactly, :contain_exactly
|
515
515
|
|
516
516
|
# Passes if actual covers expected. This works for
|
517
517
|
# Ranges. You can also pass in multiple args
|
@@ -529,7 +529,7 @@ module RSpec
|
|
529
529
|
BuiltIn::Cover.new(*values)
|
530
530
|
end
|
531
531
|
alias_matcher :a_range_covering, :cover
|
532
|
-
alias_matcher :covering,
|
532
|
+
alias_matcher :covering, :cover
|
533
533
|
|
534
534
|
# Matches if the actual value ends with the expected value(s). In the case
|
535
535
|
# of a string, matches against the last `expected.length` characters of the
|
@@ -544,8 +544,8 @@ module RSpec
|
|
544
544
|
BuiltIn::EndWith.new(*expected)
|
545
545
|
end
|
546
546
|
alias_matcher :a_collection_ending_with, :end_with
|
547
|
-
alias_matcher :a_string_ending_with,
|
548
|
-
alias_matcher :ending_with,
|
547
|
+
alias_matcher :a_string_ending_with, :end_with
|
548
|
+
alias_matcher :ending_with, :end_with
|
549
549
|
|
550
550
|
# Passes if <tt>actual == expected</tt>.
|
551
551
|
#
|
@@ -559,7 +559,7 @@ module RSpec
|
|
559
559
|
BuiltIn::Eq.new(expected)
|
560
560
|
end
|
561
561
|
alias_matcher :an_object_eq_to, :eq
|
562
|
-
alias_matcher :eq_to,
|
562
|
+
alias_matcher :eq_to, :eq
|
563
563
|
|
564
564
|
# Passes if `actual.eql?(expected)`
|
565
565
|
#
|
@@ -573,7 +573,7 @@ module RSpec
|
|
573
573
|
BuiltIn::Eql.new(expected)
|
574
574
|
end
|
575
575
|
alias_matcher :an_object_eql_to, :eql
|
576
|
-
alias_matcher :eql_to,
|
576
|
+
alias_matcher :eql_to, :eql
|
577
577
|
|
578
578
|
# Passes if <tt>actual.equal?(expected)</tt> (object identity).
|
579
579
|
#
|
@@ -587,7 +587,7 @@ module RSpec
|
|
587
587
|
BuiltIn::Equal.new(expected)
|
588
588
|
end
|
589
589
|
alias_matcher :an_object_equal_to, :equal
|
590
|
-
alias_matcher :equal_to,
|
590
|
+
alias_matcher :equal_to, :equal
|
591
591
|
|
592
592
|
# Passes if `actual.exist?` or `actual.exists?`
|
593
593
|
#
|
@@ -597,7 +597,7 @@ module RSpec
|
|
597
597
|
BuiltIn::Exist.new(*args)
|
598
598
|
end
|
599
599
|
alias_matcher :an_object_existing, :exist
|
600
|
-
alias_matcher :existing,
|
600
|
+
alias_matcher :existing, :exist
|
601
601
|
|
602
602
|
# Passes if actual's attribute values match the expected attributes hash.
|
603
603
|
# This works no matter how you define your attribute readers.
|
@@ -617,7 +617,7 @@ module RSpec
|
|
617
617
|
BuiltIn::HaveAttributes.new(expected)
|
618
618
|
end
|
619
619
|
alias_matcher :an_object_having_attributes, :have_attributes
|
620
|
-
alias_matcher :having_attributes,
|
620
|
+
alias_matcher :having_attributes, :have_attributes
|
621
621
|
|
622
622
|
# Passes if actual includes expected. This works for
|
623
623
|
# collections and Strings. You can also pass in multiple args
|
@@ -640,9 +640,9 @@ module RSpec
|
|
640
640
|
BuiltIn::Include.new(*expected)
|
641
641
|
end
|
642
642
|
alias_matcher :a_collection_including, :include
|
643
|
-
alias_matcher :a_string_including,
|
644
|
-
alias_matcher :a_hash_including,
|
645
|
-
alias_matcher :including,
|
643
|
+
alias_matcher :a_string_including, :include
|
644
|
+
alias_matcher :a_hash_including, :include
|
645
|
+
alias_matcher :including, :include
|
646
646
|
|
647
647
|
# Passes if the provided matcher passes when checked against all
|
648
648
|
# elements of the collection.
|
@@ -697,14 +697,14 @@ module RSpec
|
|
697
697
|
def match(expected)
|
698
698
|
BuiltIn::Match.new(expected)
|
699
699
|
end
|
700
|
-
alias_matcher :match_regex,
|
700
|
+
alias_matcher :match_regex, :match
|
701
701
|
alias_matcher :an_object_matching, :match
|
702
|
-
alias_matcher :a_string_matching,
|
703
|
-
alias_matcher :matching,
|
702
|
+
alias_matcher :a_string_matching, :match
|
703
|
+
alias_matcher :matching, :match
|
704
704
|
|
705
705
|
# An alternate form of `contain_exactly` that accepts
|
706
706
|
# the expected contents as a single array arg rather
|
707
|
-
#
|
707
|
+
# than splatted out as individual items.
|
708
708
|
#
|
709
709
|
# @example
|
710
710
|
# expect(results).to contain_exactly(1, 2)
|
@@ -715,6 +715,9 @@ module RSpec
|
|
715
715
|
def match_array(items)
|
716
716
|
contain_exactly(*items)
|
717
717
|
end
|
718
|
+
alias_matcher :an_array_matching, :match_array do |desc|
|
719
|
+
desc.sub("contain exactly", "an array containing exactly")
|
720
|
+
end
|
718
721
|
|
719
722
|
# With no arg, passes if the block outputs `to_stdout` or `to_stderr`.
|
720
723
|
# With a string, passes if the block outputs that specific string `to_stdout` or `to_stderr`.
|
@@ -753,28 +756,30 @@ module RSpec
|
|
753
756
|
|
754
757
|
# With no args, matches if any error is raised.
|
755
758
|
# With a named error, matches only if that specific error is raised.
|
756
|
-
# With a named error and
|
757
|
-
# With a named error and
|
759
|
+
# With a named error and message specified as a String, matches only if both match.
|
760
|
+
# With a named error and message specified as a Regexp, matches only if both match.
|
758
761
|
# Pass an optional block to perform extra verifications on the exception matched
|
759
762
|
#
|
760
763
|
# @example
|
761
764
|
# expect { do_something_risky }.to raise_error
|
762
765
|
# expect { do_something_risky }.to raise_error(PoorRiskDecisionError)
|
763
766
|
# expect { do_something_risky }.to raise_error(PoorRiskDecisionError) { |error| expect(error.data).to eq 42 }
|
767
|
+
# expect { do_something_risky }.to raise_error { |error| expect(error.data).to eq 42 }
|
764
768
|
# expect { do_something_risky }.to raise_error(PoorRiskDecisionError, "that was too risky")
|
765
769
|
# expect { do_something_risky }.to raise_error(PoorRiskDecisionError, /oo ri/)
|
770
|
+
# expect { do_something_risky }.to raise_error("that was too risky")
|
766
771
|
#
|
767
772
|
# expect { do_something_risky }.not_to raise_error
|
768
|
-
def raise_error(error=
|
773
|
+
def raise_error(error=BuiltIn::RaiseError::UndefinedValue, message=nil, &block)
|
769
774
|
BuiltIn::RaiseError.new(error, message, &block)
|
770
775
|
end
|
771
|
-
alias_method :raise_exception,
|
776
|
+
alias_method :raise_exception, :raise_error
|
772
777
|
|
773
|
-
alias_matcher :a_block_raising,
|
778
|
+
alias_matcher :a_block_raising, :raise_error do |desc|
|
774
779
|
desc.sub("raise", "a block raising")
|
775
780
|
end
|
776
781
|
|
777
|
-
alias_matcher :raising,
|
782
|
+
alias_matcher :raising, :raise_error do |desc|
|
778
783
|
desc.sub("raise", "raising")
|
779
784
|
end
|
780
785
|
|
@@ -788,7 +793,7 @@ module RSpec
|
|
788
793
|
BuiltIn::RespondTo.new(*names)
|
789
794
|
end
|
790
795
|
alias_matcher :an_object_responding_to, :respond_to
|
791
|
-
alias_matcher :responding_to,
|
796
|
+
alias_matcher :responding_to, :respond_to
|
792
797
|
|
793
798
|
# Passes if the submitted block returns true. Yields target to the
|
794
799
|
# block.
|
@@ -809,7 +814,7 @@ module RSpec
|
|
809
814
|
BuiltIn::Satisfy.new(description, &block)
|
810
815
|
end
|
811
816
|
alias_matcher :an_object_satisfying, :satisfy
|
812
|
-
alias_matcher :satisfying,
|
817
|
+
alias_matcher :satisfying, :satisfy
|
813
818
|
|
814
819
|
# Matches if the actual value starts with the expected value(s). In the
|
815
820
|
# case of a string, matches against the first `expected.length` characters
|
@@ -824,8 +829,8 @@ module RSpec
|
|
824
829
|
BuiltIn::StartWith.new(*expected)
|
825
830
|
end
|
826
831
|
alias_matcher :a_collection_starting_with, :start_with
|
827
|
-
alias_matcher :a_string_starting_with,
|
828
|
-
alias_matcher :starting_with,
|
832
|
+
alias_matcher :a_string_starting_with, :start_with
|
833
|
+
alias_matcher :starting_with, :start_with
|
829
834
|
|
830
835
|
# Given no argument, matches if a proc throws any Symbol.
|
831
836
|
#
|
@@ -850,7 +855,7 @@ module RSpec
|
|
850
855
|
desc.sub("throw", "a block throwing")
|
851
856
|
end
|
852
857
|
|
853
|
-
alias_matcher :throwing,
|
858
|
+
alias_matcher :throwing, :throw_symbol do |desc|
|
854
859
|
desc.sub("throw", "throwing")
|
855
860
|
end
|
856
861
|
|
@@ -866,8 +871,8 @@ module RSpec
|
|
866
871
|
def yield_control
|
867
872
|
BuiltIn::YieldControl.new
|
868
873
|
end
|
869
|
-
alias_matcher :a_block_yielding_control,
|
870
|
-
alias_matcher :yielding_control,
|
874
|
+
alias_matcher :a_block_yielding_control, :yield_control
|
875
|
+
alias_matcher :yielding_control, :yield_control
|
871
876
|
|
872
877
|
# Passes if the method called in the expect block yields with
|
873
878
|
# no arguments. Fails if it does not yield, or yields with arguments.
|
@@ -884,8 +889,8 @@ module RSpec
|
|
884
889
|
def yield_with_no_args
|
885
890
|
BuiltIn::YieldWithNoArgs.new
|
886
891
|
end
|
887
|
-
alias_matcher :a_block_yielding_with_no_args,
|
888
|
-
alias_matcher :yielding_with_no_args,
|
892
|
+
alias_matcher :a_block_yielding_with_no_args, :yield_with_no_args
|
893
|
+
alias_matcher :yielding_with_no_args, :yield_with_no_args
|
889
894
|
|
890
895
|
# Given no arguments, matches if the method called in the expect
|
891
896
|
# block yields with arguments (regardless of what they are or how
|
@@ -914,8 +919,8 @@ module RSpec
|
|
914
919
|
def yield_with_args(*args)
|
915
920
|
BuiltIn::YieldWithArgs.new(*args)
|
916
921
|
end
|
917
|
-
alias_matcher :a_block_yielding_with_args,
|
918
|
-
alias_matcher :yielding_with_args,
|
922
|
+
alias_matcher :a_block_yielding_with_args, :yield_with_args
|
923
|
+
alias_matcher :yielding_with_args, :yield_with_args
|
919
924
|
|
920
925
|
# Designed for use with methods that repeatedly yield (such as
|
921
926
|
# iterators). Passes if the method called in the expect block yields
|
@@ -935,8 +940,8 @@ module RSpec
|
|
935
940
|
def yield_successive_args(*args)
|
936
941
|
BuiltIn::YieldSuccessiveArgs.new(*args)
|
937
942
|
end
|
938
|
-
alias_matcher :a_block_yielding_successive_args,
|
939
|
-
alias_matcher :yielding_successive_args,
|
943
|
+
alias_matcher :a_block_yielding_successive_args, :yield_successive_args
|
944
|
+
alias_matcher :yielding_successive_args, :yield_successive_args
|
940
945
|
|
941
946
|
# Delegates to {RSpec::Expectations.configuration}.
|
942
947
|
# This is here because rspec-core's `expect_with` option
|
@@ -949,7 +954,7 @@ module RSpec
|
|
949
954
|
|
950
955
|
private
|
951
956
|
|
952
|
-
BE_PREDICATE_REGEX = /^(be_(?:an?_)?)(.*)/
|
957
|
+
BE_PREDICATE_REGEX = /^(?:be_(?:an?_)?)(.*)/
|
953
958
|
HAS_REGEX = /^(?:have_)(.*)/
|
954
959
|
DYNAMIC_MATCHER_REGEX = Regexp.union(BE_PREDICATE_REGEX, HAS_REGEX)
|
955
960
|
|
@@ -963,6 +968,7 @@ module RSpec
|
|
963
968
|
super
|
964
969
|
end
|
965
970
|
end
|
971
|
+
ruby2_keywords :method_missing if respond_to?(:ruby2_keywords, true)
|
966
972
|
|
967
973
|
if RUBY_VERSION.to_f >= 1.9
|
968
974
|
def respond_to_missing?(method, *)
|
@@ -1003,31 +1009,35 @@ module RSpec
|
|
1003
1009
|
is_a_matcher?(obj) && obj.respond_to?(:description)
|
1004
1010
|
end
|
1005
1011
|
|
1006
|
-
|
1007
|
-
|
1008
|
-
# Note that `included` doesn't work for this because it is triggered
|
1009
|
-
# _after_ `RSpec::Matchers` is an ancestor of the inclusion host, rather
|
1010
|
-
# than _before_, like `append_features`. It's important we check this before
|
1011
|
-
# in order to find the cases where it was already previously included.
|
1012
|
-
def self.append_features(mod)
|
1013
|
-
return super if mod < self # `mod < self` indicates a re-inclusion.
|
1012
|
+
class << self
|
1013
|
+
private
|
1014
1014
|
|
1015
|
-
|
1016
|
-
|
1015
|
+
if RSpec::Support::Ruby.mri? && RUBY_VERSION[0, 3] == '1.9'
|
1016
|
+
# Note that `included` doesn't work for this because it is triggered
|
1017
|
+
# _after_ `RSpec::Matchers` is an ancestor of the inclusion host, rather
|
1018
|
+
# than _before_, like `append_features`. It's important we check this before
|
1019
|
+
# in order to find the cases where it was already previously included.
|
1020
|
+
# @api private
|
1021
|
+
def append_features(mod)
|
1022
|
+
return super if mod < self # `mod < self` indicates a re-inclusion.
|
1017
1023
|
|
1018
|
-
|
1019
|
-
|
1024
|
+
subclasses = ObjectSpace.each_object(Class).select { |c| c < mod && c < self }
|
1025
|
+
return super unless subclasses.any?
|
1020
1026
|
|
1021
|
-
|
1022
|
-
|
1023
|
-
"which can trigger infinite recursion from `super` due to an MRI 1.9 bug " \
|
1024
|
-
"(https://redmine.ruby-lang.org/issues/3351). To work around this, " \
|
1025
|
-
"either upgrade to MRI 2.0+, include a dup of the module (e.g. " \
|
1026
|
-
"`include #{self}.dup`), or find a way to include `#{self}` in `#{mod}` " \
|
1027
|
-
"before it is included in subclasses (#{subclasses}). See " \
|
1028
|
-
"https://github.com/rspec/rspec-expectations/issues/814 for more info"
|
1027
|
+
subclasses.reject! { |s| subclasses.any? { |s2| s < s2 } } # Filter to the root ancestor.
|
1028
|
+
subclasses = subclasses.map { |s| "`#{s}`" }.join(", ")
|
1029
1029
|
|
1030
|
-
|
1030
|
+
RSpec.warning "`#{self}` has been included in a superclass (`#{mod}`) " \
|
1031
|
+
"after previously being included in subclasses (#{subclasses}), " \
|
1032
|
+
"which can trigger infinite recursion from `super` due to an MRI 1.9 bug " \
|
1033
|
+
"(https://redmine.ruby-lang.org/issues/3351). To work around this, " \
|
1034
|
+
"either upgrade to MRI 2.0+, include a dup of the module (e.g. " \
|
1035
|
+
"`include #{self}.dup`), or find a way to include `#{self}` in `#{mod}` " \
|
1036
|
+
"before it is included in subclasses (#{subclasses}). See " \
|
1037
|
+
"https://github.com/rspec/rspec-expectations/issues/814 for more info"
|
1038
|
+
|
1039
|
+
super
|
1040
|
+
end
|
1031
1041
|
end
|
1032
1042
|
end
|
1033
1043
|
end
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-expectations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.12.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steven Baker
|
8
8
|
- David Chelimsky
|
9
9
|
- Myron Marston
|
10
|
-
autorequire:
|
10
|
+
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain:
|
13
13
|
- |
|
@@ -45,7 +45,7 @@ cert_chain:
|
|
45
45
|
ZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ
|
46
46
|
F3MdtaDehhjC
|
47
47
|
-----END CERTIFICATE-----
|
48
|
-
date:
|
48
|
+
date: 2023-01-07 00:00:00.000000000 Z
|
49
49
|
dependencies:
|
50
50
|
- !ruby/object:Gem::Dependency
|
51
51
|
name: rspec-support
|
@@ -53,14 +53,14 @@ dependencies:
|
|
53
53
|
requirements:
|
54
54
|
- - "~>"
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version: 3.
|
56
|
+
version: 3.12.0
|
57
57
|
type: :runtime
|
58
58
|
prerelease: false
|
59
59
|
version_requirements: !ruby/object:Gem::Requirement
|
60
60
|
requirements:
|
61
61
|
- - "~>"
|
62
62
|
- !ruby/object:Gem::Version
|
63
|
-
version: 3.
|
63
|
+
version: 3.12.0
|
64
64
|
- !ruby/object:Gem::Dependency
|
65
65
|
name: diff-lcs
|
66
66
|
requirement: !ruby/object:Gem::Requirement
|
@@ -99,14 +99,14 @@ dependencies:
|
|
99
99
|
name: cucumber
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
|
-
- - "
|
102
|
+
- - ">="
|
103
103
|
- !ruby/object:Gem::Version
|
104
104
|
version: '1.3'
|
105
105
|
type: :development
|
106
106
|
prerelease: false
|
107
107
|
version_requirements: !ruby/object:Gem::Requirement
|
108
108
|
requirements:
|
109
|
-
- - "
|
109
|
+
- - ">="
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '1.3'
|
112
112
|
- !ruby/object:Gem::Dependency
|
@@ -123,6 +123,20 @@ dependencies:
|
|
123
123
|
- - "~>"
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: '5.2'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: rake
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ">"
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: 10.0.0
|
133
|
+
type: :development
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - ">"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: 10.0.0
|
126
140
|
description: rspec-expectations provides a simple, readable API to express expected
|
127
141
|
outcomes of a code example.
|
128
142
|
email: rspec@googlegroups.com
|
@@ -158,6 +172,7 @@ files:
|
|
158
172
|
- lib/rspec/matchers/built_in/change.rb
|
159
173
|
- lib/rspec/matchers/built_in/compound.rb
|
160
174
|
- lib/rspec/matchers/built_in/contain_exactly.rb
|
175
|
+
- lib/rspec/matchers/built_in/count_expectation.rb
|
161
176
|
- lib/rspec/matchers/built_in/cover.rb
|
162
177
|
- lib/rspec/matchers/built_in/eq.rb
|
163
178
|
- lib/rspec/matchers/built_in/eql.rb
|
@@ -188,11 +203,11 @@ licenses:
|
|
188
203
|
- MIT
|
189
204
|
metadata:
|
190
205
|
bug_tracker_uri: https://github.com/rspec/rspec-expectations/issues
|
191
|
-
changelog_uri: https://github.com/rspec/rspec-expectations/blob/v3.
|
206
|
+
changelog_uri: https://github.com/rspec/rspec-expectations/blob/v3.12.2/Changelog.md
|
192
207
|
documentation_uri: https://rspec.info/documentation/
|
193
208
|
mailing_list_uri: https://groups.google.com/forum/#!forum/rspec
|
194
209
|
source_code_uri: https://github.com/rspec/rspec-expectations
|
195
|
-
post_install_message:
|
210
|
+
post_install_message:
|
196
211
|
rdoc_options:
|
197
212
|
- "--charset=UTF-8"
|
198
213
|
require_paths:
|
@@ -208,8 +223,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
208
223
|
- !ruby/object:Gem::Version
|
209
224
|
version: '0'
|
210
225
|
requirements: []
|
211
|
-
rubygems_version: 3.
|
212
|
-
signing_key:
|
226
|
+
rubygems_version: 3.3.26
|
227
|
+
signing_key:
|
213
228
|
specification_version: 4
|
214
|
-
summary: rspec-expectations-3.
|
229
|
+
summary: rspec-expectations-3.12.2
|
215
230
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|