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
@!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}
@!attribute preference_store
Storage method for preferences.
Public Class Methods
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
# 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
# File lib/spree/preferences/configuration.rb, line 43 def initialize @loaded_defaults = Spree.solidus_version @load_defaults_called = false end
# 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
# 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
@yield [config] Yields this configuration object to a block
# File lib/spree/preferences/configuration.rb, line 72 def configure yield(self) end
@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
# File lib/spree/preferences/configuration.rb, line 79 def preference_store @preference_store ||= default_preferences end
Reset all preferences to their default values.
# File lib/spree/preferences/configuration.rb, line 105 def reset set(default_preferences) end
@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
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
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
# File lib/spree/preferences/configuration.rb, line 165 def context_for_default [loaded_defaults] end