Class: Canfig::Config

Inherits:
Object
  • Object
show all
Defined in:
lib/canfig/config.rb

Direct Known Subclasses

OpenConfig

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

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



125
126
127
128
129
130
131
132
133
134
# File 'lib/canfig/config.rb', line 125

def method_missing(meth, *args, &block)
  if meth.to_s.match(/=\Z/)
    opt = meth.to_s.gsub(/=/,'').to_sym
    return set(opt, args.first) if allowed?(opt)
  else
    return get(meth, *args, &block) if allowed?(meth)
  end

  super
end

Instance Method Details

#[](key) ⇒ Object



76
77
78
# File 'lib/canfig/config.rb', line 76

def [](key)
  get key
end

#[]=(key, val) ⇒ Object



65
66
67
# File 'lib/canfig/config.rb', line 65

def []=(key, val)
  set key, val
end

#allowed?(opt) ⇒ Boolean

Returns:

  • (Boolean)


121
122
123
# File 'lib/canfig/config.rb', line 121

def allowed?(opt)
  @allowed.include?(opt)
end

#changedObject



84
85
86
# File 'lib/canfig/config.rb', line 84

def changed
  Hash[@allowed.map { |key| [key, [@saved_state[key], state[key]]] if @saved_state[key] != state[key] }.compact]
end

#changed?(key) ⇒ Boolean

Returns:

  • (Boolean)


88
89
90
# File 'lib/canfig/config.rb', line 88

def changed?(key)
  changed.key?(key)
end

#clear(*keys) ⇒ Object



59
60
61
62
63
# File 'lib/canfig/config.rb', line 59

def clear(*keys)
  save_state! do
    keys.each { |key| state[key] = nil }
  end
end

#configure(argh = {}, file = nil, &block) ⇒ Object



4
5
6
7
8
9
10
11
# File 'lib/canfig/config.rb', line 4

def configure(argh={}, file=nil, &block)
  save_state! do
    configure_with_file file unless file.nil?
    configure_with_args argh
    configure_with_block &block
  end
  self
end

#configure_with_args(argh) ⇒ Object



19
20
21
22
23
# File 'lib/canfig/config.rb', line 19

def configure_with_args(argh)
  save_state! do
    argh.symbolize_keys.each { |key,val| set(key, val) }
  end
end

#configure_with_block(&block) ⇒ Object



25
26
27
28
29
# File 'lib/canfig/config.rb', line 25

def configure_with_block(&block)
  save_state! do
    instance_eval &block if block_given?
  end
end

#configure_with_file(file) ⇒ Object



13
14
15
16
17
# File 'lib/canfig/config.rb', line 13

def configure_with_file(file)
  save_state! do
    configure_with_args(Canfig::YAML.new(file).load)
  end
end

#disable_state_saves!Object



113
114
115
# File 'lib/canfig/config.rb', line 113

def disable_state_saves!
  @save_state = false
end

#enable_state_saves!Object



109
110
111
# File 'lib/canfig/config.rb', line 109

def enable_state_saves!
  @save_state = true
end

#env(key, default = nil, &block) ⇒ Object



49
50
51
52
53
54
55
56
57
# File 'lib/canfig/config.rb', line 49

def env(key, default=nil, &block)
  state[key] ||= begin
    val = ENV.fetch(key.to_s.underscore.upcase, default, &block)
    val = default if val.blank?
    val = env(val, default, &block) if val && ENV.key?(val.to_s)
    val = eval(val) if val == 'true' || val == 'false'
    val
  end
end

#get(key, default = nil, &block) ⇒ Object

Raises:

  • (NoMethodError)


69
70
71
72
73
74
# File 'lib/canfig/config.rb', line 69

def get(key, default=nil, &block)
  raise NoMethodError, "undefined method `#{key.to_s}' for #{self.to_s}" unless allowed?(key)
  state_val = state[key]
  return (block_given? ? yield : default) if state_val.nil?
  state_val
end

#save_state!(&block) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/canfig/config.rb', line 92

def save_state!(&block)
  if save_state?
    @saved_state = to_h

    if block_given?
      disable_state_saves!
      begin
        yield
      ensure
        enable_state_saves!
      end
    end
  else
    yield if block_given?
  end
end

#save_state?Boolean

Returns:

  • (Boolean)


117
118
119
# File 'lib/canfig/config.rb', line 117

def save_state?
  @save_state
end

#set(key, val) ⇒ Object

Raises:

  • (NoMethodError)


41
42
43
44
45
46
47
# File 'lib/canfig/config.rb', line 41

def set(key, val)
  raise NoMethodError, "undefined method `#{key.to_s}=' for #{self.to_s}" unless allowed?(key)

  save_state! do
    state[key] = val
  end
end

#stateObject



36
37
38
39
# File 'lib/canfig/config.rb', line 36

def state
  thread_configs[object_id] ||= {}
  thread_configs[object_id]
end

#thread_configsObject



31
32
33
34
# File 'lib/canfig/config.rb', line 31

def thread_configs
  Thread.current[:_canfig_configs] ||= {}
  Thread.current[:_canfig_configs]
end

#to_hObject



80
81
82
# File 'lib/canfig/config.rb', line 80

def to_h
  Hash[@allowed.map { |key| [key, state[key]] }]
end