class Ez::Settings::Store

Attributes

backend[R]
errors[R]
group[R]
on_change[R]

Public Class Methods

new(group, backend, options = {}) click to toggle source
# File lib/ez/settings/store.rb, line 13
def initialize(group, backend, options = {})
  @group     = group
  @errors    = ActiveModel::Errors.new(self)
  @backend   = backend
  @on_change = options.fetch(:on_change, nil)

  define_accessors

  keys.each { |key| default_or_exists_value(data, key) }
end

Public Instance Methods

invalid?() click to toggle source
# File lib/ez/settings/store.rb, line 36
def invalid?
  !valid?
end
schema() click to toggle source
# File lib/ez/settings/store.rb, line 53
def schema
  {
    group.name => group.keys.map(&:name).each_with_object({}) do |key_name, schema|
      schema[key_name] = send(key_name)
    end
  }
end
update(params) click to toggle source
# File lib/ez/settings/store.rb, line 40
def update(params)
  params.each { |key, value| public_send("#{key}=", value) }

  validate
  return self unless errors.empty?

  on_change&.call(changes(params))

  backend.write(schema)

  self
end
valid?() click to toggle source
# File lib/ez/settings/store.rb, line 32
def valid?
  errors.empty?
end
validate() click to toggle source
# File lib/ez/settings/store.rb, line 24
def validate
  @errors = ActiveModel::Errors.new(self)

  group.keys.select(&:required?).each do |key|
    errors.add(key.name, "can't be blank") if send(key.name).blank?
  end
end

Private Instance Methods

changes(params) click to toggle source
# File lib/ez/settings/store.rb, line 85
def changes(params)
  new_data =
    if params.is_a?(Hash)
      params.symbolize_keys
    elsif params.is_a?(ActionController::Parameters)
      params.permit(keys.map(&:name)).to_h.symbolize_keys
    end

  new_data.reject { |k, v| data[k] == v }
end
data() click to toggle source
# File lib/ez/settings/store.rb, line 69
def data
  @data ||= backend.read[group.name] || {}
end
default_or_exists_value(from_data, key) click to toggle source
# File lib/ez/settings/store.rb, line 63
def default_or_exists_value(from_data, key)
  value = from_data[key.name].nil? ? key.default : from_data[key.name]

  public_send("#{key.name}=", value)
end
define_accessors() click to toggle source
# File lib/ez/settings/store.rb, line 73
def define_accessors
  group.keys.map(&:name).each do |name|
    define_singleton_method(name) do
      instance_variable_get("@#{name}")
    end

    define_singleton_method("#{name}=") do |value|
      instance_variable_set("@#{name}", value)
    end
  end
end