/
sting_operations.rb
71 lines (53 loc) · 1.32 KB
/
sting_operations.rb
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
require 'extended_yaml'
class Sting
module StingOperations
def initialize(source = nil)
self << source if source
end
def <<(source)
if source.is_a? Hash
content = source.transform_keys(&:to_s)
elsif source.include? '*'
Dir[source.to_s].each { |file| push file }
elsif File.directory? source
Dir["#{source}/*.yml"].each { |file| push file }
else
source = "#{source}.yml" unless /\.ya?ml$/.match?(source)
content = ExtendedYAML.load source
end
settings.merge! content if content
end
alias push <<
def [](*keys)
settings.dig(*keys.map(&:to_s))
end
def method_missing(name, *args, &_block)
name = name.to_s
return settings[name] if has_key? name
suffix = nil
if name.end_with?('=', '!', '?')
suffix = name[-1]
name = name[0..-2]
end
case suffix
when '='
settings[name] = args.first
when '?'
!!settings[name]
when '!'
raise ArgumentError, "Key '#{name}' does not exist" unless has_key? name
settings[name]
end
end
def settings
@settings ||= {}
end
alias to_h settings
def reset!
@settings = nil
end
def has_key?(key)
settings.has_key? key.to_s
end
end
end