# File lib/rspec/matchers/built_in/respond_to.rb, line 5 def initialize(*names) @names = names @expected_arity = nil end
# File lib/rspec/matchers/built_in/respond_to.rb, line 35 def argument self end
# File lib/rspec/matchers/built_in/respond_to.rb, line 26 def description "respond to #{pp_names}#{with_arity}" end
# File lib/rspec/matchers/built_in/respond_to.rb, line 14 def does_not_match?(actual) find_failing_method_names(actual, :select).empty? end
# File lib/rspec/matchers/built_in/respond_to.rb, line 18 def failure_message_for_should "expected #{@actual.inspect} to respond to #{@failing_method_names.collect {|name| name.inspect }.join(', ')}#{with_arity}" end
# File lib/rspec/matchers/built_in/respond_to.rb, line 22 def failure_message_for_should_not failure_message_for_should.sub(/to respond to/, 'not to respond to') end
# File lib/rspec/matchers/built_in/respond_to.rb, line 10 def matches?(actual) find_failing_method_names(actual, :reject).empty? end
# File lib/rspec/matchers/built_in/respond_to.rb, line 30 def with(n) @expected_arity = n self end
# File lib/rspec/matchers/built_in/respond_to.rb, line 42 def find_failing_method_names(actual, filter_method) @actual = actual @failing_method_names = @names.send(filter_method) do |name| @actual.respond_to?(name) && matches_arity?(actual, name) end end
# File lib/rspec/matchers/built_in/respond_to.rb, line 49 def matches_arity?(actual, name) return true unless @expected_arity actual_arity = actual.method(name).arity if actual_arity < 0 # ~ inverts the one's complement and gives us the number of required args ~actual_arity <= @expected_arity else actual_arity == @expected_arity end end
# File lib/rspec/matchers/built_in/respond_to.rb, line 66 def pp_names # Ruby 1.9 returns the same thing for array.to_s as array.inspect, so just use array.inspect here @names.length == 1 ? "##{@names.first}" : @names.inspect end
# File lib/rspec/matchers/built_in/respond_to.rb, line 61 def with_arity @expected_arity.nil?? "" : " with #{@expected_arity} argument#{@expected_arity == 1 ? '' : 's'}" end