config_hash 1.1.0 → 1.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/config_hash.rb +33 -13
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4402ad71ee24799c7a20a27289000faad82afe5f
|
4
|
+
data.tar.gz: 5da3733c25449940c827652a7113832b30f090d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2dba44f34cc99e567b931d5666c07525f7dd65c4d3dc43eadb22e0742942cd11d90d7ec80caff1065e9699a072063eaaef6969c2934128b18b3b62ad33ad54f0
|
7
|
+
data.tar.gz: 42ba9db1f57d08e82f2d43b8c53837edad8b088fa3858e3c46eec656ee7b901ae6d1554da4e2f5e83861404f4fbfed873fac9e24b137d1b79d00b5c616ef784b
|
data/lib/config_hash.rb
CHANGED
@@ -6,8 +6,11 @@ class ConfigHash < Hash
|
|
6
6
|
raise ArgumentError.new("first argument must be a hash!")
|
7
7
|
end
|
8
8
|
|
9
|
-
@freeze
|
10
|
-
@
|
9
|
+
@freeze = options.fetch(:freeze, true)
|
10
|
+
@lazy_loading = options.fetch(:lazy_loading, false)
|
11
|
+
@processors = options.fetch(:processors, [])
|
12
|
+
@processed = {}
|
13
|
+
|
11
14
|
if !(@processors.is_a?(Array) && @processors.all? { |p| p.is_a?(Proc) || p.is_a?(Method) })
|
12
15
|
raise ArgumentError.new("processors must be a list of callables!")
|
13
16
|
end
|
@@ -20,15 +23,27 @@ class ConfigHash < Hash
|
|
20
23
|
hash.each do |key, value|
|
21
24
|
key = key.to_sym if key.is_a?(String)
|
22
25
|
self[key] = construct(value)
|
23
|
-
|
24
|
-
class << self; self; end.class_eval do
|
25
|
-
define_method(key) { self[key] }
|
26
|
-
end
|
27
26
|
end
|
28
27
|
|
29
28
|
self.freeze if @freeze
|
30
29
|
end
|
31
30
|
|
31
|
+
def [](key)
|
32
|
+
key = key.to_sym if key.is_a? String
|
33
|
+
if @lazy_loading
|
34
|
+
@processed[key] ||= process(super(key))
|
35
|
+
else
|
36
|
+
super(key)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def []=(key, value)
|
41
|
+
return super(key, value) if self.frozen?
|
42
|
+
|
43
|
+
key = key.to_sym if key.is_a? String
|
44
|
+
super(key, value).tap { __build_accessor(key) }
|
45
|
+
end
|
46
|
+
|
32
47
|
def method_missing(method, *args)
|
33
48
|
return super(method, *args) if @freeze
|
34
49
|
|
@@ -36,15 +51,12 @@ class ConfigHash < Hash
|
|
36
51
|
if method =~ /^(.*)=$/ && args.length == 1
|
37
52
|
key = method.to_s.tr('=', '').to_sym
|
38
53
|
self[key] = args[0]
|
39
|
-
|
40
|
-
class << self; self; end.class_eval do
|
41
|
-
define_method(key) { self[key] }
|
42
|
-
end
|
54
|
+
__build_accessor(key)
|
43
55
|
end
|
44
56
|
end
|
45
57
|
|
46
58
|
def delete(key, &blk)
|
47
|
-
return super(key, &blk) if
|
59
|
+
return super(key, &blk) if self.frozen?
|
48
60
|
|
49
61
|
key = key.is_a?(String) ? key.to_sym : key
|
50
62
|
class << self; self; end.class_eval do
|
@@ -56,6 +68,14 @@ class ConfigHash < Hash
|
|
56
68
|
|
57
69
|
private
|
58
70
|
|
71
|
+
def __build_accessor(key)
|
72
|
+
return unless key.is_a?(Symbol) && key !~ /^\d/
|
73
|
+
|
74
|
+
class << self; self; end.class_eval do
|
75
|
+
define_method(key) { self[key] }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
59
79
|
def process(value)
|
60
80
|
@processors.reduce(value) { |modified, proc| proc.call(modified) }
|
61
81
|
end
|
@@ -66,12 +86,12 @@ class ConfigHash < Hash
|
|
66
86
|
when Hash then ConfigHash.new(
|
67
87
|
value,
|
68
88
|
value.default,
|
69
|
-
freeze: @freeze, processors: @processors,
|
89
|
+
freeze: @freeze, processors: @processors, lazy_loading: @lazy_loading,
|
70
90
|
&value.default_proc
|
71
91
|
)
|
72
92
|
when Array then value.map { |sv| construct(sv) }
|
73
93
|
when Class, Module, Proc, Method then value
|
74
|
-
else @processors.any? ? process(value) : value
|
94
|
+
else (!@lazy_loading && @processors.any?) ? process(value) : value
|
75
95
|
end.tap { |calced| calced.freeze if @freeze }
|
76
96
|
end
|
77
97
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: config_hash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zach Lome
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-01-
|
11
|
+
date: 2017-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|