Class: PMP::CollectionDocument
- Inherits:
-
Object
- Object
- PMP::CollectionDocument
- 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_TOKEN_TYPE, PMP::Configuration::DEFAULT_USER_AGENT, PMP::Configuration::VALID_OPTIONS_KEYS
Instance Attribute Summary collapse
-
#attributes ⇒ Object
private var to save attributes obj, to handle object attributes.
-
#href ⇒ Object
the href/url string to retrieve info for this resource.
-
#items ⇒ Object
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.
-
#links ⇒ Object
private var to save links obj, to handle link additions.
-
#loaded ⇒ Object
has this resource actually been loaded from remote url or json document?.
-
#original ⇒ Object
keep a ref to original doc from which this obj was created should this be private?.
-
#response ⇒ Object
keep a ref to response obj if this resulted from one should this be private?.
-
#version ⇒ Object
all collection docs have a version default is ‘1.0’.
Class Method Summary collapse
-
.to_persist_json(body) ⇒ Object
static method to filter out static parts of c.doc+j hash before PUT/POST to PMP server in the future this should be fixed in PMP API to no longer be necessary.
Instance Method Summary collapse
- #attributes_map ⇒ Object
- #delete ⇒ Object
- #delete_link ⇒ Object
- #get ⇒ Object
-
#initialize(options = {}) {|_self| ... } ⇒ CollectionDocument
constructor
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.
- #loaded? ⇒ Boolean
- #method_missing(method, *args) ⇒ Object
-
#request(method, url, body = nil) ⇒ Object
url includes any params - full url.
- #root ⇒ Object
- #root=(r) ⇒ Object
- #root_document ⇒ Object
- #save ⇒ Object
- #save_link ⇒ Object
- #set_guid_if_blank ⇒ Object
- #setup_oauth_token ⇒ Object
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
#add_request_auth, #connection, #process_options
Methods included from Configuration
#apply_configuration, #configure, extended, #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
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/pmp/collection_document.rb', line 44 def initialize(={}, &block) apply_configuration() self.root = .delete(:root) self.href = .delete(:href) self.version = .delete(:version) || '1.0' self.attributes = OpenStruct.new self.links = PMP::Links.new(self) # if there is a doc to be had, pull it out self.response = .delete(:response) self.original = .delete(:document) yield(self) if block_given? end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *args) ⇒ Object
184 185 186 187 |
# File 'lib/pmp/collection_document.rb', line 184 def method_missing(method, *args) get if (method.to_s.last != '=') respond_to?(method) ? send(method, *args) : attributes.send(method, *args) end |
Instance Attribute Details
#attributes ⇒ Object
private var to save attributes obj, to handle object attributes
32 33 34 |
# File 'lib/pmp/collection_document.rb', line 32 def attributes @attributes end |
#href ⇒ Object
the href/url string to retrieve info for this resource
14 15 16 |
# File 'lib/pmp/collection_document.rb', line 14 def href @href end |
#items ⇒ Object
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
39 40 41 |
# File 'lib/pmp/collection_document.rb', line 39 def items @items end |
#links ⇒ Object
private var to save links obj, to handle link additions
35 36 37 |
# File 'lib/pmp/collection_document.rb', line 35 def links @links end |
#loaded ⇒ Object
has this resource actually been loaded from remote url or json document?
29 30 31 |
# File 'lib/pmp/collection_document.rb', line 29 def loaded @loaded end |
#original ⇒ Object
keep a ref to original doc from which this obj was created should this be private?
22 23 24 |
# File 'lib/pmp/collection_document.rb', line 22 def original @original end |
#response ⇒ Object
keep a ref to response obj if this resulted from one should this be private?
18 19 20 |
# File 'lib/pmp/collection_document.rb', line 18 def response @response end |
#version ⇒ Object
all collection docs have a version default is ‘1.0’
26 27 28 |
# File 'lib/pmp/collection_document.rb', line 26 def version @version end |
Class Method Details
.to_persist_json(body) ⇒ Object
static method to filter out static parts of c.doc+j hash before PUT/POST to PMP server in the future this should be fixed in PMP API to no longer be necessary
166 167 168 169 170 171 172 173 174 |
# File 'lib/pmp/collection_document.rb', line 166 def self.to_persist_json(body) return body.to_s if body.is_a?(String) || !body.respond_to?(:as_json) result = body.as_json.select! { |k,v| %w(attributes links).include?(k) } result['attributes'].reject! { |k,v| %w(created modified).include?(k) } result['links'].reject! { |k,v| %w(creator query edit auth).include?(k) } result.to_json end |
Instance Method Details
#attributes_map ⇒ Object
176 177 178 |
# File 'lib/pmp/collection_document.rb', line 176 def attributes_map HashWithIndifferentAccess.new(attributes.marshal_dump) end |
#delete ⇒ Object
96 97 98 99 100 101 |
# File 'lib/pmp/collection_document.rb', line 96 def delete raise 'No guid specified to delete' if self.guid.blank? url = delete_link.where(guid: self.guid).url request(:delete, url) end |
#delete_link ⇒ Object
109 110 111 112 113 |
# File 'lib/pmp/collection_document.rb', line 109 def delete_link link = root_document.edit['urn:collectiondoc:form:documentdelete'] raise 'Delete link not found' unless link link end |
#get ⇒ Object
81 82 83 84 85 86 87 |
# File 'lib/pmp/collection_document.rb', line 81 def get if !loaded? && href self.response = request(:get, href) self.loaded = true end self end |
#loaded? ⇒ Boolean
127 128 129 |
# File 'lib/pmp/collection_document.rb', line 127 def loaded? !!self.loaded end |
#request(method, url, body = nil) ⇒ Object
url includes any params - full url
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/pmp/collection_document.rb', line 140 def request(method, url, body=nil) # :nodoc: unless ['/', ''].include?(URI::parse(url).path) setup_oauth_token end begin raw = connection(.merge({url: url})).send(method) do |request| if [:post, :put].include?(method.to_sym) && !body.blank? request.body = PMP::CollectionDocument.to_persist_json(body) end end rescue Faraday::Error::ResourceNotFound => not_found_ex if (method.to_sym == :get) raw = OpenStruct.new(body: nil, status: 404) else raise not_found_ex 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 ⇒ Object
115 116 117 |
# File 'lib/pmp/collection_document.rb', line 115 def root @root end |
#root=(r) ⇒ Object
119 120 121 |
# File 'lib/pmp/collection_document.rb', line 119 def root=(r) @root end |
#root_document ⇒ Object
123 124 125 |
# File 'lib/pmp/collection_document.rb', line 123 def root_document @root ||= PMP::CollectionDocument.new(.merge(href: endpoint)) end |
#save ⇒ Object
89 90 91 92 93 94 |
# File 'lib/pmp/collection_document.rb', line 89 def save set_guid_if_blank url = save_link.where(guid: self.guid).url self.response = request(:put, url, self) self.href = response.body['url'] end |
#save_link ⇒ Object
103 104 105 106 107 |
# File 'lib/pmp/collection_document.rb', line 103 def save_link link = root_document.edit['urn:collectiondoc:form:documentsave'] raise 'Save link not found' unless link link end |
#set_guid_if_blank ⇒ Object
180 181 182 |
# File 'lib/pmp/collection_document.rb', line 180 def set_guid_if_blank self.guid = SecureRandom.uuid if guid.blank? end |