class Konfigyu::Config

Does the meat of the work

Constants

DEFAULT_EXAMPLE_FILENAME
DEFAULT_FILENAME

Attributes

config_file[RW]
data[RW]
options[RW]

Public Class Methods

new(config_file = nil, options = {}) click to toggle source

Options Example:

options = {

required_fields: [
  'top_level', 'top_level.second_level_field',
  'log', 'log.level',
],
required_values: {
  'log.level': %w{none fatal error warn info debug},
}

}

# File lib/konfigyu/config.rb, line 24
def initialize(config_file = nil, options = {})
  self.config_file = config_file.nil? ? File.expand_path("~/#{DEFAULT_FILENAME}") : File.expand_path(config_file)
  if !self.config_file || !File.exist?(self.config_file)
    raise Konfigyu::FileNotFoundException, "Missing configuration file: #{self.config_file}"
  end

  self.data = Sycl.load_file(self.config_file)
  @options = initialize_options(options)
  validate
end

Public Instance Methods

[](key) click to toggle source
# File lib/konfigyu/config.rb, line 41
def [](key)
  data.get(key)
end
method_missing(method_name, *args, &block) click to toggle source
Calls superclass method
# File lib/konfigyu/config.rb, line 49
def method_missing(method_name, *args, &block)
  return super unless data

  config_chain = method_name.to_s
  if !config_chain.chomp!('=').nil?
    data[config_chain] = args.first
  elsif deep_key_exists?(config_chain)
    data[config_chain]
  else
    super
  end
end
respond_to_missing?(method_name, _include_private = false) click to toggle source
# File lib/konfigyu/config.rb, line 45
def respond_to_missing?(method_name, _include_private = false)
  data && !deep_key_exists?(method_name.to_s.chomp('=')).nil?
end
validate() click to toggle source
# File lib/konfigyu/config.rb, line 35
def validate
  validate_usage
  validate_required_fields
  validate_required_values
end

Private Instance Methods

deep_key_exists?(config_key) click to toggle source
# File lib/konfigyu/config.rb, line 113
def deep_key_exists?(config_key)
  data.get(config_key)
rescue NoMethodError
  false
end
default_options() click to toggle source
# File lib/konfigyu/config.rb, line 94
def default_options
  {
    required_fields: [],
    required_values: {}
  }
end
initialize_options(options = {}) click to toggle source
# File lib/konfigyu/config.rb, line 101
def initialize_options(options = {})
  valid_keys = default_options.keys
  {}.merge(default_options).tap do |sanitized_option|
    unless options.keys.empty?
      options.keys.each do |key|
        sanitized_key = key.downcase.to_sym
        sanitized_option[sanitized_key] = options[key] if valid_keys.include?(sanitized_key)
      end
    end
  end
end
validate_required_fields() click to toggle source
# File lib/konfigyu/config.rb, line 71
def validate_required_fields
  errors = []
  (@options[:required_fields] || []).each do |required_field|
    errors.push(required_field) unless deep_key_exists?(required_field)
  end

  msg = "Missing required configuration elements: #{errors.join(', ')}"
  raise Konfigyu::InvalidConfigException, msg if errors.count > 0
end
validate_required_values() click to toggle source
# File lib/konfigyu/config.rb, line 81
def validate_required_values
  errors = []
  (@options[:required_values] || {}).each_pair do |key, required_value|
    value = data.get(key.to_s)
    next if !options[:required_fields].include?(key) && (value.nil? || value.empty?)

    errors.push(key) unless required_value.include?(value)
  end

  msg = "One or more keys missing required value: #{errors.join(', ')}"
  raise Konfigyu::InvalidConfigException, msg if errors.count > 0
end
validate_usage() click to toggle source
# File lib/konfigyu/config.rb, line 64
def validate_usage
  config_usage = "See #{DEFAULT_EXAMPLE_FILENAME} for more information on configuration."
  msg = "Missing configuration data for #{config_file}."
  msg += "\n#{config_usage}" if File.exist?(DEFAULT_EXAMPLE_FILENAME)
  raise Konfigyu::InvalidConfigException, msg unless data
end