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