rdf-serializers 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 57bc75187cb8b34149be75b41e6be7c195c22fef
4
- data.tar.gz: 339e1701a6a8f04dfb4776bbd4cb3615765bc401
2
+ SHA256:
3
+ metadata.gz: 3a641b5b49c74bdc4479196b25f4c70e5718fabb324a703e10e4f60d07fb8574
4
+ data.tar.gz: 45be5ccf9f007536f261332f396d65a8ecf8b2f63bd5ee9878320e50433a415c
5
5
  SHA512:
6
- metadata.gz: 0526660616a11ce3d3fb062dad5c47f968123fc657f5c941fc3250c8f98f7f70197255485f9d77266143e69e7ee0ef590def34f2e17be00d6f272788e592c4ab
7
- data.tar.gz: 73f4828406d358c6596eb12ce66bb40b6030656eeb599a626c3012e8b0772abc3f8ecf386786505308c2e0ce9b8ddab1431bba2816a8e880dd2596ec0476c3ff
6
+ metadata.gz: d908f4bf5f1886890c23e9268779aa4755b3de4f2e5b1e4910f2117c21983a21fef01bc32a8af24b89942b4e1b2fc46d46d0b0481fea52831d86a8b779d42c9a
7
+ data.tar.gz: f9bdabf7f8455e09dd9ae273d565061c13f127f718cb271f9387cb442a0a5469daa4f0cda5b8058181f74d178c54ab4caae9ca6deb89f65f510a9dafae248d8f
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rubocop:disable Metrics/ClassLength
3
4
  module ActiveModelSerializers
4
5
  module Adapter
5
6
  class RDF < Base
@@ -7,7 +8,6 @@ module ActiveModelSerializers
7
8
  autoload :Relationship
8
9
 
9
10
  delegate :object, to: :serializer
10
- delegate :dump, :triples, to: :repository
11
11
 
12
12
  def initialize(serializer, options = {})
13
13
  super
@@ -16,29 +16,37 @@ module ActiveModelSerializers
16
16
  @resource_identifiers = Set.new
17
17
  end
18
18
 
19
+ def dump(*args, **options)
20
+ if include_named_graphs?(*args)
21
+ repository.dump(*args, options)
22
+ else
23
+ repository.project_graph(nil).dump(*args, options)
24
+ end
25
+ end
26
+
27
+ def triples(*args, **options)
28
+ if include_named_graphs?(*args)
29
+ repository.triples(*args, options)
30
+ else
31
+ repository.project_graph(nil).triples(*args, options)
32
+ end
33
+ end
34
+
19
35
  protected
20
36
 
21
37
  attr_reader :fieldset
22
38
 
23
39
  private
24
40
 
25
- def add_attribute(subject, predicate, value)
41
+ def add_attribute(subject, predicate, value, graph)
26
42
  return unless predicate
27
- value = value.respond_to?(:each) ? value : [value]
28
- value.compact.map { |v| add_triple(subject, predicate, v) }
29
- end
30
-
31
- def add_triple(subject, predicate, object, graph = nil)
32
- obj =
33
- case object
34
- when ::RDF::Term
35
- object
36
- when ActiveSupport::TimeWithZone
37
- ::RDF::Literal(object.to_datetime)
38
- else
39
- ::RDF::Literal(object)
40
- end
41
- @repository << ::RDF::Statement.new(subject, ::RDF::URI(predicate), obj, graph_name: graph)
43
+
44
+ normalized = value.is_a?(Array) ? value : [value]
45
+ normalized.compact.map { |v| add_triple([subject, predicate, v, graph]) }
46
+ end
47
+
48
+ def add_triple(triple)
49
+ @repository << (triple.is_a?(Array) ? normalized_triple(*triple) : triple)
42
50
  end
43
51
 
44
52
  def attributes_for(serializer, fields)
@@ -46,7 +54,8 @@ module ActiveModelSerializers
46
54
  add_attribute(
47
55
  serializer.read_attribute_for_serialization(:rdf_subject),
48
56
  serializer.class._attributes_data[key].try(:options).try(:[], :predicate),
49
- value
57
+ value,
58
+ serializer.class._attributes_data[key].try(:options).try(:[], :graph)
50
59
  )
51
60
  end
52
61
  end
@@ -54,30 +63,74 @@ module ActiveModelSerializers
54
63
  def custom_triples_for(serializer)
55
64
  serializer.class.try(:_triples)&.map do |key|
56
65
  serializer.read_attribute_for_serialization(key).each do |triple|
57
- @repository << triple
66
+ add_triple(triple)
58
67
  end
59
68
  end
60
69
  end
61
70
 
62
71
  def repository
63
72
  return @repository if @repository.present?
73
+
64
74
  @repository = ::RDF::Repository.new
65
75
 
66
76
  serializers.each { |serializer| process_resource(serializer, @include_directive) }
67
77
  serializers.each { |serializer| process_relationships(serializer, @include_directive) }
68
- instance_options[:meta]&.each { |meta| add_triple(*meta) }
78
+ instance_options[:meta]&.each { |meta| add_triple(meta) }
79
+
80
+ raise_missing_nodes if raise_on_missing_nodes?
69
81
 
70
82
  @repository
71
83
  end
72
84
 
85
+ def include_named_graphs?(*args)
86
+ ::RDF::Serializers.config.always_include_named_graphs ||
87
+ ::RDF::Writer.for(*args.presence || :nquads).instance_methods.include?(:write_quad)
88
+ end
89
+
90
+ def missing_nodes
91
+ @missing_nodes ||=
92
+ @repository
93
+ .objects
94
+ .select(&:node?)
95
+ .reject { |n| @repository.has_subject?(n) }
96
+ .map { |n| @repository.query([nil, nil, n]).first }
97
+ end
98
+
99
+ def normalized_object(object) # rubocop:disable Metrics/MethodLength
100
+ case object
101
+ when ::RDF::Term
102
+ object
103
+ when ::RDF::List
104
+ list = object.statements
105
+ @repository << object.statements
106
+ list.first.subject
107
+ when ActiveSupport::TimeWithZone
108
+ ::RDF::Literal(object.to_datetime)
109
+ else
110
+ ::RDF::Literal(object)
111
+ end
112
+ end
113
+
114
+ def normalized_triple(subject, predicate, object, graph = nil)
115
+ ::RDF::Statement.new(
116
+ subject,
117
+ ::RDF::URI(predicate),
118
+ normalized_object(object),
119
+ graph_name: graph || ::RDF::Serializers.config.default_graph
120
+ )
121
+ end
122
+
73
123
  def process_relationship(serializer, include_slice)
74
124
  return serializer.each { |s| process_relationship(s, include_slice) } if serializer.respond_to?(:each)
125
+
75
126
  return unless serializer&.object && process_resource(serializer, include_slice)
127
+
76
128
  process_relationships(serializer, include_slice)
77
129
  end
78
130
 
79
131
  def process_relationships(serializer, include_slice)
80
132
  return unless serializer.respond_to?(:associations)
133
+
81
134
  serializer.associations(include_slice).each do |association|
82
135
  process_relationship(association.lazy_association.serializer, include_slice[association.key])
83
136
  end
@@ -88,16 +141,28 @@ module ActiveModelSerializers
88
141
  return serializer.map { |child| process_resource(child, include_slice) }
89
142
  end
90
143
  return unless serializer.respond_to?(:rdf_subject) || serializer.object.respond_to?(:rdf_subject)
144
+
91
145
  return false unless @resource_identifiers.add?(serializer.read_attribute_for_serialization(:rdf_subject))
146
+
92
147
  resource_object_for(serializer, include_slice)
93
148
  true
94
149
  end
95
150
 
151
+ def raise_on_missing_nodes?
152
+ Rails.env.development? || Rails.env.test?
153
+ end
154
+
155
+ def raise_missing_nodes
156
+ return if missing_nodes.empty?
157
+
158
+ raise "The following triples point to nodes that are not included in the graph:\n#{missing_nodes.join("\n")}"
159
+ end
160
+
96
161
  def relationships_for(serializer, requested_associations, include_slice)
97
162
  include_directive = JSONAPI::IncludeDirective.new(requested_associations, allow_wildcard: true)
98
163
  serializer.associations(include_directive, include_slice).each do |association|
99
164
  Relationship.new(serializer, instance_options, association).triples.each do |triple|
100
- @repository << triple
165
+ add_triple(triple)
101
166
  end
102
167
  end
103
168
  end
@@ -106,6 +171,7 @@ module ActiveModelSerializers
106
171
  type = type_for(serializer, instance_options).to_s
107
172
  serializer.fetch(self) do
108
173
  break nil if serializer.read_attribute_for_serialization(:rdf_subject).nil?
174
+
109
175
  requested_fields = fieldset&.fields_for(type)
110
176
  attributes_for(serializer, requested_fields)
111
177
  custom_triples_for(serializer)
@@ -124,3 +190,4 @@ module ActiveModelSerializers
124
190
  end
125
191
  end
126
192
  end
193
+ # rubocop:enable Metrics/ClassLength
@@ -5,10 +5,12 @@ module ActiveModelSerializers
5
5
  class RDF
6
6
  class Relationship < JsonApi::Relationship
7
7
  def triples
8
- return [] if subject.blank? || predicate.blank? || data.empty?
8
+ return [] if no_data?
9
+
9
10
  data.map do |object|
10
11
  raise "#{object} is not a RDF::Resource but a #{object.class}" unless object.is_a?(::RDF::Resource)
11
- ::RDF::Statement.new(subject, predicate, object)
12
+
13
+ ::RDF::Statement.new(subject, predicate, object, graph_name: graph_name)
12
14
  end
13
15
  end
14
16
 
@@ -23,6 +25,14 @@ module ActiveModelSerializers
23
25
  end
24
26
  end
25
27
 
28
+ def graph_name
29
+ association.reflection.options[:graph] || ::RDF::Serializers.config.default_graph
30
+ end
31
+
32
+ def no_data?
33
+ subject.blank? || predicate.blank? || data.empty?
34
+ end
35
+
26
36
  def objects_for_many(association)
27
37
  collection_serializer = association.lazy_association.serializer
28
38
  if collection_serializer.respond_to?(:each)
@@ -2,3 +2,4 @@
2
2
 
3
3
  require 'active_model_serializers/adapter/rdf'
4
4
  require 'active_model_serializers/serializer'
5
+ require 'rdf/serializers/config'
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RDF
4
+ module Serializers
5
+ def self.configure
6
+ yield @config ||= RDF::Serializers::Configuration.new
7
+ end
8
+
9
+ def self.config
10
+ @config
11
+ end
12
+
13
+ class Configuration
14
+ include ActiveSupport::Configurable
15
+ config_accessor :always_include_named_graphs
16
+ config_accessor :default_graph
17
+ end
18
+
19
+ configure do |config|
20
+ config.always_include_named_graphs = true
21
+ end
22
+ end
23
+ end
@@ -16,7 +16,8 @@ module RDF
16
16
  symbols = [symbols] unless symbols.respond_to?(:each)
17
17
  symbols.each do |symbol|
18
18
  format = RDF::Format.for(symbol)
19
- raise "#{symbol} if not a known rdf format" if format.nil?
19
+ raise "#{symbol} is not a known rdf format" if format.nil?
20
+
20
21
  Mime::Type.register format.content_type.first, format.file_extension.first
21
22
  add_renderer(format, opts)
22
23
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RDFSerializers
4
4
  module Version
5
- VERSION = '0.0.6'
5
+ VERSION = '0.0.7'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdf-serializers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arthur Dingemans
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-11 00:00:00.000000000 Z
11
+ date: 2019-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_model_serializers
@@ -33,7 +33,7 @@ dependencies:
33
33
  version: 4.2.0
34
34
  - - "<"
35
35
  - !ruby/object:Gem::Version
36
- version: '6'
36
+ version: '7'
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: 4.2.0
44
44
  - - "<"
45
45
  - !ruby/object:Gem::Version
46
- version: '6'
46
+ version: '7'
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rdf
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -68,10 +68,12 @@ files:
68
68
  - lib/active_model_serializers/adapter/rdf/relationship.rb
69
69
  - lib/active_model_serializers/serializer.rb
70
70
  - lib/rdf/serializers.rb
71
+ - lib/rdf/serializers/config.rb
71
72
  - lib/rdf/serializers/renderers.rb
72
73
  - lib/rdf/serializers/version.rb
73
- homepage: https://github.com/argu-co/rdf-serializers
74
- licenses: []
74
+ homepage: https://github.com/ontola/rdf-serializers
75
+ licenses:
76
+ - MIT
75
77
  metadata: {}
76
78
  post_install_message:
77
79
  rdoc_options: []
@@ -88,8 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
88
90
  - !ruby/object:Gem::Version
89
91
  version: '0'
90
92
  requirements: []
91
- rubyforge_project:
92
- rubygems_version: 2.6.11
93
+ rubygems_version: 3.0.1
93
94
  signing_key:
94
95
  specification_version: 4
95
96
  summary: Adds RDF serialization, like n-triples or turtle, to active model serializers