class RSpec::Matchers::BuiltIn::BePredicate
def check_respond_to(method)
def check_respond_to(method) RSpec.deprecate( "Matching with #{@prefix}#{@expected} on an object that doesn't respond to `#{method}`", :replacement => "`respond_to_missing?` or `respond_to?` on your object" ) unless actual.respond_to?(method) end
def description
def description "#{prefix_to_sentence}#{expected_to_sentence}#{args_to_sentence}" end
def failure_message_for_should
def failure_message_for_should "expected #{predicate}#{args_to_s} to return true, got #{@result.inspect}" end
def failure_message_for_should_not
def failure_message_for_should_not "expected #{predicate}#{args_to_s} to return false, got #{@result.inspect}" end
def initialize(*args, &block)
def initialize(*args, &block) @expected = parse_expected(args.shift) @args = args @block = block end
def is_private_on? actual
def is_private_on? actual actual.private_methods.include? predicate.to_s end
def is_private_on? actual
def is_private_on? actual actual.private_methods.include? predicate end
def matches?(actual)
def matches?(actual) @actual = actual if is_private_on?( @actual ) RSpec.deprecate "matching with be_#{predicate.to_s.gsub(/\?$/,'')} on private method #{predicate}", :replacement => "`expect(object.send(#{predicate.inspect})).to be_true` or change the method's visibility to public", :call_site => caller(0)[3] end begin @result = actual.__send__(predicate, *@args, &@block) check_respond_to(predicate) return @result rescue NameError => predicate_missing_error "this needs to be here or rcov will not count this branch even though it's executed in a code example" end begin @result = actual.__send__(present_tense_predicate, *@args, &@block) check_respond_to(present_tense_predicate) return @result rescue NameError raise predicate_missing_error end end
def parse_expected(expected)
def parse_expected(expected) @prefix, expected = prefix_and_expected(expected) expected end
def predicate
def predicate "#{@expected}?".to_sym end
def prefix_and_expected(symbol)
def prefix_and_expected(symbol) symbol.to_s =~ /^(be_(an?_)?)(.*)/ return $1, $3 end
def prefix_to_sentence
def prefix_to_sentence split_words(@prefix) end
def present_tense_predicate
def present_tense_predicate "#{@expected}s?".to_sym end