gonum.org/v1/gonum@v0.14.0/graph/formats/rdf/testdata/mk_manifest.rb (about) 1 #! /usr/bin/env ruby 2 # Parse test manifest to create driver and area-specific test manifests 3 4 require 'getoptlong' 5 require 'csv' 6 require 'json' 7 require 'haml' 8 require 'fileutils' 9 10 class Manifest 11 JSON_STATE = JSON::State.new( 12 :indent => " ", 13 :space => " ", 14 :space_before => "", 15 :object_nl => "\n", 16 :array_nl => "\n" 17 ) 18 19 TITLE = { 20 urgna2012: "RDF Graph Normalization (URGNA2012)", 21 urdna2015: "RDF Dataset Normalization (URDNA2015)", 22 } 23 DESCRIPTION = { 24 urgna2012: "Tests the 2012 version of RDF Graph Normalization.", 25 urdna2015: "Tests the 2015 version of RDF Dataset Normalization." 26 } 27 28 Test = Struct.new(:id, :name, :comment, :approval, :action, :urgna2012, :urdna2015) 29 30 attr_accessor :tests 31 32 def initialize 33 csv = CSV.new(File.open(File.expand_path("../manifest.csv", __FILE__))) 34 35 columns = [] 36 csv.shift.each_with_index {|c, i| columns[i] = c.to_sym if c} 37 38 @tests = csv.map do |line| 39 entry = {} 40 # Create entry as object indexed by symbolized column name 41 line.each_with_index {|v, i| entry[columns[i]] = v ? v.gsub("\r", "\n").gsub("\\", "\\\\") : nil} 42 43 urgna2012 = "#{entry[:test]}-urgna2012.nq" if entry[:urgna2012] == "TRUE" 44 urdna2015 = "#{entry[:test]}-urdna2015.nq" if entry[:urdna2015] == "TRUE" 45 Test.new(entry[:test], entry[:name], entry[:comment], entry[:approval], 46 "#{entry[:test]}-in.nq", urgna2012, urdna2015) 47 end 48 end 49 50 # Create files referenced in the manifest 51 def create_files 52 tests.each do |test| 53 files = [test.action, test.urgna2012, test.urdna2015].compact 54 files.compact.select {|f| !File.exist?(f)}.each do |f| 55 File.open(f, "w") {|io| io.puts( f.end_with?('.json') ? "{}" : "")} 56 end 57 end 58 end 59 60 def test_class(test, variant) 61 case variant.to_sym 62 when :urgna2012 then "rdfn:Urgna2012EvalTest" 63 when :urdna2015 then "rdfn:Urdna2015EvalTest" 64 end 65 end 66 67 def to_jsonld(variant) 68 context = ::JSON.parse %({ 69 "xsd": "http://www.w3.org/2001/XMLSchema#", 70 "rdfs": "http://www.w3.org/2000/01/rdf-schema#", 71 "mf": "http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#", 72 "mq": "http://www.w3.org/2001/sw/DataAccess/tests/test-query#", 73 "rdfn": "http://json-ld.github.io/normalization/test-vocab#", 74 "rdft": "http://www.w3.org/ns/rdftest#", 75 "id": "@id", 76 "type": "@type", 77 "action": {"@id": "mf:action", "@type": "@id"}, 78 "approval": {"@id": "rdft:approval", "@type": "@id"}, 79 "comment": "rdfs:comment", 80 "entries": {"@id": "mf:entries", "@type": "@id", "@container": "@list"}, 81 "label": "rdfs:label", 82 "name": "mf:name", 83 "result": {"@id": "mf:result", "@type": "@id"} 84 }) 85 86 manifest = { 87 "@context" => context, 88 "id" => "manifest-#{variant}", 89 "type" => "mf:Manifest", 90 "label" => TITLE[variant], 91 "comment" => DESCRIPTION[variant], 92 "entries" => [] 93 } 94 95 tests.each do |test| 96 next unless test.send(variant) 97 98 manifest["entries"] << { 99 "id" => "manifest-#{variant}##{test.id}", 100 "type" => test_class(test, variant), 101 "name" => test.name, 102 "comment" => test.comment, 103 "approval" => (test.approval ? "rdft:#{test.approval}" : "rdft:Proposed"), 104 "action" => test.action, 105 "result" => test.send(variant) 106 } 107 end 108 109 manifest.to_json(JSON_STATE) 110 end 111 112 def to_html 113 # Create vocab.html using vocab_template.haml and compacted vocabulary 114 template = File.read("template.haml") 115 manifests = TITLE.keys.inject({}) do |memo, v| 116 memo["manifest-#{v}"] = ::JSON.load(File.read("manifest-#{v}.jsonld")) 117 memo 118 end 119 120 Haml::Engine.new(template, :format => :html5).render(self, 121 man: ::JSON.load(File.read("manifest.jsonld")), 122 manifests: manifests 123 ) 124 end 125 126 def to_ttl(variant) 127 output = [] 128 output << %(## RDF Dataset Normalization tests 129 ## Distributed under both the W3C Test Suite License[1] and the W3C 3- 130 ## clause BSD License[2]. To contribute to a W3C Test Suite, see the 131 ## policies and contribution forms [3] 132 ## 133 ## 1. http://www.w3.org/Consortium/Legal/2008/04-testsuite-license 134 ## 2. http://www.w3.org/Consortium/Legal/2008/03-bsd-license 135 ## 3. http://www.w3.org/2004/10/27-testcases 136 ## 137 ## Test types 138 ## * rdfn:Urgna2012EvalTest - Normalization using URGNA2012 139 ## * rdfn:Urdna2015EvalTest - Normalization using URDNA2015 140 141 @prefix : <manifest-#{variant}#> . 142 @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 143 @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . 144 @prefix mf: <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> . 145 @prefix rdft: <http://www.w3.org/ns/rdftest#> . 146 @prefix rdfn: <http://json-ld.github.io/normalization/test-vocab#> . 147 148 <manifest-#{variant}> a mf:Manifest ; 149 ) 150 output << %( rdfs:label "#{TITLE[variant]}";) 151 output << %( rdfs:comment "#{DESCRIPTION[variant]}";) 152 output << %( mf:entries \() 153 154 tests.select {|t| t.send(variant)}.map {|t| ":#{t.id}"}.each_slice(10) do |entries| 155 output << %( #{entries.join(' ')}) 156 end 157 output << %( \) .) 158 159 tests.select {|t| t.send(variant)}.each do |test| 160 output << "" # separator 161 output << ":#{test.id} a #{test_class(test, variant)};" 162 output << %( mf:name "#{test.name}";) 163 output << %( rdfs:comment "#{test.comment}";) if test.comment 164 output << %( rdft:approval #{(test.approval ? "rdft:#{test.approval}" : "rdft:Proposed")};) 165 output << %( mf:action <#{test.action}>;) 166 output << %( mf:result <#{test.send(variant)}>;) 167 output << %( .) 168 end 169 output.join("\n") 170 end 171 end 172 173 options = { 174 output: $stdout 175 } 176 177 OPT_ARGS = [ 178 ["--format", "-f", GetoptLong::REQUIRED_ARGUMENT,"Output format, default #{options[:format].inspect}"], 179 ["--output", "-o", GetoptLong::REQUIRED_ARGUMENT,"Output to the specified file path"], 180 ["--quiet", GetoptLong::NO_ARGUMENT, "Supress most output other than progress indicators"], 181 ["--touch", GetoptLong::NO_ARGUMENT, "Create referenced files and directories if missing"], 182 ["--variant", GetoptLong::REQUIRED_ARGUMENT,"Test variant, 'rdf' or 'json'"], 183 ["--help", "-?", GetoptLong::NO_ARGUMENT, "This message"] 184 ] 185 def usage 186 STDERR.puts %{Usage: #{$0} [options] URL ...} 187 width = OPT_ARGS.map do |o| 188 l = o.first.length 189 l += o[1].length + 2 if o[1].is_a?(String) 190 l 191 end.max 192 OPT_ARGS.each do |o| 193 s = " %-*s " % [width, (o[1].is_a?(String) ? "#{o[0,2].join(', ')}" : o[0])] 194 s += o.last 195 STDERR.puts s 196 end 197 exit(1) 198 end 199 200 opts = GetoptLong.new(*OPT_ARGS.map {|o| o[0..-2]}) 201 202 opts.each do |opt, arg| 203 case opt 204 when '--format' then options[:format] = arg.to_sym 205 when '--output' then options[:output] = File.open(arg, "w") 206 when '--quiet' then options[:quiet] = true 207 when '--touch' then options[:touch] = true 208 when '--variant' then options[:variant] = arg.to_sym 209 when '--help' then usage 210 end 211 end 212 213 vocab = Manifest.new 214 vocab.create_files if options[:touch] 215 if options[:format] || options[:variant] 216 case options[:format] 217 when :jsonld then options[:output].puts(vocab.to_jsonld(options[:variant])) 218 when :ttl then options[:output].puts(vocab.to_ttl(options[:variant])) 219 when :html then options[:output].puts(vocab.to_html) 220 else STDERR.puts "Unknown format #{options[:format].inspect}" 221 end 222 else 223 Manifest::TITLE.keys.each do |variant| 224 %w(jsonld ttl).each do |format| 225 File.open("manifest-#{variant}.#{format}", "w") do |output| 226 output.puts(vocab.send("to_#{format}".to_sym, variant)) 227 end 228 end 229 end 230 File.open("index.html", "w") do |output| 231 output.puts(vocab.to_html) 232 end 233 end