lib/active_admin/helpers/settings.rb



module ActiveAdmin

  # Adds a class method to a class to create settings with default values.
  #
  # Example:
  #
  #   class Configuration
  #     include ActiveAdmin::Settings
  #
  #     setting :site_title, "Default Site Title"
  #   end
  #
  #   conf = Configuration.new
  #   conf.site_title #=> "Default Site Title"
  #   conf.site_title = "Override Default"
  #   conf.site_title #=> "Override Default"
  #
  module Settings

    def self.included(base)
      base.extend ClassMethods
    end

    def read_default_setting(name)
      default_settings[name]
    end

    private

    def default_settings
      self.class.default_settings
    end

    module ClassMethods

      def setting(name, default)
        default_settings[name] = default
        attr_writer name

        # Create an accessor that looks up the default value if none is set.
        define_method name do
          if instance_variable_defined? "@#{name}"
            instance_variable_get "@#{name}"
          else
            read_default_setting name.to_sym
          end
        end

        define_method "#{name}?" do
          value = public_send(name)
          if value.is_a? Array
            value.any?
          else
            value.present?
          end
        end
      end

      def deprecated_setting(name, default, message = nil)
        setting(name, default)

        message ||= "The #{name} setting is deprecated and will be removed."
        ActiveAdmin::Deprecation.deprecate self,     name,    message
        ActiveAdmin::Deprecation.deprecate self, :"#{name}=", message
      end

      def default_settings
        @default_settings ||= {}
      end

    end

    # Allows you to define child classes that should receive the same
    # settings, as well as the same default values.
    #
    # Example from the codebase:
    #
    #   class Application
    #     include Settings
    #     include Settings::Inheritance
    #
    #     settings_inherited_by :Namespace
    #
    #     inheritable_setting :root_to, 'dashboard#index'
    #   end
    #
    module Inheritance

      def self.included(base)
        base.extend ClassMethods
      end

      module ClassMethods

        def settings_inherited_by(heir)
          (@setting_heirs ||= []) << heir
          heir.send :include, ActiveAdmin::Settings
        end

        def inheritable_setting(name, default)
          setting name, default
          @setting_heirs.each{ |c| c.setting name, default }
        end

        def deprecated_inheritable_setting(name, default)
          deprecated_setting name, default
          @setting_heirs.each{ |c| c.deprecated_setting name, default }
        end

      end
    end

  end
end