rspec-expectations 3.9.4 → 3.10.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0a7b90c1caeec07d53054eb0536482494c2584e6d7cb0fc9cfd3493ebc6b27a7
4
- data.tar.gz: 2eed511b0562ee702eb71bda98058c61d9ddda6c7b0337adde7acd72ddfb81df
3
+ metadata.gz: 7aa5ece24e4b7264047d888a2cee103146afe93a99a6f2b8a8eb18e668a53660
4
+ data.tar.gz: 12517aab36f0f0d698af5aa1fff130fc1caf3273be010375cbfbbd9c534243cb
5
5
  SHA512:
6
- metadata.gz: 7d0ea4666034e2901450f23fe706d1258f0b2c37ac7edd823477e31eae7c6d56e597a0b728cea0fe5f12ab80ee43ac4ed1a5c203ef34f66d180b40713adedf81
7
- data.tar.gz: 3b42d8706be59eb0dd511497941c34cebaff7476394f3f1ca80326d26c362bf3b37cca520ae0c6002a8efe167ee3fe7707e41e53072ac000c8c2a89f960fa6c0
6
+ metadata.gz: 5518381caa98706fa70dab05072d52722ff2511d249c848cd10564eb8ce63e80ddab0146b66528bb383a89563a900ad25dc5ea854fd0f3af12524c46fd9e7ad7
7
+ data.tar.gz: 73b7195cf0e86c040a33d2729ec51ca97cb062e6c066458732e7dbe5e957a5ce3f25e6aadb1d8af5e18b65051f79662d223bd9b6e4270e7793155629b9e0d491
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -1,3 +1,23 @@
1
+ ### 3.10.0 / 2020-10-30
2
+ [Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.9.3...v3.10.0)
3
+
4
+ Enhancements:
5
+
6
+ * Allow `include` matcher to be chained with `once`, `at_least`, etc. for simple cases.
7
+ (Marc-André Lafortune, #1168)
8
+ * Add an explicit warning when `nil` is passed to `raise_error`. (Phil Pirozhkov, #1143)
9
+ * Improve `include` matcher's composability. (Phil Pirozhkov, #1155)
10
+ * Mocks expectations can now set a custom failure message.
11
+ (Benoit Tigeot and Nicolas Zermati, #1156)
12
+ * `aggregate_failures` now shows the backtrace line for each failure. (Fabricio Bedin, #1163)
13
+ * Support multiple combinations of `yield_control` modifiers like `at_least`, `at_most`.
14
+ (Jon Rowe, #1169)
15
+ * Dynamic `have_<n>` matchers now have output consistent with other dynamic matchers.
16
+ (Marc-André Lafortune, #1195)
17
+ * New config option `strict_predicate_matchers` allows predicate matcher to be strict
18
+ (i.e. match for `true` or `false`) instead of the default (match truthy vs `false` or `nil`).
19
+ (Marc-André Lafortune, #1196)
20
+
1
21
  ### 3.9.4 / 2020-10-29
2
22
  [Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.9.3...v3.9.4)
3
23
 
@@ -7,7 +27,6 @@ Bug Fixes:
7
27
  were they would act like keywords and be cast to a hash. (Jon Rowe, #1222)
8
28
 
9
29
  ### 3.9.3 / 2020-10-23
10
- [Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.9.2...v3.9.3)
11
30
 
12
31
  Bug Fixes:
13
32
 
@@ -22,6 +41,7 @@ Bug Fixes:
22
41
  * Prevent errors from causing false positives when using `be <operator>` comparison, e.g.
23
42
  `expect(1).not_to be < 'a'` will now correctly fail rather than pass. (Jon Rowe, #1208)
24
43
 
44
+
25
45
  ### 3.9.2 / 2020-05-08
26
46
  [Full Changelog](http://github.com/rspec/rspec-expectations/compare/v3.9.1...v3.9.2)
27
47
 
@@ -28,6 +28,7 @@ module RSpec
28
28
 
29
29
  def initialize
30
30
  @on_potential_false_positives = :warn
31
+ @strict_predicate_matchers = false
31
32
  end
32
33
 
33
34
  # Configures the supported syntax.
@@ -185,6 +186,20 @@ module RSpec
185
186
  @on_potential_false_positives = behavior
186
187
  end
187
188
 
189
+ # Configures RSpec to check predicate matchers to `be(true)` / `be(false)` (strict),
190
+ # or `be_truthy` / `be_falsey` (not strict).
191
+ # Historically, the default was `false`, but `true` is recommended.
192
+ def strict_predicate_matchers=(flag)
193
+ raise ArgumentError, "Pass `true` or `false`" unless flag == true || flag == false
194
+ @strict_predicate_matchers = flag
195
+ end
196
+
197
+ attr_reader :strict_predicate_matchers
198
+
199
+ def strict_predicate_matchers?
200
+ @strict_predicate_matchers
201
+ end
202
+
188
203
  # Indicates what RSpec will do about matcher use which will
189
204
  # potentially cause false positives in tests, generally you want to
190
205
  # avoid such scenarios so this defaults to `true`.
@@ -150,11 +150,29 @@ module RSpec
150
150
  def enumerated(exceptions, index_offset)
151
151
  exceptions.each_with_index.map do |exception, index|
152
152
  index += index_offset
153
- formatted_message = yield exception
153
+ formatted_message = "#{yield exception}\n#{format_backtrace(exception.backtrace).first}"
154
154
  "#{index_label index}#{indented formatted_message, index}"
155
155
  end
156
156
  end
157
157
 
158
+ def exclusion_patterns
159
+ patterns = %w[/lib\d*/ruby/ bin/ exe/rspec /lib/bundler/ /exe/bundle:]
160
+ patterns << "org/jruby/" if RSpec::Support::Ruby.jruby?
161
+ patterns.map! { |s| Regexp.new(s.gsub('/', File::SEPARATOR)) }
162
+ end
163
+
164
+ def format_backtrace(backtrace)
165
+ backtrace.map { |l| backtrace_line(l) }.compact.tap { |filtered| filtered.concat backtrace if filtered.empty? }
166
+ end
167
+
168
+ def backtrace_line(line)
169
+ return if [Regexp.union(RSpec::CallerFilter::IGNORE_REGEX, *exclusion_patterns)].any? { |p| line =~ p }
170
+
171
+ # It changes the current path that is relative to
172
+ # system root to be relative to the project root.
173
+ line.sub(/(\A|\s)#{File.expand_path('.')}(#{File::SEPARATOR}|\s|\Z)/, '\\1.\\2'.freeze).sub(/\A([^:]+:\d+)$/, '\\1'.freeze)
174
+ end
175
+
158
176
  def enumerated_failures
159
177
  enumerated(failures, 0, &:message)
160
178
  end
@@ -44,10 +44,16 @@ module RSpec
44
44
 
45
45
  # @private
46
46
  class PositiveExpectationHandler
47
- def self.handle_matcher(actual, initial_matcher, message=nil, &block)
48
- ExpectationHelper.with_matcher(self, initial_matcher, message) do |matcher|
47
+ def self.handle_matcher(actual, initial_matcher, custom_message=nil, &block)
48
+ ExpectationHelper.with_matcher(self, initial_matcher, custom_message) do |matcher|
49
49
  return ::RSpec::Matchers::BuiltIn::PositiveOperatorMatcher.new(actual) unless initial_matcher
50
- matcher.matches?(actual, &block) || ExpectationHelper.handle_failure(matcher, message, :failure_message)
50
+
51
+ match_result = matcher.matches?(actual, &block)
52
+ if custom_message && match_result.respond_to?(:error_generator)
53
+ match_result.error_generator.opts[:message] = custom_message
54
+ end
55
+
56
+ match_result || ExpectationHelper.handle_failure(matcher, custom_message, :failure_message)
51
57
  end
52
58
  end
53
59
 
@@ -66,10 +72,16 @@ module RSpec
66
72
 
67
73
  # @private
68
74
  class NegativeExpectationHandler
69
- def self.handle_matcher(actual, initial_matcher, message=nil, &block)
70
- ExpectationHelper.with_matcher(self, initial_matcher, message) do |matcher|
75
+ def self.handle_matcher(actual, initial_matcher, custom_message=nil, &block)
76
+ ExpectationHelper.with_matcher(self, initial_matcher, custom_message) do |matcher|
71
77
  return ::RSpec::Matchers::BuiltIn::NegativeOperatorMatcher.new(actual) unless initial_matcher
72
- does_not_match?(matcher, actual, &block) || ExpectationHelper.handle_failure(matcher, message, :failure_message_when_negated)
78
+
79
+ negated_match_result = does_not_match?(matcher, actual, &block)
80
+ if custom_message && negated_match_result.respond_to?(:error_generator)
81
+ negated_match_result.error_generator.opts[:message] = custom_message
82
+ end
83
+
84
+ negated_match_result || ExpectationHelper.handle_failure(matcher, custom_message, :failure_message_when_negated)
73
85
  end
74
86
  end
75
87
 
@@ -2,7 +2,7 @@ module RSpec
2
2
  module Expectations
3
3
  # @private
4
4
  module Version
5
- STRING = '3.9.4'
5
+ STRING = '3.10.0'
6
6
  end
7
7
  end
8
8
  end
@@ -316,9 +316,9 @@ module RSpec
316
316
  def be_falsey
317
317
  BuiltIn::BeFalsey.new
318
318
  end
319
- alias_matcher :be_falsy, :be_falsey
319
+ alias_matcher :be_falsy, :be_falsey
320
320
  alias_matcher :a_falsey_value, :be_falsey
321
- alias_matcher :a_falsy_value, :be_falsey
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, :be_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, :be_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, :change
496
- alias_matcher :changing, :change
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, :contain_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, :cover
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, :end_with
548
- alias_matcher :ending_with, :end_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, :eq
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, :eql
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, :equal
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, :exist
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, :have_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, :include
644
- alias_matcher :a_hash_including, :include
645
- alias_matcher :including, :include
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,10 +697,10 @@ module RSpec
697
697
  def match(expected)
698
698
  BuiltIn::Match.new(expected)
699
699
  end
700
- alias_matcher :match_regex, :match
700
+ alias_matcher :match_regex, :match
701
701
  alias_matcher :an_object_matching, :match
702
- alias_matcher :a_string_matching, :match
703
- alias_matcher :matching, :match
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
@@ -761,20 +761,22 @@ module RSpec
761
761
  # expect { do_something_risky }.to raise_error
762
762
  # expect { do_something_risky }.to raise_error(PoorRiskDecisionError)
763
763
  # expect { do_something_risky }.to raise_error(PoorRiskDecisionError) { |error| expect(error.data).to eq 42 }
764
+ # expect { do_something_risky }.to raise_error { |error| expect(error.data).to eq 42 }
764
765
  # expect { do_something_risky }.to raise_error(PoorRiskDecisionError, "that was too risky")
765
766
  # expect { do_something_risky }.to raise_error(PoorRiskDecisionError, /oo ri/)
767
+ # expect { do_something_risky }.to raise_error("that was too risky")
766
768
  #
767
769
  # expect { do_something_risky }.not_to raise_error
768
- def raise_error(error=nil, message=nil, &block)
770
+ def raise_error(error=BuiltIn::RaiseError::UndefinedValue, message=nil, &block)
769
771
  BuiltIn::RaiseError.new(error, message, &block)
770
772
  end
771
- alias_method :raise_exception, :raise_error
773
+ alias_method :raise_exception, :raise_error
772
774
 
773
- alias_matcher :a_block_raising, :raise_error do |desc|
775
+ alias_matcher :a_block_raising, :raise_error do |desc|
774
776
  desc.sub("raise", "a block raising")
775
777
  end
776
778
 
777
- alias_matcher :raising, :raise_error do |desc|
779
+ alias_matcher :raising, :raise_error do |desc|
778
780
  desc.sub("raise", "raising")
779
781
  end
780
782
 
@@ -788,7 +790,7 @@ module RSpec
788
790
  BuiltIn::RespondTo.new(*names)
789
791
  end
790
792
  alias_matcher :an_object_responding_to, :respond_to
791
- alias_matcher :responding_to, :respond_to
793
+ alias_matcher :responding_to, :respond_to
792
794
 
793
795
  # Passes if the submitted block returns true. Yields target to the
794
796
  # block.
@@ -809,7 +811,7 @@ module RSpec
809
811
  BuiltIn::Satisfy.new(description, &block)
810
812
  end
811
813
  alias_matcher :an_object_satisfying, :satisfy
812
- alias_matcher :satisfying, :satisfy
814
+ alias_matcher :satisfying, :satisfy
813
815
 
814
816
  # Matches if the actual value starts with the expected value(s). In the
815
817
  # case of a string, matches against the first `expected.length` characters
@@ -824,8 +826,8 @@ module RSpec
824
826
  BuiltIn::StartWith.new(*expected)
825
827
  end
826
828
  alias_matcher :a_collection_starting_with, :start_with
827
- alias_matcher :a_string_starting_with, :start_with
828
- alias_matcher :starting_with, :start_with
829
+ alias_matcher :a_string_starting_with, :start_with
830
+ alias_matcher :starting_with, :start_with
829
831
 
830
832
  # Given no argument, matches if a proc throws any Symbol.
831
833
  #
@@ -850,7 +852,7 @@ module RSpec
850
852
  desc.sub("throw", "a block throwing")
851
853
  end
852
854
 
853
- alias_matcher :throwing, :throw_symbol do |desc|
855
+ alias_matcher :throwing, :throw_symbol do |desc|
854
856
  desc.sub("throw", "throwing")
855
857
  end
856
858
 
@@ -866,8 +868,8 @@ module RSpec
866
868
  def yield_control
867
869
  BuiltIn::YieldControl.new
868
870
  end
869
- alias_matcher :a_block_yielding_control, :yield_control
870
- alias_matcher :yielding_control, :yield_control
871
+ alias_matcher :a_block_yielding_control, :yield_control
872
+ alias_matcher :yielding_control, :yield_control
871
873
 
872
874
  # Passes if the method called in the expect block yields with
873
875
  # no arguments. Fails if it does not yield, or yields with arguments.
@@ -884,8 +886,8 @@ module RSpec
884
886
  def yield_with_no_args
885
887
  BuiltIn::YieldWithNoArgs.new
886
888
  end
887
- alias_matcher :a_block_yielding_with_no_args, :yield_with_no_args
888
- alias_matcher :yielding_with_no_args, :yield_with_no_args
889
+ alias_matcher :a_block_yielding_with_no_args, :yield_with_no_args
890
+ alias_matcher :yielding_with_no_args, :yield_with_no_args
889
891
 
890
892
  # Given no arguments, matches if the method called in the expect
891
893
  # block yields with arguments (regardless of what they are or how
@@ -914,8 +916,8 @@ module RSpec
914
916
  def yield_with_args(*args)
915
917
  BuiltIn::YieldWithArgs.new(*args)
916
918
  end
917
- alias_matcher :a_block_yielding_with_args, :yield_with_args
918
- alias_matcher :yielding_with_args, :yield_with_args
919
+ alias_matcher :a_block_yielding_with_args, :yield_with_args
920
+ alias_matcher :yielding_with_args, :yield_with_args
919
921
 
920
922
  # Designed for use with methods that repeatedly yield (such as
921
923
  # iterators). Passes if the method called in the expect block yields
@@ -935,8 +937,8 @@ module RSpec
935
937
  def yield_successive_args(*args)
936
938
  BuiltIn::YieldSuccessiveArgs.new(*args)
937
939
  end
938
- alias_matcher :a_block_yielding_successive_args, :yield_successive_args
939
- alias_matcher :yielding_successive_args, :yield_successive_args
940
+ alias_matcher :a_block_yielding_successive_args, :yield_successive_args
941
+ alias_matcher :yielding_successive_args, :yield_successive_args
940
942
 
941
943
  # Delegates to {RSpec::Expectations.configuration}.
942
944
  # This is here because rspec-core's `expect_with` option
@@ -949,7 +951,7 @@ module RSpec
949
951
 
950
952
  private
951
953
 
952
- BE_PREDICATE_REGEX = /^(be_(?:an?_)?)(.*)/
954
+ BE_PREDICATE_REGEX = /^(?:be_(?:an?_)?)(.*)/
953
955
  HAS_REGEX = /^(?:have_)(.*)/
954
956
  DYNAMIC_MATCHER_REGEX = Regexp.union(BE_PREDICATE_REGEX, HAS_REGEX)
955
957
 
@@ -16,8 +16,9 @@ module RSpec
16
16
  autoload :Be, 'rspec/matchers/built_in/be'
17
17
  autoload :BeComparedTo, 'rspec/matchers/built_in/be'
18
18
  autoload :BeFalsey, 'rspec/matchers/built_in/be'
19
+ autoload :BeHelpers, 'rspec/matchers/built_in/be'
19
20
  autoload :BeNil, 'rspec/matchers/built_in/be'
20
- autoload :BePredicate, 'rspec/matchers/built_in/be'
21
+ autoload :BePredicate, 'rspec/matchers/built_in/has'
21
22
  autoload :BeTruthy, 'rspec/matchers/built_in/be'
22
23
  autoload :BeWithin, 'rspec/matchers/built_in/be_within'
23
24
  autoload :Change, 'rspec/matchers/built_in/change'
@@ -186,116 +186,6 @@ module RSpec
186
186
  @actual.__send__ @operator, @expected
187
187
  end
188
188
  end
189
-
190
- # @api private
191
- # Provides the implementation of `be_<predicate>`.
192
- # Not intended to be instantiated directly.
193
- class BePredicate < BaseMatcher
194
- include BeHelpers
195
-
196
- def initialize(*args, &block)
197
- @expected = parse_expected(args.shift)
198
- @args = args
199
- @block = block
200
- end
201
- ruby2_keywords :initialize if respond_to?(:ruby2_keywords, true)
202
-
203
- def matches?(actual, &block)
204
- @actual = actual
205
- @block ||= block
206
- predicate_accessible? && predicate_matches?
207
- end
208
-
209
- def does_not_match?(actual, &block)
210
- @actual = actual
211
- @block ||= block
212
- predicate_accessible? && !predicate_matches?
213
- end
214
-
215
- # @api private
216
- # @return [String]
217
- def failure_message
218
- failure_message_expecting(true)
219
- end
220
-
221
- # @api private
222
- # @return [String]
223
- def failure_message_when_negated
224
- failure_message_expecting(false)
225
- end
226
-
227
- # @api private
228
- # @return [String]
229
- def description
230
- "#{prefix_to_sentence}#{expected_to_sentence}#{args_to_sentence}"
231
- end
232
-
233
- private
234
-
235
- def predicate_accessible?
236
- actual.respond_to?(predicate) || actual.respond_to?(present_tense_predicate)
237
- end
238
-
239
- # support 1.8.7, evaluate once at load time for performance
240
- if String === methods.first
241
- # :nocov:
242
- def private_predicate?
243
- @actual.private_methods.include? predicate.to_s
244
- end
245
- # :nocov:
246
- else
247
- def private_predicate?
248
- @actual.private_methods.include? predicate
249
- end
250
- end
251
-
252
- def predicate_matches?
253
- method_name = actual.respond_to?(predicate) ? predicate : present_tense_predicate
254
- @predicate_matches = actual.__send__(method_name, *@args, &@block)
255
- end
256
-
257
- def predicate
258
- :"#{@expected}?"
259
- end
260
-
261
- def present_tense_predicate
262
- :"#{@expected}s?"
263
- end
264
-
265
- def parse_expected(expected)
266
- @prefix, expected = prefix_and_expected(expected)
267
- expected
268
- end
269
-
270
- def prefix_and_expected(symbol)
271
- Matchers::BE_PREDICATE_REGEX.match(symbol.to_s).captures.compact
272
- end
273
-
274
- def prefix_to_sentence
275
- EnglishPhrasing.split_words(@prefix)
276
- end
277
-
278
- def failure_message_expecting(value)
279
- validity_message ||
280
- "expected `#{actual_formatted}.#{predicate}#{args_to_s}` to return #{value}, got #{description_of @predicate_matches}"
281
- end
282
-
283
- def validity_message
284
- return nil if predicate_accessible?
285
-
286
- msg = "expected #{actual_formatted} to respond to `#{predicate}`".dup
287
-
288
- if private_predicate?
289
- msg << " but `#{predicate}` is a private method"
290
- elsif predicate == :true?
291
- msg << " or perhaps you meant `be true` or `be_truthy`"
292
- elsif predicate == :false?
293
- msg << " or perhaps you meant `be false` or `be_falsey`"
294
- end
295
-
296
- msg
297
- end
298
- end
299
189
  end
300
190
  end
301
191
  end