Class: JSON::LD::Resource
- Inherits:
-
Object
- Object
- JSON::LD::Resource
- Includes:
- RDF::Enumerable
- Defined in:
- lib/json/ld/resource.rb
Overview
Simple Ruby reflector class to provide native access to JSON-LD objects
Instance Attribute Summary collapse
-
#attributes ⇒ Hash<String => Object] Object representation of resource
readonly
Hash<String => Object] Object representation of resource.
-
#context ⇒ JSON::LD::Context
readonly
Context associated with this resource.
-
#id ⇒ String
readonly
ID of this resource.
Instance Method Summary collapse
-
#anonymous? ⇒ Boolean
Anonymous resources have BNode ids or no schema:url.
-
#clean? ⇒ Boolean
Is this resource clean (i.e., saved to mongo?).
-
#deresolve ⇒ Hash
Reverse resolution of resource attributes.
-
#dirty? ⇒ Boolean
Is this resource dirty (i.e., not yet saved to mongo?).
-
#each(&block) ⇒ Object
Enumerate over statements associated with this resource.
-
#hash ⇒ Integer
Return a hash of this object, suitable for use by for ETag.
-
#initialize(node_definition, **options) ⇒ Resource
constructor
A new resource from the parsed graph.
- #inspect ⇒ Object
-
#method_missing(method, *args) ⇒ Object
Access individual fields, from subject definition.
-
#new? ⇒ Boolean
Is this a new resource, which has not yet been synched or created within the DB?.
-
#property(prop_name) ⇒ Object
Access individual fields, from subject definition.
-
#reconciled? ⇒ Boolean
Has this resource been reconciled against a mongo ID?.
-
#resolve(reference_map) ⇒ Resource
Update node references using the provided map.
-
#resolved? ⇒ Boolean
Has this resource been resolved so that all references are to other Resources?.
-
#save ⇒ Boolean
Override this method to implement save using an appropriate storage mechanism.
-
#stub? ⇒ Boolean
Is this a stub resource, which has not yet been synched or created within the DB?.
-
#to_json(**options) ⇒ String
Serialize to JSON-LD, minus ‘@context` using a deresolved version of the attributes.
- #update_obj(obj, reference_map) ⇒ Object
Constructor Details
#initialize(node_definition, **options) ⇒ Resource
A new resource from the parsed graph
79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/json/ld/resource.rb', line 79 def initialize(node_definition, **) @context = [:context] @clean = .fetch(:clean, false) @new = .fetch(:new, true) @reconciled = .fetch(:reconciled, !@new) @resolved = false @attributes = if [:compact] JSON::LD::API.compact(node_definition, @context) else node_definition end @id = @attributes['@id'] @anon = @id.nil? || @id.to_s.start_with?('_:') end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *args) ⇒ Object
Access individual fields, from subject definition
218 219 220 |
# File 'lib/json/ld/resource.rb', line 218 def method_missing(method, *args) property(method.to_s) end |
Instance Attribute Details
#attributes ⇒ Hash<String => Object] Object representation of resource (readonly)
Returns Hash<String => Object] Object representation of resource.
10 11 12 |
# File 'lib/json/ld/resource.rb', line 10 def attributes @attributes end |
#context ⇒ JSON::LD::Context (readonly)
Returns Context associated with this resource.
16 17 18 |
# File 'lib/json/ld/resource.rb', line 16 def context @context end |
#id ⇒ String (readonly)
Returns ID of this resource.
13 14 15 |
# File 'lib/json/ld/resource.rb', line 13 def id @id end |
Instance Method Details
#anonymous? ⇒ Boolean
Anonymous resources have BNode ids or no schema:url
47 |
# File 'lib/json/ld/resource.rb', line 47 def anonymous?; @anon; end |
#clean? ⇒ Boolean
Is this resource clean (i.e., saved to mongo?)
22 |
# File 'lib/json/ld/resource.rb', line 22 def clean?; @clean; end |
#deresolve ⇒ Hash
Reverse resolution of resource attributes. Just returns ‘attributes` if resource is unresolved. Otherwise, replaces `Resource` values with node references.
Result is expanded and re-compacted to get to normalized representation.
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'lib/json/ld/resource.rb', line 111 def deresolve node_definition = if resolved? deresolved = [].tap do |memo| attributes.each_pair do |prop, value| memo[prop] = case value when Resource {'id' => value.id} when Array value.map do |v| v.is_a?(Resource) ? {'id' => v.id} : v end else value end end end deresolved else attributes end compacted = nil JSON::LD::API.(node_definition, expandContext: @context) do || compacted = JSON::LD::API.compact(, @context) end compacted.delete_if {|k, v| k == '@context'} end |
#dirty? ⇒ Boolean
Is this resource dirty (i.e., not yet saved to mongo?)
28 |
# File 'lib/json/ld/resource.rb', line 28 def dirty?; !clean?; end |
#each(&block) ⇒ Object
Enumerate over statements associated with this resource
151 152 153 |
# File 'lib/json/ld/resource.rb', line 151 def each(&block) JSON::LD::API.toRdf(attributes, expandContext: context, &block) end |
#hash ⇒ Integer
Return a hash of this object, suitable for use by for ETag
97 98 99 |
# File 'lib/json/ld/resource.rb', line 97 def hash self.deresolve.hash end |
#inspect ⇒ Object
222 223 224 225 226 227 228 |
# File 'lib/json/ld/resource.rb', line 222 def inspect "<Resource" + attributes.map do |k, v| "\n #{k}: #{v.inspect}" end.join(" ") + ">" end |
#new? ⇒ Boolean
Is this a new resource, which has not yet been synched or created within the DB?
57 |
# File 'lib/json/ld/resource.rb', line 57 def new?; !!@new; end |
#property(prop_name) ⇒ Object
Access individual fields, from subject definition
214 |
# File 'lib/json/ld/resource.rb', line 214 def property(prop_name); @attributes.fetch(prop_name, nil); end |
#reconciled? ⇒ Boolean
Has this resource been reconciled against a mongo ID?
34 |
# File 'lib/json/ld/resource.rb', line 34 def reconciled?; @reconciled; end |
#resolve(reference_map) ⇒ Resource
Update node references using the provided map. This replaces node references with Resources, either stub or instantiated.
Node references with ids not in the reference_map will cause stub resources to be added to the map.
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 |
# File 'lib/json/ld/resource.rb', line 165 def resolve(reference_map) return if resolved? def update_obj(obj, reference_map) case obj when Array obj.map {|o| update_obj(o, reference_map)} when Hash if node_reference?(obj) reference_map[obj['id']] ||= Resource.new(obj, context: @context_name, clean: false, stub: true ) else obj.each_key do |k| obj[k] = update_obj(obj[k], reference_map) end obj end else obj end end #$logger.debug "resolve(0): #{attributes.inspect}" @attributes.each do |k, v| next if k == 'id' || k == 'type' @attributes[k] = update_obj(@attributes[k], reference_map) end #$logger.debug "resolve(1): #{attributes.inspect}" @resolved = true self end |
#resolved? ⇒ Boolean
Has this resource been resolved so that all references are to other Resources?
41 |
# File 'lib/json/ld/resource.rb', line 41 def resolved?; @resolved; end |
#save ⇒ Boolean
Override this method to implement save using an appropriate storage mechanism.
Save the object to the Mongo collection use Upsert to create things that don’t exist. First makes sure that the resource is valid.
208 209 210 |
# File 'lib/json/ld/resource.rb', line 208 def save raise NotImplementedError end |
#stub? ⇒ Boolean
Is this a stub resource, which has not yet been synched or created within the DB?
52 |
# File 'lib/json/ld/resource.rb', line 52 def stub?; !!@stub; end |
#to_json(**options) ⇒ String
Serialize to JSON-LD, minus ‘@context` using a deresolved version of the attributes
145 146 147 |
# File 'lib/json/ld/resource.rb', line 145 def to_json(**) deresolve.to_json(**) end |
#update_obj(obj, reference_map) ⇒ Object
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
# File 'lib/json/ld/resource.rb', line 167 def update_obj(obj, reference_map) case obj when Array obj.map {|o| update_obj(o, reference_map)} when Hash if node_reference?(obj) reference_map[obj['id']] ||= Resource.new(obj, context: @context_name, clean: false, stub: true ) else obj.each_key do |k| obj[k] = update_obj(obj[k], reference_map) end obj end else obj end end |