ldp 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +6 -0
- data/Gemfile +2 -1
- data/README.md +27 -5
- data/Rakefile +5 -0
- data/ldp.gemspec +1 -1
- data/lib/ldp.rb +11 -12
- data/lib/ldp/client.rb +6 -40
- data/lib/ldp/client/methods.rb +44 -0
- data/lib/ldp/container.rb +26 -2
- data/lib/ldp/orm.rb +87 -0
- data/lib/ldp/resource.rb +94 -22
- data/lib/ldp/response.rb +102 -21
- data/lib/ldp/uri.rb +35 -0
- data/lib/ldp/version.rb +1 -1
- data/spec/lib/integration/integration_spec.rb +5 -0
- data/spec/lib/ldp/client_spec.rb +73 -5
- data/spec/lib/ldp/orm/orm_spec.rb +102 -0
- data/spec/lib/ldp/resource_spec.rb +40 -0
- data/spec/lib/ldp/response_spec.rb +128 -0
- data/spec/spec_helper.rb +0 -1
- metadata +31 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 85a6fa5082ce00c5b29780ec58bdc216286a5cfe
|
4
|
+
data.tar.gz: 884e4e0ea864ddf64270eff48c9ae1fca7d7d70b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7061275707496fd834cc225c3fe6ff1ac6eaf7bd8d01ef63677b8fbd30c24c1038a16ee0646c35b59e452f2c988d2c8d908c1c1011c200812dc3b379cbcc7212
|
7
|
+
data.tar.gz: 40a58400110d941f10212a0b56bfa4cca92d0244372a4e7769a9fdda746c7444de04eefac95cf3f04863d4d31b52ab980b25ed5a2c1562b2424113951a1a4c05
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
-
# Ldp
|
1
|
+
# Ldp.rb
|
2
2
|
|
3
|
-
|
3
|
+
[![Build Status](https://travis-ci.org/cbeer/ldp.png?branch=master)](https://travis-ci.org/cbeer/ldp)
|
4
|
+
|
5
|
+
Linked Data Platform client library for Ruby
|
4
6
|
|
5
7
|
## Installation
|
6
8
|
|
7
9
|
Add this line to your application's Gemfile:
|
8
10
|
|
9
|
-
gem 'ldp
|
11
|
+
gem 'ldp'
|
10
12
|
|
11
13
|
And then execute:
|
12
14
|
|
@@ -14,11 +16,31 @@ And then execute:
|
|
14
16
|
|
15
17
|
Or install it yourself as:
|
16
18
|
|
17
|
-
$ gem install ldp
|
19
|
+
$ gem install ldp
|
18
20
|
|
19
21
|
## Usage
|
20
22
|
|
21
|
-
|
23
|
+
```ruby
|
24
|
+
host = 'http://localhost:8080'
|
25
|
+
client = Ldp::Client.new(host)
|
26
|
+
resource = Ldp::Resource.new(client, host + '/rest/node/to/update')
|
27
|
+
orm = Ldp::Orm.new(resource)
|
28
|
+
|
29
|
+
# view the current title(s)
|
30
|
+
orm.orm.value(RDF::DC11.title)
|
31
|
+
|
32
|
+
# update the title
|
33
|
+
orm.graph.delete([orm.resource.subject_uri, RDF::DC11.title, nil])
|
34
|
+
orm.graph.insert([orm.resource.subject_uri, RDF::DC11.title, 'a new title'])
|
35
|
+
|
36
|
+
# save changes
|
37
|
+
orm.save
|
38
|
+
```
|
39
|
+
|
40
|
+
### Fedora Commons notes
|
41
|
+
Due to some discrepancies with alpha version of Fedora Commons, you may need to do some things differently:
|
42
|
+
* [Can't load resources from Fedora 4](https://github.com/cbeer/ldp/issues/1)
|
43
|
+
* [orm.save with an rdf:type doesn't work with Fedora 4.0.0-alpha-3](https://github.com/cbeer/ldp/issues/2)
|
22
44
|
|
23
45
|
## Contributing
|
24
46
|
|
data/Rakefile
CHANGED
data/ldp.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_dependency "faraday"
|
22
|
-
spec.add_dependency "linkeddata"
|
22
|
+
spec.add_dependency "linkeddata", ">= 1.1"
|
23
23
|
spec.add_development_dependency "bundler", "~> 1.3"
|
24
24
|
spec.add_development_dependency "rake"
|
25
25
|
spec.add_development_dependency "rspec"
|
data/lib/ldp.rb
CHANGED
@@ -1,21 +1,20 @@
|
|
1
1
|
require 'ldp/version'
|
2
|
+
require 'linkeddata'
|
2
3
|
|
3
4
|
module Ldp
|
4
|
-
|
5
|
-
|
6
|
-
def self.resource
|
7
|
-
RDF::URI.new("http://www.w3.org/ns/ldp/Resource")
|
8
|
-
end
|
5
|
+
RDF::Graph.send(:include, RDF::Isomorphic)
|
9
6
|
|
10
|
-
|
11
|
-
|
12
|
-
end
|
7
|
+
require 'ldp/client'
|
8
|
+
require 'ldp/uri'
|
13
9
|
|
14
|
-
|
15
|
-
RDF::URI.new("http://www.w3.org/ns/ldp/inlinedResource")
|
16
|
-
end
|
10
|
+
extend Uri
|
17
11
|
|
18
12
|
autoload :Response, 'ldp/response'
|
19
13
|
autoload :Resource, 'ldp/resource'
|
20
14
|
autoload :Container, 'ldp/container'
|
21
|
-
|
15
|
+
|
16
|
+
autoload :Orm, 'ldp/orm'
|
17
|
+
|
18
|
+
class NotFound < StandardError; end
|
19
|
+
|
20
|
+
end
|
data/lib/ldp/client.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
require 'faraday'
|
2
|
-
require 'linkeddata'
|
3
2
|
|
4
3
|
module Ldp
|
5
4
|
class Client
|
5
|
+
|
6
|
+
require 'ldp/client/methods'
|
7
|
+
|
8
|
+
include Ldp::Client::Methods
|
6
9
|
|
7
10
|
attr_reader :http
|
8
11
|
|
@@ -14,10 +17,11 @@ module Ldp
|
|
14
17
|
end
|
15
18
|
end
|
16
19
|
|
20
|
+
# Find or initialize a new LDP resource by URI
|
17
21
|
def find_or_initialize subject
|
18
22
|
data = get(subject)
|
19
23
|
|
20
|
-
|
24
|
+
unless data.is_a? Response
|
21
25
|
raise "#{subject} is not an LDP Resource"
|
22
26
|
end
|
23
27
|
|
@@ -28,43 +32,5 @@ module Ldp
|
|
28
32
|
end
|
29
33
|
end
|
30
34
|
|
31
|
-
def get url
|
32
|
-
resp = http.get do |req|
|
33
|
-
req.url url
|
34
|
-
yield req if block_given?
|
35
|
-
end
|
36
|
-
|
37
|
-
if Response.resource? resp
|
38
|
-
Response.wrap self, resp
|
39
|
-
else
|
40
|
-
resp
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def delete url
|
45
|
-
http.delete do |req|
|
46
|
-
req.url url
|
47
|
-
yield req if block_given?
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def post url, body
|
52
|
-
http.post do |req|
|
53
|
-
req.url url
|
54
|
-
req.headers['Content-Type'] = 'text/turtle'
|
55
|
-
req.body = body
|
56
|
-
yield req if block_given?
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def put url, body
|
61
|
-
http.put do |req|
|
62
|
-
req.url url
|
63
|
-
req.headers['Content-Type'] = 'text/turtle'
|
64
|
-
req.body = body
|
65
|
-
yield req if block_given?
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
35
|
end
|
70
36
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Ldp::Client::Methods
|
2
|
+
|
3
|
+
# Get a LDP Resource by URI
|
4
|
+
def get url
|
5
|
+
resp = http.get do |req|
|
6
|
+
req.url url
|
7
|
+
yield req if block_given?
|
8
|
+
end
|
9
|
+
|
10
|
+
if Ldp::Response.resource? resp
|
11
|
+
Ldp::Response.wrap self, resp
|
12
|
+
else
|
13
|
+
resp
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Delete a LDP Resource by URI
|
18
|
+
def delete url
|
19
|
+
http.delete do |req|
|
20
|
+
req.url url
|
21
|
+
yield req if block_given?
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Post TTL to an LDP Resource
|
26
|
+
def post url, body = nil, headers = {}
|
27
|
+
http.post do |req|
|
28
|
+
req.url url
|
29
|
+
req.headers = {"Content-Type"=>"text/turtle"}.merge headers
|
30
|
+
req.body = body
|
31
|
+
yield req if block_given?
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Update an LDP resource with TTL by URI
|
36
|
+
def put url, body
|
37
|
+
http.put do |req|
|
38
|
+
req.url url
|
39
|
+
req.headers['Content-Type'] = 'text/turtle'
|
40
|
+
req.body = body
|
41
|
+
yield req if block_given?
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/ldp/container.rb
CHANGED
@@ -1,7 +1,31 @@
|
|
1
1
|
module Ldp
|
2
2
|
class Container < Resource
|
3
|
-
|
4
|
-
|
3
|
+
##
|
4
|
+
# Add a resource to the LDP container
|
5
|
+
def add *args
|
6
|
+
# slug, graph
|
7
|
+
# graph
|
8
|
+
# slug
|
9
|
+
|
10
|
+
case
|
11
|
+
when (args.length > 2 || args.length == 0)
|
12
|
+
|
13
|
+
when (args.length == 2)
|
14
|
+
slug, graph = args
|
15
|
+
when (args.first.is_a? RDF::Graph)
|
16
|
+
slug = nil
|
17
|
+
graph = args.first
|
18
|
+
else
|
19
|
+
slug = args.first
|
20
|
+
graph = RDF::Graph.new
|
21
|
+
end
|
22
|
+
|
23
|
+
resp = client.post subject, graph.dump(:ttl) do |req|
|
24
|
+
req.headers['Slug'] = slug
|
25
|
+
end
|
26
|
+
|
27
|
+
subject = resp.headers['Location']
|
28
|
+
return client.find_or_initialize subject
|
5
29
|
end
|
6
30
|
end
|
7
31
|
end
|
data/lib/ldp/orm.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
module Ldp
|
2
|
+
class Orm
|
3
|
+
|
4
|
+
attr_reader :resource
|
5
|
+
attr_reader :last_response
|
6
|
+
|
7
|
+
def initialize resource
|
8
|
+
@resource = resource
|
9
|
+
end
|
10
|
+
|
11
|
+
def graph
|
12
|
+
resource.graph
|
13
|
+
end
|
14
|
+
|
15
|
+
def value predicate
|
16
|
+
graph.query(:subject => resource.subject_uri, :predicate => predicate).map do |stmt|
|
17
|
+
stmt.object
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def query *args, &block
|
22
|
+
graph.query *args, &block
|
23
|
+
end
|
24
|
+
|
25
|
+
def reload
|
26
|
+
Ldp::Orm.new resource.reload
|
27
|
+
end
|
28
|
+
|
29
|
+
def create
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
|
33
|
+
def save
|
34
|
+
@last_response = resource.update
|
35
|
+
|
36
|
+
diff = Ldp::Resource.check_for_differences_and_reload_resource self
|
37
|
+
|
38
|
+
if diff.any?
|
39
|
+
diff
|
40
|
+
else
|
41
|
+
@last_response.success?
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def save!
|
46
|
+
result = save
|
47
|
+
|
48
|
+
if result.is_a? RDF::Graph
|
49
|
+
raise GraphDifferenceException.new "", result
|
50
|
+
elsif !result
|
51
|
+
raise SaveException.new "", @last_response
|
52
|
+
end
|
53
|
+
|
54
|
+
result
|
55
|
+
end
|
56
|
+
|
57
|
+
def delete
|
58
|
+
resource.delete
|
59
|
+
end
|
60
|
+
|
61
|
+
def method_missing meth, *args, &block
|
62
|
+
super
|
63
|
+
end
|
64
|
+
|
65
|
+
def respond_to?(meth)
|
66
|
+
super
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
class GraphDifferenceException < Exception
|
72
|
+
attr_reader :diff
|
73
|
+
def initialize message, diff
|
74
|
+
super(message)
|
75
|
+
@diff = diff
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class SaveException < Exception
|
80
|
+
attr_reader :response
|
81
|
+
def initialize message, response
|
82
|
+
super(message)
|
83
|
+
@response = response
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
data/lib/ldp/resource.rb
CHANGED
@@ -1,11 +1,81 @@
|
|
1
1
|
module Ldp
|
2
2
|
class Resource
|
3
|
+
|
3
4
|
attr_reader :client, :subject
|
4
5
|
|
5
|
-
|
6
|
+
##
|
7
|
+
# Create a new LDP resource with a blank RDF graph
|
8
|
+
def self.create client, subject
|
9
|
+
self.new client, subject, RDF::Graph.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize client, subject, graph_or_response = nil
|
6
13
|
@client = client
|
7
14
|
@subject = subject
|
8
|
-
|
15
|
+
|
16
|
+
@graph = graph_or_response if graph_or_response.is_a? RDF::Graph
|
17
|
+
@get = graph_or_response if graph_or_response.is_a? Ldp::Response
|
18
|
+
end
|
19
|
+
|
20
|
+
##
|
21
|
+
# Get the graph subject as a URI
|
22
|
+
def subject_uri
|
23
|
+
@subject_uri ||= RDF::URI.new subject
|
24
|
+
end
|
25
|
+
|
26
|
+
##
|
27
|
+
# Reload the LDP resource
|
28
|
+
def reload
|
29
|
+
Ldp::Resource.new client, subject
|
30
|
+
end
|
31
|
+
|
32
|
+
##
|
33
|
+
# Is the resource new, or does it exist in the LDP server?
|
34
|
+
def new?
|
35
|
+
get
|
36
|
+
end
|
37
|
+
|
38
|
+
##
|
39
|
+
# Have we retrieved the content already?
|
40
|
+
def retrieved_content?
|
41
|
+
@get
|
42
|
+
end
|
43
|
+
|
44
|
+
##
|
45
|
+
# Get the resource
|
46
|
+
def get
|
47
|
+
@get ||= client.get(subject).tap do |result|
|
48
|
+
raise NotFound if result.status == 404
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
##
|
53
|
+
# Delete the resource
|
54
|
+
def delete
|
55
|
+
client.delete subject do |req|
|
56
|
+
req.headers['If-Match'] = get.etag if retrieved_content?
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
##
|
61
|
+
# Create a new resource at the URI
|
62
|
+
def create
|
63
|
+
raise "" if new?
|
64
|
+
resp = client.post '', graph.dump(:ttl) do |req|
|
65
|
+
req.headers['Slug'] = subject
|
66
|
+
end
|
67
|
+
|
68
|
+
@subject = resp.headers['Location']
|
69
|
+
@subject_uri = nil
|
70
|
+
end
|
71
|
+
|
72
|
+
##
|
73
|
+
# Update the stored graph
|
74
|
+
def update new_graph = nil
|
75
|
+
new_graph ||= graph
|
76
|
+
client.put subject, new_graph.dump(:ttl) do |req|
|
77
|
+
req.headers['If-Match'] = get.etag if retrieved_content?
|
78
|
+
end
|
9
79
|
end
|
10
80
|
|
11
81
|
def graph
|
@@ -14,11 +84,11 @@ module Ldp
|
|
14
84
|
|
15
85
|
inlinedResources = get.graph.query(:predicate => Ldp.inlinedResource).map { |x| x.object }
|
16
86
|
|
17
|
-
unless
|
87
|
+
unless inlinedResources.empty?
|
18
88
|
new_graph = RDF::Graph.new
|
19
89
|
|
20
90
|
original_graph.each_statement do |s|
|
21
|
-
unless
|
91
|
+
unless inlinedResources.include? s.subject
|
22
92
|
new_graph << s
|
23
93
|
end
|
24
94
|
end
|
@@ -30,29 +100,31 @@ module Ldp
|
|
30
100
|
end
|
31
101
|
end
|
32
102
|
|
33
|
-
def
|
34
|
-
|
35
|
-
end
|
103
|
+
def self.check_for_differences_and_reload_resource old_object
|
104
|
+
new_object = old_object.reload
|
36
105
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
106
|
+
bijection = new_object.graph.bijection_to(old_object.graph)
|
107
|
+
diff = RDF::Graph.new
|
108
|
+
|
109
|
+
old_object.graph.each do |statement|
|
110
|
+
if statement.has_blank_nodes?
|
111
|
+
subject = bijection.fetch(statement.subject, false) if statement.subject.node?
|
112
|
+
object = bijection.fetch(statement.object, false) if statement.object.node?
|
113
|
+
bijection_statement = RDF::Statement.new :subject => subject || statemnet.subject, :predicate => statement.predicate, :object => object || statement.object
|
114
|
+
|
115
|
+
diff << statement if subject === false or object === false or new_object.graph.has_statement?(bijection_statement)
|
116
|
+
elsif !new_object.graph.has_statement? statement
|
117
|
+
diff << statement
|
41
118
|
end
|
42
119
|
end
|
43
120
|
|
44
|
-
|
45
|
-
@graph = nil
|
121
|
+
diff
|
46
122
|
end
|
47
123
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
end
|
53
|
-
end
|
54
|
-
@get = nil
|
55
|
-
@graph = nil
|
124
|
+
##
|
125
|
+
# Reload this resource as an LDP container
|
126
|
+
def as_container
|
127
|
+
Ldp::Container.new client, subject, @graph || @get
|
56
128
|
end
|
57
129
|
end
|
58
|
-
end
|
130
|
+
end
|
data/lib/ldp/response.rb
CHANGED
@@ -1,17 +1,22 @@
|
|
1
1
|
module Ldp
|
2
2
|
module Response
|
3
|
+
|
4
|
+
##
|
5
|
+
# Wrap the raw Faraday respone with our LDP extensions
|
3
6
|
def self.wrap client, raw_resp
|
4
7
|
raw_resp.send(:extend, Ldp::Response)
|
5
8
|
raw_resp.ldp_client = client
|
6
9
|
raw_resp
|
7
10
|
end
|
8
11
|
|
12
|
+
##
|
13
|
+
# Extract the Link: headers from the HTTP resource
|
9
14
|
def self.links raw_resp
|
10
|
-
|
15
|
+
h = Hash.new { |hash, key| hash[key] = [] }
|
16
|
+
Array(raw_resp.headers["Link"]).map { |x| x.split(", ") }.flatten.inject(h) do |memo, header|
|
11
17
|
v = header.scan(/(.*);\s?rel="([^"]+)"/)
|
12
18
|
|
13
19
|
if v.length == 1
|
14
|
-
memo[v.first.last] ||= []
|
15
20
|
memo[v.first.last] << v.first.first
|
16
21
|
end
|
17
22
|
|
@@ -19,25 +24,63 @@ module Ldp
|
|
19
24
|
end
|
20
25
|
end
|
21
26
|
|
27
|
+
##
|
28
|
+
# Is the response an LDP resource?
|
22
29
|
def self.resource? raw_resp
|
23
|
-
links(raw_resp).fetch("type", []).include? Ldp.resource
|
30
|
+
links(raw_resp).fetch("type", []).include? Ldp.resource.to_s
|
31
|
+
end
|
32
|
+
|
33
|
+
##
|
34
|
+
# Is the response an LDP resource?
|
35
|
+
def resource?
|
36
|
+
Ldp::Response.resource?(self)
|
37
|
+
end
|
38
|
+
|
39
|
+
##
|
40
|
+
# Is the response an LDP container
|
41
|
+
def container?
|
42
|
+
graph.has_statement? RDF::Statement.new(subject, RDF.type, Ldp.container)
|
24
43
|
end
|
25
44
|
|
45
|
+
##
|
46
|
+
# Get the subject for the response
|
47
|
+
def subject
|
48
|
+
@subject ||= if has_page?
|
49
|
+
graph.first_object [page_subject, Ldp.page_of, nil]
|
50
|
+
else
|
51
|
+
page_subject
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
##
|
56
|
+
# Get the URI to the response
|
57
|
+
def page_subject
|
58
|
+
@page_subject ||= RDF::URI.new env[:url]
|
59
|
+
end
|
60
|
+
|
61
|
+
##
|
62
|
+
# Set the LDP client for this resource
|
26
63
|
def ldp_client= client
|
27
64
|
@ldp_client = client
|
28
65
|
end
|
29
66
|
|
67
|
+
##
|
68
|
+
# Get the LDP client
|
30
69
|
def ldp_client
|
31
70
|
@ldp_client
|
32
71
|
end
|
33
72
|
|
73
|
+
##
|
74
|
+
# Get the graph for the resource (or a blank graph if there is no metadata for the resource)
|
34
75
|
def graph
|
35
76
|
@graph ||= begin
|
36
77
|
graph = RDF::Graph.new
|
37
78
|
|
38
|
-
|
39
|
-
|
40
|
-
|
79
|
+
if resource?
|
80
|
+
RDF::Reader.for(:ttl).new(StringIO.new(body), :base_uri => page_subject) do |reader|
|
81
|
+
reader.each_statement do |s|
|
82
|
+
graph << s
|
83
|
+
end
|
41
84
|
end
|
42
85
|
end
|
43
86
|
|
@@ -45,52 +88,90 @@ module Ldp
|
|
45
88
|
end
|
46
89
|
end
|
47
90
|
|
91
|
+
##
|
92
|
+
# Extract the ETag for the resource
|
48
93
|
def etag
|
49
|
-
|
94
|
+
headers['ETag']
|
50
95
|
end
|
51
96
|
|
97
|
+
##
|
98
|
+
# Extract the last modified header for the resource
|
52
99
|
def last_modified
|
53
|
-
|
100
|
+
headers['Last-Modified']
|
54
101
|
end
|
55
102
|
|
103
|
+
##
|
104
|
+
# Statements about the page
|
56
105
|
def page
|
106
|
+
@page_graph ||= begin
|
107
|
+
g = RDF::Graph.new
|
108
|
+
|
109
|
+
if resource?
|
110
|
+
res = graph.query RDF::Statement.new(page_subject, nil, nil)
|
57
111
|
|
112
|
+
res.each_statement do |s|
|
113
|
+
g << s
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
g
|
118
|
+
end
|
58
119
|
end
|
59
120
|
|
60
|
-
|
121
|
+
##
|
122
|
+
# Is the response paginated?
|
123
|
+
def has_page?
|
124
|
+
graph.has_statement? RDF::Statement.new(page_subject, RDF.type, Ldp.page)
|
125
|
+
end
|
61
126
|
|
127
|
+
##
|
128
|
+
# Is there a next page?
|
129
|
+
def has_next?
|
130
|
+
next_page != nil
|
62
131
|
end
|
63
132
|
|
133
|
+
##
|
134
|
+
# Get the URI for the next page
|
64
135
|
def next_page
|
65
|
-
|
136
|
+
graph.first_object [page_subject, Ldp.nextPage, nil]
|
66
137
|
end
|
67
138
|
|
139
|
+
##
|
140
|
+
# Get the URI to the first page
|
68
141
|
def first_page
|
69
|
-
|
142
|
+
if links['first']
|
143
|
+
RDF::URI.new links['first']
|
144
|
+
elsif graph.has_statement? RDf::Statement.new(page_subject, Ldp.nextPage, nil)
|
145
|
+
subject
|
146
|
+
end
|
70
147
|
end
|
71
148
|
|
149
|
+
##
|
150
|
+
# Get a list of inlined resources
|
72
151
|
def resources
|
73
|
-
|
152
|
+
graph.query RDF::Statement.new(page_subject, Ldp.inlinedResource, nil)
|
74
153
|
end
|
75
154
|
|
155
|
+
##
|
156
|
+
# Get a list of member resources
|
76
157
|
def members
|
77
|
-
|
78
|
-
end
|
79
|
-
|
80
|
-
def resource?
|
81
|
-
Ldp::Response.resource?(self)
|
158
|
+
graph.query RDF::Statement.new(page_subject, membership_predicate, nil)
|
82
159
|
end
|
83
160
|
|
84
|
-
|
85
|
-
|
161
|
+
##
|
162
|
+
# Predicate to use to determine container membership
|
163
|
+
def membership_predicate
|
164
|
+
graph.first_object [page_subject, Ldp.membership_predicate, nil]
|
86
165
|
end
|
87
166
|
|
88
167
|
def sort
|
89
168
|
|
90
169
|
end
|
91
170
|
|
92
|
-
|
93
|
-
|
171
|
+
##
|
172
|
+
# Link: headers from the HTTP response
|
173
|
+
def links
|
174
|
+
Ldp::Response.links(self)
|
94
175
|
end
|
95
176
|
end
|
96
177
|
end
|
data/lib/ldp/uri.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
module Ldp::Uri
|
2
|
+
|
3
|
+
def uri str
|
4
|
+
RDF::URI.new("http://www.w3.org/ns/ldp#") + str
|
5
|
+
end
|
6
|
+
|
7
|
+
def resource
|
8
|
+
uri("Resource")
|
9
|
+
end
|
10
|
+
|
11
|
+
def container
|
12
|
+
uri("Container")
|
13
|
+
end
|
14
|
+
|
15
|
+
def page
|
16
|
+
uri("Page")
|
17
|
+
end
|
18
|
+
|
19
|
+
def page_of
|
20
|
+
uri("pageOf")
|
21
|
+
end
|
22
|
+
|
23
|
+
def next_page
|
24
|
+
uri("nextPage")
|
25
|
+
end
|
26
|
+
|
27
|
+
def inlinedResource
|
28
|
+
uri("inlinedResource")
|
29
|
+
end
|
30
|
+
|
31
|
+
def membership_predicate
|
32
|
+
uri("membershipPredicate")
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
data/lib/ldp/version.rb
CHANGED
data/spec/lib/ldp/client_spec.rb
CHANGED
@@ -6,6 +6,14 @@ describe "Ldp::Client" do
|
|
6
6
|
graph.dump(:ttl)
|
7
7
|
end
|
8
8
|
|
9
|
+
|
10
|
+
let(:paginatedGraph) do
|
11
|
+
graph = RDF::Graph.new << [RDF::URI.new(""), RDF::DC.title, "Hello, world!"]
|
12
|
+
graph << [RDF::URI.new("?firstPage"), RDF.type, Ldp.page]
|
13
|
+
graph << [RDF::URI.new("?firstPage"), Ldp.page_of, RDF::URI.new("")]
|
14
|
+
graph.dump(:ttl)
|
15
|
+
end
|
16
|
+
|
9
17
|
let(:simple_container_graph) do
|
10
18
|
graph = RDF::Graph.new << [RDF::URI.new(""), RDF.type, Ldp.container]
|
11
19
|
graph.dump(:ttl)
|
@@ -13,9 +21,11 @@ describe "Ldp::Client" do
|
|
13
21
|
|
14
22
|
let(:conn_stubs) do
|
15
23
|
stubs = Faraday::Adapter::Test::Stubs.new do |stub|
|
16
|
-
stub.get('/a_resource') {[ 200, {"Link" => "http://www.w3.org/ns/ldp
|
17
|
-
stub.get('/a_container') {[ 200, {"Link" => "http://www.w3.org/ns/ldp
|
18
|
-
|
24
|
+
stub.get('/a_resource') {[ 200, {"Link" => "http://www.w3.org/ns/ldp#Resource;rel=\"type\""}, simple_graph ]}
|
25
|
+
stub.get('/a_container') {[ 200, {"Link" => "http://www.w3.org/ns/ldp#Resource;rel=\"type\""}, simple_container_graph ]}
|
26
|
+
stub.put("/a_resource") { [204]}
|
27
|
+
stub.delete("/a_resource") { [204]}
|
28
|
+
stub.post("/a_container") { [201, {"Location" => "http://example.com/a_container/subresource"}]}
|
19
29
|
end
|
20
30
|
end
|
21
31
|
|
@@ -53,11 +63,69 @@ describe "Ldp::Client" do
|
|
53
63
|
expect(resp.resource?).to be_true
|
54
64
|
end
|
55
65
|
|
56
|
-
|
66
|
+
it "should accept a block to change the HTTP request" do
|
67
|
+
expect { |b| subject.get "a_resource", &b }.to yield_control
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "delete" do
|
72
|
+
it "should DELETE the subject from the HTTP endpoint" do
|
73
|
+
resp = subject.delete "a_resource"
|
74
|
+
expect(resp.status).to eq(204)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should accept a block to change the HTTP request" do
|
78
|
+
expect { |b| subject.delete "a_resource", &b }.to yield_control
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "post" do
|
83
|
+
it "should POST to the subject at the HTTP endpoint" do
|
84
|
+
resp = subject.post "a_container"
|
85
|
+
expect(resp.status).to eq(201)
|
86
|
+
expect(resp.headers[:Location]).to eq("http://example.com/a_container/subresource")
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should set content" do
|
90
|
+
subject.post "a_container", 'foo' do |req|
|
91
|
+
expect(req.body).to eq 'foo'
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should set default Content-type" do
|
96
|
+
subject.post "a_container", 'foo' do |req|
|
97
|
+
expect(req.headers).to eq({ "Content-Type" => "text/turtle" })
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should set headers" do
|
102
|
+
subject.post "a_container", 'foo', {'Content-Type' => 'application/pdf'} do |req|
|
103
|
+
expect(req.headers).to eq({ "Content-Type" => "application/pdf" })
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should set headers passed as arguments" do
|
108
|
+
resp = subject.post "a_container"
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should accept a block to change the HTTP request" do
|
112
|
+
expect { |b| subject.post "a_container", &b }.to yield_control
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
describe "put" do
|
118
|
+
it "should PUT content to the subject at the HTTP endpoint" do
|
119
|
+
resp = subject.put "a_resource", "some-payload"
|
120
|
+
expect(resp.status).to eq(204)
|
121
|
+
end
|
57
122
|
|
123
|
+
it "should accept a block to change the HTTP request" do
|
124
|
+
expect { |b| subject.put "a_resource", "some-payload", &b }.to yield_control
|
58
125
|
end
|
59
126
|
end
|
60
127
|
|
128
|
+
|
61
129
|
describe "find_or_initialize" do
|
62
130
|
it "should be a resource" do
|
63
131
|
resource = subject.find_or_initialize "a_resource"
|
@@ -71,4 +139,4 @@ describe "Ldp::Client" do
|
|
71
139
|
end
|
72
140
|
|
73
141
|
end
|
74
|
-
end
|
142
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ldp::Orm do
|
4
|
+
subject { Ldp::Orm.new test_resource }
|
5
|
+
|
6
|
+
let(:simple_graph) do
|
7
|
+
graph = RDF::Graph.new << [RDF::URI.new(""), RDF::DC.title, "Hello, world!"]
|
8
|
+
graph.dump(:ttl)
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:conn_stubs) do
|
12
|
+
stubs = Faraday::Adapter::Test::Stubs.new do |stub|
|
13
|
+
stub.get('/a_resource') {[ 200, {"Link" => "http://www.w3.org/ns/ldp#Resource;rel=\"type\""}, simple_graph ]}
|
14
|
+
stub.put("/a_resource") { [204]}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
let(:mock_conn) do
|
19
|
+
test = Faraday.new do |builder|
|
20
|
+
builder.adapter :test, conn_stubs do |stub|
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
let :mock_client do
|
26
|
+
Ldp::Client.new mock_conn
|
27
|
+
end
|
28
|
+
|
29
|
+
let :test_resource do
|
30
|
+
Ldp::Resource.new mock_client, "http://example.com/a_resource"
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "#delete" do
|
34
|
+
it "should delete the LDP resource" do
|
35
|
+
test_resource.should_receive(:delete)
|
36
|
+
subject.delete
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#create" do
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#save" do
|
45
|
+
it "should update the resource from the graph" do
|
46
|
+
expect(subject.save).to be_true
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should provide a graph of differences if the post-save graph doesn't match our graph" do
|
50
|
+
subject.graph << RDF::Statement.new(:subject => subject.resource.subject_uri, :predicate => RDF::URI.new("info:some-predicate"), :object => RDF::Literal.new("xyz"))
|
51
|
+
result = subject.save
|
52
|
+
expect(result).to_not be_empty
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should return false if the response was not successful" do
|
56
|
+
conn_stubs.instance_variable_get(:@stack)[:put] = [] # erases the stubs for :put
|
57
|
+
conn_stubs.put('/a_resource') {[412]}
|
58
|
+
expect(subject.save).to be_false
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#save!" do
|
63
|
+
it "should raise an exception if there are differences after saving the graph" do
|
64
|
+
subject.graph << RDF::Statement.new(:subject => subject.resource.subject_uri, :predicate => RDF::URI.new("info:some-predicate"), :object => RDF::Literal.new("xyz"))
|
65
|
+
expect { subject.save! }.to raise_exception(Ldp::GraphDifferenceException)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should raise an exception if the ETag didn't match" do
|
69
|
+
conn_stubs.instance_variable_get(:@stack)[:put] = [] # erases the stubs for :put
|
70
|
+
conn_stubs.put('/a_resource') {[412, {}, "Bad If-Match header value: 'ae43aa934dc4f4e15ea1b4dd1ca7a56791972836'"]}
|
71
|
+
expect { subject.save! }.to raise_exception(Ldp::SaveException)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "#value" do
|
76
|
+
it "should provide a convenience method for retrieving values" do
|
77
|
+
expect(subject.value(RDF::DC.title).first.to_s).to eq "Hello, world!"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "#reload" do
|
82
|
+
before do
|
83
|
+
updated_graph = RDF::Graph.new << [RDF::URI.new(""), RDF::DC.title, "Hello again, world!"]
|
84
|
+
conn_stubs.get('/a_resource') {[200,
|
85
|
+
{"Link" => "http://www.w3.org/ns/ldp#Resource;rel=\"type\"",
|
86
|
+
"ETag" => "new-tag"},
|
87
|
+
updated_graph.dump(:ttl)]}
|
88
|
+
end
|
89
|
+
|
90
|
+
it "loads the new values" do
|
91
|
+
old_value = subject.value(RDF::DC.title).first.to_s
|
92
|
+
reloaded = subject.reload
|
93
|
+
expect(reloaded.value(RDF::DC.title).first.to_s).not_to eq old_value
|
94
|
+
end
|
95
|
+
|
96
|
+
it "uses the new ETag" do
|
97
|
+
old_tag = subject.resource.get.etag
|
98
|
+
reloaded = subject.reload
|
99
|
+
expect(reloaded.resource.get.etag).not_to eq old_tag
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ldp::Resource do
|
4
|
+
subject { Ldp::Resource.new(mock_client, path) }
|
5
|
+
|
6
|
+
let(:conn_stubs) do
|
7
|
+
stubs = Faraday::Adapter::Test::Stubs.new do |stub|
|
8
|
+
stub.get('/not_found_resource') { [404] }
|
9
|
+
stub.get('/a_resource') { [200] }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:mock_conn) do
|
14
|
+
test = Faraday.new do |builder|
|
15
|
+
builder.adapter :test, conn_stubs do |stub|
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
let :mock_client do
|
21
|
+
Ldp::Client.new mock_conn
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#get" do
|
25
|
+
context "when the resource is not in repository" do
|
26
|
+
let(:path) { '/not_found_resource' }
|
27
|
+
it "should raise an error" do
|
28
|
+
expect{ subject.get }.to raise_error Ldp::NotFound
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "when the resource is in the repository" do
|
33
|
+
let(:path) { '/a_resource' }
|
34
|
+
it "should get the response" do
|
35
|
+
expect(subject.get).to be_kind_of Faraday::Response
|
36
|
+
expect(subject.get.status).to eq 200
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Ldp::Response do
|
4
|
+
LDP_RESOURCE_HEADERS = { "Link" => Ldp.resource.to_s + ";rel=\"type\""}
|
5
|
+
|
6
|
+
let(:mock_response) { double() }
|
7
|
+
let(:mock_client) { double(Ldp::Client) }
|
8
|
+
|
9
|
+
subject do
|
10
|
+
Ldp::Response.wrap mock_client, mock_response
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ".wrap" do
|
14
|
+
it "should mixin Ldp::Response into the raw response" do
|
15
|
+
Ldp::Response.wrap(mock_client, mock_response)
|
16
|
+
expect(mock_response).to be_a_kind_of(Ldp::Response)
|
17
|
+
expect(mock_response.ldp_client).to eq(mock_client)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe ".links" do
|
22
|
+
it "should extract link headers with relations as a hash" do
|
23
|
+
mock_response.stub(:headers => {
|
24
|
+
"Link" => [
|
25
|
+
"xyz;rel=\"some-rel\"",
|
26
|
+
"abc;rel=\"some-multi-rel\"",
|
27
|
+
"123;rel=\"some-multi-rel\"",
|
28
|
+
"vanilla-link"
|
29
|
+
]
|
30
|
+
})
|
31
|
+
h = Ldp::Response.links mock_response
|
32
|
+
|
33
|
+
expect(h['some-rel']).to include("xyz")
|
34
|
+
expect(h['some-multi-rel']).to include("abc", "123")
|
35
|
+
expect(h['doesnt-exist']).to be_empty
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should return an empty hash if no link headers are availabe" do
|
39
|
+
mock_response.stub(:headers => {})
|
40
|
+
h = Ldp::Response.links mock_response
|
41
|
+
|
42
|
+
expect(h).to be_empty
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
describe ".resource?" do
|
48
|
+
it "should be a resource if a Link[rel=type] header asserts it is an ldp:resource" do
|
49
|
+
mock_response.stub(:headers => {
|
50
|
+
"Link" => [
|
51
|
+
"#{Ldp.resource};rel=\"type\""
|
52
|
+
]
|
53
|
+
})
|
54
|
+
expect(Ldp::Response.resource? mock_response).to be_true
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#graph" do
|
59
|
+
it "should parse the response body for an RDF graph" do
|
60
|
+
mock_response.stub :body => "<> <info:b> <info:c> .", :headers => LDP_RESOURCE_HEADERS
|
61
|
+
subject.stub :page_subject => RDF::URI.new('info:a')
|
62
|
+
graph = subject.graph
|
63
|
+
|
64
|
+
expect(graph).to have_subject(RDF::URI.new("info:a"))
|
65
|
+
expect(graph).to have_statement RDF::Statement.new(RDF::URI.new("info:a"), RDF::URI.new("info:b"), RDF::URI.new("info:c"))
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "#etag" do
|
71
|
+
it "should pass through the response's ETag" do
|
72
|
+
mock_response.stub :headers => { 'ETag' => 'xyz'}
|
73
|
+
|
74
|
+
expect(subject.etag).to eq('xyz')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "#last_modified" do
|
79
|
+
it "should pass through the response's Last-Modified" do
|
80
|
+
mock_response.stub :headers => { 'Last-Modified' => 'some-date'}
|
81
|
+
expect(subject.last_modified).to eq('some-date')
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "#has_page" do
|
86
|
+
it "should see if the response has an ldp:Page statement" do
|
87
|
+
graph = RDF::Graph.new
|
88
|
+
|
89
|
+
subject.stub :page_subject => RDF::URI.new('info:a')
|
90
|
+
|
91
|
+
graph << [RDF::URI.new('info:a'), RDF.type, Ldp.page]
|
92
|
+
|
93
|
+
mock_response.stub :body => graph.dump(:ttl), :headers => LDP_RESOURCE_HEADERS
|
94
|
+
|
95
|
+
expect(subject).to have_page
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should be false otherwise" do
|
99
|
+
subject.stub :page_subject => RDF::URI.new('info:a')
|
100
|
+
mock_response.stub :body => '', :headers => LDP_RESOURCE_HEADERS
|
101
|
+
expect(subject).not_to have_page
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "#page" do
|
106
|
+
it "should get the ldp:Page data from the query" do
|
107
|
+
graph = RDF::Graph.new
|
108
|
+
|
109
|
+
subject.stub :page_subject => RDF::URI.new('info:a')
|
110
|
+
|
111
|
+
graph << [RDF::URI.new('info:a'), RDF.type, Ldp.page]
|
112
|
+
graph << [RDF::URI.new('info:b'), RDF.type, Ldp.page]
|
113
|
+
|
114
|
+
mock_response.stub :body => graph.dump(:ttl), :headers => LDP_RESOURCE_HEADERS
|
115
|
+
|
116
|
+
expect(subject.page.count).to eq(1)
|
117
|
+
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe "#subject" do
|
122
|
+
it "should extract the HTTP request URI as an RDF URI" do
|
123
|
+
mock_response.stub :body => '', :headers => LDP_RESOURCE_HEADERS
|
124
|
+
mock_response.stub :env => { :url => 'http://xyz/a'}
|
125
|
+
expect(subject.subject).to eq(RDF::URI.new("http://xyz/a"))
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,83 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ldp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Beer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: linkeddata
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '1.1'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '1.1'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - ~>
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '1.3'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ~>
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.3'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
description: Linked Data Platform client library
|
@@ -87,7 +87,8 @@ executables: []
|
|
87
87
|
extensions: []
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
|
-
- .gitignore
|
90
|
+
- ".gitignore"
|
91
|
+
- ".travis.yml"
|
91
92
|
- Gemfile
|
92
93
|
- LICENSE.txt
|
93
94
|
- README.md
|
@@ -95,11 +96,18 @@ files:
|
|
95
96
|
- ldp.gemspec
|
96
97
|
- lib/ldp.rb
|
97
98
|
- lib/ldp/client.rb
|
99
|
+
- lib/ldp/client/methods.rb
|
98
100
|
- lib/ldp/container.rb
|
101
|
+
- lib/ldp/orm.rb
|
99
102
|
- lib/ldp/resource.rb
|
100
103
|
- lib/ldp/response.rb
|
104
|
+
- lib/ldp/uri.rb
|
101
105
|
- lib/ldp/version.rb
|
106
|
+
- spec/lib/integration/integration_spec.rb
|
102
107
|
- spec/lib/ldp/client_spec.rb
|
108
|
+
- spec/lib/ldp/orm/orm_spec.rb
|
109
|
+
- spec/lib/ldp/resource_spec.rb
|
110
|
+
- spec/lib/ldp/response_spec.rb
|
103
111
|
- spec/spec_helper.rb
|
104
112
|
homepage: ''
|
105
113
|
licenses:
|
@@ -111,20 +119,25 @@ require_paths:
|
|
111
119
|
- lib
|
112
120
|
required_ruby_version: !ruby/object:Gem::Requirement
|
113
121
|
requirements:
|
114
|
-
- -
|
122
|
+
- - ">="
|
115
123
|
- !ruby/object:Gem::Version
|
116
124
|
version: '0'
|
117
125
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
126
|
requirements:
|
119
|
-
- -
|
127
|
+
- - ">="
|
120
128
|
- !ruby/object:Gem::Version
|
121
129
|
version: '0'
|
122
130
|
requirements: []
|
123
131
|
rubyforge_project:
|
124
|
-
rubygems_version: 2.
|
132
|
+
rubygems_version: 2.2.2
|
125
133
|
signing_key:
|
126
134
|
specification_version: 4
|
127
135
|
summary: Linked Data Platform client library
|
128
136
|
test_files:
|
137
|
+
- spec/lib/integration/integration_spec.rb
|
129
138
|
- spec/lib/ldp/client_spec.rb
|
139
|
+
- spec/lib/ldp/orm/orm_spec.rb
|
140
|
+
- spec/lib/ldp/resource_spec.rb
|
141
|
+
- spec/lib/ldp/response_spec.rb
|
130
142
|
- spec/spec_helper.rb
|
143
|
+
has_rdoc:
|