solis 0.73.0 → 0.75.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a91e5038f9e0a152b51ad35d25c6bdd99ef383bfb0da8fb7baf1d08baddbf49a
4
- data.tar.gz: b4b1a434aae6a337358815e8b0dc5ff37edea7e0ffb56d85a9d7d1590677ea92
3
+ metadata.gz: d927fa3a6e648f3d4359df7bc05f60d3ac2cdd62e36ae8a3c1bd7b9845c6c13c
4
+ data.tar.gz: 92475ada9028fa045fe7f8f5b07a9ccd8b03db2ecb81f67a978dbecdd6eef714
5
5
  SHA512:
6
- metadata.gz: 35f713d36e731ac83203fec6f3d82bd6ad5f321c68ccf1424fd8f0c6b82183392e2c76d62cdd7eac6542318810c62940d9a4e1badb5dd817177509bf65753c9e
7
- data.tar.gz: 5a9efc223d46e01936aed52e649e856344c7847307f6a39d7b094b48d2b553542a8059ce846bd483634cfb7046f9ab9646ed2130bab81de5c196b43af48b95c2
6
+ metadata.gz: cb0e60d9e4d347e488bac8429e6c1481ad3344cdf1acc5170da37079d82cdc5a1e412ca28b648edaf4db642d6481a3fa07afb45bb176688cbef142b32c9d96b3
7
+ data.tar.gz: 8fab47cd98128888ed69e3c1af21df1a19bc2872dc05be70fd23a66fc25b2738b344353b28ebce4e7a7d26fb81647d1bc8b0e61ad5bd70fbfaa633fe7d45e57c
data/lib/solis/graph.rb CHANGED
@@ -351,7 +351,7 @@ module Solis
351
351
 
352
352
  @sparql_client = SPARQL::Client.new(@sparql_endpoint)
353
353
  result = @sparql_client.query("with <#{graph_name}> delete {?s ?p ?o} where{?s ?p ?o}")
354
- LOGGER.info(result.first.to_a.first.last.value)
354
+ LOGGER.info(result)
355
355
  true
356
356
  end
357
357
 
data/lib/solis/model.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'securerandom'
2
2
  require 'iso8601'
3
+ require 'hashdiff'
3
4
  require_relative 'query'
4
5
 
5
6
  module Solis
@@ -130,7 +131,7 @@ values ?s {<#{self.graph_id}>}
130
131
  result
131
132
  end
132
133
 
133
- def save(validate_dependencies = true)
134
+ def save(validate_dependencies = true, top_level = true)
134
135
  raise "I need a SPARQL endpoint" if self.class.sparql_endpoint.nil?
135
136
  sparql = SPARQL::Client.new(self.class.sparql_endpoint)
136
137
 
@@ -141,6 +142,29 @@ values ?s {<#{self.graph_id}>}
141
142
 
142
143
  result = update(data)
143
144
  else
145
+ data = properties_to_hash(self)
146
+ attributes = data.include?('attributes') ? data['attributes'] : data
147
+ attributes.each_pair do |key, value| # check each key. if it is an entity process it
148
+ unless self.class.metadata[:attributes][key][:node].nil? #is it an entity
149
+ value = [value] unless value.is_a?(Array)
150
+ value.each do |sub_value|
151
+ embedded = self.class.graph.shape_as_model(self.class.metadata[:attributes][key][:datatype].to_s).new(sub_value)
152
+ embedded_readonly_entities = Solis::Options.instance.get[:embedded_readonly].map{|s| s.to_s} || []
153
+
154
+ if (embedded.class.ancestors.map{|s| s.to_s} & embedded_readonly_entities).empty? || top_level
155
+ if embedded.exists?(sparql)
156
+ embedded_data = properties_to_hash(embedded)
157
+ embedded.update(embedded_data, validate_dependencies, false)
158
+ else
159
+ embedded.save(validate_dependencies, false)
160
+ end
161
+ else
162
+ Solis::LOGGER.info("#{embedded.class.name} is embedded not allowed to change. Skipping")
163
+ end
164
+ end
165
+ end
166
+ end
167
+
144
168
  graph = as_graph(self, validate_dependencies)
145
169
 
146
170
  # File.open('/Users/mehmetc/Dropbox/AllSources/LP/graphiti-api/save.ttl', 'wb') do |file|
@@ -159,7 +183,7 @@ values ?s {<#{self.graph_id}>}
159
183
  raise e
160
184
  end
161
185
 
162
- def update(data, validate_dependencies = true)
186
+ def update(data, validate_dependencies = true, top_level = true)
163
187
  raise Solis::Error::GeneralError, "I need a SPARQL endpoint" if self.class.sparql_endpoint.nil?
164
188
 
165
189
  attributes = data.include?('attributes') ? data['attributes'] : data
@@ -173,100 +197,36 @@ values ?s {<#{self.graph_id}>}
173
197
  raise Solis::Error::NotFoundError if original_klass.nil?
174
198
  updated_klass = original_klass.deep_dup
175
199
 
176
- attributes.each_pair do |key, value|
177
- if value.is_a?(Hash)
178
- embedded = self.class.graph.shape_as_model(original_klass.class.metadata[:attributes][key][:datatype].to_s).new(value)
179
- if embedded.exists?(sparql)
180
- embedded_data = properties_to_hash(embedded)
181
- embedded.update(embedded_data)
182
- else
183
- embedded.save
200
+ attributes.each_pair do |key, value| # check each key. if it is an entity process it
201
+ unless original_klass.class.metadata[:attributes][key][:node].nil? #it is an entity
202
+ value = [value] unless value.is_a?(Array)
203
+ value.each do |sub_value|
204
+ embedded = self.class.graph.shape_as_model(original_klass.class.metadata[:attributes][key][:datatype].to_s).new(sub_value)
205
+
206
+ embedded_readonly_entities = Solis::Options.instance.get[:embedded_readonly].map{|s| s.to_s} || []
207
+
208
+ if (embedded.class.ancestors.map{|s| s.to_s} & embedded_readonly_entities).empty? || top_level
209
+ if embedded.exists?(sparql)
210
+ embedded_data = properties_to_hash(embedded)
211
+ embedded.update(embedded_data, validate_dependencies, false)
212
+ else
213
+ embedded.save(validate_dependencies, false)
214
+ end
215
+ else
216
+ Solis::LOGGER.info("#{embedded.class.name} is embedded not allowed to change. Skipping")
217
+ end
184
218
  end
185
219
  end
186
220
 
187
221
  updated_klass.instance_variable_set("@#{key}", value)
188
222
  end
189
223
 
190
- # attributes.each_pair do |key, value|
191
- # updated_klass.instance_variable_set("@#{key}", value)
192
- # end
193
- # properties_original_klass=Model.properties_to_hash(original_klass)
194
- # properties_updated_klass = Model.properties_to_hash(updated_klass)
195
- # changes = Hashdiff.diff(properties_original_klass, properties_updated_klass)
196
- # pp changes
197
- #
198
- # #a=self.class.graph.shape_as_model('Identificatienummer').new
199
- # changes.each do |change|
200
- # change_type = change[0]
201
- # original_change_entity = change[1]
202
- # change_entity = original_change_entity.split('.').last
203
- # change[1] = change_object
204
- # data = change[2]
205
- #
206
- # case change_type
207
- # when '+' # new
208
- # new_entity_hash = {} #self.class.graph.shape_as_model(change_object.classify).new
209
- # Hashdiff.patch!(new_entity_hash, [change])
210
- #
211
- # new_entity = self.class.graph.shape_as_model(change_entity.classify).new(new_entity_hash[change_entity])
212
- # new_entity.save
213
- # when '-' # delete
214
- # when '~' # change
215
- # else
216
- # raise RuntimeError, "Unknown change type(#{change_type}) for #{change[1]}"
217
- # end
218
- #
219
- # end
220
-
221
- # attributes.each_pair do |key, value|
222
- # updated_klass.instance_variable_set("@#{key}", value)
223
- # unless original_klass.class.metadata[:attributes][key][:node_kind].nil?
224
- # inner_model = self.class.graph.shape_as_model(original_klass.class.metadata[:attributes][key][:datatype].to_s)
225
- # if value.is_a?(Hash)
226
- # value.each_pair do |inner_key, inner_value|
227
- # next unless inner_model.metadata[:attributes][inner_key][:node_kind].is_a?(RDF::URI)
228
- # inner_inner_model = self.class.graph.shape_as_model(inner_model.metadata[:attributes][inner_key][:datatype].to_s)
229
- # # if inner_inner_model.class.ancestors.include?(Codetabel) && inner_value.key?('id')
230
- # # inner_data = inner_inner_model.query.filter({ language: nil, filters: { id: [inner_value['id']] } }).find_all.map { |m| m }&.first
231
- # # else
232
- # inner_value = inner_value.first if inner_value.is_a?(Array)
233
- # inner_data = inner_inner_model.new(inner_value)
234
- # inner_data.save
235
- # # end
236
- # end
237
- # elsif value.is_a?(Array)
238
- # data = value.map do |m|
239
- # if m.is_a?(Hash)
240
- # m.each do |inner_key, inner_value|
241
- # #next if inner_model.metadata[:attributes][inner_key][:class].nil?
242
- # next unless inner_model.metadata[:attributes][inner_key][:node_kind].is_a?(RDF::URI)
243
- # inner_inner_model = self.class.graph.shape_as_model(inner_model.class.metadata[:attributes][inner_key][:datatype].to_s)
244
- # # if inner_inner_model.class.ancestors.include?(Codetabel) && inner_value.key?('id')
245
- # # inner_data = inner_inner_model.query.filter({ language: nil, filters: { id: [inner_value['id']] } }).find_all.map { |m| m }&.first
246
- # # else
247
- # inner_value = inner_value.first if inner_value.is_a?(Array)
248
- # inner_data = inner_inner_model.new(inner_value)
249
- # inner_data.save
250
- # # end
251
- #
252
- # inner_data
253
- # end
254
- # else
255
- # m
256
- # end
257
- # end
258
- # elsif value.is_a?(Object)
259
- # value.save
260
- # end
261
- # end
262
- # end
263
-
264
224
  before_update_proc&.call(original_klass, updated_klass)
265
225
 
266
226
  properties_orignal_klass = properties_to_hash(original_klass)
267
- properties_updated_klsss = properties_to_hash(updated_klass)
227
+ properties_updated_klass = properties_to_hash(updated_klass)
268
228
 
269
- if Hashdiff.best_diff(properties_orignal_klass, properties_updated_klsss).empty?
229
+ if Hashdiff.best_diff(properties_orignal_klass, properties_updated_klass).empty?
270
230
  Solis::LOGGER.info("#{original_klass.class.name} unchanged, skipping")
271
231
  data = self.query.filter({ filters: { id: [id] } }).find_all.map { |m| m }&.first
272
232
  else
@@ -330,9 +290,17 @@ values ?s {<#{self.graph_id}>}
330
290
  end
331
291
 
332
292
  def self.make_id_for(model)
293
+ raise "I need a SPARQL endpoint" if self.sparql_endpoint.nil?
294
+ sparql = SPARQL::Client.new(self.sparql_endpoint)
333
295
  id = model.instance_variable_get("@id")
334
296
  if id.nil? || (id.is_a?(String) && id&.empty?)
335
- id = SecureRandom.uuid
297
+ id_retries = 0
298
+
299
+ while id.nil? || sparql.query("ASK WHERE { ?s <#{self.graph_name}/id> \"#{id}\" }")
300
+ id = SecureRandom.uuid
301
+ id_retries+=1
302
+ end
303
+ LOGGER.info("ID(#{id}) generated for #{self.name} in #{id_retries} retries") if ConfigFile[:debug]
336
304
  model.instance_variable_set("@id", id)
337
305
  end
338
306
  model
data/lib/solis/query.rb CHANGED
@@ -191,11 +191,11 @@ order by ?s
191
191
  from_cache = Graphiti.context[:object]&.from_cache || '0'
192
192
  if @query_cache.key?(query_key) && from_cache.eql?('1')
193
193
  result = @query_cache[query_key]
194
- Solis::LOGGER.info("CACHE: from #{query_key}")# if ConfigFile[:debug]
194
+ Solis::LOGGER.info("CACHE: from #{query_key}") if ConfigFile[:debug]
195
195
  else
196
196
  result = graph_to_object(sparql_client.query(query))
197
197
  @query_cache[query_key] = result unless result.nil? || result.empty?
198
- Solis::LOGGER.info("CACHE: to #{query_key}")# if ConfigFile[:debug]
198
+ Solis::LOGGER.info("CACHE: to #{query_key}") if ConfigFile[:debug]
199
199
  end
200
200
 
201
201
  result
data/lib/solis/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Solis
2
- VERSION = "0.73.0"
2
+ VERSION = "0.75.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.73.0
4
+ version: 0.75.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mehmet Celik
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-03-11 00:00:00.000000000 Z
11
+ date: 2024-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport