class ApiExporter

Attributes

model[RW]
response[RW]
user[RW]
version[RW]

Public Class Methods

define(name, opts={}) click to toggle source
# File lib/api-exporter.rb, line 11
def define name, opts={}, &block
  version = opts.delete(:version) || opts.delete(:v) || 1
  EXPORTERS[version] ||= {}
  EXPORTERS[version][name.to_s.classify] = block
end
export(name, opts={}) click to toggle source
# File lib/api-exporter.rb, line 17
def export name, opts={}
  new(name, opts).render
end
filter(&block) click to toggle source
# File lib/api-exporter.rb, line 21
def filter &block
  EXPORTERS[:__filter] = block
end
new(model, opts={}) click to toggle source
# File lib/api-exporter.rb, line 28
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

  unless opts.is_a?(Hash)
    raise ArgumentError, 'ApiExporter opts is not a hash'
  end

  opts[:version]       ||= opts.delete(:v) || 1
  opts[:depth]         ||= 2 # 2 is default depth
  opts[:current_depth] ||= 0
  opts[:current_depth] += 1

  unallowed = opts.keys - %i(user version depth current_depth exporter)
  raise ArgumentError, 'Unallowed key ApiExporter option found: %s' % unallowed.first if unallowed.first

  @model    = model
  @version  = opts[:version]
  @user     = opts[:user]
  @opts     = opts
  @block    = _find_exporter

  @response = {}.to_hwia
end

Public Instance Methods

render() click to toggle source
# File lib/api-exporter.rb, line 54
def render
  instance_exec &@block
  instance_exec &EXPORTERS[:__filter]
  @response
end

Private Instance Methods

_find_exporter(version=nil) click to toggle source

finds versioned exporter

# File lib/api-exporter.rb, line 95
def _find_exporter version=nil
  version  ||= @version
  exporter   = @opts.delete(:exporter) || model.class
  @exporter  = exporter.to_s.classify

  for num in version.downto(1).to_a
    if block = EXPORTERS.dig(num, @exporter)
      return block
    end
  end

  raise('Exporter "%s" (:%s) not found' % [exporter, exporter.underscore])
end
copy(version=nil) click to toggle source

copy calls from lesser version of the same exporter

# File lib/api-exporter.rb, line 88
def copy version=nil
  version ||= @opts[:version] - 1
  exporter = _find_exporter version
  instance_exec &exporter
end
export(name) click to toggle source

export object

# File lib/api-exporter.rb, line 63
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] = ApiExporter.export(cmodel, @opts)
end
prop(name, data=:_undefined)
Alias for: property
property(name, data=:_undefined) { || ... } click to toggle source

add property to exporter

# File lib/api-exporter.rb, line 76
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