class RSpec::Matchers::BuiltIn::HaveAttributes

Not intended to be instantiated directly.
Provides the implementation for ‘have_attributes`.
@api private

def actual

Other tags:
    Private: -
def actual
  @values
end

def actual_has_attribute?(attribute_key, attribute_value)

def actual_has_attribute?(attribute_key, attribute_value)
  values_match?(attribute_value, @values.fetch(attribute_key))
end

def cache_all_values

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 description

Returns:
  • (String) -

Other tags:
    Api: - private
def description
  described_items = surface_descriptions_in(expected)
  improve_hash_formatting "have attributes #{RSpec::Support::ObjectFormatter.format(described_items)}"
end

def diffable?

Returns:
  • (Boolean) -

Other tags:
    Api: - private
def diffable?
  !@respond_to_failed && !@negated
end

def does_not_match?(actual)

Returns:
  • (Boolean) -

Other tags:
    Api: - private
def does_not_match?(actual)
  @actual = actual
  @negated = true
  return false unless respond_to_attributes?
  perform_match(:none?)
end

def failure_message

Returns:
  • (String) -

Other tags:
    Api: - private
def failure_message
  respond_to_failure_message_or do
    "expected #{actual_formatted} to #{description} but had attributes #{ formatted_values }"
  end
end

def failure_message_when_negated

Returns:
  • (String) -

Other tags:
    Api: - private
def failure_message_when_negated
  respond_to_failure_message_or { "expected #{actual_formatted} not to #{description}" }
end

def formatted_values

def formatted_values
  values = RSpec::Support::ObjectFormatter.format(@values)
  improve_hash_formatting(values)
end

def initialize(expected)

def initialize(expected)
  @expected = expected
  @values = {}
  @respond_to_failed = false
  @negated = false
end

def matches?(actual)

Returns:
  • (Boolean) -

Other tags:
    Api: - private
def matches?(actual)
  @actual = actual
  @negated = false
  return false unless respond_to_attributes?
  perform_match(:all?)
end

def perform_match(predicate)

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 respond_to_attributes?

def respond_to_attributes?
  matches = respond_to_matcher.matches?(@actual)
  @respond_to_failed = !matches
  matches
end

def respond_to_failure_message_or

def respond_to_failure_message_or
  if respond_to_failed
    respond_to_matcher.failure_message
  else
    improve_hash_formatting(yield)
  end
end

def respond_to_matcher

def respond_to_matcher
  @respond_to_matcher ||= RespondTo.new(*expected.keys).with(0).arguments.tap { |m| m.ignoring_method_signature_failure! }
end