-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrepresentor.rb
More file actions
96 lines (90 loc) · 2.91 KB
/
representor.rb
File metadata and controls
96 lines (90 loc) · 2.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
require 'representor/resource_builder'
##
# A canonical interface for introspecting a hypermedia message. A builder is used to construct the object
# to keep the interface of instances simple and abstract the internal complexity that supports diverse
# generic hypermedia media types.
#
# @example
# my_resource = Representor.new do |builder|
# builder.add_meta_link(:profile, 'http://alps.io/schema.org/ItemList')
#
# builder.add_transition(:self, 'http://example.com/something')
#
# builder.add_transition(:search, 'http://example.com/search') do |transition_builder|
# transition_builder.add_parameter(:name)
# end
#
# builder.add_transition(:create, 'http://example.com/some_resources') do |transition_builder|
# transition_builder.add_attribute(:first_name, { validators: [required: true] })
# transition_builder.add_attribute(:last_name, { validators: [required: true] })
# end
#
# builder.add_attribute(:about, 'A list of people.')
#
# builder.add_resources(:people) do |resource_builder|
# resource_builder.add_transition(:self, 'http://example.com/person/1')
# resource_builder.add_attribute(:first_name, '')
# resource_builder.add_attribute(:last_name, '')
# end
#
# builder.add_resources(:people) do |resource_builder|
# resource_builder.add_attribute(:first_name, '')
# resource_builder.add_attribute(:last_name, '')
# resource_builder.add_transition(:self, 'http://example.com/person/2')
# end
# end
#
# self_transition = resource.transitions[:self]
# self_transition.uri # => 'http://example.com/something'
#
# search_transition = resource.transitions[:search]
# search_transition.parameters.keys # => [:name]
#
# create_transition = resource.transitions[:create]
# create_transition.attributes.keys # => [:first_name, :last_name]
#
# resource.attributes[:total_count] # => 2
#
# people = resource.resources[:people]
# person = people.first
# person.first_name # =>
#
class Representor
def initialize(resource_struct = nil)
builder = ResourceBuilder.new(resource_struct)
yield builder if block_given?
@internal_struct = builder.to_struct
end
##
# Any meta links, e.g. profile, type.
#
def meta_links
@meta_links ||= @internal_struct[:meta_links]
end
##
# Any meta data about the resource.
#
def meta_data
@meta_data ||= @internal_struct[:meta_data]
end
##
# The attributes of the resource.
#
def attributes
@attributes ||= @internal_struct[:attributes] || {}
end
##
# The transitions available for the resource.
#
# @return [Hash] The transition keyed by relation type.
def transitions
@transitions ||= @internal_struct[:transitions] || {}
end
##
# The separate resources embedded in the current resource.
#
# @return [Hash of Representor] Any embedded resources keyed by name.
def resources
@resources ||= @internal_struct[:resources] || {}
end
end