json-ld 3.1.4 → 3.1.9
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 +131 -48
- data/VERSION +1 -1
- data/bin/jsonld +31 -32
- data/lib/json/ld.rb +5 -2
- data/lib/json/ld/api.rb +35 -16
- data/lib/json/ld/compact.rb +41 -29
- data/lib/json/ld/conneg.rb +1 -1
- data/lib/json/ld/context.rb +51 -59
- data/lib/json/ld/expand.rb +72 -16
- data/lib/json/ld/extensions.rb +4 -4
- data/lib/json/ld/flatten.rb +137 -9
- data/lib/json/ld/format.rb +28 -8
- data/lib/json/ld/frame.rb +8 -8
- data/lib/json/ld/from_rdf.rb +46 -16
- data/lib/json/ld/reader.rb +2 -1
- data/lib/json/ld/streaming_reader.rb +5 -5
- data/lib/json/ld/streaming_writer.rb +4 -4
- data/lib/json/ld/to_rdf.rb +11 -7
- data/lib/json/ld/utils.rb +13 -13
- data/lib/json/ld/writer.rb +12 -5
- data/spec/api_spec.rb +1 -1
- data/spec/compact_spec.rb +207 -3
- data/spec/context_spec.rb +0 -2
- data/spec/expand_spec.rb +631 -0
- data/spec/flatten_spec.rb +517 -1
- data/spec/from_rdf_spec.rb +181 -0
- data/spec/matchers.rb +1 -1
- data/spec/rdfstar_spec.rb +25 -0
- data/spec/spec_helper.rb +32 -0
- data/spec/suite_flatten_spec.rb +4 -0
- data/spec/suite_frame_spec.rb +7 -0
- data/spec/suite_helper.rb +13 -7
- data/spec/suite_to_rdf_spec.rb +1 -0
- data/spec/to_rdf_spec.rb +209 -3
- data/spec/writer_spec.rb +193 -0
- metadata +66 -64
data/lib/json/ld/frame.rb
CHANGED
@@ -52,7 +52,7 @@ module JSON::LD
|
|
52
52
|
state[:uniqueEmbeds][state[:graph]] ||= {}
|
53
53
|
end
|
54
54
|
|
55
|
-
if flags[:embed] == '@link' && link.
|
55
|
+
if flags[:embed] == '@link' && link.key?(id)
|
56
56
|
# add existing linked subject
|
57
57
|
add_frame_output(parent, property, link[id])
|
58
58
|
next
|
@@ -66,7 +66,7 @@ module JSON::LD
|
|
66
66
|
warn "[DEPRECATION] #{flags[:embed]} is not a valid value of @embed in 1.1 mode.\n"
|
67
67
|
end
|
68
68
|
|
69
|
-
if !state[:embedded] && state[:uniqueEmbeds][state[:graph]].
|
69
|
+
if !state[:embedded] && state[:uniqueEmbeds][state[:graph]].key?(id)
|
70
70
|
# Skip adding this node object to the top-level, as it was included in another node object
|
71
71
|
next
|
72
72
|
elsif state[:embedded] &&
|
@@ -76,7 +76,7 @@ module JSON::LD
|
|
76
76
|
next
|
77
77
|
elsif state[:embedded] &&
|
78
78
|
%w(@first @once).include?(flags[:embed]) &&
|
79
|
-
state[:uniqueEmbeds][state[:graph]].
|
79
|
+
state[:uniqueEmbeds][state[:graph]].key?(id)
|
80
80
|
|
81
81
|
# if only the first match should be embedded
|
82
82
|
# Embed unless already embedded
|
@@ -97,7 +97,7 @@ module JSON::LD
|
|
97
97
|
state[:subjectStack] << {subject: subject, graph: state[:graph]}
|
98
98
|
|
99
99
|
# Subject is also the name of a graph
|
100
|
-
if state[:graphMap].
|
100
|
+
if state[:graphMap].key?(id)
|
101
101
|
# check frame's "@graph" to see what to do next
|
102
102
|
# 1. if it doesn't exist and state.graph === "@merged", don't recurse
|
103
103
|
# 2. if it doesn't exist and state.graph !== "@merged", recurse
|
@@ -105,7 +105,7 @@ module JSON::LD
|
|
105
105
|
# 4. if "@default" then don't recurse
|
106
106
|
# 5. recurse
|
107
107
|
recurse, subframe = false, nil
|
108
|
-
if !frame.
|
108
|
+
if !frame.key?('@graph')
|
109
109
|
recurse, subframe = (state[:graph] != '@merged'), {}
|
110
110
|
else
|
111
111
|
subframe = frame['@graph'].first
|
@@ -134,7 +134,7 @@ module JSON::LD
|
|
134
134
|
end
|
135
135
|
|
136
136
|
# explicit is on and property isn't in frame, skip processing
|
137
|
-
next if flags[:explicit] && !frame.
|
137
|
+
next if flags[:explicit] && !frame.key?(prop)
|
138
138
|
|
139
139
|
# add objects
|
140
140
|
objects.each do |o|
|
@@ -267,7 +267,7 @@ module JSON::LD
|
|
267
267
|
# If, after replacement, an array contains only the value null remove the value, leaving an empty array.
|
268
268
|
input.map {|o| cleanup_preserve(o)}
|
269
269
|
when Hash
|
270
|
-
if input.
|
270
|
+
if input.key?('@preserve')
|
271
271
|
# Replace with the content of `@preserve`
|
272
272
|
cleanup_preserve(input['@preserve'].first)
|
273
273
|
else
|
@@ -388,7 +388,7 @@ module JSON::LD
|
|
388
388
|
is_empty = v.empty?
|
389
389
|
if v = v.first
|
390
390
|
validate_frame(v)
|
391
|
-
has_default = v.
|
391
|
+
has_default = v.key?('@default')
|
392
392
|
end
|
393
393
|
|
394
394
|
# No longer a wildcard pattern if frame has any non-keyword properties
|
data/lib/json/ld/from_rdf.rb
CHANGED
@@ -22,7 +22,6 @@ module JSON::LD
|
|
22
22
|
referenced_once = {}
|
23
23
|
|
24
24
|
value = nil
|
25
|
-
ec = @context
|
26
25
|
|
27
26
|
# Create an entry for compound-literal node detection
|
28
27
|
compound_literal_subjects = {}
|
@@ -33,7 +32,7 @@ module JSON::LD
|
|
33
32
|
dataset.each do |statement|
|
34
33
|
#log_debug("statement") { statement.to_nquads.chomp}
|
35
34
|
|
36
|
-
name = statement.graph_name ?
|
35
|
+
name = statement.graph_name ? @context.expand_iri(statement.graph_name, base: @options[:base]).to_s : '@default'
|
37
36
|
|
38
37
|
# Create a graph entry as needed
|
39
38
|
node_map = graph_map[name] ||= {}
|
@@ -41,17 +40,24 @@ module JSON::LD
|
|
41
40
|
|
42
41
|
default_graph[name] ||= {'@id' => name} unless name == '@default'
|
43
42
|
|
44
|
-
subject =
|
45
|
-
|
43
|
+
subject = statement.subject.statement? ?
|
44
|
+
resource_representation(statement.subject, useNativeTypes)['@id'].to_json_c14n :
|
45
|
+
statement.subject.to_s
|
46
|
+
node = node_map[subject] ||= resource_representation(statement.subject, useNativeTypes)
|
46
47
|
|
47
48
|
# If predicate is rdf:datatype, note subject in compound literal subjects map
|
48
49
|
if @options[:rdfDirection] == 'compound-literal' && statement.predicate == RDF.to_uri + 'direction'
|
49
50
|
compound_literal_subjects[name][subject] ||= true
|
50
51
|
end
|
51
52
|
|
52
|
-
# If object is an IRI
|
53
|
-
|
54
|
-
statement.object.
|
53
|
+
# If object is an IRI, blank node identifier, or statement, and node map does not have an object member, create one and initialize its value to a new JSON object consisting of a single member @id whose value is set to object.
|
54
|
+
unless statement.object.literal?
|
55
|
+
object = statement.object.statement? ?
|
56
|
+
resource_representation(statement.object, useNativeTypes)['@id'].to_json_c14n :
|
57
|
+
statement.object.to_s
|
58
|
+
node_map[object] ||=
|
59
|
+
resource_representation(statement.object, useNativeTypes)
|
60
|
+
end
|
55
61
|
|
56
62
|
# If predicate equals rdf:type, and object is an IRI or blank node identifier, append object to the value of the @type member of node. If no such member exists, create one and initialize it to an array whose only item is object. Finally, continue to the next RDF triple.
|
57
63
|
if statement.predicate == RDF.type && statement.object.resource? && !useRdfType
|
@@ -60,11 +66,7 @@ module JSON::LD
|
|
60
66
|
end
|
61
67
|
|
62
68
|
# Set value to the result of using the RDF to Object Conversion algorithm, passing object, rdfDirection, and use native types.
|
63
|
-
value =
|
64
|
-
statement.object,
|
65
|
-
rdfDirection: @options[:rdfDirection],
|
66
|
-
useNativeTypes: useNativeTypes,
|
67
|
-
base: @options[:base])
|
69
|
+
value = resource_representation(statement.object, useNativeTypes)
|
68
70
|
|
69
71
|
merge_value(node, statement.predicate.to_s, value)
|
70
72
|
|
@@ -77,7 +79,7 @@ module JSON::LD
|
|
77
79
|
property: statement.predicate.to_s,
|
78
80
|
value: value
|
79
81
|
})
|
80
|
-
elsif referenced_once.
|
82
|
+
elsif referenced_once.key?(statement.object.to_s)
|
81
83
|
referenced_once[statement.object.to_s] = false
|
82
84
|
elsif statement.object.node?
|
83
85
|
referenced_once[statement.object.to_s] = {
|
@@ -114,8 +116,7 @@ module JSON::LD
|
|
114
116
|
end
|
115
117
|
end
|
116
118
|
|
117
|
-
|
118
|
-
next unless nil_var = graph_object[RDF.nil.to_s]
|
119
|
+
nil_var = graph_object.fetch(RDF.nil.to_s, {})
|
119
120
|
|
120
121
|
# For each item usage in the usages member of nil, perform the following steps:
|
121
122
|
nil_var.fetch(:usages, []).each do |usage|
|
@@ -143,12 +144,15 @@ module JSON::LD
|
|
143
144
|
head['@list'] = list.reverse
|
144
145
|
list_nodes.each {|node_id| graph_object.delete(node_id)}
|
145
146
|
end
|
147
|
+
|
148
|
+
# Create annotations on graph object
|
149
|
+
create_annotations(graph_object)
|
146
150
|
end
|
147
151
|
|
148
152
|
result = []
|
149
153
|
default_graph.keys.opt_sort(ordered: @options[:ordered]).each do |subject|
|
150
154
|
node = default_graph[subject]
|
151
|
-
if graph_map.
|
155
|
+
if graph_map.key?(subject)
|
152
156
|
node['@graph'] = []
|
153
157
|
graph_map[subject].keys.opt_sort(ordered: @options[:ordered]).each do |s|
|
154
158
|
n = graph_map[subject][s]
|
@@ -162,5 +166,31 @@ module JSON::LD
|
|
162
166
|
#log_debug("fromRdf") {result.to_json(JSON_STATE) rescue 'malformed json'}
|
163
167
|
result
|
164
168
|
end
|
169
|
+
|
170
|
+
private
|
171
|
+
def resource_representation(resource, useNativeTypes)
|
172
|
+
case resource
|
173
|
+
when RDF::Statement
|
174
|
+
# Note, if either subject or object are a BNode which is used elsewhere,
|
175
|
+
# this might not work will with the BNode accounting from above.
|
176
|
+
rep = {'@id' => resource_representation(resource.subject, false)}
|
177
|
+
if resource.predicate == RDF.type
|
178
|
+
rep['@id'].merge!('@type' => resource.object.to_s)
|
179
|
+
else
|
180
|
+
rep['@id'].merge!(
|
181
|
+
resource.predicate.to_s =>
|
182
|
+
as_array(resource_representation(resource.object, useNativeTypes)))
|
183
|
+
end
|
184
|
+
rep
|
185
|
+
when RDF::Literal
|
186
|
+
@context.expand_value(nil,
|
187
|
+
resource,
|
188
|
+
rdfDirection: @options[:rdfDirection],
|
189
|
+
useNativeTypes: useNativeTypes,
|
190
|
+
base: @options[:base])
|
191
|
+
else
|
192
|
+
{'@id' => resource.to_s}
|
193
|
+
end
|
194
|
+
end
|
165
195
|
end
|
166
196
|
end
|
data/lib/json/ld/reader.rb
CHANGED
@@ -20,7 +20,7 @@ module JSON::LD
|
|
20
20
|
control: :url2,
|
21
21
|
datatype: RDF::URI,
|
22
22
|
on: ["--expand-context CONTEXT"],
|
23
|
-
description: "Context to use when expanding.") {|arg| RDF::URI(arg)},
|
23
|
+
description: "Context to use when expanding.") {|arg| RDF::URI(arg).absolute? ? RDF::URI(arg) : StringIO.new(File.read(arg))},
|
24
24
|
RDF::CLI::Option.new(
|
25
25
|
symbol: :extractAllScripts,
|
26
26
|
datatype: TrueClass,
|
@@ -68,6 +68,7 @@ module JSON::LD
|
|
68
68
|
# @raise [RDF::ReaderError] if the JSON document cannot be loaded
|
69
69
|
def initialize(input = $stdin, **options, &block)
|
70
70
|
options[:base_uri] ||= options[:base]
|
71
|
+
options[:rename_bnodes] = false unless options.key?(:rename_bnodes)
|
71
72
|
super do
|
72
73
|
@options[:base] ||= base_uri.to_s if base_uri
|
73
74
|
# Trim non-JSON stuff in script.
|
@@ -136,7 +136,7 @@ module JSON::LD
|
|
136
136
|
when '@type'
|
137
137
|
# Set the type-scoped context to the context on input, for use later
|
138
138
|
raise JsonLdError::InvalidStreamingKeyOrder,
|
139
|
-
"found #{key} in state #{state}" unless
|
139
|
+
"found #{key} in state #{state}" unless %i(await_context await_type).include?(state)
|
140
140
|
|
141
141
|
type_scoped_context = context
|
142
142
|
as_array(value).sort.each do |term|
|
@@ -159,7 +159,7 @@ module JSON::LD
|
|
159
159
|
raise JsonLdError::InvalidSetOrListObject,
|
160
160
|
"found #{key} in state #{state}" if is_list_or_set
|
161
161
|
raise JsonLdError::CollidingKeywords,
|
162
|
-
"found #{key} in state #{state}" unless
|
162
|
+
"found #{key} in state #{state}" unless %i(await_context await_type await_id).include?(state)
|
163
163
|
|
164
164
|
# Set our actual id, and use for replacing any provisional statements using our existing node_id, which is provisional
|
165
165
|
raise JsonLdError::InvalidIdValue,
|
@@ -209,7 +209,7 @@ module JSON::LD
|
|
209
209
|
# Expanded values must be node objects
|
210
210
|
have_statements = false
|
211
211
|
parse_object(value, active_property, context) do |st|
|
212
|
-
have_statements ||= st.
|
212
|
+
have_statements ||= st.subject?
|
213
213
|
block.call(st)
|
214
214
|
end
|
215
215
|
raise JsonLdError::InvalidIncludedValue, "values of @included must expand to node objects" unless have_statements
|
@@ -232,7 +232,7 @@ module JSON::LD
|
|
232
232
|
when '@list'
|
233
233
|
raise JsonLdError::InvalidSetOrListObject,
|
234
234
|
"found #{key} in state #{state}" if
|
235
|
-
|
235
|
+
!%i(await_context await_type await_id).include?(state)
|
236
236
|
is_list_or_set = true
|
237
237
|
if subject
|
238
238
|
node_id = parse_list(value, active_property, context, &block)
|
@@ -277,7 +277,7 @@ module JSON::LD
|
|
277
277
|
when '@set'
|
278
278
|
raise JsonLdError::InvalidSetOrListObject,
|
279
279
|
"found #{key} in state #{state}" if
|
280
|
-
|
280
|
+
!%i(await_context await_type await_id).include?(state)
|
281
281
|
is_list_or_set = true
|
282
282
|
value = as_array(value).compact
|
283
283
|
parse_object(value, active_property, context, subject: subject, predicate: predicate, &block)
|
@@ -64,8 +64,8 @@ module JSON::LD
|
|
64
64
|
{"@value" => MultiJson.load(statement.object.to_s), "@type" => "@json"}
|
65
65
|
else
|
66
66
|
lit = {"@value" => statement.object.to_s}
|
67
|
-
lit["@type"] = statement.object.datatype.to_s if statement.object.
|
68
|
-
lit["@language"] = statement.object.language.to_s if statement.object.
|
67
|
+
lit["@type"] = statement.object.datatype.to_s if statement.object.datatype?
|
68
|
+
lit["@language"] = statement.object.language.to_s if statement.object.language?
|
69
69
|
lit
|
70
70
|
end
|
71
71
|
end
|
@@ -91,7 +91,7 @@ module JSON::LD
|
|
91
91
|
def start_graph(resource)
|
92
92
|
#log_debug("start_graph") {"state: #{@state.inspect}, resource: #{resource}"}
|
93
93
|
if resource
|
94
|
-
@output.puts(",") if
|
94
|
+
@output.puts(",") if %i(wrote_node wrote_graph).include?(@state)
|
95
95
|
@output.puts %({"@id": "#{resource}", "@graph": [)
|
96
96
|
@state = :in_graph
|
97
97
|
end
|
@@ -109,7 +109,7 @@ module JSON::LD
|
|
109
109
|
|
110
110
|
def end_node
|
111
111
|
#log_debug("end_node") {"state: #{@state.inspect}, node: #{@current_node_def.to_json}"}
|
112
|
-
@output.puts(",") if
|
112
|
+
@output.puts(",") if %i(wrote_node wrote_graph).include?(@state)
|
113
113
|
if @current_node_def
|
114
114
|
node_def = if context
|
115
115
|
compacted = JSON::LD::API.compact(@current_node_def, context, rename_bnodes: false, **@options)
|
data/lib/json/ld/to_rdf.rb
CHANGED
@@ -16,6 +16,8 @@ module JSON::LD
|
|
16
16
|
# @return RDF::Resource the subject of this item
|
17
17
|
def item_to_rdf(item, graph_name: nil, &block)
|
18
18
|
# Just return value object as Term
|
19
|
+
return unless item
|
20
|
+
|
19
21
|
if value?(item)
|
20
22
|
value, datatype = item.fetch('@value'), item.fetch('@type', nil)
|
21
23
|
|
@@ -46,7 +48,7 @@ module JSON::LD
|
|
46
48
|
# Only valid for rdf:JSON
|
47
49
|
value = value.to_json_c14n
|
48
50
|
else
|
49
|
-
if item.
|
51
|
+
if item.key?('@direction') && @options[:rdfDirection]
|
50
52
|
# Either serialize using a datatype, or a compound-literal
|
51
53
|
case @options[:rdfDirection]
|
52
54
|
when 'i18n-datatype'
|
@@ -61,7 +63,7 @@ module JSON::LD
|
|
61
63
|
end
|
62
64
|
|
63
65
|
# Otherwise, if datatype is null, set it to xsd:string or xsd:langString, depending on if item has a @language key.
|
64
|
-
datatype ||= item.
|
66
|
+
datatype ||= item.key?('@language') ? RDF.langString : RDF::XSD.string
|
65
67
|
if datatype == RDF::URI(RDF.to_uri + "JSON")
|
66
68
|
value = value.to_json_c14n
|
67
69
|
end
|
@@ -76,11 +78,13 @@ module JSON::LD
|
|
76
78
|
return parse_list(item['@list'], graph_name: graph_name, &block)
|
77
79
|
end
|
78
80
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
81
|
+
subject = case item['@id']
|
82
|
+
when nil then node
|
83
|
+
when String then as_resource(item['@id'])
|
84
|
+
when Object
|
85
|
+
# Embedded statement
|
86
|
+
# (No error checking, as this is done in expansion)
|
87
|
+
to_enum(:item_to_rdf, item['@id']).to_a.first
|
84
88
|
end
|
85
89
|
|
86
90
|
#log_debug("item_to_rdf") {"subject: #{subject.to_ntriples rescue 'malformed rdf'}"}
|
data/lib/json/ld/utils.rb
CHANGED
@@ -11,8 +11,8 @@ module JSON::LD
|
|
11
11
|
# @return [Boolean]
|
12
12
|
def node?(value)
|
13
13
|
value.is_a?(Hash) &&
|
14
|
-
!(value.
|
15
|
-
(value.length > 1 || !value.
|
14
|
+
!(value.key?('@value') || value.key?('@list') || value.key?('@set')) &&
|
15
|
+
(value.length > 1 || !value.key?('@id'))
|
16
16
|
end
|
17
17
|
|
18
18
|
##
|
@@ -29,7 +29,7 @@ module JSON::LD
|
|
29
29
|
# @return [Boolean]
|
30
30
|
def node_or_ref?(value)
|
31
31
|
value.is_a?(Hash) &&
|
32
|
-
!(value.
|
32
|
+
!(value.key?('@value') || value.key?('@list') || value.key?('@set'))
|
33
33
|
end
|
34
34
|
|
35
35
|
##
|
@@ -66,7 +66,7 @@ module JSON::LD
|
|
66
66
|
# @param [Object] value
|
67
67
|
# @return [Boolean]
|
68
68
|
def simple_graph?(value)
|
69
|
-
graph?(value) && !value.
|
69
|
+
graph?(value) && !value.key?('@id')
|
70
70
|
end
|
71
71
|
|
72
72
|
##
|
@@ -75,7 +75,7 @@ module JSON::LD
|
|
75
75
|
# @param [Object] value
|
76
76
|
# @return [Boolean]
|
77
77
|
def list?(value)
|
78
|
-
value.is_a?(Hash) && value.
|
78
|
+
value.is_a?(Hash) && value.key?('@list')
|
79
79
|
end
|
80
80
|
|
81
81
|
##
|
@@ -84,7 +84,7 @@ module JSON::LD
|
|
84
84
|
# @param [Object] value
|
85
85
|
# @return [Boolean]
|
86
86
|
def index?(value)
|
87
|
-
value.is_a?(Hash) && value.
|
87
|
+
value.is_a?(Hash) && value.key?('@index')
|
88
88
|
end
|
89
89
|
|
90
90
|
##
|
@@ -93,7 +93,7 @@ module JSON::LD
|
|
93
93
|
# @param [Object] value
|
94
94
|
# @return [Boolean]
|
95
95
|
def value?(value)
|
96
|
-
value.is_a?(Hash) && value.
|
96
|
+
value.is_a?(Hash) && value.key?('@value')
|
97
97
|
end
|
98
98
|
|
99
99
|
##
|
@@ -170,7 +170,7 @@ module JSON::LD
|
|
170
170
|
end
|
171
171
|
elsif subject[property]
|
172
172
|
# check if subject already has value if duplicates not allowed
|
173
|
-
_has_value = !allow_duplicate && has_value(subject, property, value)
|
173
|
+
_has_value = !allow_duplicate && has_value?(subject, property, value)
|
174
174
|
|
175
175
|
# make property an array if value not present or always an array
|
176
176
|
if !subject[property].is_a?(Array) && (!_has_value || property_is_array)
|
@@ -188,7 +188,7 @@ module JSON::LD
|
|
188
188
|
# @param property the property to look for.
|
189
189
|
#
|
190
190
|
# @return [Boolean] true if the subject has the given property, false if not.
|
191
|
-
def
|
191
|
+
def property?(subject, property)
|
192
192
|
return false unless value = subject[property]
|
193
193
|
!value.is_a?(Array) || !value.empty?
|
194
194
|
end
|
@@ -200,8 +200,8 @@ module JSON::LD
|
|
200
200
|
# @param [Object] value the value to check.
|
201
201
|
#
|
202
202
|
# @return [Boolean] true if the value exists, false if not.
|
203
|
-
def has_value(subject, property, value)
|
204
|
-
if
|
203
|
+
def has_value?(subject, property, value)
|
204
|
+
if property?(subject, property)
|
205
205
|
val = subject[property]
|
206
206
|
is_list = list?(val)
|
207
207
|
if val.is_a?(Array) || is_list
|
@@ -265,7 +265,7 @@ module JSON::LD
|
|
265
265
|
# @return [String]
|
266
266
|
def get_sym(old = "")
|
267
267
|
old = old.to_s.sub(/_:/, '')
|
268
|
-
if old && self.
|
268
|
+
if old && self.key?(old)
|
269
269
|
self[old]
|
270
270
|
elsif !old.empty?
|
271
271
|
self[old] = RDF::Node.new.to_unique_base[2..-1]
|
@@ -289,7 +289,7 @@ module JSON::LD
|
|
289
289
|
# @return [String]
|
290
290
|
def get_sym(old = "")
|
291
291
|
old = old.to_s.sub(/_:/, '')
|
292
|
-
if !old.empty? && self.
|
292
|
+
if !old.empty? && self.key?(old)
|
293
293
|
self[old]
|
294
294
|
elsif !old.empty?
|
295
295
|
@num += 1
|
data/lib/json/ld/writer.rb
CHANGED
@@ -93,7 +93,7 @@ module JSON::LD
|
|
93
93
|
datatype: RDF::URI,
|
94
94
|
control: :url2,
|
95
95
|
on: ["--context CONTEXT"],
|
96
|
-
description: "Context to use when compacting.") {|arg| RDF::URI(arg)},
|
96
|
+
description: "Context to use when compacting.") {|arg| RDF::URI(arg).absolute? ? RDF::URI(arg) : StringIO.new(File.read(arg))},
|
97
97
|
RDF::CLI::Option.new(
|
98
98
|
symbol: :embed,
|
99
99
|
datatype: %w(@always @once @never),
|
@@ -107,6 +107,13 @@ module JSON::LD
|
|
107
107
|
control: :checkbox,
|
108
108
|
on: ["--[no-]explicit"],
|
109
109
|
description: "Only include explicitly declared properties in output (false)") {|arg| arg},
|
110
|
+
RDF::CLI::Option.new(
|
111
|
+
symbol: :frame,
|
112
|
+
datatype: RDF::URI,
|
113
|
+
control: :url2,
|
114
|
+
use: :required,
|
115
|
+
on: ["--frame FRAME"],
|
116
|
+
description: "Frame to use when serializing.") {|arg| RDF::URI(arg).absolute? ? RDF::URI(arg) : StringIO.new(File.read(arg))},
|
110
117
|
RDF::CLI::Option.new(
|
111
118
|
symbol: :lowercaseLanguage,
|
112
119
|
datatype: TrueClass,
|
@@ -137,7 +144,7 @@ module JSON::LD
|
|
137
144
|
default: 'null',
|
138
145
|
control: :select,
|
139
146
|
on: ["--rdf-direction DIR", %w(i18n-datatype compound-literal)],
|
140
|
-
description: "How to serialize literal direction (i18n-datatype compound-literal)") {|arg|
|
147
|
+
description: "How to serialize literal direction (i18n-datatype compound-literal)") {|arg| arg},
|
141
148
|
RDF::CLI::Option.new(
|
142
149
|
symbol: :requireAll,
|
143
150
|
datatype: TrueClass,
|
@@ -202,7 +209,7 @@ module JSON::LD
|
|
202
209
|
end
|
203
210
|
|
204
211
|
##
|
205
|
-
# Initializes the
|
212
|
+
# Initializes the JSON-LD writer instance.
|
206
213
|
#
|
207
214
|
# @param [IO, File] output
|
208
215
|
# the output stream
|
@@ -230,8 +237,8 @@ module JSON::LD
|
|
230
237
|
# @yield [writer]
|
231
238
|
# @yieldparam [RDF::Writer] writer
|
232
239
|
def initialize(output = $stdout, **options, &block)
|
233
|
-
options[:base_uri] ||= options[:base] if options.
|
234
|
-
options[:base] ||= options[:base_uri] if options.
|
240
|
+
options[:base_uri] ||= options[:base] if options.key?(:base)
|
241
|
+
options[:base] ||= options[:base_uri] if options.key?(:base_uri)
|
235
242
|
super do
|
236
243
|
@repo = RDF::Repository.new
|
237
244
|
|