module ModelView

Constants

ROOT
VERSION

Public Instance Methods

after_update(&block) click to toggle source
# File lib/model_view.rb, line 42
def after_update(&block)
  scope_name = @current_scope || ROOT
  add_after_update scope_name, block
end
as_hash(object, opts={}) click to toggle source
# File lib/model_view.rb, line 51
def as_hash(object, opts={})
  scope = opts[:scope] || ROOT
  context = opts[:context] || {}
  ModelView::Resolver.resolve(object, @scopes, scope , context)
end
extend_scope(*scope) click to toggle source
# File lib/model_view.rb, line 37
def extend_scope(*scope)
  raise Exception.new("Root scope can not extend another scope") if @current_scope.nil? || @current_scope == ROOT
  scope.flatten.each { |s| @scopes[@current_scope][:extends] << s }
end
field(field_name, arg={}, &block) click to toggle source
# File lib/model_view.rb, line 9
def field(field_name, arg={}, &block)
  scope_name = @current_scope || ROOT
  add_field scope_name, field_name, arg, block
end
fields(*fields) click to toggle source
# File lib/model_view.rb, line 14
def fields(*fields)
  fields.flatten.each { |f| field f }
end
include_scope(*scope) click to toggle source
# File lib/model_view.rb, line 32
def include_scope(*scope)
  raise Exception.new("Root scope can not include another scope") if @current_scope.nil? || @current_scope == ROOT
  scope.flatten.each { |s| @scopes[@current_scope][:includes] << s }
end
model(model_class) click to toggle source
# File lib/model_view.rb, line 62
def model(model_class)
  model_view_class = self
  model_class.class_eval do
    define_method(:as_hash) do |opts|
      model_view_class.as_hash(self, opts)
    end
  end
end
scope(scope_name, &block) click to toggle source
# File lib/model_view.rb, line 18
def scope(scope_name, &block)
  sym_scope_name = scope_name.to_sym
  add_scope(sym_scope_name)

  @current_scope = sym_scope_name
  instance_eval &block
  @current_scope = nil
end
scopes() click to toggle source
# File lib/model_view.rb, line 47
def scopes
  @scopes
end
setter(field_name, arg={}, &block) click to toggle source
# File lib/model_view.rb, line 27
def setter(field_name, arg={}, &block)
  scope_name = @current_scope || ROOT
  add_setter scope_name, field_name, arg, block
end
update(object, data, opts={}) click to toggle source
# File lib/model_view.rb, line 57
def update(object, data, opts={})
  scope = opts[:scope] || ROOT
  ModelView::Updater.update(object, @scopes, data , scope)
end

Private Instance Methods

add_after_update(scope, block) click to toggle source
# File lib/model_view.rb, line 77
def add_after_update(scope, block)
  create_scopes
  @scopes[scope] ||= new_opts
  @scopes[scope][:after_update] = block
end
add_field(scope, field_name, args, block) click to toggle source
# File lib/model_view.rb, line 88
def add_field(scope, field_name, args, block)
  create_scopes
  @scopes[scope] ||= new_opts
  cleaned_args = args.select{ |k| k != :setter}
  if args[:setter]
    add_setter(scope, field_name, cleaned_args, nil)
  end
  @scopes[scope][:fields][field_name] = {args: cleaned_args, block: block}
end
add_scope(scope_name) click to toggle source
# File lib/model_view.rb, line 83
def add_scope(scope_name)
  create_scopes
  @scopes[scope_name] = new_opts unless @scopes.key?(scope_name)
end
add_setter(scope, field_name, args, block) click to toggle source
# File lib/model_view.rb, line 98
def add_setter(scope, field_name, args, block)
  create_scopes
  @scopes[scope] ||= new_opts
  @scopes[scope][:setters][field_name] = {args: args, block: block}
end
create_scopes() click to toggle source
# File lib/model_view.rb, line 104
def create_scopes
  if self.superclass.respond_to?(:scopes) && @scopes.nil?
    @scopes = self.superclass.scopes.deep_dup
  elsif @scopes.nil?
    @scopes = { ROOT =>  new_opts }
  end
end
new_opts() click to toggle source
# File lib/model_view.rb, line 73
def new_opts
  {fields: {}, extends: [], includes: [], setters: {}, after_update: nil}
end