class JsonExporter

Attributes

meta[RW]
model[RW]
response[RW]
user[RW]

Public Class Methods

define(*args, &block) click to toggle source
# File lib/json-exporter/base.rb, line 8
def define *args, &block
  if args.first.is_a?(Hash)
    name, opts = nil, args[0]
  else
    name, opts = args[0], args[1]
  end

  name   = name ? name.to_s.classify : to_s
  opts ||= {}

  EXPORTERS[name] = block
end
export(name, opts={}) click to toggle source
# File lib/json-exporter/base.rb, line 21
def export name, opts={}
  new(name, opts).render
end
filter(&block) click to toggle source
# File lib/json-exporter/base.rb, line 25
def filter &block
  FILTERS[to_s] = block
end
new(model, opts={}) click to toggle source
# File lib/json-exporter/base.rb, line 32
def initialize model, opts={}
  if model.is_a?(String) || model.is_a?(Symbol)
    raise ArgumentError, 'model argument is not model instance (it is %s)' % model.class
  end

  opts[:version] ||= opts.delete(:v) || 1

  if opts.class == Hash
    opts = opts.to_hwia :version, :user, :depth, :current_depth, :exporter, :meta, :wia, :compact
  end

  opts.meta          ||= {}
  opts.depth         ||= 2 # 2 is default depth
  opts.current_depth ||= 0
  opts.current_depth += 1

  @model    = model
  @user     = opts[:user]
  @opts     = opts
  @meta     = opts.wia ? opts.meta.to_hwia : opts.meta
  @block    = exporter_find_class
  @response = opts.wia ? {}.to_hwia : {}
end

Public Instance Methods

render() click to toggle source
# File lib/json-exporter/base.rb, line 56
def render
  instance_exec &@block
  exporter_apply_filters
  @opts.compact ? @response.compact : @response
end
version(version_num=nil, &block) click to toggle source
# File lib/json-exporter/base.rb, line 62
def version version_num=nil, &block
  return @opts.version unless version_num

  if block && @opts.version >= version_num
    instance_exec &block
  end
end

Private Instance Methods

export(name) click to toggle source

export object

# File lib/json-exporter/base.rb, line 73
def export name
  return if @opts[:current_depth] > @opts[:depth]

  if name.is_a?(Symbol)
    name, cmodel = name, @model.send(name)
  else
    name, cmodel = name.class.to_s.underscore.to_sym, name
  end

  @response[name] =
    if [Array].include?(cmodel.class)
      cmodel
    else
      JsonExporter.export(cmodel, @opts)
    end
end
exporter_apply_filters() click to toggle source
# File lib/json-exporter/base.rb, line 116
def exporter_apply_filters
  for klass in self.class.ancestors.reverse.map(&:to_s)
    if filter = FILTERS[klass]
      instance_exec(&filter) if filter
    end
  end
end
exporter_find_class(version=nil) click to toggle source

finds versioned exporter

# File lib/json-exporter/base.rb, line 103
def exporter_find_class version=nil
  exporter =
  if self.class == JsonExporter
    # JsonExporter.define User do
    @opts.exporter ? @opts.exporter.to_s.classify : model.class
  else
    # class FooExporter< JsonExporter
    self.class
  end

  EXPORTERS[exporter.to_s] || raise('Exporter "%s" (:%s) not found' % [exporter, exporter.to_s.underscore])
end
prop(name, data=:_undefined)
Alias for: property
property(name, data=:_undefined) { || ... } click to toggle source

add property to exporter

# File lib/json-exporter/base.rb, line 91
def property name, data=:_undefined
  if block_given?
    data = yield
  elsif data == :_undefined
    data = @model.send(name)
  end

  @response[name] = data unless data.nil?
end
Also aliased as: prop