/usr/lib/ruby/vendor_ruby/rspec/mocks/object_reference.rb is in ruby-rspec-mocks 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 | module RSpec
module Mocks
# @private
class ObjectReference
# Returns an appropriate Object or Module reference based
# on the given argument.
def self.for(object_module_or_name, allow_direct_object_refs=false)
case object_module_or_name
when Module
if anonymous_module?(object_module_or_name)
DirectObjectReference.new(object_module_or_name)
else
# Use a `NamedObjectReference` if it has a name because this
# will use the original value of the constant in case it has
# been stubbed.
NamedObjectReference.new(name_of(object_module_or_name))
end
when String
NamedObjectReference.new(object_module_or_name)
else
if allow_direct_object_refs
DirectObjectReference.new(object_module_or_name)
else
raise ArgumentError,
"Module or String expected, got #{object_module_or_name.inspect}"
end
end
end
if Module.new.name.nil?
def self.anonymous_module?(mod)
!name_of(mod)
end
else # 1.8.7
def self.anonymous_module?(mod)
name_of(mod) == ""
end
end
private_class_method :anonymous_module?
def self.name_of(mod)
MODULE_NAME_METHOD.bind(mod).call
end
private_class_method :name_of
# @private
MODULE_NAME_METHOD = Module.instance_method(:name)
end
# An implementation of rspec-mocks' reference interface.
# Used when an object is passed to {ExampleMethods#object_double}, or
# an anonymous class or module is passed to {ExampleMethods#instance_double}
# or {ExampleMethods#class_double}.
# Represents a reference to that object.
# @see NamedObjectReference
class DirectObjectReference
# @param object [Object] the object to which this refers
def initialize(object)
@object = object
end
# @return [String] the object's description (via `#inspect`).
def description
@object.inspect
end
# Defined for interface parity with the other object reference
# implementations. Raises an `ArgumentError` to indicate that `as_stubbed_const`
# is invalid when passing an object argument to `object_double`.
def const_to_replace
raise ArgumentError,
"Can not perform constant replacement with an anonymous object."
end
# The target of the verifying double (the object itself).
#
# @return [Object]
def target
@object
end
# Always returns true for an object as the class is defined.
#
# @return [true]
def defined?
true
end
# Yields if the reference target is loaded, providing a generic mechanism
# to optionally run a bit of code only when a reference's target is
# loaded.
#
# This specific implementation always yields because direct references
# are always loaded.
#
# @yield [Object] the target of this reference.
def when_loaded
yield @object
end
end
# An implementation of rspec-mocks' reference interface.
# Used when a string is passed to {ExampleMethods#object_double},
# and when a string, named class or named module is passed to
# {ExampleMethods#instance_double}, or {ExampleMethods#class_double}.
# Represents a reference to the object named (via a constant lookup)
# by the string.
# @see DirectObjectReference
class NamedObjectReference
# @param const_name [String] constant name
def initialize(const_name)
@const_name = const_name
end
# @return [Boolean] true if the named constant is defined, false otherwise.
def defined?
!!object
end
# @return [String] the constant name to replace with a double.
def const_to_replace
@const_name
end
alias description const_to_replace
# @return [Object, nil] the target of the verifying double (the named object), or
# nil if it is not defined.
def target
object
end
# Yields if the reference target is loaded, providing a generic mechanism
# to optionally run a bit of code only when a reference's target is
# loaded.
#
# @yield [Object] the target object
def when_loaded
yield object if object
end
private
def object
return @object if defined?(@object)
@object = Constant.original(@const_name).original_value
end
end
end
end
|