earl-report 0.4.9 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,7 +10,7 @@
10
10
  -# "assertions": ["./rdf.rb-earl.ttl"],
11
11
  -# "testSubjects": [
12
12
  -# {
13
- -# "@id": "http://rubygems.org/gems/rdf-turtle",
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": "http://greggkellogg.net/foaf#me",
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": "http://rubygems.org/gems/rdf-turtle",
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: "http://greggkellogg.net/"}]
44
- - foaf = {name: "Gregg Kellogg", url: "http://greggkellogg.net/foaf#me" }
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
@@ -334,10 +334,12 @@
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
336
  %td{class: pass_fail, property: "earl:assertions", typeof: assertion['@type']}
337
- - if assertion['assertedBy']
337
+ - if assertion['assertedBy'] && !assertion['assertedBy'].start_with?('_:')
338
338
  %link{property: "earl:assertedBy", href: assertion['assertedBy']}
339
- %link{property: "earl:test", href: assertion['test']}
340
- %link{property: "earl:subject", href: assertion['subject']}
339
+ - if assertion['test'] && !assertion['test'].start_with?('_:')
340
+ %link{property: "earl:test", href: assertion['test']}
341
+ - if assertion['subject'] && !assertion['subject'].start_with?('_:')
342
+ %link{property: "earl:subject", href: assertion['subject']}
341
343
  - if assertion['mode']
342
344
  %link{property: 'earl:mode', href: assertion['mode']}
343
345
  %span{property: "earl:result", typeof: assertion['result']['@type']}
@@ -443,10 +445,10 @@
443
445
  %p{property: "dc:description rdfs:comment"}<
444
446
  ~ CGI.escapeHTML test['description'].to_s
445
447
  %pre{class: "example actionDoc", property: "mf:action", resource: test['testAction'], title: "#{test['title']} Input"}<
446
- ~ Kernel.open(test['testAction']) {|f| f.set_encoding(Encoding::UTF_8); CGI.escapeHTML(f.read).gsub(/\n/, '<br/>')} rescue "#{test['testAction']} not loaded"
448
+ ~ URI.open(test['testAction']) {|f| f.set_encoding(Encoding::UTF_8); CGI.escapeHTML(f.read).gsub(/\n/, '<br/>')} rescue "#{test['testAction']} not loaded"
447
449
  - if test['testResult']
448
450
  %pre{class: "example resultDoc", property: "mf:result", resource: test['testResult'], title: "#{test['title']} Result"}<
449
- ~ Kernel.open(test['testResult']) {|f| f.set_encoding(Encoding::UTF_8); CGI.escapeHTML(f.read).gsub(/\n/, '<br/>')} rescue "#{test['testResult']} not loaded"
451
+ ~ URI.open(test['testResult']) {|f| f.set_encoding(Encoding::UTF_8); CGI.escapeHTML(f.read).gsub(/\n/, '<br/>')} rescue "#{test['testResult']} not loaded"
450
452
  %section.appendix#report-generation-software{property: "earl:generatedBy", resource: tests['generatedBy']['@id'], typeof: tests['generatedBy']['@type'].join(' ')}
451
453
  %h2
452
454
  %span.secno="D."
@@ -464,16 +466,17 @@
464
466
  %span{property: "doap:release", resource: rel['@id'], typeof: 'doap:Version'}
465
467
  %span{property: "doap:revision"}<=rel['revision']
466
468
  %meta{property: "doap:name", content: rel['name']}
467
- %meta{property: "doap:created", content: rel['created'], datatype: "xsd:date"}
469
+ - if rel['created']
470
+ %meta{property: "doap:created", content: rel['created'], datatype: "xsd:date"}
468
471
  an
469
472
  %a{property: "doap:license", href: doap['license']}<="Unlicensed"
470
473
  %span{property: "doap:programming-language"}<="Ruby"
471
474
  application. More information is available at
472
475
  %a{property: "doap:homepage", href: doap['homepage']}<=doap['homepage']
473
476
  = "."
474
- %p{property: "doap:developer", resource: "http://greggkellogg.net/foaf#me", typeof: "foaf:Person"}
477
+ %p{property: "doap:developer", resource: "https://greggkellogg.net/foaf#me", typeof: "foaf:Person"}
475
478
  This software is provided by
476
- %a{property: "foaf:homepage", href: "http://greggkellogg.net/"}<
477
- %span{about: "http://greggkellogg.net/foaf#me", property: "foaf:name"}<
479
+ %a{property: "foaf:homepage", href: "https://greggkellogg.net/"}<
480
+ %span{about: "https://greggkellogg.net/foaf#me", property: "foaf:name"}<
478
481
  Gregg Kellogg
479
482
  in hopes that it might make the lives of conformance testers easier.
@@ -6,10 +6,10 @@ describe EarlReport do
6
6
  let!(:earl) {
7
7
  EarlReport.new(
8
8
  File.expand_path("../test-files/report-complete.ttl", __FILE__),
9
- :bibRef => "[[TURTLE]]",
10
- :name => "Turtle Test Results",
11
- :verbose => false,
12
- :manifest => File.expand_path("../test-files/manifest.ttl", __FILE__))
9
+ bibRef: "[[TURTLE]]",
10
+ name: "Turtle Test Results",
11
+ verbose: false,
12
+ manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
13
13
  }
14
14
  subject {earl}
15
15
 
@@ -26,6 +26,9 @@ describe EarlReport do
26
26
  let(:reportNoFoaf) {
27
27
  RDF::Graph.new << RDF::Turtle::Reader.new(File.open File.expand_path("../test-files/report-no-foaf.ttl", __FILE__))
28
28
  }
29
+ let(:reportNoTest) {
30
+ RDF::Graph.new << RDF::Turtle::Reader.new(File.open File.expand_path("../test-files/report-no-test.ttl", __FILE__))
31
+ }
29
32
  let(:doap) {
30
33
  RDF::Graph.new << RDF::Turtle::Reader.new(File.open File.expand_path("../test-files/doap.ttl", __FILE__))
31
34
  }
@@ -47,9 +50,9 @@ describe EarlReport do
47
50
  .and_return(reportComplete)
48
51
  EarlReport.new(
49
52
  File.expand_path("../test-files/report-complete.ttl", __FILE__),
50
- :verbose => false,
51
- :base => "http://example.com/base/",
52
- :manifest => File.expand_path("../test-files/manifest.ttl", __FILE__))
53
+ verbose: false,
54
+ base: "http://example.com/base/",
55
+ manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
53
56
  end
54
57
  end
55
58
 
@@ -66,8 +69,8 @@ describe EarlReport do
66
69
  subject {
67
70
  EarlReport.new(
68
71
  File.expand_path("../test-files/report-complete.ttl", __FILE__),
69
- :verbose => false,
70
- :manifest => File.expand_path("../test-files/manifest.ttl", __FILE__))
72
+ verbose: false,
73
+ manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
71
74
  }
72
75
  it "loads manifest" do
73
76
  expect(subject.graph.subjects.to_a).to include(RDF::URI("http://example/manifest.ttl"))
@@ -79,12 +82,24 @@ describe EarlReport do
79
82
  end
80
83
 
81
84
  it "loads doap" do
82
- expect(subject.graph.subjects.to_a).to include(RDF::URI("http://rubygems.org/gems/rdf-turtle"))
85
+ expect(subject.graph.subjects.to_a).to include(RDF::URI("https://rubygems.org/gems/rdf-turtle"))
83
86
  end
84
87
 
85
88
  it "loads foaf" do
86
89
  expect(subject.graph.objects.to_a).to include(RDF::Vocab::FOAF.Person)
87
90
  end
91
+
92
+ it "does not raise an error if the strict option is used" do
93
+ expect do
94
+ expect do
95
+ EarlReport.new(
96
+ File.expand_path("../test-files/report-complete.ttl", __FILE__),
97
+ verbose: false,
98
+ strict: true,
99
+ manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
100
+ end.not_to raise_error
101
+ end.not_to output.to_stderr
102
+ end
88
103
  end
89
104
 
90
105
  context "no doap report" do
@@ -96,15 +111,15 @@ describe EarlReport do
96
111
  .with(File.expand_path("../test-files/report-no-doap.ttl", __FILE__))
97
112
  .and_return(reportNoDoap)
98
113
  expect(RDF::Graph).to receive(:load)
99
- .with("http://rubygems.org/gems/rdf-turtle")
114
+ .with("https://rubygems.org/gems/rdf-turtle")
100
115
  .and_return(doap)
101
116
  end
102
117
 
103
118
  subject {
104
119
  EarlReport.new(
105
120
  File.expand_path("../test-files/report-no-doap.ttl", __FILE__),
106
- :verbose => false,
107
- :manifest => File.expand_path("../test-files/manifest.ttl", __FILE__))
121
+ verbose: false,
122
+ manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
108
123
  }
109
124
  it "loads manifest" do
110
125
  expect(subject.graph.subjects.to_a).to include(RDF::URI("http://example/manifest.ttl"))
@@ -116,12 +131,24 @@ describe EarlReport do
116
131
  end
117
132
 
118
133
  it "loads doap" do
119
- expect(subject.graph.subjects.to_a).to include(RDF::URI("http://rubygems.org/gems/rdf-turtle"))
134
+ expect(subject.graph.subjects.to_a).to include(RDF::URI("https://rubygems.org/gems/rdf-turtle"))
120
135
  end
121
136
 
122
137
  it "loads foaf" do
123
138
  expect(subject.graph.objects.to_a).to include(RDF::Vocab::FOAF.Person)
124
139
  end
140
+
141
+ it "does not raise an error if the strict option is used" do
142
+ expect do
143
+ expect do
144
+ EarlReport.new(
145
+ File.expand_path("../test-files/report-no-doap.ttl", __FILE__),
146
+ verbose: false,
147
+ strict: true,
148
+ manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
149
+ end.not_to raise_error
150
+ end.not_to output.to_stderr
151
+ end
125
152
  end
126
153
 
127
154
  context "no foaf report" do
@@ -133,15 +160,15 @@ describe EarlReport do
133
160
  .with(File.expand_path("../test-files/report-no-foaf.ttl", __FILE__))
134
161
  .and_return(reportNoFoaf)
135
162
  expect(RDF::Graph).to receive(:load)
136
- .with("http://greggkellogg.net/foaf#me")
163
+ .with("https://greggkellogg.net/foaf#me")
137
164
  .and_return(foaf)
138
165
  end
139
166
 
140
167
  subject {
141
168
  EarlReport.new(
142
169
  File.expand_path("../test-files/report-no-foaf.ttl", __FILE__),
143
- :verbose => false,
144
- :manifest => File.expand_path("../test-files/manifest.ttl", __FILE__))
170
+ verbose: false,
171
+ manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
145
172
  }
146
173
  it "loads manifest" do
147
174
  expect(subject.graph.subjects.to_a).to include(RDF::URI("http://example/manifest.ttl"))
@@ -153,12 +180,73 @@ describe EarlReport do
153
180
  end
154
181
 
155
182
  it "loads doap" do
156
- expect(subject.graph.subjects.to_a).to include(RDF::URI("http://rubygems.org/gems/rdf-turtle"))
183
+ expect(subject.graph.subjects.to_a).to include(RDF::URI("https://rubygems.org/gems/rdf-turtle"))
184
+ end
185
+
186
+ it "loads foaf" do
187
+ expect(subject.graph.objects.to_a).to include(RDF::Vocab::FOAF.Person)
188
+ end
189
+
190
+ it "does not raise an error if the strict option is used" do
191
+ expect do
192
+ expect do
193
+ EarlReport.new(
194
+ File.expand_path("../test-files/report-no-foaf.ttl", __FILE__),
195
+ verbose: false,
196
+ strict: true,
197
+ manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
198
+ end.not_to raise_error
199
+ end.not_to output.to_stderr
200
+ end
201
+ end
202
+
203
+ context "asserts a test not in manifest" do
204
+ before(:each) do
205
+ expect(RDF::Graph).to receive(:load)
206
+ .with(File.expand_path("../test-files/manifest.ttl", __FILE__), {unique_bnodes: true, })
207
+ .and_return(manifest)
208
+ expect(RDF::Graph).to receive(:load)
209
+ .with(File.expand_path("../test-files/report-no-test.ttl", __FILE__))
210
+ .and_return(reportNoTest)
211
+ end
212
+
213
+ subject {
214
+ expect do
215
+ @no_test_earl = EarlReport.new(
216
+ File.expand_path("../test-files/report-no-test.ttl", __FILE__),
217
+ verbose: false,
218
+ manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
219
+ end.to output.to_stderr
220
+ @no_test_earl
221
+ }
222
+ it "loads manifest" do
223
+ expect(subject.graph.subjects.to_a).to include(RDF::URI("http://example/manifest.ttl"))
224
+ expect(subject.graph.subjects.to_a).to include(RDF::URI("http://example/manifest.ttl#testeval00"))
225
+ end
226
+
227
+ it "loads report" do
228
+ expect(subject.graph.predicates.to_a).to include(RDF::URI("http://www.w3.org/ns/earl#generatedBy"))
229
+ end
230
+
231
+ it "loads doap" do
232
+ expect(subject.graph.subjects.to_a).to include(RDF::URI("https://rubygems.org/gems/rdf-turtle"))
157
233
  end
158
234
 
159
235
  it "loads foaf" do
160
236
  expect(subject.graph.objects.to_a).to include(RDF::Vocab::FOAF.Person)
161
237
  end
238
+
239
+ it "raises an error if the strict option is used" do
240
+ expect do
241
+ expect do
242
+ EarlReport.new(
243
+ File.expand_path("../test-files/report-no-test.ttl", __FILE__),
244
+ verbose: false,
245
+ strict: true,
246
+ manifest: File.expand_path("../test-files/manifest.ttl", __FILE__))
247
+ end.to raise_error(RuntimeError)
248
+ end.to output.to_stderr
249
+ end
162
250
  end
163
251
  end
164
252
 
@@ -227,7 +315,7 @@ describe EarlReport do
227
315
  let(:output) {
228
316
  @output ||= begin
229
317
  sio = StringIO.new
230
- earl.send(:earl_turtle, {io: sio})
318
+ earl.send(:earl_turtle, io: sio)
231
319
  sio.rewind
232
320
  sio.read
233
321
  end
@@ -240,7 +328,7 @@ describe EarlReport do
240
328
 
241
329
  context "prefixes" do
242
330
  %w(dc doap earl foaf mf rdf rdfs xsd).each do |pfx|
243
- specify {is_expected.to match(/@prefix #{pfx}: </)}
331
+ specify {is_expected.to match(/@prefix #{pfx}:\s+</)}
244
332
  end
245
333
  end
246
334
 
@@ -264,7 +352,7 @@ describe EarlReport do
264
352
  end
265
353
 
266
354
  context "Assertion" do
267
- specify {is_expected.to match(/\sa earl:Assertion;$/)}
355
+ specify {is_expected.to match(/\sa earl:Assertion\s*;$/)}
268
356
  end
269
357
 
270
358
  context "parsing to RDF" do
@@ -384,7 +472,7 @@ describe EarlReport do
384
472
  dc:bibliographicCitation "[[TURTLE]]";
385
473
  earl:generatedBy ?generatedBy;
386
474
  earl:assertions ?assertionFile;
387
- earl:testSubjects <http://rubygems.org/gems/rdf-turtle>;
475
+ earl:testSubjects <https://rubygems.org/gems/rdf-turtle>;
388
476
  mf:entries (<http://example/manifest.ttl>) .
389
477
 
390
478
  <http://example/manifest.ttl> a earl:Report, mf:Manifest;
@@ -401,11 +489,11 @@ describe EarlReport do
401
489
  PREFIX earl: <http://www.w3.org/ns/earl#>
402
490
 
403
491
  ASK WHERE {
404
- <http://rubygems.org/gems/rdf-turtle> a earl:TestSubject, doap:Project;
492
+ <https://rubygems.org/gems/rdf-turtle> a earl:TestSubject, doap:Project;
405
493
  doap:name "RDF::Turtle";
406
494
  doap:description """RDF::Turtle is an Turtle reader/writer for the RDF.rb library suite."""@en;
407
495
  doap:programming-language "Ruby";
408
- doap:developer <http://greggkellogg.net/foaf#me> .
496
+ doap:developer <https://greggkellogg.net/foaf#me> .
409
497
  }
410
498
  )
411
499
 
@@ -413,9 +501,9 @@ describe EarlReport do
413
501
  PREFIX foaf: <http://xmlns.com/foaf/0.1/>
414
502
 
415
503
  ASK WHERE {
416
- <http://greggkellogg.net/foaf#me> a foaf:Person;
504
+ <https://greggkellogg.net/foaf#me> a foaf:Person;
417
505
  foaf:name "Gregg Kellogg";
418
- foaf:homepage <http://greggkellogg.net/> .
506
+ foaf:homepage <https://greggkellogg.net/> .
419
507
  }
420
508
  )
421
509
 
@@ -429,7 +517,7 @@ describe EarlReport do
429
517
  mf:name "subm-test-00";
430
518
  mf:action <http://example/test-00.ttl>;
431
519
  mf:result <http://example/test-00.out>;
432
- earl:assertions [ a earl:Assertion; earl:subject <http://rubygems.org/gems/rdf-turtle> ] .
520
+ earl:assertions [ a earl:Assertion; earl:subject <https://rubygems.org/gems/rdf-turtle> ] .
433
521
  }
434
522
  )
435
523
 
@@ -438,9 +526,9 @@ describe EarlReport do
438
526
 
439
527
  ASK WHERE {
440
528
  [ a earl:Assertion;
441
- earl:assertedBy <http://greggkellogg.net/foaf#me>;
529
+ earl:assertedBy <https://greggkellogg.net/foaf#me>;
442
530
  earl:test <http://example/manifest.ttl#testeval00>;
443
- earl:subject <http://rubygems.org/gems/rdf-turtle>;
531
+ earl:subject <https://rubygems.org/gems/rdf-turtle>;
444
532
  earl:mode earl:automatic;
445
533
  earl:result [ a earl:TestResult; earl:outcome earl:passed] ] .
446
534
  }
data/spec/spec_helper.rb CHANGED
@@ -4,15 +4,22 @@ $:.unshift File.dirname(__FILE__)
4
4
  require "bundler/setup"
5
5
  require 'rspec'
6
6
  require 'rspec/its'
7
- require 'simplecov'
8
- require 'coveralls'
9
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
10
- SimpleCov::Formatter::HTMLFormatter,
11
- Coveralls::SimpleCov::Formatter
12
- ])
13
- SimpleCov.start do
14
- add_filter "/spec/"
7
+ require 'amazing_print'
8
+
9
+ begin
10
+ require 'simplecov'
11
+ require 'coveralls'
12
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
13
+ SimpleCov::Formatter::HTMLFormatter,
14
+ Coveralls::SimpleCov::Formatter
15
+ ])
16
+ SimpleCov.start do
17
+ add_filter "/spec/"
18
+ end
19
+ rescue LoadError => e
20
+ STDERR.puts "Coverage Skipped: #{e.message}"
15
21
  end
22
+
16
23
  require 'earl_report'
17
24
 
18
25
  JSON_STATE = JSON::State.new(
@@ -7,10 +7,10 @@
7
7
  @prefix ex: <http://example.org/> .
8
8
  @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
9
9
 
10
- <http://rubygems.org/gems/rdf-turtle> a doap:Project, earl:TestSubject, earl:Software ;
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/licenses/publicdomain/> ;
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 <http://rubygems.org/gems/rdf-turtle> ;
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 <http://github.com/ruby-rdf/rdf-turtle/issues> ;
24
- doap:blog <http://greggkellogg.net/> ;
25
- doap:developer <http://greggkellogg.net/foaf#me> ;
26
- doap:maintainer <http://greggkellogg.net/foaf#me> ;
27
- doap:documenter <http://greggkellogg.net/foaf#me> ;
28
- foaf:maker <http://greggkellogg.net/foaf#me> ;
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 <http://greggkellogg.net/foaf#me>;
33
- dc:isPartOf <http://rubygems.org/gems/rdf> .
32
+ dc:creator <https://greggkellogg.net/foaf#me>;
33
+ dc:isPartOf <https://rubygems.org/gems/rdf> .
@@ -1,7 +1,7 @@
1
1
  @prefix earl: <http://www.w3.org/ns/earl#> .
2
2
  @prefix foaf: <http://xmlns.com/foaf/0.1/> .
3
3
 
4
- <http://greggkellogg.net/foaf#me> a foaf:Person, earl:Assertor;
4
+ <https://greggkellogg.net/foaf#me> a foaf:Person, earl:Assertor;
5
5
  foaf:name "Gregg Kellogg";
6
6
  foaf:title "Implementor";
7
- foaf:homepage <http://greggkellogg.net/> .
7
+ foaf:homepage <https://greggkellogg.net/> .