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
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