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
79
80
81
82
83
|
class Chef
class Node
class AttributeTrait
module ConvertValue
def initialize(wrapped_object: nil, convert_value: true, **args)
super(wrapped_object: convert_value ? convert_value(wrapped_object) : wrapped_object, **args)
end
def regular_writer(*path, value)
path = path.map { |key| convert_key(key) }
super(*path, value)
end
def regular_reader(*path)
path = path.map { |key| convert_key(key) }
super(*path)
end
def []=(key, value)
super(convert_key(key), convert_value(value))
end
def [](key)
super(convert_key(key))
end
def key?(key)
wrapped_object.key?(convert_key(key))
end
alias_method :has_key?, :key?
alias_method :member?, :key?
#alias_method :include?, :key?
def delete(key)
super(convert_key(key))
end
def update(other_hash)
other_hash.each { |k, v| self[convert_key(k)] = convert_value(v) }
self
end
alias_method :merge!, :update
def fetch(key, *args, &block)
super(convert_key(key), *args, &block)
end
def values_at(*indicies)
indicies.collect { |key| self[convert_key(key)] }
end
def merge(hash)
self.dup.update(hash)
end
def except(*keys)
super(*keys.map {|k| convert_key(k)})
end
def self.from_hash(hash)
new(wrapped_object: hash)
end
private
def new_decorator(**args)
args[:convert_value] = false
super(**args)
end
def convert_key(key)
key
end
def convert_value(value)
value
end
end
end
end
end
|