roadforest 0.1 → 0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/examples/file-management.rb +12 -13
- data/lib/roadforest-client.rb +3 -0
- data/lib/roadforest-common.rb +2 -0
- data/lib/roadforest-server.rb +7 -0
- data/lib/roadforest-testing.rb +1 -0
- data/lib/roadforest/application.rb +9 -7
- data/lib/roadforest/application/dispatcher.rb +39 -63
- data/lib/roadforest/application/parameters.rb +1 -1
- data/lib/roadforest/application/path-provider.rb +2 -2
- data/lib/roadforest/application/route-adapter.rb +130 -18
- data/lib/roadforest/application/services-host.rb +0 -4
- data/lib/roadforest/augment/affordance.rb +78 -0
- data/lib/roadforest/augment/augmentation.rb +97 -0
- data/lib/roadforest/augment/augmenter.rb +54 -0
- data/lib/roadforest/augmentations.rb +1 -0
- data/lib/roadforest/content-handling.rb +1 -0
- data/lib/roadforest/content-handling/common-engines.rb +67 -0
- data/lib/roadforest/content-handling/engine.rb +2 -14
- data/lib/roadforest/content-handling/handler-wrap.rb +29 -31
- data/lib/roadforest/content-handling/media-type.rb +6 -0
- data/lib/roadforest/{rdf.rb → graph.rb} +1 -1
- data/lib/roadforest/{rdf → graph}/access-manager.rb +12 -74
- data/lib/roadforest/{rdf → graph}/document.rb +1 -1
- data/lib/roadforest/{rdf → graph}/etagging.rb +2 -2
- data/lib/roadforest/{rdf → graph}/focus-list.rb +1 -9
- data/lib/roadforest/{rdf → graph}/graph-copier.rb +2 -2
- data/lib/roadforest/{rdf → graph}/graph-focus.rb +5 -7
- data/lib/roadforest/{rdf → graph}/normalization.rb +1 -1
- data/lib/roadforest/{rdf → graph}/post-focus.rb +2 -3
- data/lib/roadforest/graph/vocabulary.rb +96 -0
- data/lib/roadforest/http/graph-transfer.rb +2 -2
- data/lib/roadforest/interface/application.rb +145 -0
- data/lib/roadforest/interface/blob.rb +38 -0
- data/lib/roadforest/interface/rdf.rb +77 -0
- data/lib/roadforest/interfaces.rb +2 -0
- data/lib/roadforest/remote-host.rb +17 -17
- data/lib/roadforest/resource.rb +4 -0
- data/lib/roadforest/resource/{rdf/leaf-item.rb → leaf-item.rb} +1 -1
- data/lib/roadforest/resource/{rdf/list.rb → list.rb} +1 -1
- data/lib/roadforest/resource/{rdf/parent-item.rb → parent-item.rb} +1 -1
- data/lib/roadforest/resource/{rdf/read-only.rb → read-only.rb} +18 -18
- data/lib/roadforest/resource/role/has-children.rb +1 -1
- data/lib/roadforest/resource/role/writable.rb +2 -2
- data/lib/roadforest/server.rb +1 -1
- data/lib/roadforest/source-rigor.rb +9 -0
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence-annealer.rb +2 -2
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence.rb +5 -5
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/any.rb +1 -1
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/none-if-role-absent.rb +1 -1
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/role-if-available.rb +1 -1
- data/lib/roadforest/source-rigor/engine.rb +45 -0
- data/lib/roadforest/{rdf → source-rigor}/graph-store.rb +9 -9
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/http-investigator.rb +2 -2
- data/lib/roadforest/{rdf → source-rigor}/investigation.rb +2 -2
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/investigator.rb +3 -3
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/null-investigator.rb +3 -2
- data/lib/roadforest/{rdf → source-rigor}/parcel.rb +5 -5
- data/lib/roadforest/{rdf → source-rigor}/resource-pattern.rb +6 -6
- data/lib/roadforest/{rdf → source-rigor}/resource-query.rb +2 -2
- data/lib/roadforest/source-rigor/rigorous-access.rb +101 -0
- data/lib/roadforest/templates/affordance-doc.haml +23 -0
- data/lib/roadforest/templates/affordance-property-values.haml +13 -0
- data/lib/roadforest/templates/affordance-subject.haml +9 -0
- data/lib/roadforest/templates/affordance-uri-object.haml +2 -0
- data/lib/roadforest/templates/base/{property_value.haml → property-value.haml} +0 -0
- data/lib/roadforest/templates/base/{property_values.haml → property-values.haml} +0 -0
- data/lib/roadforest/templates/distiller/{property_value.haml → property-value.haml} +0 -0
- data/lib/roadforest/templates/distiller/{property_values.haml → property-values.haml} +0 -0
- data/lib/roadforest/templates/min/{property_values.haml → property-values.haml} +0 -0
- data/lib/roadforest/templates/rdfpost-curie.haml +6 -0
- data/lib/roadforest/test-support/dispatcher-facade.rb +2 -0
- data/lib/roadforest/test-support/matchers.rb +169 -5
- data/lib/roadforest/test-support/remote-host.rb +2 -2
- data/lib/roadforest/type-handlers/handler.rb +74 -0
- data/lib/roadforest/type-handlers/jsonld.rb +34 -0
- data/lib/roadforest/type-handlers/rdf-handler.rb +36 -0
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer.rb +2 -2
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/document-environment.rb +9 -8
- data/lib/roadforest/type-handlers/rdfa-writer/environment-decorator.rb +312 -0
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/object-environment.rb +3 -3
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/property-environment.rb +5 -11
- data/lib/roadforest/type-handlers/rdfa-writer/render-engine.rb +427 -0
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/render-environment.rb +33 -26
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/subject-environment.rb +7 -23
- data/lib/roadforest/type-handlers/rdfa.rb +73 -0
- data/lib/roadforest/type-handlers/rdfpost.rb +301 -0
- data/lib/roadforest/utility/class-registry.rb +23 -5
- data/spec/.ctrlp-root +0 -0
- data/spec/affordance-augmenter.rb +75 -0
- data/spec/affordances-flow.rb +438 -0
- data/spec/authorization.rb +34 -0
- data/spec/client.rb +13 -12
- data/spec/credence-annealer.rb +5 -5
- data/spec/focus-list.rb +8 -8
- data/spec/full-integration.rb +3 -3
- data/spec/graph-copier.rb +4 -4
- data/spec/graph-store.rb +19 -31
- data/spec/keychain.rb +82 -0
- data/spec/rdf-normalization.rb +2 -2
- data/spec/rdf-parcel.rb +3 -3
- data/spec/rdfa-handler.rb +514 -0
- data/spec/rdfpost.rb +96 -0
- data/spec/source-rigor.rb +57 -0
- data/spec/update-focus.rb +11 -10
- metadata +91 -66
- data/lib/roadforest/blob-model.rb +0 -53
- data/lib/roadforest/content-handling/type-handler.rb +0 -76
- data/lib/roadforest/content-handling/type-handlers/jsonld.rb +0 -36
- data/lib/roadforest/content-handling/type-handlers/rdf-handler.rb +0 -38
- data/lib/roadforest/content-handling/type-handlers/rdfa-writer/render-engine.rb +0 -574
- data/lib/roadforest/content-handling/type-handlers/rdfa.rb +0 -175
- data/lib/roadforest/content-handling/type-handlers/rdfpost.rb +0 -297
- data/lib/roadforest/model.rb +0 -209
- data/lib/roadforest/models.rb +0 -2
- data/lib/roadforest/rdf/source-rigor.rb +0 -44
- data/lib/roadforest/rdf/vocabulary.rb +0 -11
- data/lib/roadforest/resource/http/form-parsing.rb +0 -81
- data/lib/roadforest/resource/rdf.rb +0 -4
- data/spec/form-parsing.rb +0 -1
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'roadforest/authorization'
|
2
|
+
|
3
|
+
describe RoadForest::Authorization do
|
4
|
+
subject :manager do
|
5
|
+
RoadForest::Authorization::Manager.new.tap do |manager|
|
6
|
+
manager.authenticator.add_account("user","secret","")
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "default setup" do
|
11
|
+
let :requires_admin do
|
12
|
+
manager.build_grants do |grants|
|
13
|
+
grants.add(:admin)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should refuse an unauthenticated user" do
|
18
|
+
manager.authorization(nil, requires_admin).should == :refused
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should grant an authenticated user" do
|
22
|
+
manager.authorization("Basic #{Base64.encode64("user:secret")}", requires_admin).should == :granted
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should refuse a garbage authentication header" do
|
26
|
+
manager.authorization("some garbage here", requires_admin).should == :refused
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should construct a valid challenge header" do
|
30
|
+
manager.challenge(:realm => "This test here").should == 'Basic realm="This test here"'
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/spec/client.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
require 'roadforest
|
2
|
-
require 'roadforest/test-support'
|
3
|
-
|
1
|
+
require 'roadforest-client'
|
4
2
|
require 'examples/file-management'
|
5
3
|
|
6
4
|
describe RoadForest::RemoteHost do
|
@@ -28,7 +26,7 @@ describe RoadForest::RemoteHost do
|
|
28
26
|
let :base_server do
|
29
27
|
RoadForest::TestSupport::RemoteHost.new(FileManagementExample::Application.new("http://localhost:8778", services)).tap do |server|
|
30
28
|
server.add_credentials("user", "secret")
|
31
|
-
|
29
|
+
# server.trace = true
|
32
30
|
end
|
33
31
|
end
|
34
32
|
|
@@ -118,7 +116,6 @@ describe RoadForest::RemoteHost do
|
|
118
116
|
describe "putting data to server" do
|
119
117
|
before :each do
|
120
118
|
server.putting do |graph|
|
121
|
-
require 'rdf/turtle'
|
122
119
|
items = graph.all(:skos, "hasTopConcept")
|
123
120
|
|
124
121
|
unresolved = items.find do |nav_item|
|
@@ -159,11 +156,12 @@ describe RoadForest::RemoteHost do
|
|
159
156
|
@correct.should == 0
|
160
157
|
end
|
161
158
|
|
162
|
-
it "should extract data from server responses" do
|
163
|
-
|
164
|
-
|
165
|
-
pattern(:subject,
|
166
|
-
|
159
|
+
it "should extract data from server responses", :pending => "RemoteHost understanding RDF::Query" do
|
160
|
+
lc = FileManagementExample::Vocabulary::LC
|
161
|
+
server.should match_query {
|
162
|
+
pattern([:subject, lc.path, nil])
|
163
|
+
pattern([:subject, lc.file, nil])
|
164
|
+
}
|
167
165
|
end
|
168
166
|
|
169
167
|
it "should have transmitted data" do
|
@@ -180,9 +178,10 @@ describe RoadForest::RemoteHost do
|
|
180
178
|
|
181
179
|
describe "using JSON-LD" do
|
182
180
|
let :server do
|
181
|
+
require 'roadforest/type-handlers/jsonld'
|
183
182
|
base_server.tap do |server|
|
184
183
|
server.graph_transfer.type_handling = RoadForest::ContentHandling::Engine.new.tap do |engine|
|
185
|
-
engine.add RoadForest::
|
184
|
+
engine.add RoadForest::TypeHandlers::JSONLD.new, "application/ld+json"
|
186
185
|
end
|
187
186
|
end
|
188
187
|
end
|
@@ -196,9 +195,11 @@ describe RoadForest::RemoteHost do
|
|
196
195
|
|
197
196
|
describe "using RDFa" do
|
198
197
|
let :server do
|
198
|
+
require 'roadforest/type-handlers/rdfa'
|
199
199
|
base_server.tap do |server|
|
200
200
|
server.graph_transfer.type_handling = RoadForest::ContentHandling::Engine.new.tap do |engine|
|
201
|
-
|
201
|
+
rdfa = RoadForest::TypeHandlers::RDFa.new
|
202
|
+
engine.add rdfa, "text/html;q=1;rdfa=1"
|
202
203
|
end
|
203
204
|
end
|
204
205
|
end
|
data/spec/credence-annealer.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
require 'roadforest/
|
2
|
-
require 'roadforest/
|
1
|
+
require 'roadforest/source-rigor/credence-annealer'
|
2
|
+
require 'roadforest/source-rigor/graph-store'
|
3
3
|
require 'timeout'
|
4
4
|
|
5
|
-
describe RoadForest::
|
5
|
+
describe RoadForest::SourceRigor::CredenceAnnealer do
|
6
6
|
let :graph do
|
7
|
-
RoadForest::
|
7
|
+
RoadForest::SourceRigor::GraphStore.new
|
8
8
|
end
|
9
9
|
|
10
10
|
subject :annealer do
|
11
|
-
RoadForest::
|
11
|
+
RoadForest::SourceRigor::CredenceAnnealer.new(graph)
|
12
12
|
end
|
13
13
|
|
14
14
|
it "should run it's block at least once" do
|
data/spec/focus-list.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
require 'rdf'
|
2
|
-
require 'roadforest/
|
3
|
-
require 'roadforest/
|
2
|
+
require 'roadforest/graph/focus-list'
|
3
|
+
require 'roadforest/graph/graph-focus'
|
4
4
|
|
5
|
-
describe RoadForest::
|
5
|
+
describe RoadForest::Graph::FocusList do
|
6
6
|
let :graph do
|
7
7
|
RDF::Graph.new
|
8
8
|
end
|
9
9
|
|
10
10
|
let :access do
|
11
|
-
RoadForest::
|
11
|
+
RoadForest::Graph::WriteManager.new.tap do |access|
|
12
12
|
access.source_graph = graph
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
let :focus do
|
17
|
-
RoadForest::
|
17
|
+
RoadForest::Graph::GraphFocus.new(access, "urn:root")
|
18
18
|
end
|
19
19
|
|
20
20
|
let :list do
|
@@ -24,9 +24,9 @@ describe RoadForest::RDF::FocusList do
|
|
24
24
|
it "should add an item to graph" do
|
25
25
|
list.append_node("#test")
|
26
26
|
|
27
|
-
graph.should match_query
|
28
|
-
query.pattern(:
|
29
|
-
|
27
|
+
graph.should match_query { |query|
|
28
|
+
query.pattern(:object => RDF::URI.new("urn:root#test"))
|
29
|
+
}
|
30
30
|
end
|
31
31
|
|
32
32
|
it "should add several items to the graph" do
|
data/spec/full-integration.rb
CHANGED
@@ -19,7 +19,7 @@ describe "RoadForest integration", :integration => true do
|
|
19
19
|
rescue Errno::ECONNREFUSED
|
20
20
|
#That's what we're hoping for
|
21
21
|
ensure
|
22
|
-
|
22
|
+
test_conn.close rescue nil
|
23
23
|
end
|
24
24
|
|
25
25
|
@setup_time_limit = 3
|
@@ -27,9 +27,9 @@ describe "RoadForest integration", :integration => true do
|
|
27
27
|
@server_logs = "integration-tests.log"
|
28
28
|
|
29
29
|
@server_pid = fork do
|
30
|
-
require 'roadforest/server'
|
31
30
|
require 'examples/file-management'
|
32
31
|
require 'logger'
|
32
|
+
|
33
33
|
RoadForest.serve(
|
34
34
|
FileManagementExample::Application.new("http://localhost:#{@server_port}"),
|
35
35
|
FileManagementExample::ServicesHost.new.tap do |host|
|
@@ -48,7 +48,7 @@ describe "RoadForest integration", :integration => true do
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
require 'roadforest
|
51
|
+
require 'roadforest-client'
|
52
52
|
|
53
53
|
%w{EXIT TERM}.each do |signal|
|
54
54
|
trap(signal) do
|
data/spec/graph-copier.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'roadforest/test-support/matchers'
|
2
|
-
require 'roadforest/
|
2
|
+
require 'roadforest/graph/graph-copier'
|
3
3
|
|
4
|
-
describe RoadForest::
|
4
|
+
describe RoadForest::Graph::GraphFocus, "with a CopyManager" do
|
5
5
|
class TestVoc < ::RDF::Vocabulary("http://test.com/");end
|
6
6
|
|
7
7
|
let :start_subject do
|
@@ -33,14 +33,14 @@ describe RoadForest::RDF::GraphFocus, "with a CopyManager" do
|
|
33
33
|
end
|
34
34
|
|
35
35
|
let :access do
|
36
|
-
RoadForest::
|
36
|
+
RoadForest::Graph::CopyManager.new.tap do |access|
|
37
37
|
access.source_graph = source_graph
|
38
38
|
access.target_graph = target_graph
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
42
|
let :copier do
|
43
|
-
RoadForest::
|
43
|
+
RoadForest::Graph::GraphFocus.new(access, start_subject)
|
44
44
|
end
|
45
45
|
|
46
46
|
#copier needs URL accessor
|
data/spec/graph-store.rb
CHANGED
@@ -1,31 +1,22 @@
|
|
1
1
|
require 'rdf'
|
2
2
|
require 'rdf/rdfa'
|
3
|
-
require 'roadforest/
|
4
|
-
require 'roadforest/
|
5
|
-
require 'roadforest/
|
6
|
-
require 'roadforest/rdf/source-rigor'
|
7
|
-
|
8
|
-
describe RoadForest::RDF do
|
9
|
-
let :source_rigor do
|
10
|
-
RoadForest::RDF::SourceRigor.new.tap do |skept|
|
11
|
-
skept.policy_list(:may_subject)
|
12
|
-
skept.investigator_list(:null)
|
13
|
-
end
|
14
|
-
end
|
3
|
+
require 'roadforest/graph/document'
|
4
|
+
require 'roadforest/source-rigor/graph-store'
|
5
|
+
require 'roadforest/graph/graph-focus'
|
15
6
|
|
7
|
+
describe RoadForest::Graph do
|
16
8
|
let :graph_store do
|
17
|
-
RoadForest::
|
9
|
+
RoadForest::SourceRigor::GraphStore.new
|
18
10
|
end
|
19
11
|
|
20
12
|
#merging graphs
|
21
13
|
|
22
|
-
describe RoadForest::
|
14
|
+
describe RoadForest::SourceRigor::GraphStore do
|
23
15
|
let :root_body do
|
24
|
-
store = RoadForest::
|
25
|
-
access = RoadForest::
|
16
|
+
store = RoadForest::SourceRigor::GraphStore.new
|
17
|
+
access = RoadForest::Graph::WriteManager.new
|
26
18
|
access.source_graph = store
|
27
|
-
|
28
|
-
step = RoadForest::RDF::GraphFocus.new(access, "http://lrdesign.com/test-rdf")
|
19
|
+
step = RoadForest::Graph::GraphFocus.new(access, "http://lrdesign.com/test-rdf")
|
29
20
|
|
30
21
|
step[[:foaf, :givenname]] = "Lester"
|
31
22
|
step[[:dc, :date]] = Time.now
|
@@ -36,11 +27,10 @@ describe RoadForest::RDF do
|
|
36
27
|
end
|
37
28
|
|
38
29
|
let :second_body do
|
39
|
-
store = RoadForest::
|
40
|
-
access = RoadForest::
|
30
|
+
store = RoadForest::SourceRigor::GraphStore.new
|
31
|
+
access = RoadForest::Graph::WriteManager.new
|
41
32
|
access.source_graph = store
|
42
|
-
|
43
|
-
step = RoadForest::RDF::GraphFocus.new(access, "http://lrdesign.com/test-rdf")
|
33
|
+
step = RoadForest::Graph::GraphFocus.new(access, "http://lrdesign.com/test-rdf")
|
44
34
|
|
45
35
|
step[[:foaf, :givenname]] = "Foster"
|
46
36
|
step[[:dc, :date]] = Time.now
|
@@ -49,24 +39,23 @@ describe RoadForest::RDF do
|
|
49
39
|
end
|
50
40
|
|
51
41
|
let :first_doc do
|
52
|
-
RoadForest::
|
42
|
+
RoadForest::Graph::Document.new.tap do |doc|
|
53
43
|
doc.source = "http://lrdesign.com/test-rdf"
|
54
44
|
doc.body_string = root_body
|
55
45
|
end
|
56
46
|
end
|
57
47
|
|
58
48
|
let :second_doc do
|
59
|
-
RoadForest::
|
49
|
+
RoadForest::Graph::Document.new.tap do |doc|
|
60
50
|
doc.source = "http://lrdesign.com/test-rdf"
|
61
51
|
doc.body_string = second_body
|
62
52
|
end
|
63
53
|
end
|
64
54
|
|
65
55
|
let :step do
|
66
|
-
access = RoadForest::
|
56
|
+
access = RoadForest::Graph::WriteManager.new
|
67
57
|
access.source_graph = graph_store
|
68
|
-
access.
|
69
|
-
RoadForest::RDF::GraphFocus.new(access, "http://lrdesign.com/test-rdf")
|
58
|
+
RoadForest::Graph::GraphFocus.new(access, "http://lrdesign.com/test-rdf")
|
70
59
|
end
|
71
60
|
|
72
61
|
before :each do
|
@@ -86,7 +75,7 @@ describe RoadForest::RDF do
|
|
86
75
|
end
|
87
76
|
end
|
88
77
|
|
89
|
-
describe RoadForest::
|
78
|
+
describe RoadForest::Graph::GraphFocus do
|
90
79
|
let :main_subject do
|
91
80
|
RDF::URI.new("http://test.com/main")
|
92
81
|
end
|
@@ -112,14 +101,13 @@ describe RoadForest::RDF do
|
|
112
101
|
end
|
113
102
|
|
114
103
|
let :access do
|
115
|
-
RoadForest::
|
116
|
-
access.rigor = source_rigor
|
104
|
+
RoadForest::Graph::WriteManager.new.tap do |access|
|
117
105
|
access.source_graph = graph_store
|
118
106
|
end
|
119
107
|
end
|
120
108
|
|
121
109
|
let :step do
|
122
|
-
RoadForest::
|
110
|
+
RoadForest::Graph::GraphFocus.new(access, main_subject)
|
123
111
|
end
|
124
112
|
|
125
113
|
it "should enumerate forward properties" do
|
data/spec/keychain.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'roadforest/http/keychain'
|
2
|
+
|
3
|
+
describe RoadForest::HTTP::Keychain do
|
4
|
+
let :expected_header do
|
5
|
+
"Basic dXNlcjpzZWNyZXRl"
|
6
|
+
end
|
7
|
+
|
8
|
+
let :username do
|
9
|
+
"user"
|
10
|
+
end
|
11
|
+
|
12
|
+
let :password do
|
13
|
+
"secrete"
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "Basic scheme regex" do
|
17
|
+
let :regex do
|
18
|
+
RoadForest::HTTP::Keychain::BASIC_SCHEME
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should match with single-quote realm" do
|
22
|
+
match = regex.match "Basic realm='test'"
|
23
|
+
match[:realm].should == "test"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should not match without realm" do
|
27
|
+
match = regex.match 'Basic'
|
28
|
+
match.should be_nil
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should match with double-quote realm" do
|
32
|
+
match = regex.match 'Basic realm="test"'
|
33
|
+
match[:realm].should == "test"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should not match with mismatched-quote realm" do
|
37
|
+
match = regex.match "Basic realm=\"test'"
|
38
|
+
match.should be_nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#preemptive_response" do
|
43
|
+
subject :keychain do
|
44
|
+
RoadForest::HTTP::Keychain.new.tap do |chain|
|
45
|
+
chain.add("http://example.com/test/", username, password)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should return matching creds" do
|
50
|
+
creds = keychain.preemptive_response("http://example.com/test/under/here/")
|
51
|
+
creds.should == expected_header
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should not return creds from outside protection" do
|
55
|
+
creds = keychain.preemptive_response("http://example.com/")
|
56
|
+
creds.should be_nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "#challenge_response" do
|
61
|
+
subject :keychain do
|
62
|
+
RoadForest::HTTP::Keychain.new.tap do |chain|
|
63
|
+
chain.add("http://example.com/test/", username, password, "test")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should return matching creds" do
|
68
|
+
creds = keychain.challenge_response("http://example.com/", "Basic realm='test'")
|
69
|
+
creds.should == expected_header
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should not return covering creds" do
|
73
|
+
creds = keychain.challenge_response("http://example.com/test/under/here/", "Basic realm='other'")
|
74
|
+
creds.should be_nil
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should not return non-matching creds" do
|
78
|
+
creds = keychain.challenge_response("http://example.com/", "Basic realm='other'")
|
79
|
+
creds.should be_nil
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
data/spec/rdf-normalization.rb
CHANGED
data/spec/rdf-parcel.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'roadforest/test-support/matchers'
|
2
|
-
require 'roadforest/
|
2
|
+
require 'roadforest/source-rigor/parcel'
|
3
3
|
|
4
|
-
describe RoadForest::
|
4
|
+
describe RoadForest::SourceRigor::Parcel do
|
5
5
|
let :literal do
|
6
6
|
42
|
7
7
|
end
|
@@ -59,7 +59,7 @@ describe RoadForest::RDF::Parcel do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
let :parceller do
|
62
|
-
RoadForest::
|
62
|
+
RoadForest::SourceRigor::Parcel.new.tap do |parceller|
|
63
63
|
parceller.graph = source_graph
|
64
64
|
end
|
65
65
|
end
|
@@ -0,0 +1,514 @@
|
|
1
|
+
require 'rdf/xsd'
|
2
|
+
#require 'rdf/spec/writer'
|
3
|
+
require 'rdf/turtle'
|
4
|
+
require 'rdf'
|
5
|
+
|
6
|
+
require 'roadforest/type-handlers/rdfa-writer'
|
7
|
+
require 'roadforest/type-handlers/rdfa-writer/render-engine'
|
8
|
+
require 'cgi'
|
9
|
+
|
10
|
+
class EX < RDF::Vocabulary("http://example.com/"); end
|
11
|
+
|
12
|
+
describe RoadForest::TypeHandlers::RDFaWriter, :vcr => {} do
|
13
|
+
# Heuristically detect the input stream
|
14
|
+
def detect_format(stream)
|
15
|
+
# Got to look into the file to see
|
16
|
+
if stream.is_a?(IO) || stream.is_a?(StringIO)
|
17
|
+
stream.rewind
|
18
|
+
string = stream.read(1000)
|
19
|
+
stream.rewind
|
20
|
+
else
|
21
|
+
string = stream.to_s
|
22
|
+
end
|
23
|
+
case string
|
24
|
+
when /<html/i then RDF::RDFa::Reader
|
25
|
+
when /@prefix/i then RDF::Turtle::Reader
|
26
|
+
else RDF::NTriples::Reader
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def parse(input, options = {})
|
31
|
+
reader_class = RDF::Reader.for(options[:format]) if options[:format]
|
32
|
+
reader_class ||= options.fetch(:reader, RDF::Reader.for(detect_format(input)))
|
33
|
+
|
34
|
+
graph = RDF::Repository.new
|
35
|
+
reader_class.new(input, options).each do |statement|
|
36
|
+
graph << statement
|
37
|
+
end
|
38
|
+
graph
|
39
|
+
end
|
40
|
+
|
41
|
+
before(:all) do
|
42
|
+
@valise = Valise.define do
|
43
|
+
ro up_to("spec") + "../lib/roadforest"
|
44
|
+
end
|
45
|
+
|
46
|
+
@tilt_cache = ::Tilt::Cache.new
|
47
|
+
end
|
48
|
+
|
49
|
+
# Serialize @graph to a string and compare against regexps
|
50
|
+
def serialize(options = {})
|
51
|
+
options = {:debug => debug, :standard_prefixes => true}.merge(options)
|
52
|
+
base_uri =
|
53
|
+
if options[:base_uri]
|
54
|
+
RDF::URI(options[:base_uri])
|
55
|
+
else
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
|
59
|
+
templates = RoadForest::TypeHandlers::RDFaWriter::TemplateHandler.new
|
60
|
+
templates.valise = @valise
|
61
|
+
templates.template_cache = @tilt_cache
|
62
|
+
templates.style_name = options[:haml]
|
63
|
+
templates.haml_options = options[:haml_options]
|
64
|
+
|
65
|
+
engine = RoadForest::TypeHandlers::RDFaWriter::RenderEngine.new(@graph, options[:debug]) do |engine|
|
66
|
+
#engine.decoration_set.names.clear
|
67
|
+
engine.template_handler = templates
|
68
|
+
engine.base_uri = base_uri
|
69
|
+
engine.lang = options[:lang]
|
70
|
+
engine.standard_prefixes = options[:standard_prefixes]
|
71
|
+
engine.top_classes = options[:top_classes] || [RDF::RDFS.Class]
|
72
|
+
engine.predicate_order = options[:predicate_order] || [RDF.type, RDF::RDFS.label, RDF::DC.title]
|
73
|
+
engine.heading_predicates = options[:heading_predicates] || [RDF::RDFS.label, RDF::DC.title]
|
74
|
+
end
|
75
|
+
|
76
|
+
engine.prefixes.merge! options[:prefixes] unless options[:prefixes].nil?
|
77
|
+
|
78
|
+
# Generate document
|
79
|
+
result = engine.render_document
|
80
|
+
|
81
|
+
puts CGI.escapeHTML(result) if $verbose
|
82
|
+
result
|
83
|
+
end
|
84
|
+
|
85
|
+
shared_context "RDFa rendering" do
|
86
|
+
let :graph do
|
87
|
+
parse(turtle, :format => :ttl)
|
88
|
+
end
|
89
|
+
|
90
|
+
let :serialize_options do
|
91
|
+
{:haml_options => {:ugly => false}}
|
92
|
+
end
|
93
|
+
|
94
|
+
subject :html do
|
95
|
+
@graph = graph
|
96
|
+
serialize(serialize_options)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
before(:each) do
|
101
|
+
@graph = RDF::Repository.new
|
102
|
+
end
|
103
|
+
|
104
|
+
let :debug do
|
105
|
+
[]
|
106
|
+
end
|
107
|
+
|
108
|
+
#include RDF_Writer
|
109
|
+
|
110
|
+
describe "#buffer" do
|
111
|
+
context "prefix definitions" do
|
112
|
+
subject do
|
113
|
+
@graph << [EX.a, RDF::DC.title, "foo"]
|
114
|
+
serialize(:prefixes => {:dc => "http://purl.org/dc/terms/"})
|
115
|
+
end
|
116
|
+
|
117
|
+
it { should have_xpath("/html/@prefix", %r(dc: http://purl.org/dc/terms/), @debug)}
|
118
|
+
it { should have_xpath("/html/@prefix", %r(ex: http://example.com/), @debug)}
|
119
|
+
it { should have_xpath("/html/@prefix", %r(ex:), @debug)}
|
120
|
+
end
|
121
|
+
|
122
|
+
context "plain literal" do
|
123
|
+
subject do
|
124
|
+
@graph << [EX.a, EX.b, "foo"]
|
125
|
+
serialize(:haml_options => {:ugly => false})
|
126
|
+
end
|
127
|
+
|
128
|
+
it { should have_xpath( "/html/body/div/@resource" , "ex:a" ) }
|
129
|
+
it { should have_xpath( "//div[@class='property']/span[@property]/@property" , "ex:b" ) }
|
130
|
+
it { should have_xpath( "//div[@class='property']/span[@property]/text()" , "foo" ) }
|
131
|
+
end
|
132
|
+
|
133
|
+
context "dc:title" do
|
134
|
+
subject do
|
135
|
+
@graph << [EX.a, RDF::DC.title, "foo"]
|
136
|
+
serialize(:prefixes => {:dc => RDF::DC.to_s})
|
137
|
+
end
|
138
|
+
|
139
|
+
it { should have_xpath( "/html/head/title/text()" , "foo" ) }
|
140
|
+
it { should have_xpath( "/html/body/div/@resource" , "ex:a" ) }
|
141
|
+
it { should have_xpath( "/html/body/div/h1/@property" , "dc:title" ) }
|
142
|
+
it { should have_xpath( "/html/body/div/h1/text()" , "foo" ) }
|
143
|
+
end
|
144
|
+
|
145
|
+
context "typed resources" do
|
146
|
+
context "typed resource" do
|
147
|
+
subject do
|
148
|
+
@graph << [EX.a, RDF.type, EX.Type]
|
149
|
+
serialize(:haml_options => {:ugly => false})
|
150
|
+
end
|
151
|
+
|
152
|
+
it { should have_xpath( "/html/body/div/@resource" , "ex:a" ) }
|
153
|
+
it { should have_xpath( "/html/body/div/@typeof" , "ex:Type" ) }
|
154
|
+
end
|
155
|
+
|
156
|
+
context "resource with two types" do
|
157
|
+
subject do
|
158
|
+
@graph << [EX.a, RDF.type, EX.t1]
|
159
|
+
@graph << [EX.a, RDF.type, EX.t2]
|
160
|
+
serialize(:haml_options => {:ugly => false})
|
161
|
+
end
|
162
|
+
|
163
|
+
it { should have_xpath( "/html/body/div/@resource" , "ex:a" ) }
|
164
|
+
it { should have_xpath( "/html/body/div/@typeof" , "ex:t1 ex:t2" ) }
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
context "languaged tagged literals" do
|
169
|
+
context "literal with language and no default language" do
|
170
|
+
subject do
|
171
|
+
@graph << [EX.a, RDF::DC.title, RDF::Literal("foo", :language => :en)]
|
172
|
+
serialize(:prefixes => {:dc => "http://purl.org/dc/terms/"})
|
173
|
+
end
|
174
|
+
|
175
|
+
it { should have_xpath( "/html/body/div/h1/@property" , "dc:title" ) }
|
176
|
+
it { should have_xpath( "/html/body/div/h1/@lang" , "en" ) }
|
177
|
+
end
|
178
|
+
|
179
|
+
context "literal with language and same default language" do
|
180
|
+
subject do
|
181
|
+
@graph << [EX.a, RDF::DC.title, RDF::Literal("foo", :language => :en)]
|
182
|
+
serialize(:lang => :en)
|
183
|
+
end
|
184
|
+
|
185
|
+
it { should have_xpath( "/html/@lang" , "en" ) }
|
186
|
+
it { should have_xpath( "/html/body/div/h1/@lang" , false ) }
|
187
|
+
end
|
188
|
+
|
189
|
+
context "literal with language and different default language" do
|
190
|
+
subject do
|
191
|
+
@graph << [EX.a, RDF::DC.title, RDF::Literal("foo", :language => :en)]
|
192
|
+
serialize(:lang => :de)
|
193
|
+
end
|
194
|
+
|
195
|
+
it { should have_xpath( "/html/@lang" , "de" ) }
|
196
|
+
it { should have_xpath( "/html/body/div/h1/@lang" , "en" ) }
|
197
|
+
end
|
198
|
+
|
199
|
+
context "property and rel serialize to different elements" do
|
200
|
+
subject do
|
201
|
+
@graph << [EX.a, RDF.value, "foo"]
|
202
|
+
@graph << [EX.a, RDF.value, EX.b]
|
203
|
+
serialize
|
204
|
+
end
|
205
|
+
|
206
|
+
it { should have_xpath( "/html/body/div/div/ul/li[@property='rdf:value']/text()" , "foo" ) }
|
207
|
+
it { should have_xpath( "/html/body/div/div/ul/li/a[@property='rdf:value']/@href" , EX.b.to_s ) }
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
context "typed literals" do
|
212
|
+
describe "xsd:date" do
|
213
|
+
subject do
|
214
|
+
@graph << [EX.a, EX.b, RDF::Literal::Date.new("2011-03-18")]
|
215
|
+
serialize(:haml_options => {:ugly => false})
|
216
|
+
end
|
217
|
+
|
218
|
+
it { should have_xpath( "//span[@property]/@property" , "ex:b" ) }
|
219
|
+
it { should have_xpath( "//span[@property]/@datatype" , "xsd:date" ) }
|
220
|
+
it { should have_xpath( "//span[@property]/@content" , "2011-03-18" ) }
|
221
|
+
it { should have_xpath( "//span[@property]/text()" , "Friday, 18 March 2011") }
|
222
|
+
end
|
223
|
+
|
224
|
+
context "xsd:time" do
|
225
|
+
subject do
|
226
|
+
@graph << [EX.a, EX.b, RDF::Literal::Time.new("12:34:56")]
|
227
|
+
serialize(:haml_options => {:ugly => false})
|
228
|
+
end
|
229
|
+
|
230
|
+
it { should have_xpath( "//span[@property]/@property" , "ex:b" ) }
|
231
|
+
it { should have_xpath( "//span[@property]/@datatype" , "xsd:time" ) }
|
232
|
+
it { should have_xpath( "//span[@property]/@content" , "12:34:56" ) }
|
233
|
+
it { should have_xpath( "//span[@property]/text()" , /12:34:56/ ) }
|
234
|
+
end
|
235
|
+
|
236
|
+
context "xsd:dateTime" do
|
237
|
+
subject do
|
238
|
+
@graph << [EX.a, EX.b, RDF::Literal::DateTime.new("2011-03-18T12:34:56")]
|
239
|
+
serialize(:haml_options => {:ugly => false})
|
240
|
+
end
|
241
|
+
|
242
|
+
it { should have_xpath( "//span[@property]/@property" , "ex:b" ) }
|
243
|
+
it { should have_xpath( "//span[@property]/@datatype" , "xsd:dateTime" ) }
|
244
|
+
it { should have_xpath( "//span[@property]/@content" , "2011-03-18T12:34:56" ) }
|
245
|
+
it { should have_xpath( "//span[@property]/text()" , /12:34:56 \w+ on Friday, 18 March 2011/) }
|
246
|
+
end
|
247
|
+
|
248
|
+
context "rdf:XMLLiteral" do
|
249
|
+
subject do
|
250
|
+
@graph << [EX.a, EX.b, RDF::Literal::XML.new("E = mc<sup>2</sup>: The Most Urgent Problem of Our Time")]
|
251
|
+
serialize(:haml_options => {:ugly => false})
|
252
|
+
end
|
253
|
+
|
254
|
+
it { should have_xpath( "//span[@property]/@property" , "ex:b" ) }
|
255
|
+
it { should have_xpath( "//span[@property]/@datatype" , "rdf:XMLLiteral" ) }
|
256
|
+
it { should have_xpath( "//span[@property]", %r(<span [^>]+>E = mc<sup>2</sup>: The Most Urgent Problem of Our Time<\/span>)) }
|
257
|
+
end
|
258
|
+
|
259
|
+
context "xsd:string" do
|
260
|
+
subject do
|
261
|
+
@graph << [EX.a, EX.b, RDF::Literal.new("Albert Einstein", :datatype => RDF::XSD.string)]
|
262
|
+
serialize(:haml_options => {:ugly => false})
|
263
|
+
end
|
264
|
+
|
265
|
+
it { should have_xpath( "//span[@property]/@property" , "ex:b" ) }
|
266
|
+
it { should have_xpath( "//span[@property]/@datatype" , false ) } # xsd:string implied in RDF 1.1
|
267
|
+
it { should have_xpath( "//span[@property]/text()" , "Albert Einstein" ) }
|
268
|
+
end
|
269
|
+
|
270
|
+
context "unknown" do
|
271
|
+
subject do
|
272
|
+
@graph << [EX.a, EX.b, RDF::Literal.new("Albert Einstein", :datatype => EX.unknown)]
|
273
|
+
serialize(:haml_options => {:ugly => false})
|
274
|
+
end
|
275
|
+
|
276
|
+
it { should have_xpath( "//span[@property]/@property" , "ex:b" ) }
|
277
|
+
it { should have_xpath( "//span[@property]/@datatype" , "ex:unknown" ) }
|
278
|
+
it { should have_xpath( "//span[@property]/text()" , "Albert Einstein" ) }
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
context "multi-valued literals" do
|
283
|
+
subject do
|
284
|
+
@graph << [EX.a, EX.b, "c"]
|
285
|
+
@graph << [EX.a, EX.b, "d"]
|
286
|
+
serialize(:haml_options => {:ugly => false})
|
287
|
+
end
|
288
|
+
|
289
|
+
it { should have_xpath( "//ul/li[1][@property='ex:b']/text()" , "c" ) }
|
290
|
+
it { should have_xpath( "//ul/li[2][@property='ex:b']/text()" , "d" ) }
|
291
|
+
end
|
292
|
+
|
293
|
+
context "resource objects" do
|
294
|
+
subject do
|
295
|
+
@graph << [EX.a, EX.b, EX.c]
|
296
|
+
serialize(:haml_options => {:ugly => false})
|
297
|
+
end
|
298
|
+
|
299
|
+
it { should have_xpath( "//div/@resource" , "ex:a" ) }
|
300
|
+
it { should have_xpath( "//a/@property" , "ex:b" ) }
|
301
|
+
it { should have_xpath( "//a/@href" , EX.c.to_s ) }
|
302
|
+
end
|
303
|
+
|
304
|
+
context "multi-valued resource objects" do
|
305
|
+
subject do
|
306
|
+
@graph << [EX.a, EX.b, EX.c]
|
307
|
+
@graph << [EX.a, EX.b, EX.d]
|
308
|
+
serialize(:haml_options => {:ugly => false})
|
309
|
+
end
|
310
|
+
|
311
|
+
it { should have_xpath( "//div/@resource" , "ex:a" ) }
|
312
|
+
it { should have_xpath( "//ul/li[1]/a[@property='ex:b']/@href" , EX.c.to_s ) }
|
313
|
+
it { should have_xpath( "//ul/li[2]/a[@property='ex:b']/@href" , EX.d.to_s ) }
|
314
|
+
end
|
315
|
+
|
316
|
+
context "booleans" do
|
317
|
+
let :turtle do
|
318
|
+
%q{
|
319
|
+
@prefix lc: <http://lrdesign.com/vocabularies/logical-construct#> .
|
320
|
+
<http://localhost:8778/needs/one> <lc:resolved> true .
|
321
|
+
}
|
322
|
+
end
|
323
|
+
|
324
|
+
include_context "RDFa rendering"
|
325
|
+
|
326
|
+
let :serialize_options do
|
327
|
+
{ :base_uri => RDF::URI.new("http://localhost:8778/needs/one") }
|
328
|
+
end
|
329
|
+
|
330
|
+
it { should have_xpath( "//div/div[@class='property']/span[@datatype='xsd:boolean']/text()", "true") }
|
331
|
+
end
|
332
|
+
|
333
|
+
context "lists" do
|
334
|
+
context "empty list" do
|
335
|
+
let :turtle do
|
336
|
+
%q(
|
337
|
+
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
338
|
+
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
339
|
+
|
340
|
+
<> rdf:value () .
|
341
|
+
)
|
342
|
+
end
|
343
|
+
|
344
|
+
include_context "RDFa rendering"
|
345
|
+
|
346
|
+
it { should have_xpath( "//div/span[@inlist]/@rel" , 'rdf:value' ) }
|
347
|
+
it { should have_xpath( "//div/span[@inlist]/text()" , false ) }
|
348
|
+
end
|
349
|
+
|
350
|
+
|
351
|
+
context "literal" do
|
352
|
+
let :turtle do
|
353
|
+
%q(
|
354
|
+
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
355
|
+
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
356
|
+
|
357
|
+
<> rdf:value ("Foo") .
|
358
|
+
)
|
359
|
+
end
|
360
|
+
|
361
|
+
include_context "RDFa rendering"
|
362
|
+
|
363
|
+
it { should have_xpath( "//div/span[@inlist]/@property" , 'rdf:value' ) }
|
364
|
+
it { should have_xpath( "//div/span[@inlist]/text()" , 'Foo' ) }
|
365
|
+
end
|
366
|
+
|
367
|
+
|
368
|
+
context "IRI" do
|
369
|
+
let :turtle do
|
370
|
+
%q(
|
371
|
+
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
372
|
+
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
373
|
+
|
374
|
+
<> rdf:value (<foo>) .
|
375
|
+
)
|
376
|
+
end
|
377
|
+
|
378
|
+
include_context "RDFa rendering"
|
379
|
+
|
380
|
+
it { should have_xpath( "//div/a[@inlist]/@property" , 'rdf:value' ) }
|
381
|
+
it { should have_xpath( "//div/a[@inlist]/@href" , 'foo' ) }
|
382
|
+
end
|
383
|
+
|
384
|
+
context "implicit list with hetrogenious membership" do
|
385
|
+
let :turtle do
|
386
|
+
%q(
|
387
|
+
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
388
|
+
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
389
|
+
|
390
|
+
<> rdf:value ("Foo" <foo>) .
|
391
|
+
)
|
392
|
+
end
|
393
|
+
|
394
|
+
include_context "RDFa rendering"
|
395
|
+
|
396
|
+
it { should have_xpath( "//ul/li[1][@inlist]/@property" , 'rdf:value' ) }
|
397
|
+
it { should have_xpath( "//ul/li[1][@inlist]/text()" , 'Foo' ) }
|
398
|
+
it { should have_xpath( "//ul/li[2]/a[@inlist]/@property" , 'rdf:value' ) }
|
399
|
+
it { should have_xpath( "//ul/li[2]/a[@inlist]/@href" , 'foo' ) }
|
400
|
+
end
|
401
|
+
|
402
|
+
context "property with list and literal" do
|
403
|
+
let :turtle do
|
404
|
+
%q(
|
405
|
+
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
406
|
+
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
407
|
+
|
408
|
+
<> rdf:value ("Foo" "Bar"), "Baz" .
|
409
|
+
)
|
410
|
+
end
|
411
|
+
|
412
|
+
include_context "RDFa rendering"
|
413
|
+
|
414
|
+
it { should have_xpath( "//div[@class='property']/span[@property='rdf:value']/text()" , "Baz" ) }
|
415
|
+
it { should have_xpath( "//div[@class='property']/ul/li[1][@inlist][@property='rdf:value']/text()" , 'Foo' ) }
|
416
|
+
it { should have_xpath( "//div[@class='property']/ul/li[2][@inlist][@property='rdf:value']/text()" , 'Bar' ) }
|
417
|
+
end
|
418
|
+
|
419
|
+
context "multiple rel items" do
|
420
|
+
let :turtle do
|
421
|
+
%q(
|
422
|
+
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
423
|
+
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
424
|
+
|
425
|
+
<> rdf:value (<foo> <bar>) .
|
426
|
+
)
|
427
|
+
end
|
428
|
+
|
429
|
+
include_context "RDFa rendering"
|
430
|
+
|
431
|
+
it { should have_xpath( "//div[@class='property']/ul/li[1]/a[@inlist][@property='rdf:value']/@href" , 'foo' ) }
|
432
|
+
it { should have_xpath( "//div[@class='property']/ul/li[2]/a[@inlist][@property='rdf:value']/@href" , 'bar' ) }
|
433
|
+
end
|
434
|
+
|
435
|
+
context "multiple collections", :pending => true do
|
436
|
+
let :turtle do
|
437
|
+
%q(
|
438
|
+
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
439
|
+
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
440
|
+
|
441
|
+
<foo> rdf:value ("Foo"), ("Bar") .
|
442
|
+
)
|
443
|
+
end
|
444
|
+
|
445
|
+
include_context "RDFa rendering"
|
446
|
+
|
447
|
+
it { should have_xpath( "//div[@class='property']/ul/li[1][@inlist][@property='rdf:value']/text()" , 'Foo' ) }
|
448
|
+
it { should have_xpath( "//div[@class='property']/ul/li[2][@inlist][@property='rdf:value']/text()" , 'Bar' ) }
|
449
|
+
end
|
450
|
+
|
451
|
+
context "issue 14" do
|
452
|
+
let :turtle do
|
453
|
+
%q(
|
454
|
+
@base <http://example/> .
|
455
|
+
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
456
|
+
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
|
457
|
+
|
458
|
+
<> rdf:value (<needs/one> <needs/two> <needs/three>) .
|
459
|
+
<needs/one> rdfs:label "one" .
|
460
|
+
<needs/three> rdfs:label "three" .
|
461
|
+
<needs/two> rdfs:label "two" .
|
462
|
+
)
|
463
|
+
end
|
464
|
+
|
465
|
+
include_context "RDFa rendering"
|
466
|
+
|
467
|
+
it { should have_xpath( "//div[@class='property']/ul/li[1][@inlist][@rel='rdf:value']/h1[@property='rdfs:label']/text()" , 'one' ) }
|
468
|
+
it { should have_xpath( "//div[@class='property']/ul/li[2][@inlist][@rel='rdf:value']/h1[@property='rdfs:label']/text()" , 'two' ) }
|
469
|
+
it { should have_xpath( "//div[@class='property']/ul/li[3][@inlist][@rel='rdf:value']/h1[@property='rdfs:label']/text()" , 'three' ) }
|
470
|
+
end
|
471
|
+
end
|
472
|
+
|
473
|
+
context "included resource definitions" do
|
474
|
+
subject do
|
475
|
+
@graph << [EX.a, EX.b, EX.c]
|
476
|
+
@graph << [EX.c, EX.d, EX.e]
|
477
|
+
serialize(:haml_options => {:ugly => false})
|
478
|
+
end
|
479
|
+
|
480
|
+
it { should have_xpath( "/html/body/div/@resource" , "ex:a" ) }
|
481
|
+
it { should have_xpath( "//div[@resource='ex:a']/div[@class='property']/div[@rel]/@rel" , "ex:b" ) }
|
482
|
+
it { should have_xpath( "//div[@rel]/@resource" , "ex:c" ) }
|
483
|
+
it { should have_xpath( "//div[@rel]/div[@class='property']/a/@href" , EX.e.to_s ) }
|
484
|
+
it { should have_xpath( "//div[@rel]/div[@class='property']/a/@property" , "ex:d" ) }
|
485
|
+
end
|
486
|
+
|
487
|
+
unless ENV['CI'] # Not for continuous integration
|
488
|
+
# W3C Test suite from http://www.w3.org/2006/07/SWD/RDFa/testsuite/
|
489
|
+
describe "w3c xhtml testcases" do
|
490
|
+
require 'suite_helper'
|
491
|
+
|
492
|
+
# Generate with each template set
|
493
|
+
%w{base min distiller}.each do |name, template|
|
494
|
+
context "Using #{name} template" do
|
495
|
+
Fixtures::TestCase.for_specific("html5", "rdfa1.1", Fixtures::TestCase::Test.required) do |t|
|
496
|
+
next if %w(0198 0225 0284 0295 0319 0329).include?(t.num)
|
497
|
+
specify "test #{t.num}: #{t.description}" do
|
498
|
+
input = t.input("html5", "rdfa1.1")
|
499
|
+
@graph = RDF::Repository.load(t.input("html5", "rdfa1.1"))
|
500
|
+
result = serialize(:haml => name, :haml_options => {:ugly => true})
|
501
|
+
graph2 = parse(result, :format => :rdfa)
|
502
|
+
# Need to put this in to avoid problems with added markup
|
503
|
+
statements = graph2.query(:object => RDF::URI("http://rdf.kellogg-assoc.com/css/distiller.css")).to_a
|
504
|
+
statements.each {|st| graph2.delete(st)}
|
505
|
+
#puts graph2.dump(:ttl)
|
506
|
+
graph2.should be_equivalent_graph(@graph, :trace => debug.unshift(result.force_encoding("utf-8")).join("\n"))
|
507
|
+
end
|
508
|
+
end
|
509
|
+
end
|
510
|
+
end
|
511
|
+
end
|
512
|
+
end
|
513
|
+
end
|
514
|
+
end
|