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