rubyisbeautiful/cupcakinator

View on GitHub
lib/cupcakinator/base.rb

Summary

Maintainability
A
1 hr
Test Coverage
require 'yaml'

module Cupcakinator

  module Base


    def self.included(other)
      raise I18n.t('cupcakinator.error.deprecation.include_base')
    end


    def self.extend_object(other)
      class_eval <<-ENDOFCLASSDEF
        class << self
          @cupcakinator_options = nil;
          @cupcakinator_config = nil;
        end
      ENDOFCLASSDEF
      super
    end


    # this is the main access point to using and setting up cupcakinator
    # it accepts any arguments, the following are currently recognized:
    # @param [Array<Hash>] options
    # @option options.last [Hash] :dir The directory where the file can be found
    # @option options.last [Hash] :file The configuration filename
    # @option options.last [Hash] :method The method used to access the configuration options
    # @option options.last [Hash] :root_key A key in the top level of the config file that will become the base
    # @option options.last [Hash] :allow_missing Allows the config file to be missing, config will return empty Hash
    # @example  Default usage - Foo will load ./config/config.yml into a method named 'config' and raise on missing
    #   class Foo
    #     include cupcakinator
    #     cupcakinate
    #   end
    #   >> puts Foo.config
    #   { :foo => 'bar' }
    #
    # @example  method name change - Foo will load ./config/config.yml into a method named 'le_config'
    #   class Foo
    #     include cupcakinator
    #     cupcakinate method: 'le_config'
    #   end
    #   >> puts Foo.le_config
    #   { :foo => 'bar' }
    #   >> puts Foo.new.le_config
    #   { :foo => 'bar' }
    #
    # @example  with Rails - Foo will load config/foo_config.yml relative to Rails root into a method named 'config'
    #   class Foo
    #     include cupcakinator
    #     cupcakinate dir: Rails.root.join('config'), file: 'foo_config.yml'
    #   end
    #   >> puts Foo.config
    #   { :foo => 'bar' }
    #   >> puts Foo.new.config
    #   { :foo => 'bar' }
    #
    # @example  with Rails - Foo will load config/foo_config.yml relative to Rails root into a method named 'config'
    #           beginning at the root_key based on the Rails.env
    #   class Foo
    #     include cupcakinator
    #     cupcakinate dir: Rails.root.join('config'), file: 'foo_config.yml', root_key: Rails.env
    #   end
    #   >> puts Foo.config
    #   { :foo => 'bar' }
    #   >> puts Foo.new.config
    #   { :foo => 'bar' }
    #
    # @example with no config file
    #
    #   class Foo
    #     include cupcakinator
    #     cupcakinate dir: Rails.root.join('config'), file: 'foo_config.yml', allow_missing: true
    #   end
    #   >> puts Foo.config
    #   {}
    #
    def cupcakinate(*options)
      if !options.empty?
        default_options = _cupcakinator_options
        @cupcakinator_options = default_options.merge(options.last)
      end
    end


    def _cupcakinator_options
      if @cupcakinator_options.nil?
        @cupcakinator_options = Cupcakinator::Options.new
      end
      @cupcakinator_options
    end


    def _cupcakinator_config
      if @cupcakinator_config.nil?
        load_cupcakinator_config
      end
      @cupcakinator_config
    end


    def load_cupcakinator_config
      filename = File.join(_cupcakinator_options[:dir], _cupcakinator_options[:file])
      yaml_config = YAML.load_file(filename)
      if _cupcakinator_options.has_key?(:root_key)
        rk = _cupcakinator_options[:root_key]
        @cupcakinator_config = Cupcakinator::Config.new(yaml_config[rk])
      else
        @cupcakinator_config = Cupcakinator::Config.new(yaml_config)
      end
    rescue Errno::ENOENT
      if (_cupcakinator_options.allow_missing rescue false)
        @cupcakinator_config = Cupcakinator::Config.new({})
      else
        raise Cupcakinator::ConfigFileNotFoundError.new(filename, _cupcakinator_options)
      end
    rescue Psych::SyntaxError => e
      raise Cupcakinator::ConfigFileInvalidError.new(filename, e.message)
    end


    def method_missing(original_method, *args)
      if original_method.to_s == _cupcakinator_options[:method].to_s
         _cupcakinator_config(*args)
      else
        super
      end
    end


  end


  def method_missing(original_method, *args)
    if original_method.to_s == self.class._cupcakinator_options[:method].to_s
       self.class._cupcakinator_config(*args)
    else
      super
    end
  end

end