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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/config_hash.rb +33 -13
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 11a34ee8349781b3893bc7ef8dfa913c59174d8b
4
- data.tar.gz: fbdcc4607f4a4c39c142680c57cacce06eaf243c
3
+ metadata.gz: 4402ad71ee24799c7a20a27289000faad82afe5f
4
+ data.tar.gz: 5da3733c25449940c827652a7113832b30f090d0
5
5
  SHA512:
6
- metadata.gz: 8d2bdb3ecd78db04b9de48f9ead579dbaef0ae5f42e252acf2a7b31b8f829e062267640eb27444469525663e2317408ccdc3e43e78b8cc62bcff9d3d69871a2c
7
- data.tar.gz: 34ebc465ae1cb5bd59fbeca0c71803883a45e4bf3fd4a23e556f409cc1979600b240d32283820f3f3c3842c259e811e3e05022911752abc1e17b15663e5899bc
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 = options.fetch(:freeze, true)
10
- @processors = options.fetch(:processors, [])
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 @freeze
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.0
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-03 00:00:00.000000000 Z
11
+ date: 2017-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler