/usr/lib/ruby/vendor_ruby/rspec/matchers/built_in/match.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 | module RSpec
module Matchers
module BuiltIn
# @api private
# Provides the implementation for `match`.
# Not intended to be instantiated directly.
class Match < BaseMatcher
def initialize(expected)
super(expected)
@expected_captures = nil
end
# @api private
# @return [String]
def description
if @expected_captures && @expected.match(actual)
"match #{surface_descriptions_in(expected).inspect} with captures #{surface_descriptions_in(@expected_captures).inspect}"
else
"match #{surface_descriptions_in(expected).inspect}"
end
end
# @api private
# @return [Boolean]
def diffable?
true
end
# Used to specify the captures we match against
# @return [self]
def with_captures(*captures)
@expected_captures = captures
self
end
private
def match(expected, actual)
return match_captures(expected, actual) if @expected_captures
return true if values_match?(expected, actual)
return false unless can_safely_call_match?(expected, actual)
actual.match(expected)
end
def can_safely_call_match?(expected, actual)
return false unless actual.respond_to?(:match)
!(RSpec::Matchers.is_a_matcher?(expected) &&
(String === actual || Regexp === actual))
end
def match_captures(expected, actual)
match = actual.match(expected)
if match
match = ReliableMatchData.new(match)
if match.names.empty?
values_match?(@expected_captures, match.captures)
else
expected_matcher = @expected_captures.last
values_match?(expected_matcher, Hash[match.names.zip(match.captures)]) ||
values_match?(expected_matcher, Hash[match.names.map(&:to_sym).zip(match.captures)]) ||
values_match?(@expected_captures, match.captures)
end
else
false
end
end
end
# @api private
# Used to wrap match data and make it reliable for 1.8.7
class ReliableMatchData
def initialize(match_data)
@match_data = match_data
end
if RUBY_VERSION == "1.8.7"
# @api private
# Returns match data names for named captures
# @return Array
def names
[]
end
else
# @api private
# Returns match data names for named captures
# @return Array
def names
match_data.names
end
end
# @api private
# returns an array of captures from the match data
# @return Array
def captures
match_data.captures
end
protected
attr_reader :match_data
end
end
end
end
|