module LegacyFacter::Util::Values

A util module for custom_facts containing helper methods

Public Instance Methods

convert(value) click to toggle source
# File lib/facter/custom_facts/util/values.rb, line 74
def convert(value)
  value = value.to_s if value.is_a?(Symbol)
  value = value.downcase if value.is_a?(String)
  value
end
deep_freeze(value) click to toggle source

Duplicate and deeply freeze a given data structure

@param value [Object] The structure to freeze @return [void]

# File lib/facter/custom_facts/util/values.rb, line 15
def deep_freeze(value)
  case value
  when Numeric, Symbol, TrueClass, FalseClass, NilClass
    # These are immutable values, we can safely ignore them
    value
  when String
    value.dup.freeze
  when Array
    value.map do |entry|
      deep_freeze(entry)
    end.freeze
  when Hash
    value.each_with_object({}) do |(key, val), hash|
      hash[deep_freeze(key)] = deep_freeze(val)
    end.freeze
  else
    raise DeepFreezeError, "Cannot deep freeze #{value}:#{value.class}"
  end
end
deep_merge(left, right, path = []) click to toggle source

Perform a deep merge of two nested data structures.

@param left [Object] @param right [Object] @param path [Array<String>] The traversal path followed when merging nested hashes

@return [Object] The merged data structure.

# File lib/facter/custom_facts/util/values.rb, line 44
def deep_merge(left, right, path = [])
  ret = nil

  if left.is_a?(Hash) && right.is_a?(Hash)
    ret = left.merge(right) do |key, left_val, right_val|
      path.push(key)
      merged = deep_merge(left_val, right_val, path)
      path.pop
      merged
    end
  elsif left.is_a?(Array) && right.is_a?(Array)
    ret = left.dup.concat(right)
  elsif right.nil?
    ret = left
  elsif left.nil?
    ret = right
  elsif left.nil? && right.nil?
    ret = nil
  else
    msg = "Cannot merge #{left.inspect}:#{left.class} and #{right.inspect}:#{right.class}"
    unless path.empty?
      msg << ' at root'
      msg << path.map { |part| "[#{part.inspect}]" }.join
    end
    raise DeepMergeError, msg
  end

  ret
end
flatten_structure(path, structure) click to toggle source

Flatten the given data structure to something that's suitable to return as flat facts.

@param path [String] The fact path to be prefixed to the given value. @param structure [Object] The data structure to flatten. Nested hashes

will be recursively flattened, everything else will be returned as-is.

@return [Hash] The given data structure prefixed with the given path

# File lib/facter/custom_facts/util/values.rb, line 88
def flatten_structure(path, structure)
  results = {}

  if structure.is_a? Hash
    structure.each_pair do |name, value|
      new_path = "#{path}_#{name}".gsub(%r{\-|/}, '_')
      results.merge! flatten_structure(new_path, value)
    end
  elsif structure.is_a? Array
    structure.each_with_index do |value, index|
      new_path = "#{path}_#{index}"
      results.merge! flatten_structure(new_path, value)
    end
  else
    results[path] = structure
  end

  results
end