class ModelView::Resolver

Public Class Methods

fields_for_scope(scope, scope_data) click to toggle source
# File lib/model_view/resolver.rb, line 16
def fields_for_scope(scope, scope_data)
  root_scope_fields = extract_fields(ModelView::ROOT, scope_data)
  scope_fields = scope == ModelView::ROOT ? {} : extract_fields(scope, scope_data)

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

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

  {}.merge(root_scope_fields)
    .merge(scope_fields)
    .merge(extended_fields)
    .merge(included_scopes)
end
resolve(obj, scopes, scope=nil, context={}) click to toggle source
# File lib/model_view/resolver.rb, line 5
def resolve(obj, scopes, scope=nil, context={})
  scope ||= ModelView::ROOT

  fields = fields_for_scope(scope, scopes)

  fields.each_with_object({}) do |(field_name, field_data), result|
    result[field_name] = evaluate_field(obj, field_name, field_data[:args], field_data[:block], context)
  end

end

Private Class Methods

evaluate_field(object, field_name, options, block, context) click to toggle source
# File lib/model_view/resolver.rb, line 38
def evaluate_field(object, field_name, options, block, context)
  if options && options[:constant]
    options[:constant]
  elsif options && options[:alias_for]
    object.send(options[:alias_for])
  elsif block.nil?
    object.send(field_name)
  else
    if block.arity == 1
      block.call(object)
    else
      arguments_for_block = options[:context].map { |key| context[key] }
      block.call(object, *arguments_for_block)
    end
  end
end
extract_fields(scope, scope_data) click to toggle source
# File lib/model_view/resolver.rb, line 55
def extract_fields(scope, scope_data)
  scope_data[scope][:fields]
end