Class: HalClient::Representation

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/hal_client/representation.rb

Overview

HAL representation of a single resource. Provides access to properties, links and embedded representations.

Operations on a representation are not thread-safe. If you’d like to use representations in a threaded environment, consider using the method #clone_for_use_in_different_thread to create a copy for each new thread

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ Representation

Create a new Representation

options - name parameters

:parsed_json - A hash structure representing a single HAL
  document.
:href - The href of this representation.
:hal_client - The HalClient instance to use when navigating.


41
42
43
44
45
46
47
48
49
# File 'lib/hal_client/representation.rb', line 41

def initialize(options)
  @hal_client = options[:hal_client]
  @href = options[:href]

  interpret options[:parsed_json] if options[:parsed_json]

  (fail ArgumentError, "Either parsed_json or href must be provided") if
    @raw.nil? && @href.nil?
end

Instance Attribute Details

#hal_clientObject

Return the HalClient used to retrieve this representation



324
325
326
# File 'lib/hal_client/representation.rb', line 324

def hal_client
  @hal_client
end

#propertiesObject (readonly)

Returns a Hash including the key-value pairs of all the properties

in the resource. It does not include HAL's reserved
properties (`_links` and `_embedded`).


127
128
129
# File 'lib/hal_client/representation.rb', line 127

def properties
  @properties
end

Instance Method Details

#==(other) ⇒ Object Also known as: eql?



305
306
307
308
309
310
311
312
313
# File 'lib/hal_client/representation.rb', line 305

def ==(other)
  if href && other.respond_to?(:href)
    href == other.href
  elsif other.respond_to?(:raw)
    @raw == other.raw
  else
    false
  end
end

#[](name_or_rel) ⇒ Object

Returns the value of the specified property or representations

of resources related via the specified link rel or nil

name_or_rel - The name of property or link rel of interest



163
164
165
166
# File 'lib/hal_client/representation.rb', line 163

def [](name_or_rel)
  item_key = name_or_rel
  fetch(item_key, nil)
end

Returns set of all links in this representation.



257
258
259
260
261
262
263
264
# File 'lib/hal_client/representation.rb', line 257

def all_links
  links_by_rel
    .reduce(Set.new) { |result, kv|
      _,links = *kv
      links.each { |l| result << l }
      result
    }
end

#as_enumObject

Returns an Enumerable of the items in this collection resource if this is an rfc 6573 collection.

Raises HalClient::NotACollectionError if this is not a collection resource.



243
244
245
# File 'lib/hal_client/representation.rb', line 243

def as_enum
  Collection.new(self)
end

#clone_for_use_in_different_threadObject

Returns a copy of this instance that is safe to use in threaded environments



53
54
55
56
57
58
59
# File 'lib/hal_client/representation.rb', line 53

def clone_for_use_in_different_thread
  clone.tap do |c|
    if c.hal_client
      c.hal_client = c.hal_client.clone_for_use_in_different_thread
    end
  end
end

#fetch(name_or_rel, default = MISSING, &default_proc) ⇒ Object

Returns the value of the specified property or representations

of resources related via the specified link rel or the
specified default value.

name_or_rel - The name of property or link rel of interest default - an optional object that should be return if the

specified property or link does not exist

default_proc - an option proc that will be called with ‘name`

to produce default value if the specified property or link does not
exist

Raises KeyError if the specified property or link does not exist

and no default nor default_proc is provided.


150
151
152
153
154
155
156
157
# File 'lib/hal_client/representation.rb', line 150

def fetch(name_or_rel, default=MISSING, &default_proc)
  item_key = name_or_rel
  default_proc ||= ->(_){default} if default != MISSING

  property(item_key) {
    related(item_key, &default_proc)
  }
end

#form(form_id = "default") ⇒ Object

Returns the specified ‘Form`

form_id - the string or symbol id of the form of interest. Default: ‘“default”`

Raises ‘KeyError` if the specified form doesn’t exist.



271
272
273
274
275
# File 'lib/hal_client/representation.rb', line 271

def form(form_id="default")
  parsed_form_json = property("_forms").fetch(form_id.to_s)

  Form.new(parsed_form_json, hal_client)
end

#hashObject



297
298
299
300
301
302
303
# File 'lib/hal_client/representation.rb', line 297

def hash
  if href
    href.hash
  else
    @raw.hash
  end
end

#hrefObject

Returns the URL of the resource this representation represents.



130
131
132
133
134
135
# File 'lib/hal_client/representation.rb', line 130

def href
  @href ||= raw
          .fetch("_links",{})
          .fetch("self",{})
          .fetch("href", AnonymousResourceLocator.new)
end

#patch(data, options = {}) ⇒ Object

Patchs a ‘Representation` or `String` to this resource. Causes this representation to be reloaded the next time it is used.

data - a ‘String` or an object that responds to `#to_hal` options - set of options to pass to `HalClient#patch`



88
89
90
91
92
# File 'lib/hal_client/representation.rb', line 88

def patch(data, options={})
  @hal_client.patch(href, data, options).tap do
    reset
  end
end

#post(data, options = {}) ⇒ Object

Posts a ‘Representation` or `String` to this resource. Causes this representation to be reloaded the next time it is used.

data - a ‘String` or an object that responds to `#to_hal` options - set of options to pass to `HalClient#post`



66
67
68
69
70
# File 'lib/hal_client/representation.rb', line 66

def post(data, options={})
  @hal_client.post(href, data, options).tap do
    reset
  end
end

#property(name, default = MISSING, &default_proc) ⇒ Object

Returns The value of the specified property or the specified

default value.

name - The name of property of interest default - an optional object that should be return if the

specified property does not exist

default_proc - an option proc that will be called with ‘name`

to produce default value if the specified property does not
exist

Raises KeyError if the specified property does not exist

and no default nor default_proc is provided.


116
117
118
119
120
121
122
# File 'lib/hal_client/representation.rb', line 116

def property(name, default=MISSING, &default_proc)
  ensure_reified

  default_proc ||= ->(_){ default} if default != MISSING

  properties.fetch(name.to_s, &default_proc)
end

#property?(name) ⇒ Boolean Also known as: has_property?

Returns true if this representation contains the specified property.

name - the name of the property to check

Returns:

  • (Boolean)


98
99
100
101
# File 'lib/hal_client/representation.rb', line 98

def property?(name)
  ensure_reified
  properties.key? name
end

#put(data, options = {}) ⇒ Object

Puts a ‘Representation` or `String` to this resource. Causes this representation to be reloaded the next time it is used.

data - a ‘String` or an object that responds to `#to_hal` options - set of options to pass to `HalClient#put`



77
78
79
80
81
# File 'lib/hal_client/representation.rb', line 77

def put(data, options={})
  @hal_client.put(href, data, options).tap do
    reset
  end
end

#rawObject

Returns raw parsed json.



317
318
319
320
321
# File 'lib/hal_client/representation.rb', line 317

def raw
  ensure_reified

  @raw
end

Returns values of the ‘href` member of links and the URL of embedded representations related via the specified link rel. The only difference between this and `#related_hrefs` is that this method makes no attempt to expand templated links. For templated links the returned collection will include the template pattern as encoded in the HAL document.

link_rel - The link rel of interest default_proc - an option proc that will be called with ‘name`

to produce default value if the specified property or link does not
exist

Raises KeyError if the specified link does not exist

and no default_proc is provided.


230
231
232
233
234
235
236
# File 'lib/hal_client/representation.rb', line 230

def raw_related_hrefs(link_rel, &default_proc)
  default_proc ||= NO_RELATED_RESOURCE

  links_by_rel
    .fetch(link_rel) { return default_proc.call(link_rel) }
    .map { |l| l.raw_href }
end

Returns representations of resources related via the specified

link rel or the specified default value.

link_rel - The link rel of interest options - optional keys and values with which to expand any

templated links that are encountered

default_proc - an option proc that will be called with ‘name`

to produce default value if the specified property or link does not
exist

Raises KeyError if the specified link does not exist

and no default_proc is provided.


189
190
191
192
193
194
195
196
197
# File 'lib/hal_client/representation.rb', line 189

def related(link_rel, options = {}, &default_proc)
  default_proc ||= NO_RELATED_RESOURCE

  related = links_by_rel
            .fetch(link_rel) { return default_proc.call(link_rel) }
            .map { |l| l.target(options) }

  RepresentationSet.new(related)
end

#related?(link_rel) ⇒ Boolean Also known as: has_related?

Returns true if this representation contains a link (including embedded links) whose rel is ‘link_rel`.

link_rel - The link rel of interest

Returns:

  • (Boolean)


172
173
174
# File 'lib/hal_client/representation.rb', line 172

def related?(link_rel)
  links_by_rel.key?(link_rel)
end

Returns urls of resources related via the specified

link rel or the specified default value.

link_rel - The link rel of interest options - optional keys and values with which to expand any

templated links that are encountered

default_proc - an option proc that will be called with ‘name`

to produce default value if the specified property or link does not
exist

Raises KeyError if the specified link does not exist

and no default_proc is provided.


211
212
213
214
# File 'lib/hal_client/representation.rb', line 211

def related_hrefs(link_rel, options={}, &default_proc)
  related(link_rel, options, &default_proc).
    map(&:href)
end

#resetObject

Resets this representation such that it will be requested from the upstream on it’s next use.



280
281
282
283
# File 'lib/hal_client/representation.rb', line 280

def reset
  @href = href # make sure we have the href
  @raw = nil
end

#to_enum(method = :each, *args, &blk) ⇒ Object

Returns an Enumerator of the items in the collection resource if this is an rfc 6573 collection.

Raises HalClient::NotACollectionError if this is not a collection resource.



252
253
254
# File 'lib/hal_client/representation.rb', line 252

def to_enum(method=:each, *args, &blk)
  as_enum.to_enum(method, *args, &blk)
end

#to_jsonObject Also known as: to_hal

Returns the raw json representation of this representation



292
293
294
# File 'lib/hal_client/representation.rb', line 292

def to_json
  MultiJson.dump(raw)
end

#to_sObject

Returns a short human readable description of this representation.



287
288
289
# File 'lib/hal_client/representation.rb', line 287

def to_s
  "#<" + self.class.name + ": " + href.to_s  + ">"
end