earl-report 0.5.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +23 -13
- data/VERSION +1 -1
- data/bin/earl-report +4 -2
- data/lib/earl_report.rb +225 -141
- data/lib/earl_report/views/earl_report.html.haml +10 -10
- data/spec/earl_report_spec.rb +127 -31
- data/spec/spec_helper.rb +28 -9
- data/spec/test-files/doap.ttl +11 -11
- data/spec/test-files/foaf.ttl +2 -2
- data/spec/test-files/report-complete.ttl +15 -15
- data/spec/test-files/report-no-doap.ttl +4 -4
- data/spec/test-files/report-no-foaf.ttl +14 -14
- data/spec/test-files/report-no-test.ttl +48 -0
- data/spec/test-files/results.html +33 -33
- data/spec/test-files/results.jsonld +66 -58
- data/spec/test-files/results.ttl +60 -73
- metadata +103 -25
@@ -10,7 +10,7 @@
|
|
10
10
|
-# "assertions": ["./rdf.rb-earl.ttl"],
|
11
11
|
-# "testSubjects": [
|
12
12
|
-# {
|
13
|
-
-# "@id": "
|
13
|
+
-# "@id": "https://rubygems.org/gems/rdf-turtle",
|
14
14
|
-# "@type": "earl:TestSubject",
|
15
15
|
-# "name": "RDF::Turtle"
|
16
16
|
-# },
|
@@ -27,9 +27,9 @@
|
|
27
27
|
-# "assertions": [
|
28
28
|
-# {
|
29
29
|
-# "@type": "earl:Assertion",
|
30
|
-
-# "assertedBy": "
|
30
|
+
-# "assertedBy": "https://greggkellogg.net/foaf#me",
|
31
31
|
-# "test": "http://svn.apache.org/repos/asf/jena/Experimental/riot-reader/testing/RIOT/Lang/TurtleSubm/manifest.ttl#testeval00",
|
32
|
-
-# "subject": "
|
32
|
+
-# "subject": "https://rubygems.org/gems/rdf-turtle",
|
33
33
|
-# "result": {
|
34
34
|
-# "@type": "earl:TestResult",
|
35
35
|
-# "outcome": "earl:passed"
|
@@ -40,8 +40,8 @@
|
|
40
40
|
-# }
|
41
41
|
- require 'cgi'
|
42
42
|
- require 'digest'
|
43
|
-
- editors = [{ name: "Gregg Kellogg", url: "
|
44
|
-
- foaf = {name: "Gregg Kellogg", url: "
|
43
|
+
- editors = [{ name: "Gregg Kellogg", url: "https://greggkellogg.net/"}]
|
44
|
+
- foaf = {name: "Gregg Kellogg", url: "https://greggkellogg.net/foaf#me" }
|
45
45
|
|
46
46
|
!!! 5
|
47
47
|
%html
|
@@ -333,7 +333,7 @@
|
|
333
333
|
- assertion = test['assertions'].detect {|a| a['subject'] == subject['@id']}
|
334
334
|
- pass_fail = assertion['result']['outcome'].split(':').last.upcase.sub(/(PASS|FAIL)ED$/, '\1')
|
335
335
|
- passed_tests[ndx2][ndx] = (passed_tests[ndx2][ndx] || 0) + (pass_fail == 'PASS' ? 1 : 0)
|
336
|
-
%td{class: pass_fail,
|
336
|
+
%td{class: pass_fail, typeof: assertion['@type']}
|
337
337
|
- if assertion['assertedBy'] && !assertion['assertedBy'].start_with?('_:')
|
338
338
|
%link{property: "earl:assertedBy", href: assertion['assertedBy']}
|
339
339
|
- if assertion['test'] && !assertion['test'].start_with?('_:')
|
@@ -418,7 +418,7 @@
|
|
418
418
|
%td{class: (pct == 100.0 ? 'passed-all' : (pct >= 85.0 ? 'passed-most' : 'passed-some'))}
|
419
419
|
= "#{passed}/#{total} (#{'%.1f' % pct}%)"
|
420
420
|
- unless tests['assertions'].empty?
|
421
|
-
%section.appendix#individual-test-results{rel: "xhv:related
|
421
|
+
%section.appendix#individual-test-results{rel: "xhv:related mf:report"}
|
422
422
|
%h2
|
423
423
|
%span.secno="B."
|
424
424
|
Individual Test Results
|
@@ -474,9 +474,9 @@
|
|
474
474
|
application. More information is available at
|
475
475
|
%a{property: "doap:homepage", href: doap['homepage']}<=doap['homepage']
|
476
476
|
= "."
|
477
|
-
%p{property: "doap:developer", resource: "
|
477
|
+
%p{property: "doap:developer", resource: "https://greggkellogg.net/foaf#me", typeof: "foaf:Person"}
|
478
478
|
This software is provided by
|
479
|
-
%a{property: "foaf:homepage", href: "
|
480
|
-
%span{about: "
|
479
|
+
%a{property: "foaf:homepage", href: "https://greggkellogg.net/"}<
|
480
|
+
%span{about: "https://greggkellogg.net/foaf#me", property: "foaf:name"}<
|
481
481
|
Gregg Kellogg
|
482
482
|
in hopes that it might make the lives of conformance testers easier.
|
data/spec/earl_report_spec.rb
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
$:.unshift "."
|
3
3
|
require 'spec_helper'
|
4
|
+
require 'rdf/rdfa'
|
4
5
|
|
5
6
|
describe EarlReport do
|
6
7
|
let!(:earl) {
|
7
8
|
EarlReport.new(
|
8
9
|
File.expand_path("../test-files/report-complete.ttl", __FILE__),
|
9
|
-
:
|
10
|
-
:
|
11
|
-
:
|
12
|
-
:
|
10
|
+
bibRef: "[[TURTLE]]",
|
11
|
+
name: "Turtle Test Results",
|
12
|
+
verbose: false,
|
13
|
+
manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
|
13
14
|
}
|
14
15
|
subject {earl}
|
15
16
|
|
@@ -26,6 +27,9 @@ describe EarlReport do
|
|
26
27
|
let(:reportNoFoaf) {
|
27
28
|
RDF::Graph.new << RDF::Turtle::Reader.new(File.open File.expand_path("../test-files/report-no-foaf.ttl", __FILE__))
|
28
29
|
}
|
30
|
+
let(:reportNoTest) {
|
31
|
+
RDF::Graph.new << RDF::Turtle::Reader.new(File.open File.expand_path("../test-files/report-no-test.ttl", __FILE__))
|
32
|
+
}
|
29
33
|
let(:doap) {
|
30
34
|
RDF::Graph.new << RDF::Turtle::Reader.new(File.open File.expand_path("../test-files/doap.ttl", __FILE__))
|
31
35
|
}
|
@@ -47,9 +51,9 @@ describe EarlReport do
|
|
47
51
|
.and_return(reportComplete)
|
48
52
|
EarlReport.new(
|
49
53
|
File.expand_path("../test-files/report-complete.ttl", __FILE__),
|
50
|
-
:
|
51
|
-
:
|
52
|
-
:
|
54
|
+
verbose: false,
|
55
|
+
base: "http://example.com/base/",
|
56
|
+
manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
|
53
57
|
end
|
54
58
|
end
|
55
59
|
|
@@ -66,8 +70,8 @@ describe EarlReport do
|
|
66
70
|
subject {
|
67
71
|
EarlReport.new(
|
68
72
|
File.expand_path("../test-files/report-complete.ttl", __FILE__),
|
69
|
-
:
|
70
|
-
:
|
73
|
+
verbose: false,
|
74
|
+
manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
|
71
75
|
}
|
72
76
|
it "loads manifest" do
|
73
77
|
expect(subject.graph.subjects.to_a).to include(RDF::URI("http://example/manifest.ttl"))
|
@@ -79,12 +83,24 @@ describe EarlReport do
|
|
79
83
|
end
|
80
84
|
|
81
85
|
it "loads doap" do
|
82
|
-
expect(subject.graph.subjects.to_a).to include(RDF::URI("
|
86
|
+
expect(subject.graph.subjects.to_a).to include(RDF::URI("https://rubygems.org/gems/rdf-turtle"))
|
83
87
|
end
|
84
88
|
|
85
89
|
it "loads foaf" do
|
86
90
|
expect(subject.graph.objects.to_a).to include(RDF::Vocab::FOAF.Person)
|
87
91
|
end
|
92
|
+
|
93
|
+
it "does not raise an error if the strict option is used" do
|
94
|
+
expect do
|
95
|
+
expect do
|
96
|
+
EarlReport.new(
|
97
|
+
File.expand_path("../test-files/report-complete.ttl", __FILE__),
|
98
|
+
verbose: false,
|
99
|
+
strict: true,
|
100
|
+
manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
|
101
|
+
end.not_to raise_error
|
102
|
+
end.not_to output.to_stderr
|
103
|
+
end
|
88
104
|
end
|
89
105
|
|
90
106
|
context "no doap report" do
|
@@ -96,15 +112,15 @@ describe EarlReport do
|
|
96
112
|
.with(File.expand_path("../test-files/report-no-doap.ttl", __FILE__))
|
97
113
|
.and_return(reportNoDoap)
|
98
114
|
expect(RDF::Graph).to receive(:load)
|
99
|
-
.with("
|
115
|
+
.with("https://rubygems.org/gems/rdf-turtle")
|
100
116
|
.and_return(doap)
|
101
117
|
end
|
102
118
|
|
103
119
|
subject {
|
104
120
|
EarlReport.new(
|
105
121
|
File.expand_path("../test-files/report-no-doap.ttl", __FILE__),
|
106
|
-
:
|
107
|
-
:
|
122
|
+
verbose: false,
|
123
|
+
manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
|
108
124
|
}
|
109
125
|
it "loads manifest" do
|
110
126
|
expect(subject.graph.subjects.to_a).to include(RDF::URI("http://example/manifest.ttl"))
|
@@ -116,12 +132,24 @@ describe EarlReport do
|
|
116
132
|
end
|
117
133
|
|
118
134
|
it "loads doap" do
|
119
|
-
expect(subject.graph.subjects.to_a).to include(RDF::URI("
|
135
|
+
expect(subject.graph.subjects.to_a).to include(RDF::URI("https://rubygems.org/gems/rdf-turtle"))
|
120
136
|
end
|
121
137
|
|
122
138
|
it "loads foaf" do
|
123
139
|
expect(subject.graph.objects.to_a).to include(RDF::Vocab::FOAF.Person)
|
124
140
|
end
|
141
|
+
|
142
|
+
it "does not raise an error if the strict option is used" do
|
143
|
+
expect do
|
144
|
+
expect do
|
145
|
+
EarlReport.new(
|
146
|
+
File.expand_path("../test-files/report-no-doap.ttl", __FILE__),
|
147
|
+
verbose: false,
|
148
|
+
strict: true,
|
149
|
+
manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
|
150
|
+
end.not_to raise_error
|
151
|
+
end.not_to output.to_stderr
|
152
|
+
end
|
125
153
|
end
|
126
154
|
|
127
155
|
context "no foaf report" do
|
@@ -133,15 +161,15 @@ describe EarlReport do
|
|
133
161
|
.with(File.expand_path("../test-files/report-no-foaf.ttl", __FILE__))
|
134
162
|
.and_return(reportNoFoaf)
|
135
163
|
expect(RDF::Graph).to receive(:load)
|
136
|
-
.with("
|
164
|
+
.with("https://greggkellogg.net/foaf#me")
|
137
165
|
.and_return(foaf)
|
138
166
|
end
|
139
167
|
|
140
168
|
subject {
|
141
169
|
EarlReport.new(
|
142
170
|
File.expand_path("../test-files/report-no-foaf.ttl", __FILE__),
|
143
|
-
:
|
144
|
-
:
|
171
|
+
verbose: false,
|
172
|
+
manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
|
145
173
|
}
|
146
174
|
it "loads manifest" do
|
147
175
|
expect(subject.graph.subjects.to_a).to include(RDF::URI("http://example/manifest.ttl"))
|
@@ -153,12 +181,73 @@ describe EarlReport do
|
|
153
181
|
end
|
154
182
|
|
155
183
|
it "loads doap" do
|
156
|
-
expect(subject.graph.subjects.to_a).to include(RDF::URI("
|
184
|
+
expect(subject.graph.subjects.to_a).to include(RDF::URI("https://rubygems.org/gems/rdf-turtle"))
|
157
185
|
end
|
158
186
|
|
159
187
|
it "loads foaf" do
|
160
188
|
expect(subject.graph.objects.to_a).to include(RDF::Vocab::FOAF.Person)
|
161
189
|
end
|
190
|
+
|
191
|
+
it "does not raise an error if the strict option is used" do
|
192
|
+
expect do
|
193
|
+
expect do
|
194
|
+
EarlReport.new(
|
195
|
+
File.expand_path("../test-files/report-no-foaf.ttl", __FILE__),
|
196
|
+
verbose: false,
|
197
|
+
strict: true,
|
198
|
+
manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
|
199
|
+
end.not_to raise_error
|
200
|
+
end.not_to output.to_stderr
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
context "asserts a test not in manifest" do
|
205
|
+
before(:each) do
|
206
|
+
expect(RDF::Graph).to receive(:load)
|
207
|
+
.with(File.expand_path("../test-files/manifest.ttl", __FILE__), {unique_bnodes: true, })
|
208
|
+
.and_return(manifest)
|
209
|
+
expect(RDF::Graph).to receive(:load)
|
210
|
+
.with(File.expand_path("../test-files/report-no-test.ttl", __FILE__))
|
211
|
+
.and_return(reportNoTest)
|
212
|
+
end
|
213
|
+
|
214
|
+
subject {
|
215
|
+
expect do
|
216
|
+
@no_test_earl = EarlReport.new(
|
217
|
+
File.expand_path("../test-files/report-no-test.ttl", __FILE__),
|
218
|
+
verbose: false,
|
219
|
+
manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
|
220
|
+
end.to output.to_stderr
|
221
|
+
@no_test_earl
|
222
|
+
}
|
223
|
+
it "loads manifest" do
|
224
|
+
expect(subject.graph.subjects.to_a).to include(RDF::URI("http://example/manifest.ttl"))
|
225
|
+
expect(subject.graph.subjects.to_a).to include(RDF::URI("http://example/manifest.ttl#testeval00"))
|
226
|
+
end
|
227
|
+
|
228
|
+
it "loads report" do
|
229
|
+
expect(subject.graph.predicates.to_a).to include(RDF::URI("http://www.w3.org/ns/earl#generatedBy"))
|
230
|
+
end
|
231
|
+
|
232
|
+
it "loads doap" do
|
233
|
+
expect(subject.graph.subjects.to_a).to include(RDF::URI("https://rubygems.org/gems/rdf-turtle"))
|
234
|
+
end
|
235
|
+
|
236
|
+
it "loads foaf" do
|
237
|
+
expect(subject.graph.objects.to_a).to include(RDF::Vocab::FOAF.Person)
|
238
|
+
end
|
239
|
+
|
240
|
+
it "raises an error if the strict option is used" do
|
241
|
+
expect do
|
242
|
+
expect do
|
243
|
+
EarlReport.new(
|
244
|
+
File.expand_path("../test-files/report-no-test.ttl", __FILE__),
|
245
|
+
verbose: false,
|
246
|
+
strict: true,
|
247
|
+
manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
|
248
|
+
end.to raise_error(RuntimeError)
|
249
|
+
end.to output.to_stderr
|
250
|
+
end
|
162
251
|
end
|
163
252
|
end
|
164
253
|
|
@@ -227,7 +316,7 @@ describe EarlReport do
|
|
227
316
|
let(:output) {
|
228
317
|
@output ||= begin
|
229
318
|
sio = StringIO.new
|
230
|
-
earl.send(:earl_turtle,
|
319
|
+
earl.send(:earl_turtle, io: sio)
|
231
320
|
sio.rewind
|
232
321
|
sio.read
|
233
322
|
end
|
@@ -240,7 +329,7 @@ describe EarlReport do
|
|
240
329
|
|
241
330
|
context "prefixes" do
|
242
331
|
%w(dc doap earl foaf mf rdf rdfs xsd).each do |pfx|
|
243
|
-
specify {is_expected.to match(/@prefix #{pfx}
|
332
|
+
specify {is_expected.to match(/@prefix #{pfx}:\s+</)}
|
244
333
|
end
|
245
334
|
end
|
246
335
|
|
@@ -264,7 +353,7 @@ describe EarlReport do
|
|
264
353
|
end
|
265
354
|
|
266
355
|
context "Assertion" do
|
267
|
-
specify {is_expected.to match(/\sa earl:Assertion
|
356
|
+
specify {is_expected.to match(/\sa earl:Assertion\s*;$/)}
|
268
357
|
end
|
269
358
|
|
270
359
|
context "parsing to RDF" do
|
@@ -311,6 +400,10 @@ describe EarlReport do
|
|
311
400
|
end
|
312
401
|
}
|
313
402
|
|
403
|
+
it "is valid HTML" do
|
404
|
+
expect(output).to be_valid_html
|
405
|
+
end
|
406
|
+
|
314
407
|
context "parsing to RDF" do
|
315
408
|
let(:graph) do
|
316
409
|
@graph ||= begin
|
@@ -383,8 +476,8 @@ describe EarlReport do
|
|
383
476
|
doap:name "Turtle Test Results";
|
384
477
|
dc:bibliographicCitation "[[TURTLE]]";
|
385
478
|
earl:generatedBy ?generatedBy;
|
386
|
-
|
387
|
-
earl:testSubjects <
|
479
|
+
mf:report ?assertionFile;
|
480
|
+
earl:testSubjects <https://rubygems.org/gems/rdf-turtle>;
|
388
481
|
mf:entries (<http://example/manifest.ttl>) .
|
389
482
|
|
390
483
|
<http://example/manifest.ttl> a earl:Report, mf:Manifest;
|
@@ -401,11 +494,11 @@ describe EarlReport do
|
|
401
494
|
PREFIX earl: <http://www.w3.org/ns/earl#>
|
402
495
|
|
403
496
|
ASK WHERE {
|
404
|
-
<
|
497
|
+
<https://rubygems.org/gems/rdf-turtle> a earl:TestSubject, doap:Project;
|
405
498
|
doap:name "RDF::Turtle";
|
406
499
|
doap:description """RDF::Turtle is an Turtle reader/writer for the RDF.rb library suite."""@en;
|
407
500
|
doap:programming-language "Ruby";
|
408
|
-
doap:developer <
|
501
|
+
doap:developer <https://greggkellogg.net/foaf#me> .
|
409
502
|
}
|
410
503
|
)
|
411
504
|
|
@@ -413,9 +506,9 @@ describe EarlReport do
|
|
413
506
|
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
|
414
507
|
|
415
508
|
ASK WHERE {
|
416
|
-
<
|
509
|
+
<https://greggkellogg.net/foaf#me> a foaf:Person;
|
417
510
|
foaf:name "Gregg Kellogg";
|
418
|
-
foaf:homepage <
|
511
|
+
foaf:homepage <https://greggkellogg.net/> .
|
419
512
|
}
|
420
513
|
)
|
421
514
|
|
@@ -428,8 +521,11 @@ describe EarlReport do
|
|
428
521
|
<http://example/manifest.ttl#testeval00> a earl:TestCriterion, earl:TestCase;
|
429
522
|
mf:name "subm-test-00";
|
430
523
|
mf:action <http://example/test-00.ttl>;
|
431
|
-
mf:result <http://example/test-00.out
|
432
|
-
|
524
|
+
mf:result <http://example/test-00.out>.
|
525
|
+
[ a earl:Assertion;
|
526
|
+
earl:subject <https://rubygems.org/gems/rdf-turtle>;
|
527
|
+
earl:test <http://example/manifest.ttl#testeval00>
|
528
|
+
] .
|
433
529
|
}
|
434
530
|
)
|
435
531
|
|
@@ -438,9 +534,9 @@ describe EarlReport do
|
|
438
534
|
|
439
535
|
ASK WHERE {
|
440
536
|
[ a earl:Assertion;
|
441
|
-
earl:assertedBy <
|
537
|
+
earl:assertedBy <https://greggkellogg.net/foaf#me>;
|
442
538
|
earl:test <http://example/manifest.ttl#testeval00>;
|
443
|
-
earl:subject <
|
539
|
+
earl:subject <https://rubygems.org/gems/rdf-turtle>;
|
444
540
|
earl:mode earl:automatic;
|
445
541
|
earl:result [ a earl:TestResult; earl:outcome earl:passed] ] .
|
446
542
|
}
|
data/spec/spec_helper.rb
CHANGED
@@ -4,16 +4,23 @@ $:.unshift File.dirname(__FILE__)
|
|
4
4
|
require "bundler/setup"
|
5
5
|
require 'rspec'
|
6
6
|
require 'rspec/its'
|
7
|
-
require '
|
8
|
-
require '
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
SimpleCov
|
15
|
-
|
7
|
+
require 'amazing_print'
|
8
|
+
require 'nokogumbo'
|
9
|
+
|
10
|
+
begin
|
11
|
+
require 'simplecov'
|
12
|
+
require 'coveralls'
|
13
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
|
14
|
+
SimpleCov::Formatter::HTMLFormatter,
|
15
|
+
Coveralls::SimpleCov::Formatter
|
16
|
+
])
|
17
|
+
SimpleCov.start do
|
18
|
+
add_filter "/spec/"
|
19
|
+
end
|
20
|
+
rescue LoadError => e
|
21
|
+
STDERR.puts "Coverage Skipped: #{e.message}"
|
16
22
|
end
|
23
|
+
|
17
24
|
require 'earl_report'
|
18
25
|
|
19
26
|
JSON_STATE = JSON::State.new(
|
@@ -28,3 +35,15 @@ JSON_STATE = JSON::State.new(
|
|
28
35
|
c.filter_run :focus => true
|
29
36
|
c.run_all_when_everything_filtered = true
|
30
37
|
end
|
38
|
+
|
39
|
+
RSpec::Matchers.define :be_valid_html do
|
40
|
+
match do |actual|
|
41
|
+
root = Nokogiri::HTML5(actual, max_parse_errors: 1000)
|
42
|
+
@errors = Array(root && root.errors.map(&:to_s))
|
43
|
+
@errors.empty?
|
44
|
+
end
|
45
|
+
|
46
|
+
failure_message do |actual|
|
47
|
+
"expected no errors, was #{@errors.join("\n")}"
|
48
|
+
end
|
49
|
+
end
|
data/spec/test-files/doap.ttl
CHANGED
@@ -7,10 +7,10 @@
|
|
7
7
|
@prefix ex: <http://example.org/> .
|
8
8
|
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
|
9
9
|
|
10
|
-
<
|
10
|
+
<https://rubygems.org/gems/rdf-turtle> a doap:Project, earl:TestSubject, earl:Software ;
|
11
11
|
doap:name "RDF::Turtle" ;
|
12
12
|
doap:homepage <http://ruby-rdf.github.com/rdf-turtle> ;
|
13
|
-
doap:license <http://creativecommons.org/
|
13
|
+
doap:license <http://creativecommons.org/publicdomain/zero/1.0/> ;
|
14
14
|
doap:shortdesc "Turtle reader/writer for Ruby."@en ;
|
15
15
|
doap:description "RDF::Turtle is an Turtle reader/writer for the RDF.rb library suite."@en ;
|
16
16
|
doap:created "2011-08-29"^^xsd:date;
|
@@ -18,16 +18,16 @@
|
|
18
18
|
doap:implements <http://www.w3.org/TR/turtle/> ;
|
19
19
|
doap:category <http://dbpedia.org/resource/Resource_Description_Framework>,
|
20
20
|
<http://dbpedia.org/resource/Ruby_(programming_language)> ;
|
21
|
-
doap:download-page <
|
21
|
+
doap:download-page <https://rubygems.org/gems/rdf-turtle> ;
|
22
22
|
doap:mailing-list <http://lists.w3.org/Archives/Public/public-rdf-ruby/> ;
|
23
|
-
doap:bug-database <
|
24
|
-
doap:blog <
|
25
|
-
doap:developer <
|
26
|
-
doap:maintainer <
|
27
|
-
doap:documenter <
|
28
|
-
foaf:maker <
|
23
|
+
doap:bug-database <https://github.com/ruby-rdf/rdf-turtle/issues> ;
|
24
|
+
doap:blog <https://greggkellogg.net/> ;
|
25
|
+
doap:developer <https://greggkellogg.net/foaf#me> ;
|
26
|
+
doap:maintainer <https://greggkellogg.net/foaf#me> ;
|
27
|
+
doap:documenter <https://greggkellogg.net/foaf#me> ;
|
28
|
+
foaf:maker <https://greggkellogg.net/foaf#me> ;
|
29
29
|
dc:title "RDF::Turtle" ;
|
30
30
|
dc:description "RDF::Turtle is an Turtle reader/writer for the RDF.rb library suite."@en ;
|
31
31
|
dc:date "2011-08-29"^^xsd:date;
|
32
|
-
dc:creator <
|
33
|
-
dc:isPartOf <
|
32
|
+
dc:creator <https://greggkellogg.net/foaf#me>;
|
33
|
+
dc:isPartOf <https://rubygems.org/gems/rdf> .
|