roadforest 0.1 → 0.5
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/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
|