json-ld 3.1.7 → 3.1.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -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.has_datatype?
68
- lit["@language"] = statement.object.language.to_s if statement.object.has_language?
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 [:wrote_node, :wrote_graph].include?(@state)
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 [:wrote_node, :wrote_graph].include?(@state)
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)
@@ -48,7 +48,7 @@ module JSON::LD
48
48
  # Only valid for rdf:JSON
49
49
  value = value.to_json_c14n
50
50
  else
51
- if item.has_key?('@direction') && @options[:rdfDirection]
51
+ if item.key?('@direction') && @options[:rdfDirection]
52
52
  # Either serialize using a datatype, or a compound-literal
53
53
  case @options[:rdfDirection]
54
54
  when 'i18n-datatype'
@@ -63,7 +63,7 @@ module JSON::LD
63
63
  end
64
64
 
65
65
  # Otherwise, if datatype is null, set it to xsd:string or xsd:langString, depending on if item has a @language key.
66
- datatype ||= item.has_key?('@language') ? RDF.langString : RDF::XSD.string
66
+ datatype ||= item.key?('@language') ? RDF.langString : RDF::XSD.string
67
67
  if datatype == RDF::URI(RDF.to_uri + "JSON")
68
68
  value = value.to_json_c14n
69
69
  end
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.has_key?('@value') || value.has_key?('@list') || value.has_key?('@set')) &&
15
- (value.length > 1 || !value.has_key?('@id'))
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.has_key?('@value') || value.has_key?('@list') || value.has_key?('@set'))
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.has_key?('@id')
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.has_key?('@list')
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.has_key?('@index')
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.has_key?('@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 has_property(subject, property)
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 has_property(subject, property)
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.has_key?(old)
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.has_key?(old)
292
+ if !old.empty? && self.key?(old)
293
293
  self[old]
294
294
  elsif !old.empty?
295
295
  @num += 1
@@ -237,8 +237,8 @@ module JSON::LD
237
237
  # @yield [writer]
238
238
  # @yieldparam [RDF::Writer] writer
239
239
  def initialize(output = $stdout, **options, &block)
240
- options[:base_uri] ||= options[:base] if options.has_key?(:base)
241
- options[:base] ||= options[:base_uri] if options.has_key?(:base_uri)
240
+ options[:base_uri] ||= options[:base] if options.key?(:base)
241
+ options[:base] ||= options[:base_uri] if options.key?(:base_uri)
242
242
  super do
243
243
  @repo = RDF::Repository.new
244
244
 
data/spec/api_spec.rb CHANGED
@@ -44,7 +44,7 @@ describe JSON::LD::API do
44
44
  end
45
45
 
46
46
  context "Test Files" do
47
- %w(oj json_gem ok_json yajl).map(&:to_sym).each do |adapter|
47
+ %i(oj json_gem ok_json yajl).each do |adapter|
48
48
  context "with MultiJson adapter #{adapter.inspect}" do
49
49
  Dir.glob(File.expand_path(File.join(File.dirname(__FILE__), 'test-files/*-input.*'))) do |filename|
50
50
  test = File.basename(filename).sub(/-input\..*$/, '')
data/spec/compact_spec.rb CHANGED
@@ -3389,7 +3389,7 @@ describe JSON::LD::API do
3389
3389
  input = ::JSON.parse(input) if input.is_a?(String)
3390
3390
  output = ::JSON.parse(output) if output.is_a?(String)
3391
3391
  context = ::JSON.parse(context) if context.is_a?(String)
3392
- context = context['@context'] if context.has_key?('@context')
3392
+ context = context['@context'] if context.key?('@context')
3393
3393
  pending params.fetch(:pending, "test implementation") unless input
3394
3394
  if params[:exception]
3395
3395
  expect {JSON::LD::API.compact(input, context, logger: logger, **params)}.to raise_error(params[:exception])
data/spec/expand_spec.rb CHANGED
@@ -3371,6 +3371,43 @@ describe JSON::LD::API do
3371
3371
  }),
3372
3372
  exception: JSON::LD::JsonLdError::InvalidReversePropertyMap,
3373
3373
  },
3374
+ "Explicit and implicit @reverse in same object": {
3375
+ input: %({
3376
+ "@context": {
3377
+ "fooOf": {"@reverse": "ex:foo", "@type": "@id"}
3378
+ },
3379
+ "@id": "ex:s",
3380
+ "fooOf": "ex:o1",
3381
+ "@reverse": {
3382
+ "ex:bar": {"@id": "ex:o2"}
3383
+ }
3384
+ }),
3385
+ output: %([{
3386
+ "@id": "ex:s",
3387
+ "@reverse": {
3388
+ "ex:bar": [{"@id": "ex:o2"}],
3389
+ "ex:foo": [{"@id": "ex:o1"}]
3390
+ }
3391
+ }])
3392
+ },
3393
+ "Two properties both with @reverse": {
3394
+ input: %({
3395
+ "@context": {
3396
+ "fooOf": {"@reverse": "ex:foo", "@type": "@id"},
3397
+ "barOf": {"@reverse": "ex:bar", "@type": "@id"}
3398
+ },
3399
+ "@id": "ex:s",
3400
+ "fooOf": "ex:o1",
3401
+ "barOf": "ex:o2"
3402
+ }),
3403
+ output: %([{
3404
+ "@id": "ex:s",
3405
+ "@reverse": {
3406
+ "ex:bar": [{"@id": "ex:o2"}],
3407
+ "ex:foo": [{"@id": "ex:o1"}]
3408
+ }
3409
+ }])
3410
+ },
3374
3411
  }.each do |title, params|
3375
3412
  it(title) {run_expand params}
3376
3413
  end
@@ -3388,6 +3425,36 @@ describe JSON::LD::API do
3388
3425
  }),
3389
3426
  exception: JSON::LD::JsonLdError::InvalidIdValue
3390
3427
  },
3428
+ "node object with @annotation property is ignored without rdfstar option": {
3429
+ input: %({
3430
+ "@id": "ex:bob",
3431
+ "ex:knows": {
3432
+ "@id": "ex:fred",
3433
+ "@annotation": {
3434
+ "ex:certainty": 0.8
3435
+ }
3436
+ }
3437
+ }),
3438
+ output: %([{
3439
+ "@id": "ex:bob",
3440
+ "ex:knows": [{"@id": "ex:fred"}]
3441
+ }])
3442
+ },
3443
+ "value object with @annotation property is ignored without rdfstar option": {
3444
+ input: %({
3445
+ "@id": "ex:bob",
3446
+ "ex:age": {
3447
+ "@value": 23,
3448
+ "@annotation": {
3449
+ "ex:certainty": 0.8
3450
+ }
3451
+ }
3452
+ }),
3453
+ output: %([{
3454
+ "@id": "ex:bob",
3455
+ "ex:age": [{"@value": 23}]
3456
+ }])
3457
+ },
3391
3458
  }.each do |title, params|
3392
3459
  it(title) {run_expand params}
3393
3460
  end
@@ -3569,7 +3636,7 @@ describe JSON::LD::API do
3569
3636
  }]
3570
3637
  }])
3571
3638
  },
3572
- "illegal node with embedded object having properties": {
3639
+ "node with embedded object having properties": {
3573
3640
  input: %({
3574
3641
  "@id": "ex:subj",
3575
3642
  "ex:value": {
@@ -3619,6 +3686,322 @@ describe JSON::LD::API do
3619
3686
  }]
3620
3687
  }])
3621
3688
  },
3689
+ "node with @annotation property on value object": {
3690
+ input: %({
3691
+ "@id": "ex:bob",
3692
+ "ex:age": {
3693
+ "@value": 23,
3694
+ "@annotation": {"ex:certainty": 0.8}
3695
+ }
3696
+ }),
3697
+ output: %([{
3698
+ "@id": "ex:bob",
3699
+ "ex:age": [{
3700
+ "@value": 23,
3701
+ "@annotation": [{"ex:certainty": [{"@value": 0.8}]}]
3702
+ }]
3703
+ }])
3704
+ },
3705
+ "node with @annotation property on node object": {
3706
+ input: %({
3707
+ "@id": "ex:bob",
3708
+ "ex:name": "Bob",
3709
+ "ex:knows": {
3710
+ "@id": "ex:fred",
3711
+ "ex:name": "Fred",
3712
+ "@annotation": {"ex:certainty": 0.8}
3713
+ }
3714
+ }),
3715
+ output: %([{
3716
+ "@id": "ex:bob",
3717
+ "ex:name": [{"@value": "Bob"}],
3718
+ "ex:knows": [{
3719
+ "@id": "ex:fred",
3720
+ "ex:name": [{"@value": "Fred"}],
3721
+ "@annotation": [{"ex:certainty": [{"@value": 0.8}]}]
3722
+ }]
3723
+ }])
3724
+ },
3725
+ "node with @annotation property multiple values": {
3726
+ input: %({
3727
+ "@id": "ex:bob",
3728
+ "ex:name": "Bob",
3729
+ "ex:knows": {
3730
+ "@id": "ex:fred",
3731
+ "ex:name": "Fred",
3732
+ "@annotation": [{
3733
+ "ex:certainty": 0.8
3734
+ }, {
3735
+ "ex:source": {"@id": "http://example.org/"}
3736
+ }]
3737
+ }
3738
+ }),
3739
+ output: %([{
3740
+ "@id": "ex:bob",
3741
+ "ex:name": [{"@value": "Bob"}],
3742
+ "ex:knows": [{
3743
+ "@id": "ex:fred",
3744
+ "ex:name": [{"@value": "Fred"}],
3745
+ "@annotation": [{
3746
+ "ex:certainty": [{"@value": 0.8}]
3747
+ }, {
3748
+ "ex:source": [{"@id": "http://example.org/"}]
3749
+ }]
3750
+ }]
3751
+ }])
3752
+ },
3753
+ "node with @annotation property that is on the top-level is invalid": {
3754
+ input: %({
3755
+ "@id": "ex:bob",
3756
+ "ex:name": "Bob",
3757
+ "@annotation": {"ex:prop": "value2"}
3758
+ }),
3759
+ exception: JSON::LD::JsonLdError::InvalidAnnotation
3760
+ },
3761
+ "node with @annotation property on a top-level graph node is invalid": {
3762
+ input: %({
3763
+ "@id": "ex:bob",
3764
+ "ex:name": "Bob",
3765
+ "@graph": {
3766
+ "@id": "ex:fred",
3767
+ "ex:name": "Fred",
3768
+ "@annotation": {"ex:prop": "value2"}
3769
+ }
3770
+ }),
3771
+ exception: JSON::LD::JsonLdError::InvalidAnnotation
3772
+ },
3773
+ "node with @annotation property having @id is invalid": {
3774
+ input: %({
3775
+ "@id": "ex:bob",
3776
+ "ex:knows": {
3777
+ "@id": "ex:fred",
3778
+ "@annotation": {
3779
+ "@id": "ex:invalid-ann-id",
3780
+ "ex:prop": "value2"
3781
+ }
3782
+ }
3783
+ }),
3784
+ exception: JSON::LD::JsonLdError::InvalidAnnotation
3785
+ },
3786
+ "node with @annotation property with value object value is invalid": {
3787
+ input: %({
3788
+ "@id": "ex:bob",
3789
+ "ex:knows": {
3790
+ "@id": "fred",
3791
+ "@annotation": "value2"
3792
+ }
3793
+ }),
3794
+ exception: JSON::LD::JsonLdError::InvalidAnnotation
3795
+ },
3796
+ "node with @annotation on a list": {
3797
+ input: %({
3798
+ "@id": "ex:bob",
3799
+ "ex:knows": {
3800
+ "@list": [{"@id": "ex:fred"}],
3801
+ "@annotation": {"ex:prop": "value2"}
3802
+ }
3803
+ }),
3804
+ exception: JSON::LD::JsonLdError::InvalidSetOrListObject
3805
+ },
3806
+ "node with @annotation on a list value": {
3807
+ input: %({
3808
+ "@id": "ex:bob",
3809
+ "ex:knows": {
3810
+ "@list": [
3811
+ {
3812
+ "@id": "ex:fred",
3813
+ "@annotation": {"ex:prop": "value2"}
3814
+ }
3815
+ ]
3816
+ }
3817
+ }),
3818
+ exception: JSON::LD::JsonLdError::InvalidAnnotation
3819
+ },
3820
+ "node with @annotation property on a top-level @included node is invalid": {
3821
+ input: %({
3822
+ "@id": "ex:bob",
3823
+ "ex:name": "Bob",
3824
+ "@included": [{
3825
+ "@id": "ex:fred",
3826
+ "ex:name": "Fred",
3827
+ "@annotation": {"ex:prop": "value2"}
3828
+ }]
3829
+ }),
3830
+ exception: JSON::LD::JsonLdError::InvalidAnnotation
3831
+ },
3832
+ "node with @annotation property on embedded subject": {
3833
+ input: %({
3834
+ "@id": {
3835
+ "@id": "ex:rei",
3836
+ "ex:prop": {"@id": "_:value"}
3837
+ },
3838
+ "ex:prop": {
3839
+ "@value": "value2",
3840
+ "@annotation": {"ex:certainty": 0.8}
3841
+ }
3842
+ }),
3843
+ output: %([{
3844
+ "@id": {
3845
+ "@id": "ex:rei",
3846
+ "ex:prop": [{"@id": "_:value"}]
3847
+ },
3848
+ "ex:prop": [{
3849
+ "@value": "value2",
3850
+ "@annotation": [{
3851
+ "ex:certainty": [{"@value": 0.8}]
3852
+ }]
3853
+ }]
3854
+ }])
3855
+ },
3856
+ "node with @annotation property on embedded object": {
3857
+ input: %({
3858
+ "@id": "ex:subj",
3859
+ "ex:value": {
3860
+ "@id": {
3861
+ "@id": "ex:rei",
3862
+ "ex:prop": "value"
3863
+ },
3864
+ "@annotation": {"ex:certainty": 0.8}
3865
+ }
3866
+ }),
3867
+ output: %([{
3868
+ "@id": "ex:subj",
3869
+ "ex:value": [{
3870
+ "@id": {
3871
+ "@id": "ex:rei",
3872
+ "ex:prop": [{"@value": "value"}]
3873
+ },
3874
+ "@annotation": [{
3875
+ "ex:certainty": [{"@value": 0.8}]
3876
+ }]
3877
+ }]
3878
+ }])
3879
+ },
3880
+ "embedded node with reverse relationship": {
3881
+ input: %({
3882
+ "@context": {
3883
+ "rel": {"@reverse": "ex:rel"}
3884
+ },
3885
+ "@id": {
3886
+ "@id": "ex:rei",
3887
+ "rel": {"@id": "ex:value"}
3888
+ },
3889
+ "ex:prop": "value2"
3890
+ }),
3891
+ exception: JSON::LD::JsonLdError::InvalidEmbeddedNode
3892
+ },
3893
+ "embedded node with expanded reverse relationship": {
3894
+ input: %({
3895
+ "@id": {
3896
+ "@id": "ex:rei",
3897
+ "@reverse": {
3898
+ "ex:rel": {"@id": "ex:value"}
3899
+ }
3900
+ },
3901
+ "ex:prop": "value2"
3902
+ }),
3903
+ exception: JSON::LD::JsonLdError::InvalidEmbeddedNode
3904
+ },
3905
+ "embedded node used as subject in reverse relationship": {
3906
+ input: %({
3907
+ "@context": {
3908
+ "rel": {"@reverse": "ex:rel"}
3909
+ },
3910
+ "@id": {
3911
+ "@id": "ex:rei",
3912
+ "ex:prop": {"@id": "ex:value"}
3913
+ },
3914
+ "rel": {"@id": "ex:value2"}
3915
+ }),
3916
+ output: %([{
3917
+ "@id": {
3918
+ "@id": "ex:rei",
3919
+ "ex:prop": [{"@id": "ex:value"}]
3920
+ },
3921
+ "@reverse": {
3922
+ "ex:rel": [{"@id": "ex:value2"}]
3923
+ }
3924
+ }])
3925
+ },
3926
+ "embedded node used as object in reverse relationship": {
3927
+ input: %({
3928
+ "@context": {
3929
+ "rel": {"@reverse": "ex:rel"}
3930
+ },
3931
+ "@id": "ex:subj",
3932
+ "rel": {
3933
+ "@id": {
3934
+ "@id": "ex:rei",
3935
+ "ex:prop": {"@id": "ex:value"}
3936
+ },
3937
+ "ex:prop": {"@id": "ex:value2"}
3938
+ }
3939
+ }),
3940
+ output: %([{
3941
+ "@id": "ex:subj",
3942
+ "@reverse": {
3943
+ "ex:rel": [{
3944
+ "@id": {
3945
+ "@id": "ex:rei",
3946
+ "ex:prop": [{"@id": "ex:value"}]
3947
+ },
3948
+ "ex:prop": [{"@id": "ex:value2"}]
3949
+ }]
3950
+ }
3951
+ }])
3952
+ },
3953
+ "node with @annotation property on node object with reverse relationship": {
3954
+ input: %({
3955
+ "@context": {
3956
+ "knownBy": {"@reverse": "ex:knows"}
3957
+ },
3958
+ "@id": "ex:bob",
3959
+ "ex:name": "Bob",
3960
+ "knownBy": {
3961
+ "@id": "ex:fred",
3962
+ "ex:name": "Fred",
3963
+ "@annotation": {"ex:certainty": 0.8}
3964
+ }
3965
+ }),
3966
+ output: %([{
3967
+ "@id": "ex:bob",
3968
+ "ex:name": [{"@value": "Bob"}],
3969
+ "@reverse": {
3970
+ "ex:knows": [{
3971
+ "@id": "ex:fred",
3972
+ "ex:name": [{"@value": "Fred"}],
3973
+ "@annotation": [{"ex:certainty": [{"@value": 0.8}]}]
3974
+ }]
3975
+ }
3976
+ }])
3977
+ },
3978
+ "reverse relationship inside annotation": {
3979
+ input: %({
3980
+ "@context": {
3981
+ "claims": {"@reverse": "ex:claims", "@type": "@id"}
3982
+ },
3983
+ "@id": "ex:bob",
3984
+ "ex:knows": {
3985
+ "@id": "ex:jane",
3986
+ "@annotation": {
3987
+ "ex:certainty": 0.8,
3988
+ "claims": "ex:sue"
3989
+ }
3990
+ }
3991
+ }),
3992
+ output: %([{
3993
+ "@id": "ex:bob",
3994
+ "ex:knows": [{
3995
+ "@id": "ex:jane",
3996
+ "@annotation": [{
3997
+ "ex:certainty": [{"@value": 0.8}],
3998
+ "@reverse": {
3999
+ "ex:claims": [{"@id": "ex:sue"}]
4000
+ }
4001
+ }]
4002
+ }]
4003
+ }])
4004
+ },
3622
4005
  }.each do |title, params|
3623
4006
  it(title) {run_expand params.merge(rdfstar: true)}
3624
4007
  end