summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLamont Granquist <lamont@scriptkiddie.org>2021-01-11 21:48:08 -0800
committerLamont Granquist <lamont@scriptkiddie.org>2021-01-15 09:37:44 -0800
commit38a6623583e34193adcc32f0e4d520f7a21be6a5 (patch)
treee5ba4f8d8f46434218e885287d4998cd5fa4093c
parent415e7fbbd5a4f6992e8941542effb3ba4800f36d (diff)
downloadchef-38a6623583e34193adcc32f0e4d520f7a21be6a5.tar.gz
lazy attribute support
Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
-rw-r--r--lib/chef/node/immutable_collections.rb12
-rw-r--r--lib/chef/node/mixin/deep_merge_cache.rb16
2 files changed, 21 insertions, 7 deletions
diff --git a/lib/chef/node/immutable_collections.rb b/lib/chef/node/immutable_collections.rb
index 49dc0256b9..62bc0fba65 100644
--- a/lib/chef/node/immutable_collections.rb
+++ b/lib/chef/node/immutable_collections.rb
@@ -109,6 +109,12 @@ class Chef
key
end
+ def [](index)
+ value = super
+ value = value.call while value.is_a?(Proc)
+ value
+ end
+
prepend Chef::Node::Mixin::StateTracking
prepend Chef::Node::Mixin::ImmutablizeArray
end
@@ -187,6 +193,12 @@ class Chef
e
end
+ def [](key)
+ value = super
+ value = value.call while value.is_a?(Proc)
+ value
+ end
+
prepend Chef::Node::Mixin::StateTracking
prepend Chef::Node::Mixin::ImmutablizeHash
end
diff --git a/lib/chef/node/mixin/deep_merge_cache.rb b/lib/chef/node/mixin/deep_merge_cache.rb
index e88e079895..c1c1d225d8 100644
--- a/lib/chef/node/mixin/deep_merge_cache.rb
+++ b/lib/chef/node/mixin/deep_merge_cache.rb
@@ -46,13 +46,15 @@ class Chef
alias :reset :reset_cache
def [](key)
- if deep_merge_cache.key?(key.to_s)
- # return the cache of the deep merged values by top-level key
- deep_merge_cache[key.to_s]
- else
- # save all the work of computing node[key]
- deep_merge_cache[key.to_s] = merged_attributes(key)
- end
+ ret = if deep_merge_cache.key?(key.to_s)
+ # return the cache of the deep merged values by top-level key
+ deep_merge_cache[key.to_s]
+ else
+ # save all the work of computing node[key]
+ deep_merge_cache[key.to_s] = merged_attributes(key)
+ end
+ ret = ret.call while ret.is_a?(Proc)
+ ret
end
end