Class: Spree::Preferences::Configuration

Inherits:
Object
  • Object
show all
Includes:
Preferable
Defined in:
lib/spree/preferences/configuration.rb

Overview

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

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Preferable

#admin_form_preference_names, #default_preferences, #defined_preferences, #get_preference, #has_preference!, #has_preference?, #preference_default, #preference_type, #set_preference

Constructor Details

#initializeConfiguration

Returns a new instance of Configuration.



44
45
46
47
# File 'lib/spree/preferences/configuration.rb', line 44

def initialize
  @loaded_defaults = Spree.solidus_version
  @load_defaults_called = false
end

Instance Attribute Details

#load_defaults_calledObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



42
43
44
# File 'lib/spree/preferences/configuration.rb', line 42

def load_defaults_called
  @load_defaults_called
end

#loaded_defaultsObject (readonly)

Returns the value of attribute loaded_defaults.



39
40
41
# File 'lib/spree/preferences/configuration.rb', line 39

def loaded_defaults
  @loaded_defaults
end

#preference_storeObject Also known as: preferences

Storage method for preferences.



79
# File 'lib/spree/preferences/configuration.rb', line 79

attr_writer :preference_store

Class Method Details

.class_name_attribute(name, default:) ⇒ Object



159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/spree/preferences/configuration.rb', line 159

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

.inherited(klass) ⇒ Object



122
123
124
125
126
127
# File 'lib/spree/preferences/configuration.rb', line 122

def self.inherited(klass)
  klass.instance_variable_set(:@versioned_preferences, [])
  class << klass
    attr_reader :versioned_preferences
  end
end

.preference(name, type, options = {}) ⇒ Object



153
154
155
156
157
# File 'lib/spree/preferences/configuration.rb', line 153

def self.preference(name, type, options = {})
  super
  alias_method name.to_s, "preferred_#{name}"
  alias_method "#{name}=", "preferred_#{name}="
end

.versioned_preference(name, type, initial_value:, boundaries:, **options) ⇒ Object

Adds a preference with different default depending on #loaded_defaults

This method is a specialized version of preference that generates a different default value for different Solidus versions. For instance, in the example, ‘foo`’s default was ‘true` until version 3.0.0.alpha, when it became `false`:

Examples:

versioned_preference :foo, :boolean, initial_value: true, boundaries: { "3.0.0.alpha" => false }

See Also:



142
143
144
145
146
147
148
149
150
151
# File 'lib/spree/preferences/configuration.rb', line 142

def self.versioned_preference(name, type, initial_value:, boundaries:, **options)
  @versioned_preferences << name
  preference(
    name,
    type,
    options.merge(
      default: by_version(initial_value, boundaries)
    )
  )
end

Instance Method Details

#check_load_defaults_called(instance_constant_name = nil) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/spree/preferences/configuration.rb', line 58

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.deprecator.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 {|config| ... } ⇒ Object

Yields:

  • (config)

    Yields this configuration object to a block



73
74
75
# File 'lib/spree/preferences/configuration.rb', line 73

def configure
  yield(self)
end

#load_defaults(version) ⇒ Object

are not overriden by the user.

Parameters:

  • Solidus (String)

    version from which take defaults when preferences

See Also:



52
53
54
55
56
# File 'lib/spree/preferences/configuration.rb', line 52

def load_defaults(version)
  @loaded_defaults = version
  @load_defaults_called = true
  reset
end

#resetObject

Reset all preferences to their default values.



106
107
108
# File 'lib/spree/preferences/configuration.rb', line 106

def reset
  set(default_preferences)
end

#set(preferences) ⇒ Object

Parameters:

  • preferences (Hash)

    a hash of preferences to set



116
117
118
119
120
# File 'lib/spree/preferences/configuration.rb', line 116

def set(preferences)
  preferences.each do |name, value|
    set_preference name, value
  end
end

#use_legacy_db_preferences!Object

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



99
100
101
# File 'lib/spree/preferences/configuration.rb', line 99

def use_legacy_db_preferences!
  @preference_store = ScopedStore.new(self.class.name.underscore)
end

#use_static_preferences!Object

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.



93
94
95
# File 'lib/spree/preferences/configuration.rb', line 93

def use_static_preferences!
  @preference_store = default_preferences
end