class ModelView::Updater

Public Class Methods

update(obj, scopes, data, scope=nil) click to toggle source
# File lib/model_view/updater.rb, line 7
def update(obj, scopes, data, scope=nil)
  scope ||= ModelView::ROOT

  setters = setters_for_scope(scope, scopes)

  data.symbolize_keys.each do |key, value|
    setter = if !setters[key].nil?
      setter_for_key(setters, key)
    else
      nil
    end

    setter.call(obj, value) if setter
  end

  after_update = after_update_for_scope(scope, scopes)
  after_update.call(obj) if after_update
end

Private Class Methods

after_update_for_scope(scope, scopes) click to toggle source
# File lib/model_view/updater.rb, line 36
def after_update_for_scope(scope, scopes)
  extended_scopes = scopes[scope][:extends] || []
  first_extended_after_update = extended_scopes.reduce(nil) do |res, s|
    res || extract_after_update(s, scopes)
  end

  extract_after_update(scope, scopes) ||
  first_extended_after_update ||
  extract_after_update(ModelView::ROOT, scopes)

end
extract_after_update(scope, scope_data) click to toggle source
# File lib/model_view/updater.rb, line 73
def extract_after_update(scope, scope_data)
  scope_data[scope][:after_update]
end
extract_setters(scope, scope_data) click to toggle source
# File lib/model_view/updater.rb, line 69
def extract_setters(scope, scope_data)
  scope_data[scope][:setters]
end
setter_for_key(setters, key) click to toggle source
# File lib/model_view/updater.rb, line 27
def setter_for_key(setters, key)
  return nil if setters[key].nil?
  if setters[key][:block]
    setters[key][:block]
  else
    lambda { |obj, value| obj.send("#{key}=", value) }
  end
end
setters_for_scope(scope, scope_data) click to toggle source
# File lib/model_view/updater.rb, line 48
def setters_for_scope(scope, scope_data)
  root_scope_setters = extract_setters(ModelView::ROOT, scope_data)
  scope_setters = scope == ModelView::ROOT ? {} : extract_setters(scope, scope_data)

  extended_scopes = scope_data[scope][:extends] || []
  extended_setters = extended_scopes.reduce({}) do |res, scope|
    res.merge(extract_setters(scope, scope_data))
  end

  included_setters = (scope_data[scope][:includes] || []).reduce({}) do |res, scope_name|
    res[scope_name] = setters_for_scope(scope_name, scope_data)
    res
  end

  {}.merge(root_scope_setters)
    .merge(scope_setters)
    .merge(extended_setters)
    .merge(included_setters)
    .with_indifferent_access
end