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 ⇒ Fixnum
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 = nil) ⇒ 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
77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/json/ld/resource.rb', line 77 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[0,2] == '_:' 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
216 217 218 |
# File 'lib/json/ld/resource.rb', line 216 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.
8 9 10 |
# File 'lib/json/ld/resource.rb', line 8 def attributes @attributes end |
#context ⇒ JSON::LD::Context (readonly)
Returns Context associated with this resource.
14 15 16 |
# File 'lib/json/ld/resource.rb', line 14 def context @context end |
#id ⇒ String (readonly)
Returns ID of this resource.
11 12 13 |
# File 'lib/json/ld/resource.rb', line 11 def id @id end |
Instance Method Details
#anonymous? ⇒ Boolean
Anonymous resources have BNode ids or no schema:url
45 |
# File 'lib/json/ld/resource.rb', line 45 def anonymous?; @anon; end |
#clean? ⇒ Boolean
Is this resource clean (i.e., saved to mongo?)
20 |
# File 'lib/json/ld/resource.rb', line 20 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.
109 110 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 |
# File 'lib/json/ld/resource.rb', line 109 def deresolve node_definition = if resolved? deresolved = attributes.keys.inject({}) do |memo, prop| value = attributes[prop] 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 memo 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?)
26 |
# File 'lib/json/ld/resource.rb', line 26 def dirty?; !clean?; end |
#each(&block) ⇒ Object
Enumerate over statements associated with this resource
149 150 151 |
# File 'lib/json/ld/resource.rb', line 149 def each(&block) JSON::LD::API.toRdf(attributes, expandContext: context, &block) end |
#hash ⇒ Fixnum
Return a hash of this object, suitable for use by for ETag
95 96 97 |
# File 'lib/json/ld/resource.rb', line 95 def hash self.deresolve.hash end |
#inspect ⇒ Object
220 221 222 223 224 225 226 |
# File 'lib/json/ld/resource.rb', line 220 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?
55 |
# File 'lib/json/ld/resource.rb', line 55 def new?; !!@new; end |
#property(prop_name) ⇒ Object
Access individual fields, from subject definition
212 |
# File 'lib/json/ld/resource.rb', line 212 def property(prop_name); @attributes.fetch(prop_name, nil); end |
#reconciled? ⇒ Boolean
Has this resource been reconciled against a mongo ID?
32 |
# File 'lib/json/ld/resource.rb', line 32 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.
163 164 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 |
# File 'lib/json/ld/resource.rb', line 163 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 %w(id type).include?(k) @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?
39 |
# File 'lib/json/ld/resource.rb', line 39 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.
206 207 208 |
# File 'lib/json/ld/resource.rb', line 206 def save raise NotImplementedError end |
#stub? ⇒ Boolean
Is this a stub resource, which has not yet been synched or created within the DB?
50 |
# File 'lib/json/ld/resource.rb', line 50 def stub?; !!@stub; end |
#to_json(options = nil) ⇒ String
Serialize to JSON-LD, minus ‘@context` using a deresolved version of the attributes
143 144 145 |
# File 'lib/json/ld/resource.rb', line 143 def to_json( = nil) deresolve.to_json() end |
#update_obj(obj, reference_map) ⇒ Object
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
# File 'lib/json/ld/resource.rb', line 165 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 |