json-ld 0.9.1 → 1.0.0

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.
Files changed (45) hide show
  1. data/{README.markdown → README.md} +15 -3
  2. data/VERSION +1 -1
  3. data/lib/json/ld.rb +50 -87
  4. data/lib/json/ld/api.rb +85 -96
  5. data/lib/json/ld/compact.rb +103 -170
  6. data/lib/json/ld/context.rb +1137 -0
  7. data/lib/json/ld/expand.rb +212 -171
  8. data/lib/json/ld/extensions.rb +17 -1
  9. data/lib/json/ld/flatten.rb +145 -78
  10. data/lib/json/ld/frame.rb +1 -1
  11. data/lib/json/ld/from_rdf.rb +73 -103
  12. data/lib/json/ld/reader.rb +3 -1
  13. data/lib/json/ld/resource.rb +3 -3
  14. data/lib/json/ld/to_rdf.rb +98 -109
  15. data/lib/json/ld/utils.rb +54 -4
  16. data/lib/json/ld/writer.rb +5 -5
  17. data/spec/api_spec.rb +3 -28
  18. data/spec/compact_spec.rb +76 -113
  19. data/spec/{evaluation_context_spec.rb → context_spec.rb} +307 -563
  20. data/spec/expand_spec.rb +163 -187
  21. data/spec/flatten_spec.rb +119 -114
  22. data/spec/frame_spec.rb +5 -5
  23. data/spec/from_rdf_spec.rb +44 -24
  24. data/spec/suite_compact_spec.rb +11 -8
  25. data/spec/suite_error_expand_spec.rb +23 -0
  26. data/spec/suite_expand_spec.rb +3 -7
  27. data/spec/suite_flatten_spec.rb +3 -3
  28. data/spec/suite_frame_spec.rb +6 -6
  29. data/spec/suite_from_rdf_spec.rb +3 -3
  30. data/spec/suite_helper.rb +13 -6
  31. data/spec/suite_to_rdf_spec.rb +16 -10
  32. data/spec/test-files/test-1-rdf.ttl +4 -3
  33. data/spec/test-files/test-3-rdf.ttl +2 -1
  34. data/spec/test-files/test-4-compacted.json +1 -1
  35. data/spec/test-files/test-5-rdf.ttl +3 -2
  36. data/spec/test-files/test-6-rdf.ttl +3 -2
  37. data/spec/test-files/test-7-compacted.json +3 -3
  38. data/spec/test-files/test-7-expanded.json +3 -3
  39. data/spec/test-files/test-7-rdf.ttl +7 -6
  40. data/spec/test-files/test-9-compacted.json +1 -1
  41. data/spec/to_rdf_spec.rb +67 -75
  42. data/spec/writer_spec.rb +2 -0
  43. metadata +36 -24
  44. checksums.yaml +0 -15
  45. data/lib/json/ld/evaluation_context.rb +0 -984
@@ -11,47 +11,6 @@ describe JSON::LD::API do
11
11
  :input => {},
12
12
  :output => []
13
13
  },
14
- "coerced IRI" => {
15
- :input => {
16
- "@context" => {
17
- "a" => {"@id" => "http://example.com/a"},
18
- "b" => {"@id" => "http://example.com/b", "@type" => "@id"},
19
- "c" => {"@id" => "http://example.com/c"},
20
- },
21
- "@id" => "a",
22
- "b" => "c"
23
- },
24
- :output => [{
25
- "@id" => "http://example.com/a",
26
- "http://example.com/b" => [{"@id" =>"http://example.com/c"}]
27
- }]
28
- },
29
- "coerced IRI in array" => {
30
- :input => {
31
- "@context" => {
32
- "a" => {"@id" => "http://example.com/a"},
33
- "b" => {"@id" => "http://example.com/b", "@type" => "@id"},
34
- "c" => {"@id" => "http://example.com/c"},
35
- },
36
- "@id" => "a",
37
- "b" => ["c"]
38
- },
39
- :output => [{
40
- "@id" => "http://example.com/a",
41
- "http://example.com/b" => [{"@id" => "http://example.com/c"}]
42
- }]
43
- },
44
- "empty term" => {
45
- :input => {
46
- "@context" => {"" => "http://example.com/"},
47
- "@id" => "",
48
- "@type" => "#{RDF::RDFS.Resource}"
49
- },
50
- :output => [{
51
- "@id" => "http://example.com/",
52
- "@type" => ["#{RDF::RDFS.Resource}"]
53
- }]
54
- },
55
14
  "@list coercion" => {
56
15
  :input => {
57
16
  "@context" => {
@@ -84,14 +43,6 @@ describe JSON::LD::API do
84
43
  {"http://example.com/bar" => [{"@value" => "bar"}]}
85
44
  ]
86
45
  },
87
- "@type with empty object" => {
88
- :input => {
89
- "@type" => {}
90
- },
91
- :output => [
92
- {"@type" => [{}]}
93
- ]
94
- },
95
46
  "@type with CURIE" => {
96
47
  :input => {
97
48
  "@context" => {"ex" => "http://example.com/"},
@@ -110,9 +61,13 @@ describe JSON::LD::API do
110
61
  {"@type" => ["http://example.com/type1", "http://example.com/type2"]}
111
62
  ]
112
63
  },
64
+ "@value with false" => {
65
+ :input => {"http://example.com/ex" => {"@value" => false}},
66
+ :output => [{"http://example.com/ex" => [{"@value" => false}]}]
67
+ }
113
68
  }.each_pair do |title, params|
114
69
  it title do
115
- jld = JSON::LD::API.expand(params[:input], nil, nil, :debug => @debug)
70
+ jld = JSON::LD::API.expand(params[:input], nil, :debug => @debug)
116
71
  jld.should produce(params[:output], @debug)
117
72
  end
118
73
  end
@@ -159,7 +114,7 @@ describe JSON::LD::API do
159
114
  },
160
115
  }.each do |title, params|
161
116
  it title do
162
- jld = JSON::LD::API.expand(params[:input], nil, nil, :base => "http://example.org/", :debug => @debug)
117
+ jld = JSON::LD::API.expand(params[:input], nil, :base => "http://example.org/", :debug => @debug)
163
118
  jld.should produce(params[:output], @debug)
164
119
  end
165
120
  end
@@ -218,7 +173,7 @@ describe JSON::LD::API do
218
173
  },
219
174
  }.each do |title, params|
220
175
  it title do
221
- jld = JSON::LD::API.expand(params[:input], nil, nil, :debug => @debug)
176
+ jld = JSON::LD::API.expand(params[:input], nil, :debug => @debug)
222
177
  jld.should produce(params[:output], @debug)
223
178
  end
224
179
  end
@@ -273,7 +228,7 @@ describe JSON::LD::API do
273
228
  },
274
229
  }.each do |title, params|
275
230
  it title do
276
- jld = JSON::LD::API.expand(params[:input], nil, nil, :debug => @debug)
231
+ jld = JSON::LD::API.expand(params[:input], nil, :debug => @debug)
277
232
  jld.should produce(params[:output], @debug)
278
233
  end
279
234
  end
@@ -301,7 +256,7 @@ describe JSON::LD::API do
301
256
  },
302
257
  }.each do |title, params|
303
258
  it title do
304
- jld = JSON::LD::API.expand(params[:input], nil, nil, :debug => @debug)
259
+ jld = JSON::LD::API.expand(params[:input], nil, :debug => @debug)
305
260
  jld.should produce(params[:output], @debug)
306
261
  end
307
262
  end
@@ -310,45 +265,21 @@ describe JSON::LD::API do
310
265
  context "null" do
311
266
  {
312
267
  "value" => {
313
- :input => {
314
- "http://example.com/foo" => nil
315
- },
268
+ :input => {"http://example.com/foo" => nil},
316
269
  :output => []
317
270
  },
318
271
  "@value" => {
319
- :input => {
320
- "http://example.com/foo" => {"@value" => nil}
321
- },
272
+ :input => {"http://example.com/foo" => {"@value" => nil}},
322
273
  :output => []
323
274
  },
324
275
  "@value and non-null @type" => {
325
- :input => {
326
- "http://example.com/foo" => {"@value" => nil, "@type" => "http://type"}
327
- },
276
+ :input => {"http://example.com/foo" => {"@value" => nil, "@type" => "http://type"}},
328
277
  :output => []
329
278
  },
330
279
  "@value and non-null @language" => {
331
- :input => {
332
- "http://example.com/foo" => {"@value" => nil, "@language" => "en"}
333
- },
280
+ :input => {"http://example.com/foo" => {"@value" => nil, "@language" => "en"}},
334
281
  :output => []
335
282
  },
336
- "non-null @value and null @type" => {
337
- :input => {
338
- "http://example.com/foo" => {"@value" => "foo", "@type" => nil}
339
- },
340
- :output => [{
341
- "http://example.com/foo" => [{"@value" => "foo"}]
342
- }]
343
- },
344
- "non-null @value and null @language" => {
345
- :input => {
346
- "http://example.com/foo" => {"@value" => "foo", "@language" => nil}
347
- },
348
- :output => [{
349
- "http://example.com/foo" => [{"@value" => "foo"}]
350
- }]
351
- },
352
283
  "array with null elements" => {
353
284
  :input => {
354
285
  "http://example.com/foo" => [nil]
@@ -369,7 +300,7 @@ describe JSON::LD::API do
369
300
  }
370
301
  }.each do |title, params|
371
302
  it title do
372
- jld = JSON::LD::API.expand(params[:input], nil, nil, :debug => @debug)
303
+ jld = JSON::LD::API.expand(params[:input], nil, :debug => @debug)
373
304
  jld.should produce(params[:output], @debug)
374
305
  end
375
306
  end
@@ -377,15 +308,6 @@ describe JSON::LD::API do
377
308
 
378
309
  context "default language" do
379
310
  {
380
- "value with null language" => {
381
- :input => {
382
- "@context" => {"@language" => "en"},
383
- "http://example.org/nolang" => {"@value" => "no language", "@language" => nil}
384
- },
385
- :output => [{
386
- "http://example.org/nolang" => [{"@value" => "no language"}]
387
- }]
388
- },
389
311
  "value with coerced null language" => {
390
312
  :input => {
391
313
  "@context" => {
@@ -406,7 +328,7 @@ describe JSON::LD::API do
406
328
  },
407
329
  }.each do |title, params|
408
330
  it title do
409
- jld = JSON::LD::API.expand(params[:input], nil, nil, :debug => @debug)
331
+ jld = JSON::LD::API.expand(params[:input], nil, :debug => @debug)
410
332
  jld.should produce(params[:output], @debug)
411
333
  end
412
334
  end
@@ -472,7 +394,7 @@ describe JSON::LD::API do
472
394
  }
473
395
  }.each do |title, params|
474
396
  it title do
475
- jld = JSON::LD::API.expand(params[:input], nil, nil,
397
+ jld = JSON::LD::API.expand(params[:input], nil,
476
398
  :base => "http://foo/bar/",
477
399
  :debug => @debug)
478
400
  jld.should produce(params[:output], @debug)
@@ -493,7 +415,7 @@ describe JSON::LD::API do
493
415
  "http://example.com/foo" => {"@value" => "bar", "@type" => "baz"}
494
416
  },
495
417
  :output => [{
496
- "http://example.com/foo" => [{"@value" => "bar"}]
418
+ "http://example.com/foo" => [{"@value" => "bar", "@type" => "http://example/baz"}]
497
419
  }]
498
420
  },
499
421
  "unknown keyword" => {
@@ -529,7 +451,7 @@ describe JSON::LD::API do
529
451
  ]}
530
452
  }.each do |title, params|
531
453
  it title do
532
- jld = JSON::LD::API.expand(params[:input], nil, nil, :debug => @debug)
454
+ jld = JSON::LD::API.expand(params[:input], nil, :debug => @debug, :base => 'http://example/')
533
455
  jld.should produce(params[:output], @debug)
534
456
  end
535
457
  end
@@ -538,30 +460,22 @@ describe JSON::LD::API do
538
460
  context "lists" do
539
461
  {
540
462
  "empty" => {
541
- :input => {
542
- "http://example.com/foo" => {"@list" => []}
543
- },
544
- :output => [{
545
- "http://example.com/foo" => [{"@list" => []}]
546
- }]
463
+ :input => {"http://example.com/foo" => {"@list" => []}},
464
+ :output => [{"http://example.com/foo" => [{"@list" => []}]}]
547
465
  },
548
466
  "coerced empty" => {
549
467
  :input => {
550
468
  "@context" => {"http://example.com/foo" => {"@container" => "@list"}},
551
469
  "http://example.com/foo" => []
552
470
  },
553
- :output => [{
554
- "http://example.com/foo" => [{"@list" => []}]
555
- }]
471
+ :output => [{"http://example.com/foo" => [{"@list" => []}]}]
556
472
  },
557
473
  "coerced single element" => {
558
474
  :input => {
559
475
  "@context" => {"http://example.com/foo" => {"@container" => "@list"}},
560
476
  "http://example.com/foo" => [ "foo" ]
561
477
  },
562
- :output => [{
563
- "http://example.com/foo" => [{"@list" => [{"@value" => "foo"}]}]
564
- }]
478
+ :output => [{"http://example.com/foo" => [{"@list" => [{"@value" => "foo"}]}]}]
565
479
  },
566
480
  "coerced multiple elements" => {
567
481
  :input => {
@@ -590,9 +504,33 @@ describe JSON::LD::API do
590
504
  "http://example.com/foo" => [{"@list" => [{"@value" => "2012-04-12", "@type" => RDF::XSD.date.to_s}]}]
591
505
  }]
592
506
  },
507
+ "expand-0004" => {
508
+ :input => ::JSON.parse(%({
509
+ "@context": {
510
+ "mylist1": {"@id": "http://example.com/mylist1", "@container": "@list"},
511
+ "mylist2": {"@id": "http://example.com/mylist2", "@container": "@list"},
512
+ "myset2": {"@id": "http://example.com/myset2", "@container": "@set"},
513
+ "myset3": {"@id": "http://example.com/myset3", "@container": "@set"}
514
+ },
515
+ "http://example.org/property": { "@list": "one item" }
516
+ })),
517
+ :output => ::JSON.parse(%([
518
+ {
519
+ "http://example.org/property": [
520
+ {
521
+ "@list": [
522
+ {
523
+ "@value": "one item"
524
+ }
525
+ ]
526
+ }
527
+ ]
528
+ }
529
+ ]))
530
+ }
593
531
  }.each do |title, params|
594
532
  it title do
595
- jld = JSON::LD::API.expand(params[:input], nil, nil, :debug => @debug)
533
+ jld = JSON::LD::API.expand(params[:input], nil, :debug => @debug)
596
534
  jld.should produce(params[:output], @debug)
597
535
  end
598
536
  end
@@ -645,7 +583,7 @@ describe JSON::LD::API do
645
583
  },
646
584
  }.each do |title, params|
647
585
  it title do
648
- jld = JSON::LD::API.expand(params[:input], nil, nil, :debug => @debug)
586
+ jld = JSON::LD::API.expand(params[:input], nil, :debug => @debug)
649
587
  jld.should produce(params[:output], @debug)
650
588
  end
651
589
  end
@@ -713,13 +651,110 @@ describe JSON::LD::API do
713
651
  }
714
652
  }.each do |title, params|
715
653
  it title do
716
- jld = JSON::LD::API.expand(params[:input], nil, nil, :debug => @debug)
654
+ jld = JSON::LD::API.expand(params[:input], nil, :debug => @debug)
655
+ jld.should produce(params[:output], @debug)
656
+ end
657
+ end
658
+ end
659
+
660
+ context "@reverse" do
661
+ {
662
+ "expand-0037" => {
663
+ :input => ::JSON.parse(%({
664
+ "@context": {
665
+ "name": "http://xmlns.com/foaf/0.1/name"
666
+ },
667
+ "@id": "http://example.com/people/markus",
668
+ "name": "Markus Lanthaler",
669
+ "@reverse": {
670
+ "http://xmlns.com/foaf/0.1/knows": {
671
+ "@id": "http://example.com/people/dave",
672
+ "name": "Dave Longley"
673
+ }
674
+ }
675
+ })),
676
+ :output => ::JSON.parse(%([
677
+ {
678
+ "@id": "http://example.com/people/markus",
679
+ "@reverse": {
680
+ "http://xmlns.com/foaf/0.1/knows": [
681
+ {
682
+ "@id": "http://example.com/people/dave",
683
+ "http://xmlns.com/foaf/0.1/name": [
684
+ {
685
+ "@value": "Dave Longley"
686
+ }
687
+ ]
688
+ }
689
+ ]
690
+ },
691
+ "http://xmlns.com/foaf/0.1/name": [
692
+ {
693
+ "@value": "Markus Lanthaler"
694
+ }
695
+ ]
696
+ }
697
+ ]))
698
+ },
699
+ "expand-0043" => {
700
+ :input => ::JSON.parse(%({
701
+ "@context": {
702
+ "name": "http://xmlns.com/foaf/0.1/name",
703
+ "isKnownBy": { "@reverse": "http://xmlns.com/foaf/0.1/knows" }
704
+ },
705
+ "@id": "http://example.com/people/markus",
706
+ "name": "Markus Lanthaler",
707
+ "@reverse": {
708
+ "isKnownBy": [
709
+ {
710
+ "@id": "http://example.com/people/dave",
711
+ "name": "Dave Longley"
712
+ },
713
+ {
714
+ "@id": "http://example.com/people/gregg",
715
+ "name": "Gregg Kellogg"
716
+ }
717
+ ]
718
+ }
719
+ })),
720
+ :output => ::JSON.parse(%([
721
+ {
722
+ "@id": "http://example.com/people/markus",
723
+ "http://xmlns.com/foaf/0.1/knows": [
724
+ {
725
+ "@id": "http://example.com/people/dave",
726
+ "http://xmlns.com/foaf/0.1/name": [
727
+ {
728
+ "@value": "Dave Longley"
729
+ }
730
+ ]
731
+ },
732
+ {
733
+ "@id": "http://example.com/people/gregg",
734
+ "http://xmlns.com/foaf/0.1/name": [
735
+ {
736
+ "@value": "Gregg Kellogg"
737
+ }
738
+ ]
739
+ }
740
+ ],
741
+ "http://xmlns.com/foaf/0.1/name": [
742
+ {
743
+ "@value": "Markus Lanthaler"
744
+ }
745
+ ]
746
+ }
747
+ ]))
748
+ },
749
+ }.each do |title, params|
750
+ it title do
751
+ jld = JSON::LD::API.expand(params[:input], nil, :debug => @debug)
717
752
  jld.should produce(params[:output], @debug)
718
753
  end
719
754
  end
720
755
  end
721
756
 
722
- context "annotations" do
757
+ context "@index" do
723
758
  {
724
759
  "string annotation" => {
725
760
  :input => {
@@ -748,88 +783,29 @@ describe JSON::LD::API do
748
783
  },
749
784
  }.each do |title, params|
750
785
  it title do
751
- jld = JSON::LD::API.expand(params[:input], nil, nil, :debug => @debug)
786
+ jld = JSON::LD::API.expand(params[:input], nil, :debug => @debug)
752
787
  jld.should produce(params[:output], @debug)
753
788
  end
754
789
  end
755
790
  end
756
791
 
757
- context "property generators" do
792
+ context "exceptions" do
758
793
  {
759
- "expand-0038" => {
760
- :input => {
761
- "@context" => {
762
- "site" => "http://example.com/",
763
- "field_tags" => {
764
- "@id" => [ "site:vocab/field_tags", "http://schema.org/about" ]
765
- },
766
- "field_related" => {
767
- "@id" => [ "site:vocab/field_related", "http://schema.org/about" ]
768
- }
769
- },
770
- "@id" => "site:node/1",
771
- "field_tags" => [
772
- { "@id" => "site:term/this-is-a-tag" }
773
- ],
774
- "field_related" => [
775
- { "@id" => "site:node/this-is-related-news" }
776
- ]
777
- },
778
- :output => [{
779
- "@id" => "http://example.com/node/1",
780
- "http://example.com/vocab/field_related" => [{
781
- "@id" => "http://example.com/node/this-is-related-news"
782
- }],
783
- "http://schema.org/about" => [{
784
- "@id" => "http://example.com/node/this-is-related-news"
785
- }, {
786
- "@id" => "http://example.com/term/this-is-a-tag"
787
- }],
788
- "http://example.com/vocab/field_tags" => [{
789
- "@id" => "http://example.com/term/this-is-a-tag"
790
- }]
791
- }]
794
+ "non-null @value and null @type" => {
795
+ :input => {"http://example.com/foo" => {"@value" => "foo", "@type" => nil}},
796
+ :exception => JSON::LD::ProcessingError::InvalidTypeValue
792
797
  },
793
- "generate bnodel ids" => {
798
+ "non-null @value and null @language" => {
799
+ :input => {"http://example.com/foo" => {"@value" => "foo", "@language" => nil}},
800
+ :exception => JSON::LD::ProcessingError::InvalidLanguageTaggedString
801
+ },
802
+ "value with null language" => {
794
803
  :input => {
795
- "@context" => {
796
- "site" => "http://example.com/",
797
- "field_tags" => {
798
- "@id" => [ "site:vocab/field_tags", "http://schema.org/about" ]
799
- }
800
- },
801
- "@id" => "site:node/1",
802
- "field_tags" => [
803
- { "@type" => "site:term/this-is-a-tag" },
804
- "foo"
805
- ]
804
+ "@context" => {"@language" => "en"},
805
+ "http://example.org/nolang" => {"@value" => "no language", "@language" => nil}
806
806
  },
807
- :output => [{
808
- "@id" => "http://example.com/node/1",
809
- "http://schema.org/about" => [{
810
- "@id" => "_:t0",
811
- "@type" => ["http://example.com/term/this-is-a-tag"]
812
- }, {
813
- "@value" => "foo"
814
- }],
815
- "http://example.com/vocab/field_tags" => [{
816
- "@id" => "_:t0",
817
- "@type" => ["http://example.com/term/this-is-a-tag"]
818
- }, {
819
- "@value" => "foo"
820
- }]
821
- }]
822
- }
823
- }.each do |title, params|
824
- it title do
825
- jld = JSON::LD::API.expand(params[:input], nil, nil, :debug => @debug)
826
- jld.should produce(params[:output], @debug)
827
- end
828
- end
829
- end
830
-
831
- context "exceptions" do
832
- {
807
+ :exception => JSON::LD::ProcessingError::InvalidLanguageTaggedString
808
+ },
833
809
  "@list containing @list" => {
834
810
  :input => {
835
811
  "http://example.com/foo" => {"@list" => [{"@list" => ["baz"]}]}
@@ -852,8 +828,8 @@ describe JSON::LD::API do
852
828
  },
853
829
  }.each do |title, params|
854
830
  it title do
855
- #JSON::LD::API.expand(params[:input], nil, nil, :debug => @debug).should produce([], @debug)
856
- lambda {JSON::LD::API.expand(params[:input], nil, nil)}.should raise_error(params[:exception])
831
+ #JSON::LD::API.expand(params[:input], nil, :debug => @debug).should produce([], @debug)
832
+ lambda {JSON::LD::API.expand(params[:input], nil)}.should raise_error(params[:exception])
857
833
  end
858
834
  end
859
835
  end