Class: PMP::CollectionDocument

Inherits:
OpenStruct
  • Object
show all
Includes:
Configuration, Connection, Parser
Defined in:
lib/pmp/collection_document.rb

Overview

Using OpenStruct for now - perhaps use ActiveModel? hmm…

Constant Summary

Constants included from Connection

PMP::Connection::ALLOWED_CONNECTION_OPTIONS

Constants included from Configuration

PMP::Configuration::DEFAULT_ADAPTER, PMP::Configuration::DEFAULT_CLIENT_ID, PMP::Configuration::DEFAULT_CLIENT_SECRET, PMP::Configuration::DEFAULT_ENDPOINT, PMP::Configuration::DEFAULT_USER_AGENT, PMP::Configuration::VALID_OPTIONS_KEYS

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Parser

#as_json, #extract_attributes, #extract_links, #parse, #parse_attributes, #parse_items, #parse_link, #parse_links, #parse_links_list, #parse_version

Methods included from Utils

#to_json_key_name, #to_ruby_safe_name

Methods included from Connection

#connection, #process_options

Methods included from Configuration

#apply_configuration, #configure, #options, #reset!

Constructor Details

#initialize(options = {}) {|_self| ... } ⇒ CollectionDocument

document is the original json derived doc used to create this resource assumption is that doc is a parsed json doc confirming to collection.doc+json TODO: check if this is a json string or hash, for now assume it has been mashified

Yields:

  • (_self)

Yield Parameters:



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/pmp/collection_document.rb', line 40

def initialize(options={}, &block)
  super()

  self.links    = PMP::Links.new(self)
  self.version  = options.delete(:version) || '1.0'
  self.href     = options.delete(:href)

  # if there is a doc to be had, pull it out
  self.response = options.delete(:response)
  self.original = options.delete(:document)

  apply_configuration(options)

  yield(self) if block_given?
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args) ⇒ Object



133
134
135
136
# File 'lib/pmp/collection_document.rb', line 133

def method_missing(method, *args)
  load if (method.to_s.last != '=') && !loaded?
  super
end

Instance Attribute Details

#hrefObject

the href/url string to retrieve info for this resource



13
14
15
# File 'lib/pmp/collection_document.rb', line 13

def href
  @href
end

#itemsObject

this is a tricky, read-only list of items, same as if loaded from link->item links do not put into json form of this doc



35
36
37
# File 'lib/pmp/collection_document.rb', line 35

def items
  @items
end

private var to save links obj, to handle link additions



31
32
33
# File 'lib/pmp/collection_document.rb', line 31

def links
  @links
end

#loadedObject

has this resource actually been loaded from remote url or json document?



28
29
30
# File 'lib/pmp/collection_document.rb', line 28

def loaded
  @loaded
end

#originalObject

keep a ref to original doc from which this obj was created should this be private?



21
22
23
# File 'lib/pmp/collection_document.rb', line 21

def original
  @original
end

#responseObject

keep a ref to response obj if this resulted from one should this be private?



17
18
19
# File 'lib/pmp/collection_document.rb', line 17

def response
  @response
end

#versionObject

all collection docs have a version default is ‘1.0’



25
26
27
# File 'lib/pmp/collection_document.rb', line 25

def version
  @version
end

Instance Method Details

#attributesObject



61
62
63
# File 'lib/pmp/collection_document.rb', line 61

def attributes
  HashWithIndifferentAccess.new(marshal_dump.delete_if{|k,v| links.keys.include?(k.to_s)})
end

#deleteObject



95
96
97
98
99
100
# File 'lib/pmp/collection_document.rb', line 95

def delete
  raise 'No guid specified to delete' if self.guid.blank?

  url = edit_link('DELETE').where(guid: self.guid).url
  request(:delete, url)
end


102
103
104
105
106
107
# File 'lib/pmp/collection_document.rb', line 102

def edit_link(method)
  # first, need the root, use the endpoint
  link = root_document.edit['urn:pmp:form:documentsave']
  raise "Edit link does not specify saving via #{method}" unless (link && link.hints.allow.include?(method))
  link
end

#loadObject Also known as: get



80
81
82
83
84
85
# File 'lib/pmp/collection_document.rb', line 80

def load
  if !loaded? && href
    self.response = request(:get, href)
    self.loaded = true
  end
end

#loaded?Boolean

Returns:

  • (Boolean)


113
114
115
# File 'lib/pmp/collection_document.rb', line 113

def loaded?
  !!self.loaded
end

#request(method, url, body = nil) ⇒ Object

url includes any params - full url



118
119
120
121
122
123
124
125
126
127
# File 'lib/pmp/collection_document.rb', line 118

def request(method, url, body=nil) # :nodoc:
  raw = connection(options.merge({url: url})).send(method) do |request|
    if [:post, :put].include?(method.to_sym) && !body.blank?
      request.body = body.is_a?(String) ? body : body.to_json
    end
  end

  # may not need this, but remember how we made this response
  PMP::Response.new(raw, {method: method, url: url, body: body})
end

#root_documentObject



109
110
111
# File 'lib/pmp/collection_document.rb', line 109

def root_document
  PMP::CollectionDocument.new(options.merge(href: endpoint))
end

#saveObject



88
89
90
91
92
93
# File 'lib/pmp/collection_document.rb', line 88

def save
  set_guid_if_blank

  url = edit_link('PUT').where(guid: self.guid).url
  request(:put, url, self)
end

#set_guid_if_blankObject



129
130
131
# File 'lib/pmp/collection_document.rb', line 129

def set_guid_if_blank
  self.guid = SecureRandom.uuid if guid.blank?
end