rdf-ldp 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -0
  3. data/VERSION +1 -1
  4. data/lib/rdf/ldp/resource.rb +101 -85
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 54ea7ba54f7ff921a5670547db56d81fcfc686ed
4
- data.tar.gz: 3dfdbb9baa8e06b2e8ce34ef3c5f5c99f6af3a38
3
+ metadata.gz: 4eb2d5a31b16d4ec608a5e86604f0e6aa62b74a7
4
+ data.tar.gz: 364e5044ef73ed29309ecfeed26264b873422692
5
5
  SHA512:
6
- metadata.gz: 0df494fa4d14ffe6ccc5533bd042b567e9d5a166e35af5b4b759af9e738b486eac010f3eee40e5e2abdd3b0bcf6087f624b6b80756a575157498b5482a0e2d97
7
- data.tar.gz: 8d69b716de23c7cf1a08d83e2b6620770d561c3aa4bfa43bf29a4024d74b60442c7fc19d58d4c8daf0b65e2d95502789d86fec192dad677b96c5576833c3ed51
6
+ metadata.gz: 8d2ca4e335869bc99aec018195ad7d42b89395eaed9166bd0313d6de850bbbe8dd91161626ca0552e92102bb5122edc1afb27bc6c810d3703e6ddc3f608ccf09
7
+ data.tar.gz: b9c3fb8d7ebd10297d55f8c90a5c1ada5ba09bc1d5f9dbd158ed8ad8d8c8e692c7a98a71162f4ad0be8e075365a651dc6bdac0c21d601e4f22ec3520f39b76d0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,20 @@
1
+ 0.5.0
2
+ -----
3
+ - Fixes error that caused resources to be misidentified when trailing
4
+ slashes are present.
5
+ - Returns a 500 error and a useful message when `last_modified` is
6
+ missing.
7
+
8
+ 0.4.0
9
+ -----
10
+ - Adds Last-Modified and updates ETag strategy to weak etags based on
11
+ that date.
12
+ - Destroys resources with an internal `prov:invalidatedAtTime`.
13
+ - Adds conditional GET support.
14
+ - Handles RDFSource responses more efficiently, avoiding loading the
15
+ graph for HEAD & OPTIONS requests.
16
+ - More efficient update/delete with RDF::Transactions.
17
+ - Uses default prefixes from RDF.rb in responses.
1
18
 
2
19
  0.3.0
3
20
  ------
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.5.0
@@ -2,7 +2,7 @@ require 'link_header'
2
2
 
3
3
  module RDF::LDP
4
4
  ##
5
- # The base class for all LDP Resources.
5
+ # The base class for all LDP Resources.
6
6
  #
7
7
  # The internal state of a Resource is specific to a given persistent datastore
8
8
  # (an `RDF::Repository` passed to the initilazer) and is managed through an
@@ -11,23 +11,23 @@ module RDF::LDP
11
11
  # - a `#subject_uri` identifying the Resource.
12
12
  # - a `#metagraph` containing server-internal properties of the Resource.
13
13
  #
14
- # Resources also define a basic set of CRUD operations, identity and current
15
- # state, and a `#to_response`/`#each` method used by Rack & `Rack::LDP` to
16
- # generate an appropriate HTTP response body.
14
+ # Resources also define a basic set of CRUD operations, identity and current
15
+ # state, and a `#to_response`/`#each` method used by Rack & `Rack::LDP` to
16
+ # generate an appropriate HTTP response body.
17
17
  #
18
- # `#metagraph' holds internal properites used by the server. It is distinct
19
- # from, and may conflict with, other RDF and non-RDF information about the
20
- # resource (e.g. representations suitable for a response body). Metagraph
21
- # contains a canonical `rdf:type` statement, which specifies the resource's
22
- # interaction model and a (dcterms:modified) last-modified date. If the
23
- # resource is deleted, a (prov:invalidatedAt) flag in metagraph indicates
18
+ # `#metagraph' holds internal properites used by the server. It is distinct
19
+ # from, and may conflict with, other RDF and non-RDF information about the
20
+ # resource (e.g. representations suitable for a response body). Metagraph
21
+ # contains a canonical `rdf:type` statement, which specifies the resource's
22
+ # interaction model and a (dcterms:modified) last-modified date. If the
23
+ # resource is deleted, a (prov:invalidatedAt) flag in metagraph indicates
24
24
  # this.
25
- #
26
- # The contents of `#metagraph` should not be confused with LDP
27
- # server-managed-triples, Those triples are included in the state of the
25
+ #
26
+ # The contents of `#metagraph` should not be confused with LDP
27
+ # server-managed-triples, Those triples are included in the state of the
28
28
  # resource as represented by the response body. `#metagraph` is invisible to
29
29
  # the client except where a subclass mirrors its contents in the body.
30
- #
30
+ #
31
31
  # @example creating a new Resource
32
32
  # repository = RDF::Repository.new
33
33
  # resource = RDF::LDP::Resource.new('http://example.org/moomin', repository)
@@ -46,7 +46,7 @@ module RDF::LDP
46
46
  # resource.update('blah', 'text/plain')
47
47
  # resource.last_modified
48
48
  # # => #<DateTime: 2015-10-25T14:32:04-07:00 ((2457321j,77524s,330658065n),-25200s,2299161j)>
49
- #
49
+ #
50
50
  # @example destroying a Resource
51
51
  # resource.exists? # => true
52
52
  # resource.destroyed? # => false
@@ -57,13 +57,13 @@ module RDF::LDP
57
57
  # resource.destroyed? # => true
58
58
  #
59
59
  # Rack (via `RDF::LDP::Rack`) uses the `#request` method to dispatch requests and
60
- # interpret responses. Disallowed HTTP methods result in
61
- # `RDF::LDP::MethodNotAllowed`. Individual Resources populate `Link`, `Allow`,
62
- # `ETag`, `Last-Modified`, and `Accept-*` headers as required by LDP. All
60
+ # interpret responses. Disallowed HTTP methods result in
61
+ # `RDF::LDP::MethodNotAllowed`. Individual Resources populate `Link`, `Allow`,
62
+ # `ETag`, `Last-Modified`, and `Accept-*` headers as required by LDP. All
63
63
  # subclasses (MUST) return `self` as the Body, and respond to `#each`/
64
64
  # `#respond_to` with the intended body.
65
65
  #
66
- # @example using HTTP request methods to get a Rack response
66
+ # @example using HTTP request methods to get a Rack response
67
67
  # resource.request(:get, 200, {}, {})
68
68
  # # => [200,
69
69
  # {"Link"=>"<http://www.w3.org/ns/ldp#Resource>;rel=\"type\"",
@@ -81,7 +81,7 @@ module RDF::LDP
81
81
  # resource.request(:put, 200, {}, {}) # RDF::LDP::MethodNotAllowed: put
82
82
  #
83
83
  # @see http://www.w3.org/TR/ldp/ for the Linked Data platform specification
84
- # @see http://www.w3.org/TR/ldp/#dfn-linked-data-platform-resource for a
84
+ # @see http://www.w3.org/TR/ldp/#dfn-linked-data-platform-resource for a
85
85
  # definition of 'Resource' in LDP
86
86
  class Resource
87
87
  # @!attribute [r] subject_uri
@@ -91,14 +91,14 @@ module RDF::LDP
91
91
  # @!attribute [rw] metagraph
92
92
  # a graph representing the server-internal state of the resource
93
93
  attr_accessor :metagraph
94
-
94
+
95
95
  class << self
96
96
  ##
97
- # @return [RDF::URI] uri with lexical representation
97
+ # @return [RDF::URI] uri with lexical representation
98
98
  # 'http://www.w3.org/ns/ldp#Resource'
99
99
  #
100
100
  # @see http://www.w3.org/TR/ldp/#dfn-linked-data-platform-resource
101
- def to_uri
101
+ def to_uri
102
102
  RDF::Vocab::LDP.Resource
103
103
  end
104
104
 
@@ -113,41 +113,41 @@ module RDF::LDP
113
113
  end
114
114
 
115
115
  ##
116
- # Finds an existing resource and
117
- #
116
+ # Finds an existing resource and
117
+ #
118
118
  # @param [RDF::URI] uri the URI for the resource to be found
119
- # @param [RDF::Repository] data a repostiory instance in which to find
119
+ # @param [RDF::Repository] data a repostiory instance in which to find
120
120
  # the resource.
121
121
  #
122
122
  # @raise [RDF::LDP::NotFound] when the resource doesn't exist
123
123
  #
124
124
  # @return [RDF::LDP::Resource] a resource instance matching the given URI;
125
- # usually of a subclass
125
+ # usually of a subclass
126
126
  # from the interaction models.
127
127
  def find(uri, data)
128
- graph = RDF::Graph.new(uri / '#meta', data: data)
128
+ graph = RDF::Graph.new(metagraph_name(uri), data: data)
129
129
  raise NotFound if graph.empty?
130
130
 
131
131
  rdf_class = graph.query([uri, RDF.type, :o]).first
132
132
  klass = INTERACTION_MODELS[rdf_class.object] if rdf_class
133
133
  klass ||= RDFSource
134
-
135
- klass.new(uri, data)
134
+
135
+ klass.new(uri, data)
136
136
  end
137
137
 
138
138
  ##
139
139
  # Retrieves the correct interaction model from the Link headers.
140
140
  #
141
141
  # Headers are handled intelligently, e.g. if a client sends a request with
142
- # Resource, RDFSource, and BasicContainer headers, the server gives a
143
- # BasicContainer. An error is thrown if the headers contain conflicting
142
+ # Resource, RDFSource, and BasicContainer headers, the server gives a
143
+ # BasicContainer. An error is thrown if the headers contain conflicting
144
144
  # types (i.e. NonRDFSource and another Resource class).
145
145
  #
146
- # @param [String] link_header a string containing Link headers from an
146
+ # @param [String] link_header a string containing Link headers from an
147
147
  # HTTP request (Rack env)
148
- #
149
- # @return [Class] a subclass of {RDF::LDP::Resource} matching the
150
- # requested interaction model;
148
+ #
149
+ # @return [Class] a subclass of {RDF::LDP::Resource} matching the
150
+ # requested interaction model;
151
151
  def interaction_model(link_header)
152
152
  models = LinkHeader.parse(link_header)
153
153
  .links.select { |link| link['rel'].downcase == 'type' }
@@ -155,9 +155,9 @@ module RDF::LDP
155
155
 
156
156
  return RDFSource if models.empty?
157
157
  match = INTERACTION_MODELS.keys.reverse.find { |u| models.include? u }
158
-
158
+
159
159
  if match == RDF::LDP::NonRDFSource.to_uri
160
- raise NotAcceptable if
160
+ raise NotAcceptable if
161
161
  models.include?(RDF::LDP::RDFSource.to_uri) ||
162
162
  models.include?(RDF::LDP::Container.to_uri) ||
163
163
  models.include?(RDF::LDP::DirectContainer.to_uri) ||
@@ -167,21 +167,29 @@ module RDF::LDP
167
167
 
168
168
  INTERACTION_MODELS[match] || RDFSource
169
169
  end
170
+
171
+ ##
172
+ # Build a graph name URI for the uri passed in
173
+ #
174
+ # @param uri [RDF::URI]
175
+ def metagraph_name(uri)
176
+ uri + '#meta'
177
+ end
170
178
  end
171
179
 
172
180
  ##
173
181
  # @param [RDF::URI, #to_s] subject_uri the uri that identifies the Resource
174
- # @param [RDF::Repository] data the repository where the resource's RDF
175
- # data (i.e. `metagraph`) is stored; defaults to an in-memory
182
+ # @param [RDF::Repository] data the repository where the resource's RDF
183
+ # data (i.e. `metagraph`) is stored; defaults to an in-memory
176
184
  # RDF::Repository specific to this Resource.
177
185
  #
178
186
  # @yield [RDF::Resource] Gives itself to the block
179
187
  #
180
- # @example
188
+ # @example
181
189
  # RDF::Resource.new('http://example.org/moomin')
182
190
  #
183
191
  # @example with a block
184
- # RDF::Resource.new('http://example.org/moomin') do |resource|
192
+ # RDF::Resource.new('http://example.org/moomin') do |resource|
185
193
  # resource.metagraph << RDF::Statement(...)
186
194
  # end
187
195
  #
@@ -195,10 +203,10 @@ module RDF::LDP
195
203
  ##
196
204
  # @abstract creates the resource
197
205
  #
198
- # @param [IO, File] input input (usually from a Rack env's
206
+ # @param [IO, File] input input (usually from a Rack env's
199
207
  # `rack.input` key) used to determine the Resource's initial state.
200
208
  # @param [#to_s] content_type a MIME content_type used to interpret the
201
- # input. This MAY be used as a content type for the created Resource
209
+ # input. This MAY be used as a content type for the created Resource
202
210
  # (especially for `LDP::NonRDFSource`s).
203
211
  #
204
212
  # @yield gives a transaction (changeset) to collect changes to graph,
@@ -206,7 +214,7 @@ module RDF::LDP
206
214
  # @yieldparam tx [RDF::Transaction]
207
215
  # @return [RDF::LDP::Resource] self
208
216
  #
209
- # @raise [RDF::LDP::RequestError] when creation fails. May raise various
217
+ # @raise [RDF::LDP::RequestError] when creation fails. May raise various
210
218
  # subclasses for the appropriate response codes.
211
219
  # @raise [RDF::LDP::Conflict] when the resource exists
212
220
  def create(input, content_type, &block)
@@ -224,7 +232,7 @@ module RDF::LDP
224
232
  ##
225
233
  # @abstract update the resource
226
234
  #
227
- # @param [IO, File, #to_s] input input (usually from a Rack env's
235
+ # @param [IO, File, #to_s] input input (usually from a Rack env's
228
236
  # `rack.input` key) used to determine the Resource's new state.
229
237
  # @param [#to_s] content_type a MIME content_type used to interpret the
230
238
  # input.
@@ -234,7 +242,7 @@ module RDF::LDP
234
242
  # @yieldparam tx [RDF::Transaction]
235
243
  # @return [RDF::LDP::Resource] self
236
244
  #
237
- # @raise [RDF::LDP::RequestError] when update fails. May raise various
245
+ # @raise [RDF::LDP::RequestError] when update fails. May raise various
238
246
  # subclasses for the appropriate response codes.
239
247
  def update(input, content_type, &block)
240
248
  return create(input, content_type, &block) unless exists?
@@ -248,20 +256,20 @@ module RDF::LDP
248
256
  ##
249
257
  # Mark the resource as destroyed.
250
258
  #
251
- # This adds a statment to the metagraph expressing that the resource has
259
+ # This adds a statment to the metagraph expressing that the resource has
252
260
  # been deleted
253
261
  #
254
262
  # @yield gives a transaction (changeset) to collect changes to graph,
255
263
  # metagraph and other resources' (e.g. containers) graphs
256
264
  # @yieldparam tx [RDF::Transaction]
257
265
  # @return [RDF::LDP::Resource] self
258
- #
259
- # @todo Use of owl:Nothing is probably problematic. Define an internal
266
+ #
267
+ # @todo Use of owl:Nothing is probably problematic. Define an internal
260
268
  # namespace and class represeting deletion status as a stateful property.
261
269
  def destroy(&block)
262
270
  @data.transaction do |transaction|
263
271
  containers.each { |c| c.remove(self, transaction) if c.container? }
264
- transaction << RDF::Statement(subject_uri,
272
+ transaction << RDF::Statement(subject_uri,
265
273
  RDF::Vocab::PROV.invalidatedAtTime,
266
274
  DateTime.now,
267
275
  graph_name: metagraph_name)
@@ -273,8 +281,8 @@ module RDF::LDP
273
281
  ##
274
282
  # Gives the status of the resource's existance.
275
283
  #
276
- # @note destroyed resources continue to exist in the sense represeted by
277
- # this method.
284
+ # @note destroyed resources continue to exist in the sense represeted by
285
+ # this method.
278
286
  #
279
287
  # @return [Boolean] true if the resource exists within the repository
280
288
  def exists?
@@ -291,14 +299,14 @@ module RDF::LDP
291
299
  ##
292
300
  # Returns an Etag. This may be a strong or a weak ETag.
293
301
  #
294
- # @return [String] an HTTP Etag
302
+ # @return [String] an HTTP Etag
295
303
  #
296
304
  # @note these etags are strong if (and only if) all software that updates
297
305
  # the resource also updates the ETag
298
306
  #
299
307
  # @see http://www.w3.org/TR/ldp#h-ldpr-gen-etags LDP ETag clause for GET
300
308
  # @see http://www.w3.org/TR/ldp#h-ldpr-put-precond LDP ETag clause for PUT
301
- # @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.3.3
309
+ # @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.3.3
302
310
  # description of strong vs. weak validators
303
311
  def etag
304
312
  return nil unless exists?
@@ -306,13 +314,21 @@ module RDF::LDP
306
314
  end
307
315
 
308
316
  ##
309
- # @return [DateTime] the time this resource was last modified
317
+ # @return [DateTime] the time this resource was last modified; `nil` if the
318
+ # resource doesn't exist and has no modified date
319
+ # @raise [RDF::LDP::RequestError] when the resource exists but is missing a
320
+ # `last_modified'
310
321
  #
311
322
  # @todo handle cases where there is more than one RDF::DC.modified.
312
323
  # check for the most recent date
313
324
  def last_modified
314
325
  results = @metagraph.query([subject_uri, RDF::Vocab::DC.modified, :time])
315
- return nil if results.empty?
326
+
327
+ if results.empty?
328
+ return nil unless exists?
329
+ raise(RequestError, "Missing dc:modified date for #{subject_uri}")
330
+ end
331
+
316
332
  results.first.object.object
317
333
  end
318
334
 
@@ -320,7 +336,7 @@ module RDF::LDP
320
336
  # @param [String] tag a tag to compare to `#etag`
321
337
  # @return [Boolean] whether the given tag matches `#etag`
322
338
  def match?(tag)
323
- tag == etag
339
+ tag == etag
324
340
  end
325
341
 
326
342
  ##
@@ -332,7 +348,7 @@ module RDF::LDP
332
348
  ##
333
349
  # @return [Array<Symbol>] a list of HTTP methods allowed by this resource.
334
350
  def allowed_methods
335
- [:GET, :POST, :PUT, :DELETE, :PATCH, :OPTIONS, :HEAD].select do |m|
351
+ [:GET, :POST, :PUT, :DELETE, :PATCH, :OPTIONS, :HEAD].select do |m|
336
352
  respond_to?(m.downcase, true)
337
353
  end
338
354
  end
@@ -370,10 +386,10 @@ module RDF::LDP
370
386
  end
371
387
 
372
388
  ##
373
- # Runs the request and returns the object's desired HTTP response body,
374
- # conforming to the Rack interfare.
389
+ # Runs the request and returns the object's desired HTTP response body,
390
+ # conforming to the Rack interfare.
375
391
  #
376
- # @see http://www.rubydoc.info/github/rack/rack/master/file/SPEC#The_Body
392
+ # @see http://www.rubydoc.info/github/rack/rack/master/file/SPEC#The_Body
377
393
  # for Rack body documentation
378
394
  def to_response
379
395
  []
@@ -382,55 +398,55 @@ module RDF::LDP
382
398
 
383
399
  ##
384
400
  # Build the response for the HTTP `method` given.
385
- #
401
+ #
386
402
  # The method passed in is symbolized, downcased, and sent to `self` with the
387
403
  # other three parameters.
388
404
  #
389
405
  # Request methods are expected to return an Array appropriate for a Rack
390
- # response; to return this object (e.g. for a sucessful GET) the response
406
+ # response; to return this object (e.g. for a sucessful GET) the response
391
407
  # may be `[status, headers, self]`.
392
408
  #
393
- # If the method given is unimplemented, we understand it to require an HTTP
409
+ # If the method given is unimplemented, we understand it to require an HTTP
394
410
  # 405 response, and throw the appropriate error.
395
411
  #
396
- # @param [#to_sym] method the HTTP request method of the response; this
412
+ # @param [#to_sym] method the HTTP request method of the response; this
397
413
  # message will be downcased and sent to the object.
398
- # @param [Fixnum] status an HTTP response code; this status should be sent
414
+ # @param [Fixnum] status an HTTP response code; this status should be sent
399
415
  # back to the caller or altered, as appropriate.
400
- # @param [Hash<String, String>] headers a hash mapping HTTP headers
401
- # built for the response to their contents; these headers should be sent
416
+ # @param [Hash<String, String>] headers a hash mapping HTTP headers
417
+ # built for the response to their contents; these headers should be sent
402
418
  # back to the caller or altered, as appropriate.
403
419
  # @param [Hash] env the Rack env for the request
404
420
  #
405
- # @return [Array<Fixnum, Hash<String, String>, #each] a new Rack response
421
+ # @return [Array<Fixnum, Hash<String, String>, #each] a new Rack response
406
422
  # array.
407
423
  def request(method, status, headers, env)
408
424
  raise Gone if destroyed?
409
425
  begin
410
426
  send(method.to_sym.downcase, status, headers, env)
411
427
  rescue NotImplementedError => e
412
- raise MethodNotAllowed, method
428
+ raise MethodNotAllowed, method
413
429
  end
414
430
  end
415
431
 
416
432
  private
417
433
 
418
434
  ##
419
- # Generate response for GET requests. Returns existing status and headers,
435
+ # Generate response for GET requests. Returns existing status and headers,
420
436
  # with `self` as the body.
421
437
  def get(status, headers, env)
422
438
  [status, update_headers(headers), self]
423
439
  end
424
440
 
425
441
  ##
426
- # Generate response for HEAD requsets. Adds appropriate headers and returns
442
+ # Generate response for HEAD requsets. Adds appropriate headers and returns
427
443
  # an empty body.
428
444
  def head(status, headers, env)
429
445
  [status, update_headers(headers), []]
430
446
  end
431
447
 
432
448
  ##
433
- # Generate response for OPTIONS requsets. Adds appropriate headers and
449
+ # Generate response for OPTIONS requsets. Adds appropriate headers and
434
450
  # returns an empty body.
435
451
  def options(status, headers, env)
436
452
  [status, update_headers(headers), []]
@@ -475,16 +491,16 @@ module RDF::LDP
475
491
  ##
476
492
  # @return [RDF::URI] the name for this resource's metagraph
477
493
  def metagraph_name
478
- subject_uri / '#meta'
494
+ self.class.metagraph_name(subject_uri)
479
495
  end
480
496
 
481
497
  ##
482
498
  # @param [Hash<String, String>] headers
483
499
  # @return [Hash<String, String>] the updated headers
484
500
  def update_headers(headers)
485
- headers['Link'] =
501
+ headers['Link'] =
486
502
  ([headers['Link']] + link_headers).compact.join(",")
487
-
503
+
488
504
  headers['Allow'] = allowed_methods.join(', ')
489
505
  headers['Accept-Post'] = accept_post if respond_to?(:post, true)
490
506
  headers['Accept-Patch'] = accept_patch if respond_to?(:patch, true)
@@ -511,7 +527,7 @@ module RDF::LDP
511
527
  end
512
528
 
513
529
  ##
514
- # @return [Array<String>] an array of link headers to add to the
530
+ # @return [Array<String>] an array of link headers to add to the
515
531
  # existing ones
516
532
  #
517
533
  # @see http://www.w3.org/TR/ldp/#h-ldpr-gen-linktypehdr
@@ -542,25 +558,25 @@ module RDF::LDP
542
558
  # ask the Repository for the current last_modified to delete the statement
543
559
  # transactionally
544
560
  modified = last_modified
545
- transaction.delete RDF::Statement(subject_uri,
546
- RDF::Vocab::DC.modified,
561
+ transaction.delete RDF::Statement(subject_uri,
562
+ RDF::Vocab::DC.modified,
547
563
  modified,
548
564
  graph_name: metagraph_name) if modified
549
565
 
550
- transaction.insert RDF::Statement(subject_uri,
551
- RDF::Vocab::DC.modified,
566
+ transaction.insert RDF::Statement(subject_uri,
567
+ RDF::Vocab::DC.modified,
552
568
  DateTime.now,
553
569
  graph_name: metagraph_name)
554
570
  else
555
571
  metagraph.update([subject_uri, RDF::Vocab::DC.modified, DateTime.now])
556
- end
572
+ end
557
573
  end
558
574
 
559
575
  ##
560
576
  # Sets the last modified date/time to the URI for this resource's class
561
577
  def set_interaction_model(transaction)
562
- transaction.insert(RDF::Statement(subject_uri,
563
- RDF.type,
578
+ transaction.insert(RDF::Statement(subject_uri,
579
+ RDF.type,
564
580
  self.class.to_uri,
565
581
  graph_name: metagraph.graph_name))
566
582
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdf-ldp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Johnson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-15 00:00:00.000000000 Z
11
+ date: 2016-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack