class Singlettings::Base

Attributes

ns[R]
source[R]

Public Class Methods

[](key) click to toggle source

Override the hash method

# File lib/singlettings/base.rb, line 28
def [](key)
  value = current_branch.fetch key.to_s, nil
  if value.is_a? Hash
    self.new value
  else
    value
  end
end
current_branch() click to toggle source
# File lib/singlettings/base.rb, line 37
def current_branch
  source unless @source
  return @source unless @ns
  if @source[@ns] == nil
    raise NoSuchNamespaceError, "Source is empty. The namespace does not exist"
  else
    @source[@ns]
  end
end
method_missing(method, *args, &block) click to toggle source
# File lib/singlettings/base.rb, line 47
def method_missing(method, *args, &block)
  key = method.to_s
  if current_branch.keys.include? key
    value = current_branch[key]

    result = value.is_a?(Hash) ? self.new(value) : value

    self.instance_eval do
      define_singleton_method(key){ result }
    end

    result
  else
    raise NoSuchKeyError, "#{key} does not exist"
  end
end
new(directory_or_hash, default_namespace= nil) click to toggle source
# File lib/singlettings/base.rb, line 70
def initialize(directory_or_hash, default_namespace= nil)
  @ns = self.class.ns default_namespace

  raise FileNotSpecifiedError, "You should choose a file to initialize" unless directory_or_hash

  if directory_or_hash.is_a? Hash
    @source = directory_or_hash
  else
    @source = self.class.source directory_or_hash
  end

  self.replace current_branch

  eval_accessors
end
ns(value = nil) click to toggle source

Set the default namespace Basic Usage of ns in class: ns :development ns Rails.env

# File lib/singlettings/base.rb, line 23
def ns(value = nil)
  @ns = value.to_s if value
end
respond_to_missing?(method, include_private = false) click to toggle source
# File lib/singlettings/base.rb, line 64
def respond_to_missing?(method, include_private = false)
  current_branch.keys.include? method.to_s ||
    (raise NoSuchKeyError, "#{method} does not exist")
end
source(directory = nil) click to toggle source

Basic Usage of source in class

source "config/setting.yml"
source
# File lib/singlettings/base.rb, line 13
def source(directory = nil)
  filename = directory ? directory : "#{self.ancestors[0].to_s.downcase}.yml"
  @erb_content = ERB.new(File.read(filename)).result # Set it in memory
  @source = @erb_content ? YAML.load(@erb_content) : {}
end

Public Instance Methods

[](key) click to toggle source
# File lib/singlettings/base.rb, line 95
def [](key)
  value = current_branch.fetch key.to_s, nil
  if value.is_a? Hash
    self.class.new value
  else
    value
  end
end
current_branch() click to toggle source
# File lib/singlettings/base.rb, line 86
def current_branch
  return source unless ns
  if source[ns] == nil
    raise NoSuchNamespaceError, "Source is empty. The namespace does not exist"
  else
    source[ns]
  end
end
eval_accessors() click to toggle source
# File lib/singlettings/base.rb, line 104
def eval_accessors
  current_branch.keys.each do |key|
    value = current_branch[key]
    result = value.is_a?(Hash) ? self.class.new(value) : value
    self.instance_eval do
      define_singleton_method(key){ result }
    end
  end
end
method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/singlettings/base.rb, line 114
def method_missing(method, *args, &block)
  (raise NoSuchKeyError, "#{method} does not exist") || super
end