class MiniHiera::Context
Constants
- DefaultObject
Public Class Methods
new(hiera, data, options)
click to toggle source
# File lib/mini_hiera.rb, line 22 def initialize(hiera, data, options) @hiera, @data, @options = hiera, data, options end
Public Instance Methods
[](key)
click to toggle source
# File lib/mini_hiera.rb, line 88 def [](key) fetch(key) end
detect_circular_interpolation(key) { || ... }
click to toggle source
# File lib/mini_hiera.rb, line 46 def detect_circular_interpolation(key) Thread.current[:interpolation_stack] ||= [] raise CircularReferenceError, "Circular reference when resolving key '#{key}'" if Thread.current[:interpolation_stack].include?(key) Thread.current[:interpolation_stack] << key yield ensure Thread.current[:interpolation_stack].pop end
error_message_suffix()
click to toggle source
# File lib/mini_hiera.rb, line 40 def error_message_suffix if !!(v = Thread.current[:interpolation_stack]) && !v.empty? "whilst interpolating keys #{v.reverse.join(", ")}" end end
fetch(key, default=DefaultObject, &default_block)
click to toggle source
# File lib/mini_hiera.rb, line 60 def fetch(key, default=DefaultObject, &default_block) key = key.to_s raise ArgumentError, "default value and block specified" if default != DefaultObject && default_block default_block ||= lambda { default == DefaultObject ? raise(KeyNotFoundError, [" ** Unknown key '#{key}'", error_message_suffix].join(" ")) : default } default_block_wrapper = lambda { |*_| default_block.arity == 0 ? default_block.call : default_block.call(key) } data = hiera_data key.split(".").each do |k| if data.is_a?(Array) raise TypeError, "no implicit conversion of String into Integer" unless k.to_i.to_s == k data = data[k.to_i] elsif data.is_a?(Hash) data = data.fetch(k, &default_block_wrapper) else data = default_block_wrapper.call break end end detect_circular_interpolation(key) do postprocess(data) end end
has_key?(key)
click to toggle source
# File lib/mini_hiera.rb, line 92 def has_key?(key) fetch(key) true rescue MiniHiera::KeyNotFoundError false end
hiera_data()
click to toggle source
# File lib/mini_hiera.rb, line 55 def hiera_data @hiera_data ||= @hiera.resolve(@data).inject({}) { |a,v| a.deep_merge(v, @options.fetch(:deep_merge, {})) } end
postprocess(value)
click to toggle source
# File lib/mini_hiera.rb, line 26 def postprocess(value) if value.is_a?(String) value.gsub(/\%\{([^}]+)\}/) do |match| fetch($1) end elsif value.is_a?(Hash) Hash[value.map { |k,v| [k, postprocess(v)] }] elsif value.is_a?(Array) value.map { |v| postprocess(v) } else value end end