/usr/lib/ruby/vendor_ruby/rspec/matchers/built_in/base_matcher.rb is in ruby-rspec-expectations 3.5.0c3e0m0s0-1.
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 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | module RSpec
module Matchers
module BuiltIn
# @api private
#
# Used _internally_ as a base class for matchers that ship with
# rspec-expectations and rspec-rails.
#
# ### Warning:
#
# This class is for internal use, and subject to change without notice.
# We strongly recommend that you do not base your custom matchers on this
# class. If/when this changes, we will announce it and remove this warning.
class BaseMatcher
include RSpec::Matchers::Composable
# @api private
# Used to detect when no arg is passed to `initialize`.
# `nil` cannot be used because it's a valid value to pass.
UNDEFINED = Object.new.freeze
# @private
attr_reader :actual, :expected, :rescued_exception
def initialize(expected=UNDEFINED)
@expected = expected unless UNDEFINED.equal?(expected)
end
# @api private
# Indicates if the match is successful. Delegates to `match`, which
# should be defined on a subclass. Takes care of consistently
# initializing the `actual` attribute.
def matches?(actual)
@actual = actual
match(expected, actual)
end
# @api private
# Used to wrap a block of code that will indicate failure by
# raising one of the named exceptions.
#
# This is used by rspec-rails for some of its matchers that
# wrap rails' assertions.
def match_unless_raises(*exceptions)
exceptions.unshift Exception if exceptions.empty?
begin
yield
true
rescue *exceptions => @rescued_exception
false
end
end
# @api private
# Generates a description using {EnglishPhrasing}.
# @return [String]
def description
desc = EnglishPhrasing.split_words(self.class.matcher_name)
desc << EnglishPhrasing.list(@expected) if defined?(@expected)
desc
end
# @api private
# Matchers are not diffable by default. Override this to make your
# subclass diffable.
def diffable?
false
end
# @api private
# Most matchers are value matchers (i.e. meant to work with `expect(value)`)
# rather than block matchers (i.e. meant to work with `expect { }`), so
# this defaults to false. Block matchers must override this to return true.
def supports_block_expectations?
false
end
# @api private
def expects_call_stack_jump?
false
end
# @private
def expected_formatted
RSpec::Support::ObjectFormatter.format(@expected)
end
# @private
def actual_formatted
RSpec::Support::ObjectFormatter.format(@actual)
end
# @private
def self.matcher_name
@matcher_name ||= underscore(name.split('::').last)
end
# @private
# Borrowed from ActiveSupport.
def self.underscore(camel_cased_word)
word = camel_cased_word.to_s.dup
word.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
word.tr!('-', '_')
word.downcase!
word
end
private_class_method :underscore
private
def assert_ivars(*expected_ivars)
return unless (expected_ivars - present_ivars).any?
ivar_list = EnglishPhrasing.list(expected_ivars)
raise "#{self.class.name} needs to supply#{ivar_list}"
end
if RUBY_VERSION.to_f < 1.9
# :nocov:
def present_ivars
instance_variables.map(&:to_sym)
end
# :nocov:
else
alias present_ivars instance_variables
end
# @private
module HashFormatting
# `{ :a => 5, :b => 2 }.inspect` produces:
#
# {:a=>5, :b=>2}
#
# ...but it looks much better as:
#
# {:a => 5, :b => 2}
#
# This is idempotent and safe to run on a string multiple times.
def improve_hash_formatting(inspect_string)
inspect_string.gsub(/(\S)=>(\S)/, '\1 => \2')
end
module_function :improve_hash_formatting
end
include HashFormatting
# @api private
# Provides default implementations of failure messages, based on the `description`.
module DefaultFailureMessages
# @api private
# Provides a good generic failure message. Based on `description`.
# When subclassing, if you are not satisfied with this failure message
# you often only need to override `description`.
# @return [String]
def failure_message
"expected #{description_of @actual} to #{description}"
end
# @api private
# Provides a good generic negative failure message. Based on `description`.
# When subclassing, if you are not satisfied with this failure message
# you often only need to override `description`.
# @return [String]
def failure_message_when_negated
"expected #{description_of @actual} not to #{description}"
end
# @private
def self.has_default_failure_messages?(matcher)
matcher.method(:failure_message).owner == self &&
matcher.method(:failure_message_when_negated).owner == self
rescue NameError
false
end
end
include DefaultFailureMessages
end
end
end
end
|