Class: Hypertemplate::Builder::Json

Inherits:
Base
  • Object
show all
Defined in:
lib/hypertemplate/builder/json.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Base

build, build_dsl, collection_helper_default_options, copy_internal_variables, #each, extend_media_types, generic_helper, helper, media_types, member_helper_default_options, #method_missing, #ns, #write

Constructor Details

#initialize(obj, options = {}) ⇒ Json

Returns a new instance of Json.



9
10
11
12
13
14
15
16
17
18
# File 'lib/hypertemplate/builder/json.rb', line 9

def initialize(obj, options = {})
  initialize_library
  if options[:root]
    @raw     = { options[:root] => {} }
    @current = @raw[options[:root]]
  else
    @current = @raw = {}
  end
  @obj     = obj
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Hypertemplate::Builder::Base

Instance Attribute Details

#rawObject (readonly)

Returns the value of attribute raw.



7
8
9
# File 'lib/hypertemplate/builder/json.rb', line 7

def raw
  @raw
end

Instance Method Details

#initialize_libraryObject



20
21
22
23
# File 'lib/hypertemplate/builder/json.rb', line 20

def initialize_library
  return if defined?(::JSON)
  require "json/pure"
end

#insert_value(name, prefix, *args, &block) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/hypertemplate/builder/json.rb', line 63

def insert_value(name, prefix, *args, &block)
  node = create_element(block_given?, *args)

  if block_given?
    parent = @current
    @current = node
    block.call
    @current = parent
  end

  # TODO change to name.to_sym in 1.3?
  add_to(@current, name, node)
end


52
53
54
55
56
57
58
59
60
61
# File 'lib/hypertemplate/builder/json.rb', line 52

def link(relationship, uri, options = {})
  # Start link array
  @current["link"] ||= []
  stringify_keys(options) 

  options["rel"]  = relationship.to_s
  options["href"] = uri
  options["type"] ||= "application/json"
  insert_value("link", nil, options)
end

#members(options = {}, &block) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/hypertemplate/builder/json.rb', line 25

def members(options = {}, &block)
  collection = options[:collection] || @obj
  raise Hypertemplate::BuilderError.new("Members method require a collection to execute") unless collection.respond_to?(:each)
  root = options[:root] || "members"

  add_to(@current, root, [])
  collection.each do |member|

    parent = @current
    @current = {}
    if block.arity==1
      # new dsl
      block.call(member)
    else
      # old dsl (deprecate at 1.3?)
      block.call(self, member)
    end
    add_to(parent, root, @current)
    @current = parent

  end
end

#representationObject



77
78
79
# File 'lib/hypertemplate/builder/json.rb', line 77

def representation
  @raw.to_json
end

#values(options = {}) {|Values.new(self)| ... } ⇒ Object

Yields:



48
49
50
# File 'lib/hypertemplate/builder/json.rb', line 48

def values(options = {}, &block)
  yield Values.new(self)
end