class Squire::Settings

Constants

RESERVED

Public Class Methods

from_hash(hash, parent = nil) click to toggle source

Loads new settings from provided hash.

# File lib/squire/settings.rb, line 135
def self.from_hash(hash, parent = nil)
  result = Settings.new(parent)

  hash.each_pair do |key, value|
    if value.is_a? ::Hash
      value = from_hash(value, key)
    end

    result.set_value(key.to_sym, value)
  end

  result
end
new(path = nil, parent = nil) click to toggle source

Creates new settings with path and parent. For top level settings (usually namespace), the is no parent or path specified.

# File lib/squire/settings.rb, line 8
def initialize(path = nil, parent = nil)
  @path     = path
  @table    = ::Hash.new
  @parent   = parent
  @children = ::Array.new
end

Public Instance Methods

[](key) click to toggle source

Access key from table directly

# File lib/squire/settings.rb, line 129
def [](key)
  get_value(key)
end
get_value(key, &block) click to toggle source

Returns a value for key from settings table. Yields value of key if block provided.

Examples:

.key do |key|
  ...
end

# or

.key do
  ...
end
# File lib/squire/settings.rb, line 85
def get_value(key, &block)
  key   = key.to_sym
  value = @table[key]

  if block_given?
    block.arity == 0 ? value.instance_eval(&block) : block.call(value)
  end

  value
end
method_missing(method, *args, &block) click to toggle source

Handles settting of values.

Examples

Setting a value:

.value = 2
.value   2

Getting a value:

.value # => 2

Checking a value:

.value? # => true

If block provided, it yields key as parent.

.value do |value|
  ...
end

.value do
  ...
end
# File lib/squire/settings.rb, line 38
def method_missing(method, *args, &block)
  _, key, type = *method.to_s.match(/(?<key>\w+)(?<type>[?=]{0,1})/)

  key = key.to_sym

  if block_given?
    if @table[key]
      settings = @table[key]
    else
      settings = Settings.new(@path ? "#{@path}.#{key}" : key, self)

      set_value(key, settings)

      @children << settings
    end

    get_value(key, &block)
  elsif args.count == 1
    set_value(key, args.pop)
  elsif type == '?'
    !!get_value(key)
  else
    value = get_value(key)

    if value.nil?
      raise MissingSettingError.new("Missing setting '#{key}' in '#{@path}'.")
    end

    value
  end
end
set_value(key, value) click to toggle source

Sets a value for key

# File lib/squire/settings.rb, line 98
def set_value(key, value)
  @table[key] = value

  define_key_accessor(key)
end
to_h()
Alias for: to_hash
to_hash() click to toggle source

Dumps settings as hash.

# File lib/squire/settings.rb, line 106
def to_hash
  result = ::Hash.new

  @table.each do |key, value|
    if value.is_a? Settings
      value = value.to_hash
    end

    result[key] = value
  end

  result
end
Also aliased as: to_h
to_s() click to toggle source

Shows string representation of settings

# File lib/squire/settings.rb, line 123
def to_s
  "#<#{self.class.name} #{@table.map { |key, value| "#{key}=#{value}"}.join(', ')}>"
end

Private Instance Methods

define_key_accessor(key) click to toggle source

Defines key accessor for key for faster accessing of keys.

# File lib/squire/settings.rb, line 153
def define_key_accessor(key)
  define_singleton_method(key) do |&block|
    get_value(key, &block)
  end
end