Sha256: fa13dd17a45e4dd588e0aac77fb7ad579fe3db94e6420c8cd5b27bcace887fb9

Contents?: true

Size: 1.7 KB

Versions: 30

Compression:

Stored size: 1.7 KB

Contents

module ConfigManager
  def self.append_features(base)
    super
    base.extend(ClassMethods)
  end

  module ClassMethods
    def fields
      @fields ||= Hash.new { Item.new }
    end

    def setting(name, type=:object, default=nil)
      item = Item.new
      item.name, item.ruby_type, item.default = name.to_s, type, default
      fields[name.to_s] = item
      add_setting_accessor(item)
    end

    def default_for(key)
      fields[key.to_s].default
    end

    private

    def add_setting_accessor(item)
      add_setting_reader(item)
      add_setting_writer(item)
    end

    def add_setting_reader(item)
      self.send(:define_method, item.name) do
        raw_value = settings[item.name]
        raw_value.nil? ? item.default : raw_value
      end
      if item.ruby_type == :boolean
        self.send(:define_method, item.name + "?") do
          raw_value = settings[item.name]
          raw_value.nil? ? item.default : raw_value
        end
      end
    end

    def add_setting_writer(item)
      self.send(:define_method, "#{item.name}=") do |newvalue|
        retval = settings[item.name] = canonicalize(item.name, newvalue)
        self.save! unless new_record?
        retval
      end
    end

  end

  def canonicalize(key, value)
    self.class.fields[key.to_s].canonicalize(value)
  end

  class Item
    attr_accessor :name, :ruby_type, :default

    def canonicalize(value)
      case ruby_type
      when :boolean
        case value
        when "0", 0, '', false, "false", "f", nil
          false
        else
          true
        end
      when :integer
        value.to_i
      when :string
        value.to_s
      when :yaml
        value.to_yaml
      else
        value
      end
    end
  end
end

Version data entries

30 entries across 30 versions & 1 rubygems

Version Path
typo-5.5 app/models/config_manager.rb
typo-5.4.4 app/models/config_manager.rb
typo-5.4.3 app/models/config_manager.rb
typo-5.4.2 app/models/config_manager.rb
typo-5.4.1 app/models/config_manager.rb
typo-5.4 app/models/config_manager.rb
typo-3.99.0 app/models/config_manager.rb
typo-3.99.1 app/models/config_manager.rb
typo-3.99.2 app/models/config_manager.rb
typo-3.99.3 app/models/config_manager.rb
typo-4.0.0 app/models/config_manager.rb
typo-4.0.2 app/models/config_manager.rb
typo-4.0.1 app/models/config_manager.rb
typo-3.99.4 app/models/config_manager.rb
typo-4.1.1 app/models/config_manager.rb
typo-4.0.3 app/models/config_manager.rb
typo-4.1 app/models/config_manager.rb
typo-5.0.2 app/models/config_manager.rb
typo-5.0.1 app/models/config_manager.rb
typo-5.0.3.98.1 app/models/config_manager.rb