settingslogic.rb
2.11 KB
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
require "yaml"
require "erb"
# A simple settings solution using a YAML file. See README for more information.
class Settingslogic < Hash
class << self
def name # :nodoc:
instance.key?("name") ? instance.name : super
end
def source(value = nil)
if value.nil?
@source
else
@source = value
end
end
def namespace(value = nil)
if value.nil?
@namespace
else
@namespace = value
end
end
private
def instance
@instance ||= new
end
def method_missing(name, *args, &block)
instance.send(name, *args, &block)
end
end
# Initializes a new settings object. You can initialize an object in any of the following ways:
#
# Settings.new(:application) # will look for config/application.yml
# Settings.new("application.yaml") # will look for application.yaml
# Settings.new("/var/configs/application.yml") # will look for /var/configs/application.yml
# Settings.new(:config1 => 1, :config2 => 2)
#
# Basically if you pass a symbol it will look for that file in the configs directory of your rails app, if you are using this in rails. If you pass a string it should be an absolute path to your settings file.
# Then you can pass a hash, and it just allows you to access the hash via methods.
def initialize(hash_or_file = self.class.source)
case hash_or_file
when Hash
self.update hash_or_file
else
hash = YAML.load(ERB.new(File.read(hash_or_file)).result).to_hash
hash = hash[self.class.namespace] if self.class.namespace
self.update hash
end
end
module EigenMethodDefiner
def method_missing(name, *args, &block)
if key?(name.to_s)
define_eigen_method name.to_s
value = self[name.to_s]
value.extend EigenMethodDefiner if value.is_a? Hash
value
else
super
end
end
private
def define_eigen_method(name)
eigen_class = class << self; self; end
eigen_class.send(:define_method, name) { self[name] }
end
end
include EigenMethodDefiner
end