json-ld 3.1.4 → 3.1.5
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 +60 -46
- data/VERSION +1 -1
- data/bin/jsonld +27 -30
- data/lib/json/ld.rb +2 -2
- data/lib/json/ld/compact.rb +28 -23
- data/lib/json/ld/conneg.rb +1 -1
- data/lib/json/ld/context.rb +4 -14
- data/lib/json/ld/expand.rb +10 -3
- data/lib/json/ld/format.rb +10 -6
- data/lib/json/ld/reader.rb +1 -1
- data/lib/json/ld/writer.rb +10 -3
- data/spec/matchers.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65b570568511427e573b9ffecdc5eedfee1b708c62e88ffc24dce4ffa8d62c2f
|
4
|
+
data.tar.gz: a3255398de49dd88c3d4b3beb918857c8939de6eed4cf92c2aa1f61764455b59
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f84d29c4d742ffe07dbdc585f8d51e612b7426dc3a58d21061d959587ebdfff0801bc02d3c7edf11426d03d6b9d500a54bdd172afc34b460bd5957fc0f9e4c5
|
7
|
+
data.tar.gz: ee8b915d0fb258e909e751c668ea31750b255d5d7e0276123439a149eece298284324fb63a8d13df9b23109f0662dcbcd0db41f56e23e22f745da17f50f7b75b
|
data/README.md
CHANGED
@@ -25,21 +25,25 @@ This gem implements an optimized streaming reader used for generating RDF from l
|
|
25
25
|
* Keys in JSON objects must be ordered with any of `@context`, and/or `@type` coming before any other keys, in that order. This includes aliases of those keys. It is strongly encouraged that `@id` be present, and come immediately after.
|
26
26
|
* JSON-LD documents can be signaled or requested in [streaming document form](https://w3c.github.io/json-ld-streaming/#dfn-streaming-document-form). The profile URI identifying the [streaming document form](https://w3c.github.io/json-ld-streaming/#dfn-streaming-document-form) is `http://www.w3.org/ns/json-ld#streaming`.
|
27
27
|
|
28
|
-
|
29
|
-
The [MultiJson](https://rubygems.org/gems/multi_json) gem is used for parsing JSON; this defaults to the native JSON parser, but will use a more performant parser if one is available. A specific parser can be specified by adding the `:adapter` option to any API call. See [MultiJson](https://rubygems.org/gems/multi_json) for more information.
|
30
|
-
|
31
|
-
### JSON-LD Streaming Profile
|
32
|
-
This gem implements an optimized streaming writer used for generating JSON-LD from large repositories. Such documents result in the JSON-LD Streaming Profile:
|
28
|
+
This gem also implements an optimized streaming writer used for generating JSON-LD from large repositories. Such documents result in the JSON-LD Streaming Profile:
|
33
29
|
|
34
30
|
* Each statement written as a separate node in expanded/flattened form.
|
35
|
-
* RDF
|
31
|
+
* `RDF List`s are written as separate nodes using `rdf:first` and `rdf:rest` properties.
|
32
|
+
|
33
|
+
The order of triples retrieved from the `RDF::Enumerable` dataset determines the way that JSON-LD node objects are written; for best results, statements should be ordered by _graph name_, _subect_, _predicate_ and _object_.
|
34
|
+
|
35
|
+
### MultiJson parser
|
36
|
+
The [MultiJson](https://rubygems.org/gems/multi_json) gem is used for parsing JSON; this defaults to the native JSON parser, but will use a more performant parser if one is available. A specific parser can be specified by adding the `:adapter` option to any API call. See [MultiJson](https://rubygems.org/gems/multi_json) for more information.
|
36
37
|
|
37
38
|
## Examples
|
39
|
+
|
38
40
|
```ruby
|
39
41
|
require 'rubygems'
|
40
42
|
require 'json/ld'
|
41
43
|
```
|
44
|
+
|
42
45
|
### Expand a Document
|
46
|
+
|
43
47
|
```ruby
|
44
48
|
input = JSON.parse %({
|
45
49
|
"@context": {
|
@@ -59,8 +63,9 @@ require 'json/ld'
|
|
59
63
|
"http://xmlns.com/foaf/0.1/avatar": [{"@value": "https://twitter.com/account/profile_image/manusporny"}]
|
60
64
|
}]
|
61
65
|
```
|
66
|
+
|
62
67
|
### Compact a Document
|
63
|
-
|
68
|
+
|
64
69
|
input = JSON.parse %([{
|
65
70
|
"http://xmlns.com/foaf/0.1/name": ["Manu Sporny"],
|
66
71
|
"http://xmlns.com/foaf/0.1/homepage": [{"@id": "https://manu.sporny.org/"}],
|
@@ -86,9 +91,9 @@ require 'json/ld'
|
|
86
91
|
"homepage": "https://manu.sporny.org/",
|
87
92
|
"name": "Manu Sporny"
|
88
93
|
}
|
89
|
-
|
94
|
+
|
90
95
|
### Frame a Document
|
91
|
-
|
96
|
+
|
92
97
|
input = JSON.parse %({
|
93
98
|
"@context": {
|
94
99
|
"Book": "http://example.org/vocab#Book",
|
@@ -169,9 +174,9 @@ require 'json/ld'
|
|
169
174
|
}
|
170
175
|
]
|
171
176
|
}
|
172
|
-
|
177
|
+
|
173
178
|
### Turn JSON-LD into RDF (Turtle)
|
174
|
-
|
179
|
+
|
175
180
|
input = JSON.parse %({
|
176
181
|
"@context": {
|
177
182
|
"": "https://manu.sporny.org/",
|
@@ -192,9 +197,9 @@ require 'json/ld'
|
|
192
197
|
<http://example.org/people#joebob> a foaf:Person;
|
193
198
|
foaf:name "Joe Bob";
|
194
199
|
foaf:nick ("joe" "bob" "jaybe") .
|
195
|
-
|
200
|
+
|
196
201
|
### Turn RDF into JSON-LD
|
197
|
-
|
202
|
+
|
198
203
|
require 'rdf/turtle'
|
199
204
|
input = RDF::Graph.new << RDF::Turtle::Reader.new(%(
|
200
205
|
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
|
@@ -230,11 +235,12 @@ require 'json/ld'
|
|
230
235
|
"http://xmlns.com/foaf/0.1/name": [{"@value": "Manu Sporny"}]
|
231
236
|
}
|
232
237
|
]
|
233
|
-
|
238
|
+
|
234
239
|
## Use a custom Document Loader
|
235
240
|
In some cases, the built-in document loader {JSON::LD::API.documentLoader} is inadequate; for example, when using `http://schema.org` as a remote context, it will be re-loaded every time (however, see [json-ld-preloaded](https://rubygems.org/gems/json-ld-preloaded)).
|
236
241
|
|
237
242
|
All entries into the {JSON::LD::API} accept a `:documentLoader` option, which can be used to provide an alternative method to use when loading remote documents. For example:
|
243
|
+
|
238
244
|
```ruby
|
239
245
|
load_document_local = Proc.new do |url, **options, &block|
|
240
246
|
if RDF::URI(url, canonicalize: true) == RDF::URI('http://schema.org/')
|
@@ -244,28 +250,34 @@ load_document_local = Proc.new do |url, **options, &block|
|
|
244
250
|
JSON::LD::API.documentLoader(url, options, &block)
|
245
251
|
end
|
246
252
|
end
|
253
|
+
|
247
254
|
```
|
248
255
|
Then, when performing something like expansion:
|
256
|
+
|
249
257
|
```ruby
|
250
258
|
JSON::LD::API.expand(input, documentLoader: load_document_local)
|
251
259
|
```
|
252
260
|
|
253
261
|
## Preloading contexts
|
254
262
|
In many cases, for small documents, processing time can be dominated by loading and parsing remote contexts. In particular, a small schema.org example may need to download a large context and turn it into an internal representation, before the actual document can be expanded for processing. Using {JSON::LD::Context.add_preloaded}, an implementation can perform this loading up-front, and make it available to the processor.
|
263
|
+
|
255
264
|
```ruby
|
256
265
|
ctx = JSON::LD::Context.new().parse('http://schema.org/')
|
257
266
|
JSON::LD::Context.add_preloaded('http://schema.org/', ctx)
|
258
267
|
```
|
268
|
+
|
259
269
|
On lookup, URIs with an `https` prefix are normalized to `http`.
|
260
270
|
|
261
271
|
A context may be serialized to Ruby to speed this process using `Context#to_rb`. When loaded, this generated file will add entries to the {JSON::LD::Context::PRELOADED}.
|
262
272
|
|
263
273
|
## RDF Reader and Writer
|
264
274
|
{JSON::LD} also acts as a normal RDF reader and writer, using the standard RDF.rb reader/writer interfaces:
|
275
|
+
|
265
276
|
```ruby
|
266
277
|
graph = RDF::Graph.load("etc/doap.jsonld", format: :jsonld)
|
267
278
|
graph.dump(:jsonld, standard_prefixes: true)
|
268
279
|
```
|
280
|
+
|
269
281
|
`RDF::GRAPH#dump` can also take a `:context` option to use a separately defined context
|
270
282
|
|
271
283
|
As JSON-LD may come from many different sources, included as an embedded script tag within an HTML document, the RDF Reader will strip input before the leading `{` or `[` and after the trailing `}` or `]`.
|
@@ -275,7 +287,7 @@ This implementation is being used as a test-bed for features planned for an upco
|
|
275
287
|
|
276
288
|
### Scoped Contexts
|
277
289
|
A term definition can include `@context`, which is applied to values of that object. This is also used when compacting. Taken together, this allows framing to effectively include context definitions more deeply within the framed structure.
|
278
|
-
|
290
|
+
|
279
291
|
{
|
280
292
|
"@context": {
|
281
293
|
"ex": "http://example.com/",
|
@@ -290,10 +302,10 @@ A term definition can include `@context`, which is applied to values of that obj
|
|
290
302
|
},
|
291
303
|
"foo": "Bar"
|
292
304
|
}
|
293
|
-
|
305
|
+
|
294
306
|
### @id and @type maps
|
295
307
|
The value of `@container` in a term definition can include `@id` or `@type`, in addition to `@set`, `@list`, `@language`, and `@index`. This allows value indexing based on either the `@id` or `@type` of associated objects.
|
296
|
-
|
308
|
+
|
297
309
|
{
|
298
310
|
"@context": {
|
299
311
|
"@vocab": "http://example/",
|
@@ -304,10 +316,10 @@ The value of `@container` in a term definition can include `@id` or `@type`, in
|
|
304
316
|
"_:bar": {"label": "Object with @id _:bar"}
|
305
317
|
}
|
306
318
|
}
|
307
|
-
|
319
|
+
|
308
320
|
### @graph containers and maps
|
309
321
|
A term can have `@container` set to include `@graph` optionally including `@id` or `@index` and `@set`. In the first form, with `@container` set to `@graph`, the value of a property is treated as a _simple graph object_, meaning that values treated as if they were contained in an object with `@graph`, creating _named graph_ with an anonymous name.
|
310
|
-
|
322
|
+
|
311
323
|
{
|
312
324
|
"@context": {
|
313
325
|
"@vocab": "http://example.org/",
|
@@ -317,9 +329,9 @@ A term can have `@container` set to include `@graph` optionally including `@id`
|
|
317
329
|
"value": "x"
|
318
330
|
}
|
319
331
|
}
|
320
|
-
|
332
|
+
|
321
333
|
which expands to the following:
|
322
|
-
|
334
|
+
|
323
335
|
[{
|
324
336
|
"http://example.org/input": [{
|
325
337
|
"@graph": [{
|
@@ -327,18 +339,18 @@ which expands to the following:
|
|
327
339
|
}]
|
328
340
|
}]
|
329
341
|
}]
|
330
|
-
|
342
|
+
|
331
343
|
Compaction reverses this process, optionally ensuring that a single value is contained within an array of `@container` also includes `@set`:
|
332
|
-
|
344
|
+
|
333
345
|
{
|
334
346
|
"@context": {
|
335
347
|
"@vocab": "http://example.org/",
|
336
348
|
"input": {"@container": ["@graph", "@set"]}
|
337
349
|
}
|
338
350
|
}
|
339
|
-
|
351
|
+
|
340
352
|
A graph map uses the map form already existing for `@index`, `@language`, `@type`, and `@id` where the index is either an index value or an id.
|
341
|
-
|
353
|
+
|
342
354
|
{
|
343
355
|
"@context": {
|
344
356
|
"@vocab": "http://example.org/",
|
@@ -348,9 +360,9 @@ A graph map uses the map form already existing for `@index`, `@language`, `@type
|
|
348
360
|
"g1": {"value": "x"}
|
349
361
|
}
|
350
362
|
}
|
351
|
-
|
363
|
+
|
352
364
|
treats "g1" as an index, and expands to the following:
|
353
|
-
|
365
|
+
|
354
366
|
[{
|
355
367
|
"http://example.org/input": [{
|
356
368
|
"@index": "g1",
|
@@ -359,11 +371,11 @@ treats "g1" as an index, and expands to the following:
|
|
359
371
|
}]
|
360
372
|
}]
|
361
373
|
}])
|
362
|
-
|
374
|
+
|
363
375
|
This can also include `@set` to ensure that, when compacting, a single value of an index will be in array form.
|
364
376
|
|
365
377
|
The _id_ version is similar:
|
366
|
-
|
378
|
+
|
367
379
|
{
|
368
380
|
"@context": {
|
369
381
|
"@vocab": "http://example.org/",
|
@@ -373,9 +385,9 @@ The _id_ version is similar:
|
|
373
385
|
"http://example.com/g1": {"value": "x"}
|
374
386
|
}
|
375
387
|
}
|
376
|
-
|
388
|
+
|
377
389
|
which expands to:
|
378
|
-
|
390
|
+
|
379
391
|
[{
|
380
392
|
"http://example.org/input": [{
|
381
393
|
"@id": "http://example.com/g1",
|
@@ -384,10 +396,10 @@ which expands to:
|
|
384
396
|
}]
|
385
397
|
}]
|
386
398
|
}])
|
387
|
-
|
399
|
+
|
388
400
|
### Transparent Nesting
|
389
401
|
Many JSON APIs separate properties from their entities using an intermediate object. For example, a set of possible labels may be grouped under a common property:
|
390
|
-
|
402
|
+
|
391
403
|
{
|
392
404
|
"@context": {
|
393
405
|
"skos": "http://www.w3.org/2004/02/skos/core#",
|
@@ -403,9 +415,9 @@ Many JSON APIs separate properties from their entities using an intermediate obj
|
|
403
415
|
"other_label": "This is the other label"
|
404
416
|
}
|
405
417
|
}
|
406
|
-
|
418
|
+
|
407
419
|
In this case, the `labels` property is semantically meaningless. Defining it as equivalent to `@nest` causes it to be ignored when expanding, making it equivalent to the following:
|
408
|
-
|
420
|
+
|
409
421
|
{
|
410
422
|
"@context": {
|
411
423
|
"skos": "http://www.w3.org/2004/02/skos/core#",
|
@@ -419,9 +431,9 @@ Many JSON APIs separate properties from their entities using an intermediate obj
|
|
419
431
|
"main_label": "This is the main label for my resource",
|
420
432
|
"other_label": "This is the other label"
|
421
433
|
}
|
422
|
-
|
434
|
+
|
423
435
|
Similarly, properties may be marked with "@nest": "nest-term", to cause them to be nested. Note that the `@nest` keyword can also be aliased in the context.
|
424
|
-
|
436
|
+
|
425
437
|
{
|
426
438
|
"@context": {
|
427
439
|
"skos": "http://www.w3.org/2004/02/skos/core#",
|
@@ -437,7 +449,7 @@ Many JSON APIs separate properties from their entities using an intermediate obj
|
|
437
449
|
"other_label": "This is the other label"
|
438
450
|
}
|
439
451
|
}
|
440
|
-
|
452
|
+
|
441
453
|
In this way, nesting survives round-tripping through expansion, and framed output can include nested properties.
|
442
454
|
|
443
455
|
## Sinatra/Rack support
|
@@ -515,14 +527,14 @@ Note, the API method signatures differed in versions before 1.0, in that they al
|
|
515
527
|
## Installation
|
516
528
|
The recommended installation method is via [RubyGems](https://rubygems.org/).
|
517
529
|
To install the latest official release of the `JSON-LD` gem, do:
|
518
|
-
|
519
|
-
|
520
|
-
|
530
|
+
|
531
|
+
% [sudo] gem install json-ld
|
532
|
+
|
521
533
|
## Download
|
522
534
|
To get a local working copy of the development repository, do:
|
523
|
-
|
524
|
-
|
525
|
-
|
535
|
+
|
536
|
+
% git clone git://github.com/ruby-rdf/json-ld.git
|
537
|
+
|
526
538
|
## Mailing List
|
527
539
|
* <https://lists.w3.org/Archives/Public/public-rdf-ruby/>
|
528
540
|
|
@@ -540,7 +552,9 @@ To get a local working copy of the development repository, do:
|
|
540
552
|
list in the the `README`. Alphabetical order applies.
|
541
553
|
* Do note that in order for us to merge any non-trivial changes (as a rule
|
542
554
|
of thumb, additions larger than about 15 lines of code), we need an
|
543
|
-
explicit [public domain dedication][PDD] on record from you
|
555
|
+
explicit [public domain dedication][PDD] on record from you,
|
556
|
+
which you will be asked to agree to on the first commit to a repo within the organization.
|
557
|
+
Note that the agreement applies to all repos in the [Ruby RDF](https://github.com/ruby-rdf/) organization.
|
544
558
|
|
545
559
|
License
|
546
560
|
-------
|
@@ -552,7 +566,7 @@ see <https://unlicense.org/> or the accompanying {file:UNLICENSE} file.
|
|
552
566
|
[RDF]: https://www.w3.org/RDF/
|
553
567
|
[YARD]: https://yardoc.org/
|
554
568
|
[YARD-GS]: https://rubydoc.info/docs/yard/file/docs/GettingStarted.md
|
555
|
-
[PDD]: https://
|
569
|
+
[PDD]: https://unlicense.org/#unlicensing-contributions
|
556
570
|
[RDF.rb]: https://rubygems.org/gems/rdf
|
557
571
|
[Rack::LinkedData]: https://rubygems.org/gems/rack-linkeddata
|
558
572
|
[Backports]: https://rubygems.org/gems/backports
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.1.
|
1
|
+
3.1.5
|
data/bin/jsonld
CHANGED
@@ -10,7 +10,7 @@ require 'getoptlong'
|
|
10
10
|
require 'open-uri'
|
11
11
|
require 'logger'
|
12
12
|
|
13
|
-
def run(input, options)
|
13
|
+
def run(input, options, parser_options)
|
14
14
|
reader_class = RDF::Reader.for(options[:input_format].to_sym)
|
15
15
|
raise "Reader not found for #{options[:input_format]}" unless reader_class
|
16
16
|
|
@@ -19,38 +19,38 @@ def run(input, options)
|
|
19
19
|
|
20
20
|
# If input format is not JSON-LD, transform input to JSON-LD first
|
21
21
|
reader = if options[:input_format] != :jsonld
|
22
|
-
reader_class.new(input,
|
22
|
+
reader_class.new(input, parser_options)
|
23
23
|
end
|
24
24
|
|
25
25
|
start = Time.new
|
26
26
|
if options[:expand]
|
27
|
-
|
27
|
+
parser_options = parser_options.merge(expandContext: parser_options.delete(:context)) if parser_options.has_key?(:context)
|
28
28
|
input = JSON::LD::API.fromRdf(reader) if reader
|
29
|
-
output = JSON::LD::API.expand(input,
|
29
|
+
output = JSON::LD::API.expand(input, parser_options)
|
30
30
|
secs = Time.new - start
|
31
31
|
options[:output].puts output.to_json(JSON::LD::JSON_STATE)
|
32
32
|
STDERR.puts "Expanded in #{secs} seconds." unless options[:quiet]
|
33
33
|
elsif options[:compact]
|
34
34
|
input = JSON::LD::API.fromRdf(reader) if reader
|
35
|
-
output = JSON::LD::API.compact(input,
|
35
|
+
output = JSON::LD::API.compact(input, parser_options[:context], parser_options)
|
36
36
|
secs = Time.new - start
|
37
37
|
options[:output].puts output.to_json(JSON::LD::JSON_STATE)
|
38
38
|
STDERR.puts "Compacted in #{secs} seconds." unless options[:quiet]
|
39
39
|
elsif options[:flatten]
|
40
40
|
input = JSON::LD::API.fromRdf(reader) if reader
|
41
|
-
output = JSON::LD::API.flatten(input,
|
41
|
+
output = JSON::LD::API.flatten(input, parser_options[:context], parser_options)
|
42
42
|
secs = Time.new - start
|
43
43
|
options[:output].puts output.to_json(JSON::LD::JSON_STATE)
|
44
44
|
STDERR.puts "Flattened in #{secs} seconds." unless options[:quiet]
|
45
45
|
elsif options[:frame]
|
46
46
|
input = JSON::LD::API.fromRdf(reader) if reader
|
47
|
-
output = JSON::LD::API.frame(input,
|
47
|
+
output = JSON::LD::API.frame(input, parser_options[:frame], parser_options)
|
48
48
|
secs = Time.new - start
|
49
49
|
options[:output].puts output.to_json(JSON::LD::JSON_STATE)
|
50
50
|
STDERR.puts "Framed in #{secs} seconds." unless options[:quiet]
|
51
51
|
else
|
52
|
-
|
53
|
-
parser_options
|
52
|
+
parser_options = parser_options.merge(expandContext: parser_options.delete(:context)) if parser_options.has_key?(:context)
|
53
|
+
parser_options[:standard_prefixes] = true
|
54
54
|
reader ||= JSON::LD::Reader.new(input, parser_options)
|
55
55
|
num = 0
|
56
56
|
RDF::Writer.for(options[:output_format]).new(options[:output], parser_options) do |w|
|
@@ -86,7 +86,6 @@ parser_options = {
|
|
86
86
|
}
|
87
87
|
|
88
88
|
options = {
|
89
|
-
parser_options: parser_options,
|
90
89
|
output: STDOUT,
|
91
90
|
output_format: :jsonld,
|
92
91
|
input_format: :jsonld,
|
@@ -141,49 +140,47 @@ opts = GetoptLong.new(*OPT_ARGS.map {|o| o[0..-2]})
|
|
141
140
|
opts.each do |opt, arg|
|
142
141
|
case opt
|
143
142
|
when '--debug' then logger.level = Logger::DEBUG
|
144
|
-
when '--compact' then
|
145
|
-
when "--compactArrays" then
|
146
|
-
when '--context' then
|
143
|
+
when '--compact' then parser_options[:compact] = true
|
144
|
+
when "--compactArrays" then parser_options[:compactArrays] = (arg || 'true') == 'true'
|
145
|
+
when '--context' then parser_options[:context] = RDF::URI(arg).absolute? ? arg : File.open(arg)
|
147
146
|
when '--evaluate' then input = arg
|
148
147
|
when '--expand' then options[:expand] = true
|
149
|
-
when "--expanded" then
|
150
|
-
when "--explicit" then
|
148
|
+
when "--expanded" then parser_options[:expanded] = (arg || 'true') == 'true'
|
149
|
+
when "--explicit" then parser_options[:compactArrays] = (arg || 'true') == 'true'
|
151
150
|
when '--format' then options[:output_format] = arg.to_sym
|
152
151
|
when '--flatten' then options[:flatten] = arg
|
153
|
-
when '--frame' then options[:frame] = arg
|
152
|
+
when '--frame' then options[:frame] = parser_otpions[:frame] = RDF::URI(arg).absolute? ? arg : File.open(arg)
|
154
153
|
when '--input-format' then options[:input_format] = arg.to_sym
|
155
|
-
when "--omitDefault" then
|
154
|
+
when "--omitDefault" then parser_options[:omitDefault] = (arg || 'true') == 'true'
|
156
155
|
when '--output' then options[:output] = File.open(arg, "w")
|
157
156
|
when '--parse-only' then options[:parse_only] = true
|
158
|
-
when '--processingMode' then
|
157
|
+
when '--processingMode' then parser_options[:processingMode] = arg
|
159
158
|
when '--quiet'
|
160
159
|
options[:quiet] = true
|
161
160
|
logger.level = Logger::FATAL
|
162
|
-
when "--rename_bnodes" then
|
163
|
-
when "--requireAll" then
|
161
|
+
when "--rename_bnodes" then parser_options[:rename_bnodes] = (arg || 'true') == 'true'
|
162
|
+
when "--requireAll" then parser_options[:requireAll] = (arg || 'true') == 'true'
|
164
163
|
when '--stream' then parser_options[:stream] = true
|
165
|
-
when "--unique_bnodes" then
|
164
|
+
when "--unique_bnodes" then parser_options[:unique_bnodes] = (arg || 'true') == 'true'
|
166
165
|
when '--uri' then parser_options[:base] = arg
|
167
166
|
when '--validate' then parser_options[:validate] = true
|
168
167
|
when '--help' then usage
|
169
168
|
when '--embed'
|
170
169
|
case arg
|
171
|
-
when '@always', '@never', '@link', '@
|
172
|
-
|
170
|
+
when '@always', '@never', '@link', '@once'
|
171
|
+
parser_options[:embed] = arg
|
173
172
|
when 'true'
|
174
|
-
|
173
|
+
parser_options[:embed] = '@never'
|
175
174
|
when 'false'
|
176
|
-
|
175
|
+
parser_options[:embed] = '@first'
|
177
176
|
else
|
178
|
-
STDERR.puts "--embed option takes one of @always, @never, @link,
|
177
|
+
STDERR.puts "--embed option takes one of @always, @never, @link, or @once"
|
179
178
|
exit(1)
|
180
179
|
end
|
181
180
|
end
|
182
181
|
end
|
183
182
|
|
184
183
|
# Hack
|
185
|
-
options[:parser_options][:context] = options[:context] if parser_options[:stream]
|
186
|
-
|
187
184
|
if !(options.keys & [:expand, :compact, :flatten, :frame]).empty? &&
|
188
185
|
(parser_options[:stream] || options[:output_format] != :jsonld)
|
189
186
|
STDERR.puts "Incompatible options"
|
@@ -192,11 +189,11 @@ end
|
|
192
189
|
|
193
190
|
if ARGV.empty?
|
194
191
|
s = input ? input : $stdin.read
|
195
|
-
run(StringIO.new(s), options)
|
192
|
+
run(StringIO.new(s), options, parser_options)
|
196
193
|
else
|
197
194
|
ARGV.each do |file|
|
198
195
|
# Call with opened files
|
199
|
-
RDF::Util::File.open_file(file, options) {|f| run(f, options)}
|
196
|
+
RDF::Util::File.open_file(file, options) {|f| run(f, options, parser_options)}
|
200
197
|
end
|
201
198
|
end
|
202
199
|
puts
|
data/lib/json/ld.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
# frozen_string_literal: true
|
3
3
|
$:.unshift(File.expand_path("../ld", __FILE__))
|
4
|
-
require 'rdf' # @see
|
4
|
+
require 'rdf' # @see https://rubygems.org/gems/rdf
|
5
5
|
require 'multi_json'
|
6
6
|
require 'set'
|
7
7
|
|
@@ -19,7 +19,7 @@ module JSON
|
|
19
19
|
# end
|
20
20
|
# end
|
21
21
|
#
|
22
|
-
# @see
|
22
|
+
# @see https://rubygems.org/gems/rdf
|
23
23
|
# @see http://www.w3.org/TR/REC-rdf-syntax/
|
24
24
|
#
|
25
25
|
# @author [Gregg Kellogg](http://greggkellogg.net/)
|
data/lib/json/ld/compact.rb
CHANGED
@@ -19,12 +19,9 @@ module JSON::LD
|
|
19
19
|
# @return [Array, Hash]
|
20
20
|
def compact(element,
|
21
21
|
base: nil,
|
22
|
-
property: nil
|
23
|
-
|
24
|
-
|
25
|
-
#else
|
26
|
-
# log_debug("compact") {"property: #{property.inspect}"}
|
27
|
-
#end
|
22
|
+
property: nil,
|
23
|
+
log_depth: nil)
|
24
|
+
log_debug("compact", depth: log_depth.to_i) {"element: #{element.inspect}, ec: #{context.inspect}"}
|
28
25
|
|
29
26
|
# If the term definition for active property itself contains a context, use that for compacting values.
|
30
27
|
input_context = self.context
|
@@ -33,7 +30,7 @@ module JSON::LD
|
|
33
30
|
when Array
|
34
31
|
#log_debug("") {"Array #{element.inspect}"}
|
35
32
|
result = element.map do |item|
|
36
|
-
compact(item, base: base, property: property)
|
33
|
+
compact(item, base: base, property: property, log_depth: log_depth.to_i + 1)
|
37
34
|
end.compact
|
38
35
|
|
39
36
|
# If element has a single member and the active property has no
|
@@ -41,10 +38,10 @@ module JSON::LD
|
|
41
38
|
# member; otherwise the compacted value is element
|
42
39
|
if result.length == 1 &&
|
43
40
|
!context.as_array?(property) && @options[:compactArrays]
|
44
|
-
|
41
|
+
log_debug("=> extract single element", depth: log_depth.to_i) {result.first.inspect}
|
45
42
|
result.first
|
46
43
|
else
|
47
|
-
|
44
|
+
log_debug("=> array result", depth: log_depth.to_i) {result.inspect}
|
48
45
|
result
|
49
46
|
end
|
50
47
|
when Hash
|
@@ -55,6 +52,7 @@ module JSON::LD
|
|
55
52
|
|
56
53
|
# Revert any previously type-scoped (non-preserved) context
|
57
54
|
if context.previous_context && !element.key?('@value') && element.keys != %w(@id)
|
55
|
+
log_debug("revert ec", depth: log_depth.to_i) {"previous context: #{context.previous_context.inspect}"}
|
58
56
|
self.context = context.previous_context
|
59
57
|
end
|
60
58
|
|
@@ -63,12 +61,13 @@ module JSON::LD
|
|
63
61
|
if td && !td.context.nil?
|
64
62
|
self.context = context.parse(td.context,
|
65
63
|
override_protected: true)
|
64
|
+
log_debug("prop-scoped", depth: log_depth.to_i) {"context: #{self.context.inspect}"}
|
66
65
|
end
|
67
66
|
|
68
67
|
if element.key?('@id') || element.key?('@value')
|
69
68
|
result = context.compact_value(property, element, base: @options[:base])
|
70
69
|
if !result.is_a?(Hash) || context.coerce(property) == '@json'
|
71
|
-
|
70
|
+
log_debug("", depth: log_depth.to_i) {"=> scalar result: #{result.inspect}"}
|
72
71
|
return result
|
73
72
|
end
|
74
73
|
end
|
@@ -76,7 +75,8 @@ module JSON::LD
|
|
76
75
|
# If expanded property is @list and we're contained within a list container, recursively compact this item to an array
|
77
76
|
if list?(element) && context.container(property).include?('@list')
|
78
77
|
return compact(element['@list'], base: base,
|
79
|
-
property: property
|
78
|
+
property: property,
|
79
|
+
log_depth: log_depth.to_i + 1)
|
80
80
|
end
|
81
81
|
|
82
82
|
inside_reverse = property == '@reverse'
|
@@ -90,11 +90,12 @@ module JSON::LD
|
|
90
90
|
each do |term|
|
91
91
|
term_context = input_context.term_definitions[term].context if input_context.term_definitions[term]
|
92
92
|
self.context = context.parse(term_context, propagate: false) unless term_context.nil?
|
93
|
+
log_debug("type-scoped", depth: log_depth.to_i) {"context: #{self.context.inspect}"}
|
93
94
|
end
|
94
95
|
|
95
96
|
element.keys.opt_sort(ordered: @options[:ordered]).each do |expanded_property|
|
96
97
|
expanded_value = element[expanded_property]
|
97
|
-
|
98
|
+
log_debug("", depth: log_depth.to_i) {"#{expanded_property}: #{expanded_value.inspect}"}
|
98
99
|
|
99
100
|
if expanded_property == '@id'
|
100
101
|
compacted_value = Array(expanded_value).map do |expanded_id|
|
@@ -124,8 +125,9 @@ module JSON::LD
|
|
124
125
|
|
125
126
|
if expanded_property == '@reverse'
|
126
127
|
compacted_value = compact(expanded_value, base: base,
|
127
|
-
property: '@reverse'
|
128
|
-
|
128
|
+
property: '@reverse',
|
129
|
+
log_depth: log_depth.to_i + 1)
|
130
|
+
log_debug("@reverse", depth: log_depth.to_i) {"compacted_value: #{compacted_value.inspect}"}
|
129
131
|
# handle double-reversed properties
|
130
132
|
compacted_value.each do |prop, value|
|
131
133
|
if context.reverse?(prop)
|
@@ -137,7 +139,7 @@ module JSON::LD
|
|
137
139
|
|
138
140
|
unless compacted_value.empty?
|
139
141
|
al = context.compact_iri('@reverse')
|
140
|
-
|
142
|
+
log_debug("", depth: log_depth.to_i) {"remainder: #{al} => #{compacted_value.inspect}"}
|
141
143
|
result[al] = compacted_value
|
142
144
|
end
|
143
145
|
next
|
@@ -146,8 +148,9 @@ module JSON::LD
|
|
146
148
|
if expanded_property == '@preserve'
|
147
149
|
# Compact using `property`
|
148
150
|
compacted_value = compact(expanded_value, base: base,
|
149
|
-
property: property
|
150
|
-
|
151
|
+
property: property,
|
152
|
+
log_depth: log_depth.to_i + 1)
|
153
|
+
log_debug("@preserve", depth: log_depth.to_i) {"compacted_value: #{compacted_value.inspect}"}
|
151
154
|
|
152
155
|
unless compacted_value.is_a?(Array) && compacted_value.empty?
|
153
156
|
result['@preserve'] = compacted_value
|
@@ -156,14 +159,14 @@ module JSON::LD
|
|
156
159
|
end
|
157
160
|
|
158
161
|
if expanded_property == '@index' && context.container(property).include?('@index')
|
159
|
-
|
162
|
+
log_debug("@index", depth: log_depth.to_i) {"drop @index"}
|
160
163
|
next
|
161
164
|
end
|
162
165
|
|
163
166
|
# Otherwise, if expanded property is @direction, @index, @value, or @language:
|
164
167
|
if EXPANDED_PROPERTY_DIRECTION_INDEX_LANGUAGE_VALUE.include?(expanded_property)
|
165
168
|
al = context.compact_iri(expanded_property, vocab: true)
|
166
|
-
|
169
|
+
log_debug(expanded_property, depth: log_depth.to_i) {"#{al} => #{expanded_value.inspect}"}
|
167
170
|
result[al] = expanded_value
|
168
171
|
next
|
169
172
|
end
|
@@ -211,8 +214,9 @@ module JSON::LD
|
|
211
214
|
end
|
212
215
|
|
213
216
|
compacted_item = compact(value, base: base,
|
214
|
-
property: item_active_property
|
215
|
-
|
217
|
+
property: item_active_property,
|
218
|
+
log_depth: log_depth.to_i + 1)
|
219
|
+
log_debug("", depth: log_depth.to_i) {" => compacted key: #{item_active_property.inspect} for #{compacted_item.inspect}"}
|
216
220
|
|
217
221
|
# handle @list
|
218
222
|
if list?(expanded_item)
|
@@ -315,7 +319,8 @@ module JSON::LD
|
|
315
319
|
if compacted_item.keys.length == 1 && expanded_item.keys.include?('@id')
|
316
320
|
compacted_item = compact({'@id' => expanded_item['@id']},
|
317
321
|
base: base,
|
318
|
-
property: item_active_property
|
322
|
+
property: item_active_property,
|
323
|
+
log_depth: log_depth.to_i + 1)
|
319
324
|
end
|
320
325
|
compacted_item
|
321
326
|
end
|
@@ -332,7 +337,7 @@ module JSON::LD
|
|
332
337
|
result
|
333
338
|
else
|
334
339
|
# For other types, the compacted value is the element value
|
335
|
-
|
340
|
+
log_debug("compact", depth: log_depth.to_i) {element.class.to_s}
|
336
341
|
element
|
337
342
|
end
|
338
343
|
|
data/lib/json/ld/conneg.rb
CHANGED
@@ -46,7 +46,7 @@ module JSON::LD
|
|
46
46
|
#
|
47
47
|
# @param [Hash{String => String}] env
|
48
48
|
# @return [Array(Integer, Hash, #each)] Status, Headers and Body
|
49
|
-
# @see
|
49
|
+
# @see https://rubydoc.info/github/rack/rack/file/SPEC
|
50
50
|
def call(env)
|
51
51
|
response = app.call(env)
|
52
52
|
body = response[2].respond_to?(:body) ? response[2].body : response[2]
|
data/lib/json/ld/context.rb
CHANGED
@@ -104,16 +104,12 @@ module JSON::LD
|
|
104
104
|
# @see #initialize
|
105
105
|
# @see #parse
|
106
106
|
# @param [String, #read, Array, Hash, Context] local_context
|
107
|
-
# @param [String, #to_s]
|
107
|
+
# @param [String, #to_s] base (nil)
|
108
108
|
# The Base IRI to use when expanding the document. This overrides the value of `input` if it is a _IRI_. If not specified and `input` is not an _IRI_, the base IRI defaults to the current document IRI if in a browser context, or the empty string if there is no document context.
|
109
|
-
# @param [Proc] :documentLoader (nil)
|
110
|
-
# The callback of the loader to be used to retrieve remote documents and contexts. If specified, it must be used to retrieve remote documents and contexts; otherwise, if not specified, the processor's built-in loader must be used. See {API.documentLoader} for the method signature.
|
111
109
|
# @param [Boolean] override_protected (false)
|
112
110
|
# Protected terms may be cleared.
|
113
111
|
# @param [Boolean] propagate (true)
|
114
112
|
# If false, retains any previously defined term, which can be rolled back when the descending into a new node object changes.
|
115
|
-
# @param [Boolean] validate (false)
|
116
|
-
# Extra validatation
|
117
113
|
# @raise [JsonLdError]
|
118
114
|
# on a remote context load error, syntax error, or a reference to a term which is not defined.
|
119
115
|
# @return [Context]
|
@@ -231,14 +227,12 @@ module JSON::LD
|
|
231
227
|
#
|
232
228
|
#
|
233
229
|
# @param [String, #read, Array, Hash, Context] local_context
|
234
|
-
# @param [String, #to_s]
|
230
|
+
# @param [String, #to_s] base
|
235
231
|
# The Base IRI to use when expanding the document. This overrides the value of `input` if it is a _IRI_. If not specified and `input` is not an _IRI_, the base IRI defaults to the current document IRI if in a browser context, or the empty string if there is no document context.
|
236
232
|
# @param [Boolean] override_protected Protected terms may be cleared.
|
237
233
|
# @param [Boolean] propagate (true)
|
238
234
|
# If false, retains any previously defined term, which can be rolled back when the descending into a new node object changes.
|
239
235
|
# @param [Array<String>] remote_contexts ([])
|
240
|
-
# @param [Boolean] validate (false)
|
241
|
-
# Extra validatation
|
242
236
|
# @param [Boolean] validate_scoped (true).
|
243
237
|
# Validate scoped context, loading if necessary.
|
244
238
|
# If false, do not load scoped contexts.
|
@@ -419,9 +413,7 @@ module JSON::LD
|
|
419
413
|
# Merge in a context, creating a new context with updates from `context`
|
420
414
|
#
|
421
415
|
# @param [Context] context
|
422
|
-
# @param [Boolean] protected mark resulting context as protected
|
423
416
|
# @param [Boolean] override_protected Allow or disallow protected terms to be changed
|
424
|
-
# @param [Boolean]
|
425
417
|
# @return [Context]
|
426
418
|
def merge(context, override_protected: false)
|
427
419
|
ctx = Context.new(term_definitions: self.term_definitions, standard_prefixes: options[:standard_prefixes])
|
@@ -469,8 +461,6 @@ module JSON::LD
|
|
469
461
|
# @param [String, RDF::URI] base for resolving document-relative IRIs
|
470
462
|
# @param [Boolean] protected if true, causes all terms to be marked protected
|
471
463
|
# @param [Boolean] override_protected Protected terms may be cleared.
|
472
|
-
# @param [Boolean] propagate
|
473
|
-
# Context is propagated across node objects.
|
474
464
|
# @param [Array<String>] remote_contexts
|
475
465
|
# @param [Boolean] validate_scoped (true).
|
476
466
|
# Validate scoped context, loading if necessary.
|
@@ -846,7 +836,7 @@ module JSON::LD
|
|
846
836
|
# If contex has a @version member, it's value MUST be 1.1, otherwise an "invalid @version value" has been detected, and processing is aborted.
|
847
837
|
# If processingMode has been set, and it is not "json-ld-1.1", a "processing mode conflict" has been detecting, and processing is aborted.
|
848
838
|
#
|
849
|
-
# @param [String, Number]
|
839
|
+
# @param [String, Number] value
|
850
840
|
# @return [String]
|
851
841
|
# @raise [JsonLdError::ProcessingModeConflict]
|
852
842
|
def processingMode=(value = nil, **options)
|
@@ -2064,7 +2054,7 @@ module JSON::LD
|
|
2064
2054
|
# @param ["ltr", "rtl"] direction_mapping
|
2065
2055
|
# Direction mapping of term, `false` is used if there is an explicit direction mapping for this term
|
2066
2056
|
# @param [Boolean] reverse_property
|
2067
|
-
# @param [Boolean] protected
|
2057
|
+
# @param [Boolean] protected mark resulting context as protected
|
2068
2058
|
# @param [String] nest term used for nest properties
|
2069
2059
|
# @param [Boolean] simple
|
2070
2060
|
# This is a simple term definition, not an expanded term definition
|
data/lib/json/ld/expand.rb
CHANGED
@@ -146,9 +146,16 @@ module JSON::LD
|
|
146
146
|
# Otherwise, if the value of result's @value member is not a string and result contains the key @language, an invalid language-tagged value error has been detected (only strings can be language-tagged) and processing is aborted.
|
147
147
|
raise JsonLdError::InvalidLanguageTaggedValue,
|
148
148
|
"when @language is used, @value must be a string: #{output_object.inspect}"
|
149
|
-
elsif
|
150
|
-
|
151
|
-
|
149
|
+
elsif output_object['@type'] &&
|
150
|
+
(!Array(output_object['@type']).all? {|t|
|
151
|
+
t.is_a?(String) && RDF::URI(t).valid? && !t.start_with?('_:') ||
|
152
|
+
t.is_a?(Hash) && t.empty?} ||
|
153
|
+
!framing && !output_object['@type'].is_a?(String))
|
154
|
+
# Otherwise, if the result has a @type member and its value is not an IRI, an invalid typed value error has been detected and processing is aborted.
|
155
|
+
raise JsonLdError::InvalidTypedValue,
|
156
|
+
"value of @type must be an IRI or '@json': #{output_object.inspect}"
|
157
|
+
elsif !framing && !output_object.fetch('@type', '').is_a?(String) &&
|
158
|
+
RDF::URI(t).valid? && !t.start_with?('_:')
|
152
159
|
# Otherwise, if the result has a @type member and its value is not an IRI, an invalid typed value error has been detected and processing is aborted.
|
153
160
|
raise JsonLdError::InvalidTypedValue,
|
154
161
|
"value of @type must be an IRI or '@json': #{output_object.inspect}"
|
data/lib/json/ld/format.rb
CHANGED
@@ -58,9 +58,10 @@ module JSON::LD
|
|
58
58
|
out = options[:output] || $stdout
|
59
59
|
out.set_encoding(Encoding::UTF_8) if RUBY_PLATFORM == "java"
|
60
60
|
options = options.merge(expandContext: options.delete(:context)) if options.has_key?(:context)
|
61
|
+
options[:base] ||= options[:base_uri]
|
61
62
|
if options[:format] == :jsonld
|
62
63
|
if files.empty?
|
63
|
-
# If files are empty, either use options[:
|
64
|
+
# If files are empty, either use options[:evaluate] or STDIN
|
64
65
|
input = options[:evaluate] ? StringIO.new(options[:evaluate]) : STDIN
|
65
66
|
input.set_encoding(options.fetch(:encoding, Encoding::UTF_8))
|
66
67
|
JSON::LD::API.expand(input, validate: false, **options) do |expanded|
|
@@ -93,9 +94,10 @@ module JSON::LD
|
|
93
94
|
raise ArgumentError, "Compacting requires a context" unless options[:context]
|
94
95
|
out = options[:output] || $stdout
|
95
96
|
out.set_encoding(Encoding::UTF_8) if RUBY_PLATFORM == "java"
|
97
|
+
options[:base] ||= options[:base_uri]
|
96
98
|
if options[:format] == :jsonld
|
97
99
|
if files.empty?
|
98
|
-
# If files are empty, either use options[:
|
100
|
+
# If files are empty, either use options[:evaluate] or STDIN
|
99
101
|
input = options[:evaluate] ? StringIO.new(options[:evaluate]) : STDIN
|
100
102
|
input.set_encoding(options.fetch(:encoding, Encoding::UTF_8))
|
101
103
|
JSON::LD::API.compact(input, options[:context], **options) do |compacted|
|
@@ -126,7 +128,7 @@ module JSON::LD
|
|
126
128
|
control: :url2,
|
127
129
|
use: :required,
|
128
130
|
on: ["--context CONTEXT"],
|
129
|
-
description: "Context to use when compacting.") {|arg| RDF::URI(arg)},
|
131
|
+
description: "Context to use when compacting.") {|arg| RDF::URI(arg).absolute? ? RDF::URI(arg) : StringIO.new(File.read(arg))},
|
130
132
|
]
|
131
133
|
},
|
132
134
|
flatten: {
|
@@ -137,9 +139,10 @@ module JSON::LD
|
|
137
139
|
lambda: ->(files, **options) do
|
138
140
|
out = options[:output] || $stdout
|
139
141
|
out.set_encoding(Encoding::UTF_8) if RUBY_PLATFORM == "java"
|
142
|
+
options[:base] ||= options[:base_uri]
|
140
143
|
if options[:format] == :jsonld
|
141
144
|
if files.empty?
|
142
|
-
# If files are empty, either use options[:
|
145
|
+
# If files are empty, either use options[:evaluate] or STDIN
|
143
146
|
input = options[:evaluate] ? StringIO.new(options[:evaluate]) : STDIN
|
144
147
|
input.set_encoding(options.fetch(:encoding, Encoding::UTF_8))
|
145
148
|
JSON::LD::API.flatten(input, options[:context], **options) do |flattened|
|
@@ -173,9 +176,10 @@ module JSON::LD
|
|
173
176
|
raise ArgumentError, "Framing requires a frame" unless options[:frame]
|
174
177
|
out = options[:output] || $stdout
|
175
178
|
out.set_encoding(Encoding::UTF_8) if RUBY_PLATFORM == "java"
|
179
|
+
options[:base] ||= options[:base_uri]
|
176
180
|
if options[:format] == :jsonld
|
177
181
|
if files.empty?
|
178
|
-
# If files are empty, either use options[:
|
182
|
+
# If files are empty, either use options[:evaluate] or STDIN
|
179
183
|
input = options[:evaluate] ? StringIO.new(options[:evaluate]) : STDIN
|
180
184
|
input.set_encoding(options.fetch(:encoding, Encoding::UTF_8))
|
181
185
|
JSON::LD::API.frame(input, options[:frame], **options) do |framed|
|
@@ -207,7 +211,7 @@ module JSON::LD
|
|
207
211
|
control: :url2,
|
208
212
|
use: :required,
|
209
213
|
on: ["--frame FRAME"],
|
210
|
-
description: "Frame to use when serializing.") {|arg| RDF::URI(arg)}
|
214
|
+
description: "Frame to use when serializing.") {|arg| RDF::URI(arg).absolute? ? RDF::URI(arg) : StringIO.new(File.read(arg))}
|
211
215
|
]
|
212
216
|
},
|
213
217
|
}
|
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,
|
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
|
data/spec/matchers.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json-ld
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.
|
4
|
+
version: 3.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gregg Kellogg
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rdf
|
@@ -411,7 +411,7 @@ homepage: https://github.com/ruby-rdf/json-ld
|
|
411
411
|
licenses:
|
412
412
|
- Unlicense
|
413
413
|
metadata: {}
|
414
|
-
post_install_message:
|
414
|
+
post_install_message:
|
415
415
|
rdoc_options: []
|
416
416
|
require_paths:
|
417
417
|
- lib
|
@@ -426,8 +426,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
426
426
|
- !ruby/object:Gem::Version
|
427
427
|
version: '0'
|
428
428
|
requirements: []
|
429
|
-
rubygems_version: 3.1.
|
430
|
-
signing_key:
|
429
|
+
rubygems_version: 3.1.4
|
430
|
+
signing_key:
|
431
431
|
specification_version: 4
|
432
432
|
summary: JSON-LD reader/writer for Ruby.
|
433
433
|
test_files:
|