class FastSerializer::JsonModel::Attribute

Attributes

cond[RW]
cond_arity[RW]
cond_method_name[RW]
injected[RW]
method_arity[RW]
method_name[RW]
mixin[RW]

Public Class Methods

new(*) click to toggle source
Calls superclass method
# File lib/fast_serializer/json_model/attribute.rb, line 14
def initialize(*)
  super

  @mixin = nil
  @method_name = nil
  @injected = false
  @cond_method_name = nil
  @cond = nil
  @cond = @opts[:if] || @opts[:unless] || @cond

  init_with_proc if method.is_a?(Proc)
  init_with_cond if !cond.nil? && cond.is_a?(Proc)
end

Public Instance Methods

included?(resource, params, context) click to toggle source

@param resource [Object] @param params [Hash] @param context [Hash] @return [Boolean]

# File lib/fast_serializer/json_model/attribute.rb, line 61
def included?(resource, params, context)
  return true if cond.nil?

  can_execute_on_mixin = injected && !cond_method_name.nil? && !context.nil?

  res = if can_execute_on_mixin
          call_method_on_context(context, cond_method_name, cond_arity, resource, params)
        elsif cond.is_a?(Proc)
          call_proc_binding_to_context(context, cond, cond_arity, resource, params)
        else
          context.public_send(cond)
        end

  res = !res unless @opts[:unless].nil?

  res
end
inject(context) click to toggle source
# File lib/fast_serializer/json_model/attribute.rb, line 32
def inject(context)
  context.include(mixin)
  self.injected = true
end
injectable?() click to toggle source
# File lib/fast_serializer/json_model/attribute.rb, line 28
def injectable?
  !mixin.nil?
end
serialize(resource, params, context) click to toggle source

@param resource [Object] @param params [Hash] @param context [Hash] @return [Object]

# File lib/fast_serializer/json_model/attribute.rb, line 41
def serialize(resource, params, context)
  can_execute_on_mixin = injected && !method_name.nil? && !context.nil?

  val = if can_execute_on_mixin
          call_method_on_context(context, method_name, method_arity, resource, params)
        elsif method.is_a?(Proc)
          call_proc_binding_to_context(context, method, method_arity, resource, params)
        else
          resource.public_send(method)
        end

  val.freeze

  val
end

Private Instance Methods

call_method_on_context(context, method_name, arity, resource, params) click to toggle source
# File lib/fast_serializer/json_model/attribute.rb, line 116
def call_method_on_context(context, method_name, arity, resource, params)
  case arity
  when 0
    context.public_send(method_name)
  when 1
    context.public_send(method_name, resource)
  when 2
    context.public_send(method_name, resource, params)
  end
end
call_proc_binding_to_context(context, prc, arity, resource, params) click to toggle source
# File lib/fast_serializer/json_model/attribute.rb, line 105
def call_proc_binding_to_context(context, prc, arity, resource, params)
  case arity
  when 1
    context.instance_exec(resource, &prc)
  when 2
    context.instance_exec(resource, params, &prc)
  when 0
    context.instance_exec(&prc)
  end
end
init_with_cond() click to toggle source
# File lib/fast_serializer/json_model/attribute.rb, line 81
def init_with_cond
  @cond_method_name = "__#{key}_cond__"
  @cond_arity = cond.arity.abs
  @mixin ||= Module.new

  if RUBY_VERSION <= '2.5.0'
    @mixin.redefine_method @cond_method_name, &cond
  else
    @mixin.define_method @cond_method_name, &cond
  end
end
init_with_proc() click to toggle source
# File lib/fast_serializer/json_model/attribute.rb, line 93
def init_with_proc
  @method_name = "__#{key}__"
  @method_arity = method.arity.abs
  @mixin = Module.new

  if RUBY_VERSION <= '2.5.0'
    @mixin.redefine_method @method_name, &method
  else
    @mixin.define_method @method_name, &method
  end
end