ldp 0.0.5 → 0.0.6
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.
- checksums.yaml +4 -4
- data/ldp.gemspec +1 -1
- data/lib/ldp/resource.rb +17 -3
- data/lib/ldp/resource/binary_source.rb +2 -2
- data/lib/ldp/resource/rdf_source.rb +2 -2
- data/lib/ldp/response.rb +11 -3
- data/lib/ldp/version.rb +1 -1
- data/spec/lib/ldp/client_spec.rb +3 -3
- data/spec/lib/ldp/orm/orm_spec.rb +5 -5
- data/spec/lib/ldp/resource/rdf_source_spec.rb +3 -3
- data/spec/lib/ldp/resource_spec.rb +45 -6
- data/spec/lib/ldp/response_spec.rb +26 -21
- data/spec/spec_helper.rb +0 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8f3d184e1548ea9060af3c059322168f6753e13
|
4
|
+
data.tar.gz: 69d0817c390fbcbff78fb98adf180ddd1e0be33b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aab3b961a934cd34e826a6504c079e2531826fbfe0b6b4b13ca63e0cb6f3edefdc6595be6931994f471605c96097e5309dd13116d3dcbe86ec259dc7b9629e3f
|
7
|
+
data.tar.gz: 0f8212e7fd4e83f494cda059ad2acb6395129b239a36df47d8abdb7d9d67ad93bb7377d1675f1a0cd2f70a4552cedd65553477ebe2016bf27cffdea53178364e
|
data/ldp.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["chris@cbeer.info"]
|
11
11
|
spec.description = %q{Linked Data Platform client library}
|
12
12
|
spec.summary = spec.description
|
13
|
-
spec.homepage = ""
|
13
|
+
spec.homepage = "https://github.com/cbeer/ldp"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
data/lib/ldp/resource.rb
CHANGED
@@ -6,10 +6,11 @@ module Ldp
|
|
6
6
|
attr_reader :client, :subject
|
7
7
|
attr_accessor :content
|
8
8
|
|
9
|
-
def initialize client, subject, response = nil
|
9
|
+
def initialize client, subject, response = nil, base_path = ''
|
10
10
|
@client = client
|
11
11
|
@subject = subject
|
12
12
|
@get = response if response.is_a? Faraday::Response and current? response
|
13
|
+
@base_path = base_path
|
13
14
|
end
|
14
15
|
|
15
16
|
##
|
@@ -65,7 +66,8 @@ module Ldp
|
|
65
66
|
# @return [RdfSource] the new representation
|
66
67
|
def create &block
|
67
68
|
raise "Can't call create on an existing resource" unless new?
|
68
|
-
|
69
|
+
verb = subject.nil? ? :post : :put
|
70
|
+
resp = client.send(verb, (subject || @base_path), content) do |req|
|
69
71
|
|
70
72
|
yield req if block_given?
|
71
73
|
end
|
@@ -79,9 +81,11 @@ module Ldp
|
|
79
81
|
# Update the stored graph
|
80
82
|
def update new_content = nil
|
81
83
|
new_content ||= content
|
82
|
-
client.put subject, new_content do |req|
|
84
|
+
resp = client.put subject, new_content do |req|
|
83
85
|
req.headers['If-Match'] = get.etag if retrieved_content?
|
84
86
|
end
|
87
|
+
update_cached_get(resp) if retrieved_content?
|
88
|
+
resp
|
85
89
|
end
|
86
90
|
|
87
91
|
def current? response = nil
|
@@ -95,5 +99,15 @@ module Ldp
|
|
95
99
|
new_response.headers['ETag'] == response.headers['ETag'] &&
|
96
100
|
new_response.headers['Last-Modified'] == response.headers['Last-Modified']
|
97
101
|
end
|
102
|
+
|
103
|
+
def update_cached_get response
|
104
|
+
Response.wrap(client, response)
|
105
|
+
if response.etag.nil? || response.last_modified.nil?
|
106
|
+
response = Response.wrap(client, client.head(subject))
|
107
|
+
end
|
108
|
+
@get.etag = response.etag
|
109
|
+
@get.last_modified = response.last_modified
|
110
|
+
end
|
111
|
+
|
98
112
|
end
|
99
113
|
end
|
@@ -2,8 +2,8 @@ module Ldp
|
|
2
2
|
class Resource::BinarySource < Ldp::Resource
|
3
3
|
attr_accessor :content
|
4
4
|
|
5
|
-
def initialize client, subject, content_or_response = nil
|
6
|
-
super
|
5
|
+
def initialize client, subject, content_or_response = nil, base_path = ''
|
6
|
+
super
|
7
7
|
|
8
8
|
case content_or_response
|
9
9
|
when Faraday::Response
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module Ldp
|
2
2
|
class Resource::RdfSource < Ldp::Resource
|
3
3
|
|
4
|
-
def initialize client, subject, graph_or_response = nil
|
5
|
-
super
|
4
|
+
def initialize client, subject, graph_or_response = nil, base_path = ''
|
5
|
+
super
|
6
6
|
|
7
7
|
case graph_or_response
|
8
8
|
when RDF::Graph
|
data/lib/ldp/response.rb
CHANGED
@@ -15,7 +15,7 @@ module Ldp
|
|
15
15
|
def self.links response
|
16
16
|
h = {}
|
17
17
|
Array(response.headers["Link"]).map { |x| x.split(", ") }.flatten.inject(h) do |memo, header|
|
18
|
-
m = header.match(
|
18
|
+
m = header.match(/<(?<link>.*)>;\s?rel="(?<rel>[^"]+)"/)
|
19
19
|
if m
|
20
20
|
memo[m[:rel]] ||= []
|
21
21
|
memo[m[:rel]] << m[:link]
|
@@ -113,13 +113,21 @@ module Ldp
|
|
113
113
|
##
|
114
114
|
# Extract the ETag for the resource
|
115
115
|
def etag
|
116
|
-
headers['ETag']
|
116
|
+
@etag ||= headers['ETag']
|
117
|
+
end
|
118
|
+
|
119
|
+
def etag=(val)
|
120
|
+
@etag = val
|
117
121
|
end
|
118
122
|
|
119
123
|
##
|
120
124
|
# Extract the last modified header for the resource
|
121
125
|
def last_modified
|
122
|
-
headers['Last-Modified']
|
126
|
+
@last_modified ||= headers['Last-Modified']
|
127
|
+
end
|
128
|
+
|
129
|
+
def last_modified=(val)
|
130
|
+
@last_modified = val
|
123
131
|
end
|
124
132
|
|
125
133
|
##
|
data/lib/ldp/version.rb
CHANGED
data/spec/lib/ldp/client_spec.rb
CHANGED
@@ -22,8 +22,8 @@ describe "Ldp::Client" do
|
|
22
22
|
let(:conn_stubs) do
|
23
23
|
stubs = Faraday::Adapter::Test::Stubs.new do |stub|
|
24
24
|
stub.head('/a_resource') {[ 200 ]}
|
25
|
-
stub.get('/a_resource') {[ 200, {"Link" => "http://www.w3.org/ns/ldp#Resource
|
26
|
-
stub.get('/a_container') {[ 200, {"Link" => ["http://www.w3.org/ns/ldp#Resource
|
25
|
+
stub.get('/a_resource') {[ 200, {"Link" => "<http://www.w3.org/ns/ldp#Resource>;rel=\"type\""}, simple_graph ]}
|
26
|
+
stub.get('/a_container') {[ 200, {"Link" => ["<http://www.w3.org/ns/ldp#Resource>;rel=\"type\"","<http://www.w3.org/ns/ldp#BasicContainer>;rel=\"type\""]}, simple_container_graph ]}
|
27
27
|
stub.head('/a_binary_resource') { [200]}
|
28
28
|
stub.get('/a_binary_resource') { [200, {}, ""]}
|
29
29
|
stub.put("/a_resource") { [204]}
|
@@ -66,7 +66,7 @@ describe "Ldp::Client" do
|
|
66
66
|
resp = subject.get "a_resource"
|
67
67
|
expect(resp).to be_a_kind_of(Ldp::Response)
|
68
68
|
expect(resp.body).to eq(simple_graph)
|
69
|
-
expect(resp.resource?).to
|
69
|
+
expect(resp.resource?).to be true
|
70
70
|
end
|
71
71
|
|
72
72
|
it "should accept a block to change the HTTP request" do
|
@@ -9,7 +9,7 @@ describe Ldp::Orm do
|
|
9
9
|
|
10
10
|
let(:conn_stubs) do
|
11
11
|
Faraday::Adapter::Test::Stubs.new do |stub|
|
12
|
-
stub.get('/a_resource') {[ 200, {"Link" => "http://www.w3.org/ns/ldp#Resource
|
12
|
+
stub.get('/a_resource') {[ 200, {"Link" => "<http://www.w3.org/ns/ldp#Resource>;rel=\"type\""}, simple_graph.dump(:ttl) ]}
|
13
13
|
stub.head('/a_resource') { [200] }
|
14
14
|
stub.put("/a_resource") { [204]}
|
15
15
|
end
|
@@ -32,7 +32,7 @@ describe Ldp::Orm do
|
|
32
32
|
|
33
33
|
describe "#delete" do
|
34
34
|
it "should delete the LDP resource" do
|
35
|
-
test_resource.
|
35
|
+
expect(test_resource).to receive(:delete)
|
36
36
|
subject.delete
|
37
37
|
end
|
38
38
|
end
|
@@ -53,13 +53,13 @@ describe Ldp::Orm do
|
|
53
53
|
|
54
54
|
describe "#save" do
|
55
55
|
it "should update the resource from the graph" do
|
56
|
-
expect(subject.save).to
|
56
|
+
expect(subject.save).to be true
|
57
57
|
end
|
58
58
|
|
59
59
|
it "should return false if the response was not successful" do
|
60
60
|
conn_stubs.instance_variable_get(:@stack)[:put] = [] # erases the stubs for :put
|
61
61
|
conn_stubs.put('/a_resource') {[412, nil, 'There was an error']}
|
62
|
-
expect(subject.save).to
|
62
|
+
expect(subject.save).to be false
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
@@ -81,7 +81,7 @@ describe Ldp::Orm do
|
|
81
81
|
before do
|
82
82
|
updated_graph = RDF::Graph.new << [RDF::URI.new(""), RDF::DC.title, "Hello again, world!"]
|
83
83
|
conn_stubs.get('/a_resource') {[200,
|
84
|
-
{"Link" => "http://www.w3.org/ns/ldp#Resource
|
84
|
+
{"Link" => "<http://www.w3.org/ns/ldp#Resource>;rel=\"type\"",
|
85
85
|
"ETag" => "new-tag"},
|
86
86
|
updated_graph.dump(:ttl)]}
|
87
87
|
end
|
@@ -7,9 +7,9 @@ describe Ldp::Resource::RdfSource do
|
|
7
7
|
|
8
8
|
let(:conn_stubs) do
|
9
9
|
Faraday::Adapter::Test::Stubs.new do |stub|
|
10
|
-
# stub.get('/a_resource') {[ 200, {"Link" => "http://www.w3.org/ns/ldp#Resource
|
10
|
+
# stub.get('/a_resource') {[ 200, {"Link" => "<http://www.w3.org/ns/ldp#Resource>;rel=\"type\""}, simple_graph ]}
|
11
11
|
stub.post("/") { [201]}
|
12
|
-
stub.
|
12
|
+
stub.put("/abs_url_object") { [201]}
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -35,7 +35,7 @@ describe Ldp::Resource::RdfSource do
|
|
35
35
|
|
36
36
|
it "should allow absolute URLs to the LDP server" do
|
37
37
|
obj = Ldp::Resource::RdfSource.new mock_client, "http://my.ldp.server/abs_url_object"
|
38
|
-
obj.
|
38
|
+
allow(obj).to receive(:new?).and_return(true)
|
39
39
|
created_resource = obj.create
|
40
40
|
expect(created_resource).to be_kind_of Ldp::Resource::RdfSource
|
41
41
|
end
|
@@ -58,13 +58,52 @@ describe Ldp::Resource do
|
|
58
58
|
end
|
59
59
|
|
60
60
|
describe "#create" do
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
61
|
+
let(:path) { '/a_new_resource' }
|
62
|
+
context "with a subject uri" do
|
63
|
+
let(:conn_stubs) do
|
64
|
+
Faraday::Adapter::Test::Stubs.new do |stub|
|
65
|
+
stub.head(path) { [404] }
|
66
|
+
stub.put(path) { [200, {'Last-Modified' => 'Tue, 22 Jul 2014 02:23:32 GMT' }] }
|
67
|
+
end
|
67
68
|
end
|
69
|
+
|
70
|
+
context "and without a base path" do
|
71
|
+
it "should post an RDF graph" do
|
72
|
+
subject.content = "xyz"
|
73
|
+
subject.save
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "and with a base path" do
|
78
|
+
let(:base_path) { '/foo' }
|
79
|
+
|
80
|
+
subject { Ldp::Resource.new(mock_client, path, nil, base_path) }
|
81
|
+
|
82
|
+
it "should ignore the base path" do
|
83
|
+
subject.content = "xyz"
|
84
|
+
subject.save
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context "without a subject" do
|
90
|
+
context "and with a base path" do
|
91
|
+
let(:base_path) { '/foo' }
|
92
|
+
|
93
|
+
let(:conn_stubs) do
|
94
|
+
Faraday::Adapter::Test::Stubs.new do |stub|
|
95
|
+
stub.post(base_path) { [200, {'Last-Modified' => 'Tue, 22 Jul 2014 02:23:32 GMT' }] }
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
subject { Ldp::Resource.new(mock_client, nil, nil, base_path) }
|
100
|
+
|
101
|
+
it "should post an RDF graph" do
|
102
|
+
subject.content = "xyz"
|
103
|
+
subject.save
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
68
107
|
end
|
69
108
|
end
|
70
109
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Ldp::Response do
|
4
|
-
LDP_RESOURCE_HEADERS = { "Link" => Ldp.resource.to_s
|
4
|
+
LDP_RESOURCE_HEADERS = { "Link" => "<#{Ldp.resource.to_s}>;rel=\"type\""}
|
5
5
|
|
6
6
|
let(:mock_response) { double(headers: {}, env: { url: "info:a" }) }
|
7
7
|
let(:mock_client) { double(Ldp::Client) }
|
@@ -19,14 +19,14 @@ describe Ldp::Response do
|
|
19
19
|
|
20
20
|
describe ".links" do
|
21
21
|
it "should extract link headers with relations as a hash" do
|
22
|
-
mock_response.
|
22
|
+
allow(mock_response).to receive(:headers).and_return(
|
23
23
|
"Link" => [
|
24
|
-
"xyz
|
25
|
-
"abc
|
26
|
-
"123
|
27
|
-
"vanilla-link"
|
24
|
+
"<xyz>;rel=\"some-rel\"",
|
25
|
+
"<abc>;rel=\"some-multi-rel\"",
|
26
|
+
"<123>;rel=\"some-multi-rel\"",
|
27
|
+
"<vanilla-link>"
|
28
28
|
]
|
29
|
-
|
29
|
+
)
|
30
30
|
h = Ldp::Response.links mock_response
|
31
31
|
|
32
32
|
expect(h['some-rel']).to include("xyz")
|
@@ -35,7 +35,7 @@ describe Ldp::Response do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
it "should return an empty hash if no link headers are availabe" do
|
38
|
-
mock_response.
|
38
|
+
allow(mock_response).to receive(:headers).and_return({})
|
39
39
|
h = Ldp::Response.links mock_response
|
40
40
|
|
41
41
|
expect(h).to be_empty
|
@@ -45,18 +45,19 @@ describe Ldp::Response do
|
|
45
45
|
|
46
46
|
describe ".resource?" do
|
47
47
|
it "should be a resource if a Link[rel=type] header asserts it is an ldp:resource" do
|
48
|
-
mock_response.
|
48
|
+
allow(mock_response).to receive(:headers).and_return(
|
49
49
|
"Link" => [
|
50
|
-
"
|
50
|
+
"<#{Ldp.resource}>;rel=\"type\""
|
51
51
|
]
|
52
|
-
|
53
|
-
expect(Ldp::Response.resource? mock_response).to
|
52
|
+
)
|
53
|
+
expect(Ldp::Response.resource? mock_response).to be_truthy
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
57
|
describe "#graph" do
|
58
58
|
it "should parse the response body for an RDF graph" do
|
59
|
-
mock_response.
|
59
|
+
allow(mock_response).to receive(:body).and_return("<> <info:b> <info:c> .")
|
60
|
+
allow(mock_response).to receive(:headers).and_return(LDP_RESOURCE_HEADERS)
|
60
61
|
graph = subject.graph
|
61
62
|
|
62
63
|
expect(graph).to have_subject(RDF::URI.new("info:a"))
|
@@ -67,7 +68,7 @@ describe Ldp::Response do
|
|
67
68
|
|
68
69
|
describe "#etag" do
|
69
70
|
it "should pass through the response's ETag" do
|
70
|
-
mock_response.
|
71
|
+
allow(mock_response).to receive(:headers).and_return('ETag' => 'xyz')
|
71
72
|
|
72
73
|
expect(subject.etag).to eq('xyz')
|
73
74
|
end
|
@@ -75,7 +76,7 @@ describe Ldp::Response do
|
|
75
76
|
|
76
77
|
describe "#last_modified" do
|
77
78
|
it "should pass through the response's Last-Modified" do
|
78
|
-
mock_response.
|
79
|
+
allow(mock_response).to receive(:headers).and_return('Last-Modified' => 'some-date')
|
79
80
|
expect(subject.last_modified).to eq('some-date')
|
80
81
|
end
|
81
82
|
end
|
@@ -86,14 +87,16 @@ describe Ldp::Response do
|
|
86
87
|
|
87
88
|
graph << [RDF::URI.new('info:a'), RDF.type, Ldp.page]
|
88
89
|
|
89
|
-
mock_response.
|
90
|
+
allow(mock_response).to receive(:body).and_return(graph.dump(:ttl))
|
91
|
+
allow(mock_response).to receive(:headers).and_return(LDP_RESOURCE_HEADERS)
|
90
92
|
|
91
93
|
expect(subject).to have_page
|
92
94
|
end
|
93
95
|
|
94
96
|
it "should be false otherwise" do
|
95
|
-
subject.
|
96
|
-
mock_response.
|
97
|
+
allow(subject).to receive(:page_subject).and_return RDF::URI.new('info:a')
|
98
|
+
allow(mock_response).to receive(:body).and_return('')
|
99
|
+
allow(mock_response).to receive(:headers).and_return(LDP_RESOURCE_HEADERS)
|
97
100
|
expect(subject).not_to have_page
|
98
101
|
end
|
99
102
|
end
|
@@ -105,7 +108,8 @@ describe Ldp::Response do
|
|
105
108
|
graph << [RDF::URI.new('info:a'), RDF.type, Ldp.page]
|
106
109
|
graph << [RDF::URI.new('info:b'), RDF.type, Ldp.page]
|
107
110
|
|
108
|
-
mock_response.
|
111
|
+
allow(mock_response).to receive(:body).and_return(graph.dump(:ttl))
|
112
|
+
allow(mock_response).to receive(:headers).and_return(LDP_RESOURCE_HEADERS)
|
109
113
|
|
110
114
|
expect(subject.page.count).to eq(1)
|
111
115
|
|
@@ -114,8 +118,9 @@ describe Ldp::Response do
|
|
114
118
|
|
115
119
|
describe "#subject" do
|
116
120
|
it "should extract the HTTP request URI as an RDF URI" do
|
117
|
-
mock_response.
|
118
|
-
mock_response.
|
121
|
+
allow(mock_response).to receive(:body).and_return('')
|
122
|
+
allow(mock_response).to receive(:headers).and_return(LDP_RESOURCE_HEADERS)
|
123
|
+
allow(mock_response).to receive(:env).and_return(:url => 'http://xyz/a')
|
119
124
|
expect(subject.subject).to eq(RDF::URI.new("http://xyz/a"))
|
120
125
|
end
|
121
126
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Beer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -146,7 +146,7 @@ files:
|
|
146
146
|
- spec/lib/ldp/resource_spec.rb
|
147
147
|
- spec/lib/ldp/response_spec.rb
|
148
148
|
- spec/spec_helper.rb
|
149
|
-
homepage:
|
149
|
+
homepage: https://github.com/cbeer/ldp
|
150
150
|
licenses:
|
151
151
|
- MIT
|
152
152
|
metadata: {}
|