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