Class: Configurate::Proxy

Inherits:
BasicObject
Defined in:
lib/configurate/proxy.rb

Overview

Proxy object to support nested settings

Cavehats: Since this object is always true, adding a ? at the end returns the value, if found, instead of the proxy object. So instead of if settings.foo.bar use if settings.foo.bar? to check for boolean values, if settings.foo.bar.nil? to check for nil values and of course you can do if settings.foo.bar.present? to check for empty values if you’re in Rails. Call #get to actually return the value, commonly when doing settings.foo.bar.get || “default”. Also don’t use this in case statements since Module#=== can’t be fooled, again call #get.

If a setting ends with = it’s too called directly, just like with ?.

Instance Method Summary collapse

Constructor Details

#initialize(lookup_chain) ⇒ Proxy

Returns a new instance of Proxy.

Parameters:

  • lookup_chain (#lookup)


19
20
21
22
# File 'lib/configurate/proxy.rb', line 19

def initialize lookup_chain
  @lookup_chain = lookup_chain
  @setting_path = SettingPath.new
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(setting, *args, &block) ⇒ Object

rubocop:disable Style/MethodMissingSuper we handle all calls rubocop:disable Style/MissingRespondToMissing we override respond_to? instead



72
73
74
75
76
77
78
79
80
# File 'lib/configurate/proxy.rb', line 72

def method_missing setting, *args, &block
  return target.public_send(setting, *args, &block) if target_respond_to? setting

  @setting_path << setting

  return target(*args) if @setting_path.question_action_or_setter?

  self
end

Instance Method Details

#!Object



24
25
26
# File 'lib/configurate/proxy.rb', line 24

def !
  !target
end

#_proxy?Boolean

Returns:

  • (Boolean)


48
49
50
# File 'lib/configurate/proxy.rb', line 48

def _proxy?
  true
end

#respond_to?(method, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/configurate/proxy.rb', line 52

def respond_to? method, include_private=false
  method == :_proxy? || target_respond_to?(method, include_private)
end

#send(*args, &block) ⇒ Object Also known as: public_send



56
57
58
# File 'lib/configurate/proxy.rb', line 56

def send *args, &block
  __send__(*args, &block)
end

#singleton_classObject



61
62
63
64
65
66
67
# File 'lib/configurate/proxy.rb', line 61

def singleton_class
  target.singleton_class
rescue ::TypeError
  class << self
    self
  end
end

#target(*args) ⇒ Object Also known as: get

Get the setting at the current path, if found. (see LookupChain#lookup)



85
86
87
88
89
# File 'lib/configurate/proxy.rb', line 85

def target *args
  return if @setting_path.empty?

  @lookup_chain.lookup @setting_path, *args
end