/usr/lib/ruby/vendor_ruby/rspec/matchers/built_in/have_attributes.rb is in ruby-rspec-expectations 3.4.0c3e0m1s1-1ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | module RSpec
module Matchers
module BuiltIn
# @api private
# Provides the implementation for `have_attributes`.
# Not intended to be instantiated directly.
class HaveAttributes < BaseMatcher
# @private
attr_reader :respond_to_failed
def initialize(expected)
@expected = expected
@values = {}
@respond_to_failed = false
@negated = false
end
# @private
def actual
@values
end
# @api private
# @return [Boolean]
def matches?(actual)
@actual = actual
@negated = false
return false unless respond_to_attributes?
perform_match(:all?)
end
# @api private
# @return [Boolean]
def does_not_match?(actual)
@actual = actual
@negated = true
return false unless respond_to_attributes?
perform_match(:none?)
end
# @api private
# @return [String]
def description
described_items = surface_descriptions_in(expected)
improve_hash_formatting "have attributes #{RSpec::Support::ObjectFormatter.format(described_items)}"
end
# @api private
# @return [Boolean]
def diffable?
!@respond_to_failed && !@negated
end
# @api private
# @return [String]
def failure_message
respond_to_failure_message_or do
"expected #{actual_formatted} to #{description} but had attributes #{ formatted_values }"
end
end
# @api private
# @return [String]
def failure_message_when_negated
respond_to_failure_message_or { "expected #{actual_formatted} not to #{description}" }
end
private
def cache_all_values
@values = {}
expected.each do |attribute_key, _attribute_value|
actual_value = @actual.__send__(attribute_key)
@values[attribute_key] = actual_value
end
end
def perform_match(predicate)
cache_all_values
expected.__send__(predicate) do |attribute_key, attribute_value|
actual_has_attribute?(attribute_key, attribute_value)
end
end
def actual_has_attribute?(attribute_key, attribute_value)
values_match?(attribute_value, @values.fetch(attribute_key))
end
def respond_to_attributes?
matches = respond_to_matcher.matches?(@actual)
@respond_to_failed = !matches
matches
end
def respond_to_matcher
@respond_to_matcher ||= RespondTo.new(*expected.keys).with(0).arguments
end
def respond_to_failure_message_or
if respond_to_failed
respond_to_matcher.failure_message
else
improve_hash_formatting(yield)
end
end
def formatted_values
values = RSpec::Support::ObjectFormatter.format(@values)
improve_hash_formatting(values)
end
end
end
end
end
|