Class: JSON::LD::Resource
- Inherits:
-
Object
- Object
- JSON::LD::Resource
- 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 ⇒ Object
readonly
Object representation of resource.
-
#context ⇒ Object
readonly
Context associated with this resource.
-
#id ⇒ Object
readonly
ID of this resource.
Class Method Summary collapse
-
.set_context(ctx) ⇒ JSON::LD::EvaluationContext
Manage contexts used by resources.
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?).
-
#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
-
#merge(resource) ⇒ Resource
Merge resources FIXME: If unreconciled or unresolved resources are merged against reconciled/resolved resources, they will appear to not match, even if they are really the same thing.
-
#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
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/json/ld/resource.rb', line 81 def initialize(node_definition, = {}) @context_name = [:context] @context = self.class.set_context(@context_name) @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
231 232 233 |
# File 'lib/json/ld/resource.rb', line 231 def method_missing(method, *args) property(method.to_s) end |
Instance Attribute Details
#attributes ⇒ Object (readonly)
Object representation of resource
8 9 10 |
# File 'lib/json/ld/resource.rb', line 8 def attributes @attributes end |
#context ⇒ Object (readonly)
Context associated with this resource
18 19 20 |
# File 'lib/json/ld/resource.rb', line 18 def context @context end |
#id ⇒ Object (readonly)
ID of this resource
13 14 15 |
# File 'lib/json/ld/resource.rb', line 13 def id @id end |
Class Method Details
.set_context(ctx) ⇒ JSON::LD::EvaluationContext
Manage contexts used by resources.
58 59 60 |
# File 'lib/json/ld/resource.rb', line 58 def self.set_context(ctx) (@@contexts ||= {})[ctx] = JSON::LD::EvaluationContext.new.parse(ctx) end |
Instance Method Details
#anonymous? ⇒ Boolean
Anonymous resources have BNode ids or no schema:url
44 |
# File 'lib/json/ld/resource.rb', line 44 def anonymous?; @anon; end |
#clean? ⇒ Boolean
Is this resource clean (i.e., saved to mongo?)
23 |
# File 'lib/json/ld/resource.rb', line 23 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.
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 138 |
# File 'lib/json/ld/resource.rb', line 112 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, @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 |
#hash ⇒ Fixnum
Return a hash of this object, suitable for use by for ETag
99 100 101 |
# File 'lib/json/ld/resource.rb', line 99 def hash self.deresolve.hash end |
#inspect ⇒ Object
235 236 237 238 239 240 241 |
# File 'lib/json/ld/resource.rb', line 235 def inspect "<Resource" + attributes.map do |k, v| "\n #{k}: #{v.inspect}" end.join(" ") + ">" end |
#merge(resource) ⇒ Resource
Merge resources FIXME: If unreconciled or unresolved resources are merged against reconciled/resolved resources, they will appear to not match, even if they are really the same thing.
199 200 201 202 203 204 205 206 207 208 209 210 211 212 |
# File 'lib/json/ld/resource.rb', line 199 def merge(resource) if attributes.neq?(resource.attributes) resource.attributes.each do |p, v| next if p == 'id' if v.nil? or (v.is_a?(Array) and v.empty?) attributes.delete(p) else attributes[p] = v end end @resolved = @clean = false end self end |
#new? ⇒ Boolean
Is this a new resource, which has not yet been synched or created within the DB?
52 |
# File 'lib/json/ld/resource.rb', line 52 def new?; !!@new; end |
#property(prop_name) ⇒ Object
Access individual fields, from subject definition
228 |
# File 'lib/json/ld/resource.rb', line 228 def property(prop_name); @attributes.fetch(prop_name, nil); end |
#reconciled? ⇒ Boolean
Has this resource been reconciled against a mongo ID?
33 |
# File 'lib/json/ld/resource.rb', line 33 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.
158 159 160 161 162 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 |
# File 'lib/json/ld/resource.rb', line 158 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 obj.node_ref? reference_map[obj['id']] ||= Resource.new(obj, :context => @context_name, :clean => false, :stub => true ) else obj.keys.each 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.
223 224 225 |
# File 'lib/json/ld/resource.rb', line 223 def save raise NotImplemented end |
#stub? ⇒ Boolean
Is this a stub resource, which has not yet been synched or created within the DB?
48 |
# File 'lib/json/ld/resource.rb', line 48 def stub?; !!@stub; end |
#to_json(options = nil) ⇒ 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( = nil) deresolve.to_json() end |
#update_obj(obj, reference_map) ⇒ Object
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
# File 'lib/json/ld/resource.rb', line 160 def update_obj(obj, reference_map) case obj when Array obj.map {|o| update_obj(o, reference_map)} when Hash if obj.node_ref? reference_map[obj['id']] ||= Resource.new(obj, :context => @context_name, :clean => false, :stub => true ) else obj.keys.each do |k| obj[k] = update_obj(obj[k], reference_map) end obj end else obj end end |