Class: Praxis::Renderer

Inherits:
Object
  • Object
show all
Defined in:
lib/praxis/renderer.rb

Defined Under Namespace

Classes: CircularRenderingError

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(include_nil: false) ⇒ Renderer

Returns a new instance of Renderer.



21
22
23
24
25
26
27
# File 'lib/praxis/renderer.rb', line 21

def initialize(include_nil: false)
  @cache = Hash.new do |hash, key|
    hash[key] = {}
  end

  @include_nil = include_nil
end

Instance Attribute Details

#cacheObject (readonly)

Returns the value of attribute cache.



5
6
7
# File 'lib/praxis/renderer.rb', line 5

def cache
  @cache
end

#include_nilObject (readonly)

Returns the value of attribute include_nil.



5
6
7
# File 'lib/praxis/renderer.rb', line 5

def include_nil
  @include_nil
end

Instance Method Details

#_render(object, fields, context: Attributor::DEFAULT_ROOT_CONTEXT) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/praxis/renderer.rb', line 48

def _render(object, fields, context: Attributor::DEFAULT_ROOT_CONTEXT)
  if fields == true
    return case object
           when Attributor::Dumpable
             object.dump
           else
             object
           end
  end

  fields.each_with_object({}) do |(key, subfields), hash|
    begin
      value = object._get_attr(key)
    rescue StandardError => e
      raise Attributor::DumpError.new(context: context, name: key, type: object.class, original_exception: e)
    end

    if value.nil?
      hash[key] = nil if include_nil
      next
    end

    if subfields == true
      hash[key] = case value
                  when Attributor::Dumpable
                    value.dump
                  else
                    value
                  end
    else
      new_context = context + [key]
      hash[key] = render(value, subfields, context: new_context)
    end
  end
end

#render(object, fields, context: Attributor::DEFAULT_ROOT_CONTEXT) ⇒ Object

Renders an object using a given list of fields.

Parameters:

  • object (Object)

    the object to render

  • fields (Hash)

    the correct set of fields, as from FieldExpander



33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/praxis/renderer.rb', line 33

def render(object, fields, context: Attributor::DEFAULT_ROOT_CONTEXT)
  if object.is_a? Praxis::Blueprint
    @cache[object._cache_key][fields] ||= _render(object, fields, context: context)
  elsif object.class < Attributor::Collection
    object.each_with_index.collect do |sub_object, i|
      sub_context = context + ["at(#{i})"]
      render(sub_object, fields, context: sub_context)
    end
  else
    _render(object, fields, context: context)
  end
rescue SystemStackError
  raise CircularRenderingError.new(object, context)
end