Module: RaceGuard::MethodResolution

Defined in:
lib/race_guard/method_resolution.rb

Overview

Shared rules for resolving public_method_defined?(name, false) targets on a class or module (used by MethodWatch and commit-safety watchers).

Class Method Summary collapse

Class Method Details

.missing_method_message(klass, name) ⇒ Object



52
53
54
55
56
# File 'lib/race_guard/method_resolution.rb', line 52

def missing_method_message(klass, name)
  label = klass.name || "Anonymous(#{klass.object_id})"
  "no public own method #{name.inspect} on #{label} for scope :auto " \
    '(define it on this class/module, or pass scope: :instance / :singleton)'
end

.public_instance_method_own?(klass, name) ⇒ Boolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/race_guard/method_resolution.rb', line 44

def public_instance_method_own?(klass, name)
  klass.public_method_defined?(name, false)
end

.public_singleton_method_own?(klass, name) ⇒ Boolean

Returns:

  • (Boolean)


48
49
50
# File 'lib/race_guard/method_resolution.rb', line 48

def public_singleton_method_own?(klass, name)
  klass.singleton_class.public_method_defined?(name, false)
end

.require_instance!(klass, method_name, has_inst) ⇒ Object

Raises:

  • (ArgumentError)


32
33
34
35
36
# File 'lib/race_guard/method_resolution.rb', line 32

def require_instance!(klass, method_name, has_inst)
  raise ArgumentError, missing_method_message(klass, method_name) unless has_inst

  :instance
end

.require_singleton!(klass, method_name, has_single) ⇒ Object

Raises:

  • (ArgumentError)


38
39
40
41
42
# File 'lib/race_guard/method_resolution.rb', line 38

def require_singleton!(klass, method_name, has_single)
  raise ArgumentError, missing_method_message(klass, method_name) unless has_single

  :singleton
end

.resolve_auto_owner(klass, method_name, has_inst, has_single) ⇒ Object

Raises:

  • (ArgumentError)


25
26
27
28
29
30
# File 'lib/race_guard/method_resolution.rb', line 25

def resolve_auto_owner(klass, method_name, has_inst, has_single)
  return :instance if has_inst
  return :singleton if has_single

  raise ArgumentError, missing_method_message(klass, method_name)
end

.resolve_owner!(klass, method_name, scope) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/race_guard/method_resolution.rb', line 9

def resolve_owner!(klass, method_name, scope)
  has_inst = public_instance_method_own?(klass, method_name)
  has_single = public_singleton_method_own?(klass, method_name)

  case scope
  when :auto
    resolve_auto_owner(klass, method_name, has_inst, has_single)
  when :instance
    require_instance!(klass, method_name, has_inst)
  when :singleton
    require_singleton!(klass, method_name, has_single)
  else
    raise ArgumentError, "invalid scope: #{scope.inspect} (use :auto, :instance, or :singleton)"
  end
end