class Spree::Preferences::Configuration

This takes the preferrable methods and adds some syntatic sugar to access the preferences

class App < Configuration
  preference :color, :string
end

a = App.new

Provides the following setters:

a.color = :blue
a[:color] = :blue
a.set color: :blue
a.preferred_color = :blue

and the following getters:

a.color
a[:color]
a.get :color
a.preferred_color

Attributes

load_defaults_called[R]
loaded_defaults[R]

@!attribute [r] loaded_defaults

@return [String]
  Some configuration defaults can be added or changed when a new Solidus
  version is released. Setting this to an older Solidus version allows keeping
  backward compatibility until the application code is updated to the new
  defaults. Set via {#load_defaults}
preference_store[W]

@!attribute preference_store Storage method for preferences.

Public Class Methods

by_version(*args) click to toggle source

Generates a different preference default depending on {#version_defaults}

This method is meant to be used in the `default:` keyword argument for {.preference}. For instance, in the example, `foo`'s default was `true` until version 3.0.0.alpha, when it became `false`:

@example

preference :foo, :boolean, default: by_version(true, "3.0.0.alpha" => false)

@see loaded_defaults @see Spree::Core::VersionedValue

# File lib/spree/preferences/configuration.rb, line 132
def self.by_version(*args)
  proc do |loaded_defaults|
    Spree::Core::VersionedValue.new(*args).call(loaded_defaults)
  end
end
class_name_attribute(name, default:) click to toggle source
# File lib/spree/preferences/configuration.rb, line 144
def self.class_name_attribute(name, default:)
  ivar = :"@#{name}"

  define_method("#{name}=") do |class_name|
    # If this is a named class constant, we should store it as a string to
    # allow code reloading.
    class_name = class_name.name if class_name.is_a?(Class) && class_name.name

    instance_variable_set(ivar, class_name)
  end

  define_method(name) do
    class_name = instance_variable_get(ivar)
    class_name ||= default
    class_name = class_name.constantize if class_name.is_a?(String)
    class_name
  end
end
new() click to toggle source
# File lib/spree/preferences/configuration.rb, line 43
def initialize
  @loaded_defaults = Spree.solidus_version
  @load_defaults_called = false
end
preference(name, type, options = {}) click to toggle source
Calls superclass method
# File lib/spree/preferences/configuration.rb, line 138
def self.preference(name, type, options = {})
  super
  alias_method name.to_s, "preferred_#{name}"
  alias_method "#{name}=", "preferred_#{name}="
end

Public Instance Methods

check_load_defaults_called(instance_constant_name = nil) click to toggle source
# File lib/spree/preferences/configuration.rb, line 57
    def check_load_defaults_called(instance_constant_name = nil)
      return if load_defaults_called || !Spree::Core.has_install_generator_been_run?

      target_name = instance_constant_name || "#{self.class.name}.new"
      Spree::Deprecation.warn <<~MSG
        It's recommended that you explicitly load the default configuration for
        your current Solidus version. You can do it by adding the following call
        to your Solidus initializer within the #{target_name} block:

          config.load_defaults('#{Spree.solidus_version}')

      MSG
    end
configure() { |self| ... } click to toggle source

@yield [config] Yields this configuration object to a block

# File lib/spree/preferences/configuration.rb, line 72
def configure
  yield(self)
end
load_defaults(version) click to toggle source

@param [String] Solidus version from which take defaults when not overriden. @see load_defaults

# File lib/spree/preferences/configuration.rb, line 51
def load_defaults(version)
  @loaded_defaults = version
  @load_defaults_called = true
  reset
end
preference_store() click to toggle source
# File lib/spree/preferences/configuration.rb, line 79
def preference_store
  @preference_store ||= default_preferences
end
Also aliased as: preferences
preferences()
Alias for: preference_store
reset() click to toggle source

Reset all preferences to their default values.

# File lib/spree/preferences/configuration.rb, line 105
def reset
  set(default_preferences)
end
set(preferences) click to toggle source

@param preferences [Hash] a hash of preferences to set

# File lib/spree/preferences/configuration.rb, line 115
def set(preferences)
  preferences.each do |name, value|
    set_preference name, value
  end
end
use_legacy_db_preferences!() click to toggle source

Replace the new static preference store with the legacy store which fetches preferences from the DB.

# File lib/spree/preferences/configuration.rb, line 98
def use_legacy_db_preferences!
  @preference_store = ScopedStore.new(self.class.name.underscore)
end
use_static_preferences!() click to toggle source

Replace the default legacy preference store, which stores preferences in the spree_preferences table, with a plain in memory hash. This is faster and less error prone.

This will set all preferences to their default values.

These won't be loaded from or persisted to the database, so any desired changes must be made each time the application is started, such as in an initializer.

# File lib/spree/preferences/configuration.rb, line 92
def use_static_preferences!
  @preference_store = default_preferences
end

Private Instance Methods

context_for_default() click to toggle source
# File lib/spree/preferences/configuration.rb, line 165
def context_for_default
  [loaded_defaults]
end