json-ld 0.1.3 → 0.1.4
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.
- data/History.markdown +3 -0
- data/VERSION +1 -1
- data/bin/jsonld +134 -0
- data/lib/json/ld/api.rb +4 -4
- data/lib/json/ld/frame.rb +2 -1
- data/lib/json/ld/from_rdf.rb +1 -1
- data/spec/api_spec.rb +66 -0
- data/spec/compact_spec.rb +420 -0
- data/spec/evaluation_context_spec.rb +1039 -0
- data/spec/expand_spec.rb +625 -0
- data/spec/format_spec.rb +71 -0
- data/spec/frame_spec.rb +542 -0
- data/spec/from_rdf_spec.rb +316 -0
- data/spec/matchers.rb +67 -0
- data/spec/reader_spec.rb +79 -0
- data/spec/spec_helper.rb +56 -0
- data/spec/suite_helper.rb +184 -0
- data/spec/suite_spec.rb +104 -0
- data/spec/support/extensions.rb +10 -0
- data/spec/test-files/test-1-automatic.json +10 -0
- data/spec/test-files/test-1-compacted.json +10 -0
- data/spec/test-files/test-1-context.json +7 -0
- data/spec/test-files/test-1-expanded.json +5 -0
- data/spec/test-files/test-1-input.json +10 -0
- data/spec/test-files/test-1-normalized.json +8 -0
- data/spec/test-files/test-1-rdf.ttl +7 -0
- data/spec/test-files/test-2-automatic.json +27 -0
- data/spec/test-files/test-2-compacted.json +20 -0
- data/spec/test-files/test-2-context.json +7 -0
- data/spec/test-files/test-2-expanded.json +16 -0
- data/spec/test-files/test-2-input.json +20 -0
- data/spec/test-files/test-2-normalized.json +32 -0
- data/spec/test-files/test-2-rdf.ttl +14 -0
- data/spec/test-files/test-3-compacted.json +11 -0
- data/spec/test-files/test-3-context.json +8 -0
- data/spec/test-files/test-3-expanded.json +10 -0
- data/spec/test-files/test-3-input.json +11 -0
- data/spec/test-files/test-3-normalized.json +13 -0
- data/spec/test-files/test-3-rdf.ttl +7 -0
- data/spec/test-files/test-4-automatic.json +10 -0
- data/spec/test-files/test-4-compacted.json +10 -0
- data/spec/test-files/test-4-context.json +7 -0
- data/spec/test-files/test-4-expanded.json +6 -0
- data/spec/test-files/test-4-input.json +10 -0
- data/spec/test-files/test-4-rdf.ttl +5 -0
- data/spec/test-files/test-5-automatic.json +13 -0
- data/spec/test-files/test-5-compacted.json +13 -0
- data/spec/test-files/test-5-context.json +7 -0
- data/spec/test-files/test-5-expanded.json +9 -0
- data/spec/test-files/test-5-input.json +13 -0
- data/spec/test-files/test-5-rdf.ttl +6 -0
- data/spec/test-files/test-6-automatic.json +10 -0
- data/spec/test-files/test-6-compacted.json +10 -0
- data/spec/test-files/test-6-context.json +7 -0
- data/spec/test-files/test-6-expanded.json +10 -0
- data/spec/test-files/test-6-input.json +10 -0
- data/spec/test-files/test-6-rdf.ttl +5 -0
- data/spec/test-files/test-7-automatic.json +20 -0
- data/spec/test-files/test-7-compacted.json +23 -0
- data/spec/test-files/test-7-context.json +4 -0
- data/spec/test-files/test-7-expanded.json +20 -0
- data/spec/test-files/test-7-input.json +23 -0
- data/spec/test-files/test-7-rdf.ttl +13 -0
- data/spec/test-files/test-8-automatic.json +1 -0
- data/spec/test-files/test-8-compacted.json +34 -0
- data/spec/test-files/test-8-context.json +11 -0
- data/spec/test-files/test-8-expanded.json +24 -0
- data/spec/test-files/test-8-frame.json +18 -0
- data/spec/test-files/test-8-framed.json +29 -0
- data/spec/test-files/test-8-input.json +30 -0
- data/spec/test-files/test-8-rdf.ttl +15 -0
- data/spec/test-files/test-9-compacted.json +20 -0
- data/spec/test-files/test-9-context.json +13 -0
- data/spec/test-files/test-9-expanded.json +14 -0
- data/spec/test-files/test-9-input.json +12 -0
- data/spec/to_rdf_spec.rb +640 -0
- data/spec/writer_spec.rb +161 -0
- metadata +150 -22
data/History.markdown
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.4
|
data/bin/jsonld
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
$:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "..", 'lib')))
|
4
|
+
begin
|
5
|
+
require 'linkeddata'
|
6
|
+
rescue LoadError
|
7
|
+
end
|
8
|
+
require 'json/ld'
|
9
|
+
require 'getoptlong'
|
10
|
+
require 'open-uri'
|
11
|
+
|
12
|
+
def run(input, options)
|
13
|
+
reader_class = RDF::Reader.for(options[:input_format].to_sym)
|
14
|
+
raise "Reader not found for #{options[:input_format]}" unless reader_class
|
15
|
+
|
16
|
+
# Override default (or specified) output format when framing
|
17
|
+
options[:format] = :jsonld if options[:compact] || options[:frame]
|
18
|
+
|
19
|
+
# If input format is not JSON-LD, transform input to JSON-LD first
|
20
|
+
if options[:format] == :jsonld && options[:input_format] != :jsonld
|
21
|
+
r = reader_class.new(input, options[:parser_options])
|
22
|
+
g = RDF::Repository.new << r
|
23
|
+
input = JSON::LD::API.fromRDF(g)
|
24
|
+
end
|
25
|
+
|
26
|
+
prefixes = {}
|
27
|
+
start = Time.new
|
28
|
+
if options[:expand]
|
29
|
+
output = JSON::LD::API.expand(input, options[:context], nil, options)
|
30
|
+
secs = Time.new - start
|
31
|
+
options[:output].puts output.to_json(JSON::LD::JSON_STATE)
|
32
|
+
STDERR.puts "Expanded in #{secs} seconds." unless options[:quiet]
|
33
|
+
elsif options[:compact]
|
34
|
+
output = JSON::LD::API.compact(input, options[:context], nil, options)
|
35
|
+
secs = Time.new - start
|
36
|
+
options[:output].puts output.to_json(JSON::LD::JSON_STATE)
|
37
|
+
STDERR.puts "Compacted in #{secs} seconds." unless options[:quiet]
|
38
|
+
elsif options[:frame]
|
39
|
+
output = JSON::LD::API.frame(input, options[:frame], nil, options)
|
40
|
+
secs = Time.new - start
|
41
|
+
options[:output].puts output.to_json(JSON::LD::JSON_STATE)
|
42
|
+
STDERR.puts "Framed in #{secs} seconds." unless options[:quiet]
|
43
|
+
else
|
44
|
+
r = reader_class.new(input, options[:parser_options])
|
45
|
+
g = RDF::Repository.new << r
|
46
|
+
secs = Time.new - start
|
47
|
+
num = g.count
|
48
|
+
parser_options = options[:parser_options].merge(:prefixes => r.prefixes, :standard_prefixes => true)
|
49
|
+
options[:output].puts g.dump(options[:output_format], parser_options)
|
50
|
+
STDERR.puts "\nParsed #{num} statements in #{secs} seconds @ #{num/secs} statements/second." unless options[:quiet]
|
51
|
+
end
|
52
|
+
rescue
|
53
|
+
fname = input.respond_to?(:path) ? input.path : "-stdin-"
|
54
|
+
STDERR.puts("Error in #{fname}")
|
55
|
+
raise
|
56
|
+
end
|
57
|
+
|
58
|
+
parser_options = {
|
59
|
+
:base => "",
|
60
|
+
:progress => false,
|
61
|
+
:validate => false,
|
62
|
+
:strict => false,
|
63
|
+
}
|
64
|
+
|
65
|
+
options = {
|
66
|
+
:parser_options => parser_options,
|
67
|
+
:output => STDOUT,
|
68
|
+
:output_format => :turtle,
|
69
|
+
:input_format => :jsonld,
|
70
|
+
}
|
71
|
+
input = nil
|
72
|
+
|
73
|
+
OPT_ARGS = [
|
74
|
+
["--dbg", GetoptLong::NO_ARGUMENT, "Turn on verbose debugging"],
|
75
|
+
["--compact", GetoptLong::NO_ARGUMENT, "Compact document, using --context"],
|
76
|
+
["--context", GetoptLong::REQUIRED_ARGUMENT,"Context to apply for expand, compact and converting from RDF"],
|
77
|
+
["--evaluate","-e", GetoptLong::REQUIRED_ARGUMENT,"Evaluate argument as a JSON-LD document"],
|
78
|
+
["--expand", GetoptLong::NO_ARGUMENT, "Expand document, using an optional --context"],
|
79
|
+
["--format", GetoptLong::REQUIRED_ARGUMENT,"Specify output format when converting to RDF"],
|
80
|
+
["--frame", GetoptLong::REQUIRED_ARGUMENT,"Frame document, using the file or URL as a frame specification"],
|
81
|
+
["--input-format", GetoptLong::REQUIRED_ARGUMENT,"Format of the input document, when converting from RDF."],
|
82
|
+
["--output", "-o", GetoptLong::REQUIRED_ARGUMENT,"Output to the specified file path"],
|
83
|
+
["--parse-only", GetoptLong::NO_ARGUMENT, "Parse the document for well-formedness only"],
|
84
|
+
["--quiet", GetoptLong::NO_ARGUMENT, "Supress most output other than progress indicators"],
|
85
|
+
["--uri", GetoptLong::REQUIRED_ARGUMENT,"URI to be used as the document base"],
|
86
|
+
["--verbose", GetoptLong::NO_ARGUMENT, "Detail on execution"],
|
87
|
+
["--help", "-?", GetoptLong::NO_ARGUMENT, "This message"]
|
88
|
+
]
|
89
|
+
def usage
|
90
|
+
STDERR.puts %{Usage: #{$0} [options] file ...}
|
91
|
+
width = OPT_ARGS.map do |o|
|
92
|
+
l = o.first.length
|
93
|
+
l += o[1].length + 2 if o[1].is_a?(String)
|
94
|
+
l
|
95
|
+
end.max
|
96
|
+
OPT_ARGS.each do |o|
|
97
|
+
s = " %-*s " % [width, (o[1].is_a?(String) ? "#{o[0,2].join(', ')}" : o[0])]
|
98
|
+
s += o.last
|
99
|
+
STDERR.puts s
|
100
|
+
end
|
101
|
+
exit(1)
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
opts = GetoptLong.new(*OPT_ARGS.map {|o| o[0..-2]})
|
106
|
+
|
107
|
+
opts.each do |opt, arg|
|
108
|
+
case opt
|
109
|
+
when '--dbg' then parser_options[:debug] = ::JSON::LD::debug = true
|
110
|
+
when '--compact' then options[:compact] = true
|
111
|
+
when '--context' then options[:context] = arg
|
112
|
+
when '--execute' then input = arg
|
113
|
+
when '--expand' then options[:expand] = true
|
114
|
+
when '--format' then options[:output_format] = arg.to_sym
|
115
|
+
when '--frame' then options[:frame] = arg
|
116
|
+
when '--input-format' then options[:input_format] = arg.to_sym
|
117
|
+
when '--output' then options[:output] = File.open(arg, "w")
|
118
|
+
when '--parse-only' then options[:parse_only] = true
|
119
|
+
when '--quiet' then options[:quiet] = true
|
120
|
+
when '--uri' then parser_options[:base] = arg
|
121
|
+
when '--verbose' then $verbose = true
|
122
|
+
when '--help' then usage
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
if ARGV.empty?
|
127
|
+
s = input ? input : $stdin.read
|
128
|
+
run(StringIO.new(s), options)
|
129
|
+
else
|
130
|
+
ARGV.each do |file|
|
131
|
+
run(Kernel.open(file), options)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
puts
|
data/lib/json/ld/api.rb
CHANGED
@@ -129,7 +129,7 @@ module JSON::LD
|
|
129
129
|
|
130
130
|
# 1) Perform the Expansion Algorithm on the JSON-LD input.
|
131
131
|
# This removes any existing context to allow the given context to be cleanly applied.
|
132
|
-
expanded = API.expand(input, nil, nil, options)
|
132
|
+
expanded = API.expand(input, nil, nil, options.merge(:debug => nil))
|
133
133
|
|
134
134
|
API.new(expanded, context, options) do
|
135
135
|
debug(".compact") {"expanded input: #{expanded.to_json(JSON_STATE)}"}
|
@@ -215,9 +215,9 @@ module JSON::LD
|
|
215
215
|
|
216
216
|
# Initialize input using frame as context
|
217
217
|
API.new(expanded_input, nil, options) do
|
218
|
-
debug(".frame") {"context from frame: #{context.inspect}"}
|
219
|
-
debug(".frame") {"expanded frame: #{expanded_frame.to_json(JSON_STATE)}"}
|
220
|
-
debug(".frame") {"expanded input: #{value.to_json(JSON_STATE)}"}
|
218
|
+
#debug(".frame") {"context from frame: #{context.inspect}"}
|
219
|
+
#debug(".frame") {"expanded frame: #{expanded_frame.to_json(JSON_STATE)}"}
|
220
|
+
#debug(".frame") {"expanded input: #{value.to_json(JSON_STATE)}"}
|
221
221
|
|
222
222
|
# Get framing subjects from expanded input, replacing Blank Node identifiers as necessary
|
223
223
|
@subjects = Hash.ordered
|
data/lib/json/ld/frame.rb
CHANGED
@@ -343,7 +343,8 @@ module JSON::LD
|
|
343
343
|
|
344
344
|
# Return value of @name in frame, or default from state if it doesn't exist
|
345
345
|
def get_frame_flag(state, frame, name)
|
346
|
-
|
346
|
+
value = frame.fetch("@#{name}", [state[name.to_sym]]).first
|
347
|
+
!!(value?(value) ? value['@value'] : value)
|
347
348
|
end
|
348
349
|
|
349
350
|
##
|
data/lib/json/ld/from_rdf.rb
CHANGED
@@ -8,7 +8,7 @@ module JSON::LD
|
|
8
8
|
# Generate a JSON-LD array representation from an array of `RDF::Statement`.
|
9
9
|
# Representation is in expanded form
|
10
10
|
#
|
11
|
-
# @param [Array<RDF::Statement
|
11
|
+
# @param [Array<RDF::Statement>, RDF::Enumerable] input
|
12
12
|
# @return [Array<Hash>] the JSON-LD document in normalized form
|
13
13
|
def from_statements(input)
|
14
14
|
defaultGraph = {:subjects => {}, :listMap => {}, :name => ''}
|
data/spec/api_spec.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
$:.unshift "."
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe JSON::LD::API do
|
6
|
+
before(:each) { @debug = []}
|
7
|
+
|
8
|
+
context "callbacks" do
|
9
|
+
describe ".compact" do
|
10
|
+
it "needs to be implemented"
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ".expand" do
|
14
|
+
it "needs to be implemented"
|
15
|
+
end
|
16
|
+
|
17
|
+
describe ".frame" do
|
18
|
+
it "needs to be implemented"
|
19
|
+
end
|
20
|
+
|
21
|
+
describe ".fromRDF" do
|
22
|
+
it "needs to be implemented"
|
23
|
+
end
|
24
|
+
|
25
|
+
describe ".toRDF" do
|
26
|
+
it "needs to be implemented"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "Test Files" do
|
31
|
+
Dir.glob(File.expand_path(File.join(File.dirname(__FILE__), 'test-files/*-input.*'))) do |filename|
|
32
|
+
test = File.basename(filename).sub(/-input\..*$/, '')
|
33
|
+
frame = filename.sub(/-input\..*$/, '-frame.json')
|
34
|
+
framed = filename.sub(/-input\..*$/, '-framed.json')
|
35
|
+
compacted = filename.sub(/-input\..*$/, '-compacted.json')
|
36
|
+
context = filename.sub(/-input\..*$/, '-context.json')
|
37
|
+
expanded = filename.sub(/-input\..*$/, '-expanded.json')
|
38
|
+
automatic = filename.sub(/-input\..*$/, '-automatic.json')
|
39
|
+
ttl = filename.sub(/-input\..*$/, '-rdf.ttl')
|
40
|
+
|
41
|
+
context test do
|
42
|
+
before(:all) do
|
43
|
+
end
|
44
|
+
|
45
|
+
it "expands" do
|
46
|
+
jld = JSON::LD::API.expand(File.open(filename), (File.open(context) if context), nil, :debug => @debug)
|
47
|
+
jld.should produce(JSON.load(File.open(expanded)), @debug)
|
48
|
+
end if File.exist?(expanded)
|
49
|
+
|
50
|
+
it "compacts" do
|
51
|
+
jld = JSON::LD::API.compact(File.open(filename), File.open(context), nil, :debug => @debug)
|
52
|
+
jld.should produce(JSON.load(File.open(compacted)), @debug)
|
53
|
+
end if File.exist?(compacted) && File.exist?(context)
|
54
|
+
|
55
|
+
it "frame" do
|
56
|
+
jld = JSON::LD::API.frame(File.open(filename), File.open(frame), nil, :debug => @debug)
|
57
|
+
jld.should produce(JSON.load(File.open(framed)), @debug)
|
58
|
+
end if File.exist?(framed) && File.exist?(frame)
|
59
|
+
|
60
|
+
it "toRDF" do
|
61
|
+
RDF::Graph.load(filename, :debug => @debug).should be_equivalent_graph(RDF::Graph.load(ttl), :trace => @debug)
|
62
|
+
end if File.exist?(ttl)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,420 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
$:.unshift "."
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe JSON::LD::API do
|
6
|
+
before(:each) { @debug = []}
|
7
|
+
|
8
|
+
describe ".compact" do
|
9
|
+
{
|
10
|
+
"prefix" => {
|
11
|
+
:input => {
|
12
|
+
"@id" => "http://example.com/a",
|
13
|
+
"http://example.com/b" => {"@id" => "http://example.com/c"}
|
14
|
+
},
|
15
|
+
:context => {"ex" => "http://example.com/"},
|
16
|
+
:output => {
|
17
|
+
"@context" => {"ex" => "http://example.com/"},
|
18
|
+
"@id" => "ex:a",
|
19
|
+
"ex:b" => {"@id" => "ex:c"}
|
20
|
+
}
|
21
|
+
},
|
22
|
+
"term" => {
|
23
|
+
:input => {
|
24
|
+
"@id" => "http://example.com/a",
|
25
|
+
"http://example.com/b" => {"@id" => "http://example.com/c"}
|
26
|
+
},
|
27
|
+
:context => {"b" => "http://example.com/b"},
|
28
|
+
:output => {
|
29
|
+
"@context" => {"b" => "http://example.com/b"},
|
30
|
+
"@id" => "http://example.com/a",
|
31
|
+
"b" => {"@id" => "http://example.com/c"}
|
32
|
+
}
|
33
|
+
},
|
34
|
+
"integer value" => {
|
35
|
+
:input => {
|
36
|
+
"@id" => "http://example.com/a",
|
37
|
+
"http://example.com/b" => {"@value" => 1}
|
38
|
+
},
|
39
|
+
:context => {"b" => "http://example.com/b"},
|
40
|
+
:output => {
|
41
|
+
"@context" => {"b" => "http://example.com/b"},
|
42
|
+
"@id" => "http://example.com/a",
|
43
|
+
"b" => 1
|
44
|
+
}
|
45
|
+
},
|
46
|
+
"boolean value" => {
|
47
|
+
:input => {
|
48
|
+
"@id" => "http://example.com/a",
|
49
|
+
"http://example.com/b" => {"@value" => true}
|
50
|
+
},
|
51
|
+
:context => {"b" => "http://example.com/b"},
|
52
|
+
:output => {
|
53
|
+
"@context" => {"b" => "http://example.com/b"},
|
54
|
+
"@id" => "http://example.com/a",
|
55
|
+
"b" => true
|
56
|
+
}
|
57
|
+
},
|
58
|
+
"@id" => {
|
59
|
+
:input => {"@id" => "http://example.org/test#example"},
|
60
|
+
:context => {},
|
61
|
+
:output => {"@id" => "http://example.org/test#example"}
|
62
|
+
},
|
63
|
+
"@id coercion" => {
|
64
|
+
:input => {
|
65
|
+
"@id" => "http://example.com/a",
|
66
|
+
"http://example.com/b" => {"@id" => "http://example.com/c"}
|
67
|
+
},
|
68
|
+
:context => {"b" => {"@id" => "http://example.com/b", "@type" => "@id"}},
|
69
|
+
:output => {
|
70
|
+
"@context" => {"b" => {"@id" => "http://example.com/b", "@type" => "@id"}},
|
71
|
+
"@id" => "http://example.com/a",
|
72
|
+
"b" => "http://example.com/c"
|
73
|
+
}
|
74
|
+
},
|
75
|
+
"xsd:date coercion" => {
|
76
|
+
:input => {
|
77
|
+
"http://example.com/b" => {"@value" => "2012-01-04", "@type" => RDF::XSD.date.to_s}
|
78
|
+
},
|
79
|
+
:context => {
|
80
|
+
"xsd" => RDF::XSD.to_s,
|
81
|
+
"b" => {"@id" => "http://example.com/b", "@type" => "xsd:date"}
|
82
|
+
},
|
83
|
+
:output => {
|
84
|
+
"@context" => {
|
85
|
+
"xsd" => RDF::XSD.to_s,
|
86
|
+
"b" => {"@id" => "http://example.com/b", "@type" => "xsd:date"}
|
87
|
+
},
|
88
|
+
"b" => "2012-01-04"
|
89
|
+
}
|
90
|
+
},
|
91
|
+
"@list coercion" => {
|
92
|
+
:input => {
|
93
|
+
"http://example.com/b" => {"@list" => ["c", "d"]}
|
94
|
+
},
|
95
|
+
:context => {"b" => {"@id" => "http://example.com/b", "@container" => "@list"}},
|
96
|
+
:output => {
|
97
|
+
"@context" => {"b" => {"@id" => "http://example.com/b", "@container" => "@list"}},
|
98
|
+
"b" => ["c", "d"]
|
99
|
+
}
|
100
|
+
},
|
101
|
+
"@list coercion (integer)" => {
|
102
|
+
:input => {
|
103
|
+
"http://example.com/term" => [
|
104
|
+
{"@list" => [1]},
|
105
|
+
]
|
106
|
+
},
|
107
|
+
:context => {
|
108
|
+
"term4" => {"@id" => "http://example.com/term", "@container" => "@list"},
|
109
|
+
"@language" => "de"
|
110
|
+
},
|
111
|
+
:output => {
|
112
|
+
"@context" => {
|
113
|
+
"term4" => {"@id" => "http://example.com/term", "@container" => "@list"},
|
114
|
+
"@language" => "de"
|
115
|
+
},
|
116
|
+
"term4" => [1],
|
117
|
+
}
|
118
|
+
},
|
119
|
+
"@set coercion" => {
|
120
|
+
:input => {
|
121
|
+
"http://example.com/b" => {"@set" => ["c"]}
|
122
|
+
},
|
123
|
+
:context => {"b" => {"@id" => "http://example.com/b", "@container" => "@set"}},
|
124
|
+
:output => {
|
125
|
+
"@context" => {"b" => {"@id" => "http://example.com/b", "@container" => "@set"}},
|
126
|
+
"b" => ["c"]
|
127
|
+
}
|
128
|
+
},
|
129
|
+
"empty @set coercion" => {
|
130
|
+
:input => {
|
131
|
+
"http://example.com/b" => []
|
132
|
+
},
|
133
|
+
:context => {"b" => {"@id" => "http://example.com/b", "@container" => "@set"}},
|
134
|
+
:output => {
|
135
|
+
"@context" => {"b" => {"@id" => "http://example.com/b", "@container" => "@set"}},
|
136
|
+
"b" => []
|
137
|
+
}
|
138
|
+
},
|
139
|
+
"empty term" => {
|
140
|
+
:input => {
|
141
|
+
"@id" => "http://example.com/",
|
142
|
+
"@type" => "#{RDF::RDFS.Resource}"
|
143
|
+
},
|
144
|
+
:context => {"" => "http://example.com/"},
|
145
|
+
:output => {
|
146
|
+
"@context" => {"" => "http://example.com/"},
|
147
|
+
"@id" => "",
|
148
|
+
"@type" => "#{RDF::RDFS.Resource}"
|
149
|
+
},
|
150
|
+
},
|
151
|
+
"@type with string @id" => {
|
152
|
+
:input => {
|
153
|
+
"@id" => "http://example.com/",
|
154
|
+
"@type" => "#{RDF::RDFS.Resource}"
|
155
|
+
},
|
156
|
+
:context => {},
|
157
|
+
:output => {
|
158
|
+
"@id" => "http://example.com/",
|
159
|
+
"@type" => "#{RDF::RDFS.Resource}"
|
160
|
+
},
|
161
|
+
},
|
162
|
+
"@type with array @id" => {
|
163
|
+
:input => {
|
164
|
+
"@id" => "http://example.com/",
|
165
|
+
"@type" => ["#{RDF::RDFS.Resource}"]
|
166
|
+
},
|
167
|
+
:context => {},
|
168
|
+
:output => {
|
169
|
+
"@id" => "http://example.com/",
|
170
|
+
"@type" => "#{RDF::RDFS.Resource}"
|
171
|
+
},
|
172
|
+
},
|
173
|
+
"default language" => {
|
174
|
+
:input => {
|
175
|
+
"http://example.com/term" => [
|
176
|
+
"v5",
|
177
|
+
{"@value" => "plain literal"}
|
178
|
+
]
|
179
|
+
},
|
180
|
+
:context => {
|
181
|
+
"term5" => {"@id" => "http://example.com/term", "@language" => nil},
|
182
|
+
"@language" => "de"
|
183
|
+
},
|
184
|
+
:output => {
|
185
|
+
"@context" => {
|
186
|
+
"term5" => {"@id" => "http://example.com/term", "@language" => nil},
|
187
|
+
"@language" => "de"
|
188
|
+
},
|
189
|
+
"term5" => [ "v5", "plain literal" ]
|
190
|
+
}
|
191
|
+
},
|
192
|
+
}.each_pair do |title, params|
|
193
|
+
it title do
|
194
|
+
jld = JSON::LD::API.compact(params[:input], params[:context], nil, :debug => @debug)
|
195
|
+
jld.should produce(params[:output], @debug)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
context "keyword aliasing" do
|
200
|
+
{
|
201
|
+
"@id" => {
|
202
|
+
:input => {
|
203
|
+
"@id" => "",
|
204
|
+
"@type" => "#{RDF::RDFS.Resource}"
|
205
|
+
},
|
206
|
+
:context => {"id" => "@id"},
|
207
|
+
:output => {
|
208
|
+
"@context" => {"id" => "@id"},
|
209
|
+
"id" => "",
|
210
|
+
"@type" => "#{RDF::RDFS.Resource}"
|
211
|
+
}
|
212
|
+
},
|
213
|
+
"@type" => {
|
214
|
+
:input => {
|
215
|
+
"@type" => RDF::RDFS.Resource.to_s,
|
216
|
+
"http://example.org/foo" => {"@value" => "bar", "@type" => "http://example.com/type"}
|
217
|
+
},
|
218
|
+
:context => {"type" => "@type"},
|
219
|
+
:output => {
|
220
|
+
"@context" => {"type" => "@type"},
|
221
|
+
"type" => RDF::RDFS.Resource.to_s,
|
222
|
+
"http://example.org/foo" => {"@value" => "bar", "type" => "http://example.com/type"}
|
223
|
+
}
|
224
|
+
},
|
225
|
+
"@language" => {
|
226
|
+
:input => {
|
227
|
+
"http://example.org/foo" => {"@value" => "bar", "@language" => "baz"}
|
228
|
+
},
|
229
|
+
:context => {"language" => "@language"},
|
230
|
+
:output => {
|
231
|
+
"@context" => {"language" => "@language"},
|
232
|
+
"http://example.org/foo" => {"@value" => "bar", "language" => "baz"}
|
233
|
+
}
|
234
|
+
},
|
235
|
+
"@value" => {
|
236
|
+
:input => {
|
237
|
+
"http://example.org/foo" => {"@value" => "bar", "@language" => "baz"}
|
238
|
+
},
|
239
|
+
:context => {"literal" => "@value"},
|
240
|
+
:output => {
|
241
|
+
"@context" => {"literal" => "@value"},
|
242
|
+
"http://example.org/foo" => {"literal" => "bar", "@language" => "baz"}
|
243
|
+
}
|
244
|
+
},
|
245
|
+
"@list" => {
|
246
|
+
:input => {
|
247
|
+
"http://example.org/foo" => {"@list" => ["bar"]}
|
248
|
+
},
|
249
|
+
:context => {"list" => "@list"},
|
250
|
+
:output => {
|
251
|
+
"@context" => {"list" => "@list"},
|
252
|
+
"http://example.org/foo" => {"list" => ["bar"]}
|
253
|
+
}
|
254
|
+
},
|
255
|
+
}.each do |title, params|
|
256
|
+
it title do
|
257
|
+
jld = JSON::LD::API.compact(params[:input], params[:context], nil, :debug => @debug)
|
258
|
+
jld.should produce(params[:output], @debug)
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
context "term selection" do
|
264
|
+
{
|
265
|
+
#"Uses term with nil language when two terms conflict on language" => {
|
266
|
+
# :input => [{
|
267
|
+
# "http://example.com/term" => {"@value" => "v1", "@language" => nil}
|
268
|
+
# }],
|
269
|
+
# :context => {
|
270
|
+
# "term5" => {"@id" => "http://example.com/term","@language" => nil},
|
271
|
+
# "@language" => "de"
|
272
|
+
# },
|
273
|
+
# :output => {
|
274
|
+
# "@context" => {
|
275
|
+
# "term5" => {"@id" => "http://example.com/term","@language" => nil},
|
276
|
+
# "@language" => "de"
|
277
|
+
# },
|
278
|
+
# "term5" => "v1",
|
279
|
+
# }
|
280
|
+
#},
|
281
|
+
"Uses subject alias" => {
|
282
|
+
:input => [{
|
283
|
+
"@id" => "http://example.com/id1"
|
284
|
+
}],
|
285
|
+
:context => {
|
286
|
+
"id1" => "http://example.com/id1",
|
287
|
+
"@language" => "de"
|
288
|
+
},
|
289
|
+
:output => {
|
290
|
+
"@context" => {
|
291
|
+
"id1" => "http://example.com/id1",
|
292
|
+
"@language" => "de"
|
293
|
+
},
|
294
|
+
"@id" => "id1",
|
295
|
+
}
|
296
|
+
},
|
297
|
+
"Allows IRI to be aliased to null, but still output term using IRI" => {
|
298
|
+
:context => {
|
299
|
+
"http://example.com/comment" => nil,
|
300
|
+
"comment_en" => {"@id" => "http://example.com/comment", "@language" => "en"}
|
301
|
+
},
|
302
|
+
:input => [{
|
303
|
+
"http://example.com/comment" => [
|
304
|
+
{"@value" => "comment in english", "@language" => "en"},
|
305
|
+
{"@value" => "commentar auf deutsch", "@language" => "de"},
|
306
|
+
{"@value" => "日本語でのコメント", "@language" => "ja"},
|
307
|
+
]
|
308
|
+
}],
|
309
|
+
:output => {
|
310
|
+
"@context" => {
|
311
|
+
"http://example.com/comment" => nil,
|
312
|
+
"comment_en" => {"@id" => "http://example.com/comment", "@language" => "en"}
|
313
|
+
},
|
314
|
+
"comment_en" => "comment in english",
|
315
|
+
}
|
316
|
+
},
|
317
|
+
}.each_pair do |title, params|
|
318
|
+
it title do
|
319
|
+
jld = JSON::LD::API.compact(params[:input], params[:context], nil, :debug => @debug)
|
320
|
+
jld.should produce(params[:output], @debug)
|
321
|
+
end
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
context "context as value" do
|
326
|
+
it "includes the context in the output document" do
|
327
|
+
ctx = {
|
328
|
+
"foo" => "http://example.com/"
|
329
|
+
}
|
330
|
+
input = {
|
331
|
+
"http://example.com/" => "bar"
|
332
|
+
}
|
333
|
+
expected = {
|
334
|
+
"@context" => {
|
335
|
+
"foo" => "http://example.com/"
|
336
|
+
},
|
337
|
+
"foo" => "bar"
|
338
|
+
}
|
339
|
+
jld = JSON::LD::API.compact(input, ctx, nil, :debug => @debug, :validate => true)
|
340
|
+
jld.should produce(expected, @debug)
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
context "context as reference" do
|
345
|
+
it "uses referenced context" do
|
346
|
+
ctx = StringIO.new(%q({"@context": {"b": "http://example.com/b"}}))
|
347
|
+
input = {
|
348
|
+
"http://example.com/b" => "c"
|
349
|
+
}
|
350
|
+
expected = {
|
351
|
+
"@context" => "http://example.com/context",
|
352
|
+
"b" => "c"
|
353
|
+
}
|
354
|
+
RDF::Util::File.stub(:open_file).with("http://example.com/context").and_yield(ctx)
|
355
|
+
jld = JSON::LD::API.compact(input, "http://example.com/context", nil, :debug => @debug, :validate => true)
|
356
|
+
jld.should produce(expected, @debug)
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
context "@graph" do
|
361
|
+
{
|
362
|
+
"Uses @graph given mutliple inputs" => {
|
363
|
+
:input => [
|
364
|
+
{"http://example.com/foo" => ["foo"]},
|
365
|
+
{"http://example.com/bar" => ["bar"]}
|
366
|
+
],
|
367
|
+
:context => {"ex" => "http://example.com/"},
|
368
|
+
:output => {
|
369
|
+
"@context" => {"ex" => "http://example.com/"},
|
370
|
+
"@graph" => [
|
371
|
+
{"ex:foo" => "foo"},
|
372
|
+
{"ex:bar" => "bar"}
|
373
|
+
]
|
374
|
+
}
|
375
|
+
},
|
376
|
+
"Uses expanded subject definitions for subject references" => {
|
377
|
+
:input => [
|
378
|
+
{"@id" => "http://example.com/foo"},
|
379
|
+
{"@id" => "http://example.com/bar"}
|
380
|
+
],
|
381
|
+
:context => {"ex" => "http://example.com/"},
|
382
|
+
:output => {
|
383
|
+
"@context" => {"ex" => "http://example.com/"},
|
384
|
+
"@graph" => [
|
385
|
+
{"@id" => "ex:foo"},
|
386
|
+
{"@id" => "ex:bar"}
|
387
|
+
]
|
388
|
+
}
|
389
|
+
},
|
390
|
+
}.each_pair do |title, params|
|
391
|
+
it title do
|
392
|
+
jld = JSON::LD::API.compact(params[:input], params[:context], nil, :debug => @debug)
|
393
|
+
jld.should produce(params[:output], @debug)
|
394
|
+
end
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
context "exceptions" do
|
399
|
+
{
|
400
|
+
"@list containing @list" => {
|
401
|
+
:input => {
|
402
|
+
"http://example.org/foo" => {"@list" => [{"@list" => ["baz"]}]}
|
403
|
+
},
|
404
|
+
:exception => JSON::LD::ProcessingError::ListOfLists
|
405
|
+
},
|
406
|
+
"@list containing @list (with coercion)" => {
|
407
|
+
:input => {
|
408
|
+
"@context" => {"http://example.org/foo" => {"@container" => "@list"}},
|
409
|
+
"http://example.org/foo" => [{"@list" => ["baz"]}]
|
410
|
+
},
|
411
|
+
:exception => JSON::LD::ProcessingError::ListOfLists
|
412
|
+
},
|
413
|
+
}.each do |title, params|
|
414
|
+
it title do
|
415
|
+
lambda {JSON::LD::API.compact(params[:input], {}, nil)}.should raise_error(params[:exception])
|
416
|
+
end
|
417
|
+
end
|
418
|
+
end
|
419
|
+
end
|
420
|
+
end
|