solis 0.99.0 → 0.100.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: 9c57f5cfabe93ada0f5aa3c008ecafa1b130147dfc7ca5b77930362a330a3457
4
- data.tar.gz: 7b9854033bb6e4677bde52c4557705f4f48adffe2e0988af33600890c4615984
3
+ metadata.gz: 848141bb6e9f81fea57188c0a10cc3cf86b656a137e5f5a2a665a835af2ef6f5
4
+ data.tar.gz: 49505d5ce710f03daa6b14f2488df1c3d0ff8e2e24301b17940aa5d60aed67d1
5
5
  SHA512:
6
- metadata.gz: 6f527bc987723ee900f250c8361a7570df65e3f6238c8ccc560c65097f94e0941a43540222e35e26196f4a70ed94d193040d55f0b2455f38f8ea2b2c39466e2f
7
- data.tar.gz: 404047145bf332a80ee0bee495640071137682f009a1a17de7e21b8d531a2b3cf57aec7c704a423366f778c2cc2259267ed1e67f638fc092c38858c611f72a81
6
+ metadata.gz: 16c1286a2b9046f5c267b2e59d9d2d293fd3919e5792a867d174d6385fbfe522bdc4b306e96af244ff4493f21727ce09f71c6c98015cac3ab2f1206cf1543771
7
+ data.tar.gz: 6e02c4c9c3511271295f010579f76c758c9c590fae999c01ac262615a6fb21384aa2b73bc7e719be61563faec7a080b5f2a95be3a857e156cb2be9400c96c5ff
data/lib/solis/model.rb CHANGED
@@ -145,22 +145,28 @@ values ?s {<#{self.graph_id}>}
145
145
  else
146
146
  data = properties_to_hash(self)
147
147
  attributes = data.include?('attributes') ? data['attributes'] : data
148
+ readonly_list = (Solis::Options.instance.get[:embedded_readonly] || []).map(&:to_s)
149
+
148
150
  attributes.each_pair do |key, value|
149
151
  unless self.class.metadata[:attributes][key][:node].nil?
150
152
  value = [value] unless value.is_a?(Array)
151
153
  value.each do |sub_value|
152
154
  embedded = self.class.graph.shape_as_model(self.class.metadata[:attributes][key][:datatype].to_s).new(sub_value)
153
- embedded_readonly_entities = Solis::Options.instance.get[:embedded_readonly].map{|s| s.to_s} || []
154
155
 
155
- if (embedded.class.ancestors.map{|s| s.to_s} & embedded_readonly_entities).empty? || top_level
156
+ if readonly_entity?(embedded, readonly_list)
157
+ # Readonly entities (code tables) should never be modified
158
+ # Only verify they exist, do not create or update them
159
+ unless embedded.exists?(sparql)
160
+ Solis::LOGGER.warn("#{embedded.class.name} (id: #{embedded.id}) is readonly but does not exist in database. Skipping.")
161
+ end
162
+ else
163
+ # Non-readonly entities can be created or updated
156
164
  if embedded.exists?(sparql)
157
165
  embedded_data = properties_to_hash(embedded)
158
166
  embedded.update(embedded_data, validate_dependencies, false)
159
167
  else
160
168
  embedded.save(validate_dependencies, false)
161
169
  end
162
- else
163
- Solis::LOGGER.info("#{embedded.class.name} is embedded not allowed to change. Skipping")
164
170
  end
165
171
  end
166
172
  end
@@ -193,6 +199,9 @@ values ?s {<#{self.graph_id}>}
193
199
  raise Solis::Error::NotFoundError if original_klass.nil?
194
200
  updated_klass = original_klass.deep_dup
195
201
 
202
+ # Cache readonly entities list once
203
+ readonly_list = (Solis::Options.instance.get[:embedded_readonly] || []).map(&:to_s)
204
+
196
205
  # Track entities to potentially delete
197
206
  entities_to_check_for_deletion = {}
198
207
 
@@ -216,9 +225,16 @@ values ?s {<#{self.graph_id}>}
216
225
  embedded = self.class.graph.shape_as_model(original_klass.class.metadata[:attributes][key][:datatype].to_s).new(sub_value)
217
226
  new_ids << embedded.id if embedded.id
218
227
 
219
- embedded_readonly_entities = Solis::Options.instance.get[:embedded_readonly].map{|s| s.to_s} || []
220
-
221
- if (embedded.class.ancestors.map{|s| s.to_s} & embedded_readonly_entities).empty? || top_level
228
+ if readonly_entity?(embedded, readonly_list)
229
+ # Readonly entities (code tables) should never be modified
230
+ # Only verify they exist, do not create or update them
231
+ if embedded.exists?(sparql)
232
+ new_embedded_values << embedded
233
+ else
234
+ Solis::LOGGER.warn("#{embedded.class.name} (id: #{embedded.id}) is readonly but does not exist in database. Skipping.")
235
+ end
236
+ else
237
+ # Non-readonly entities can be created or updated
222
238
  if embedded.exists?(sparql)
223
239
  embedded_data = properties_to_hash(embedded)
224
240
  embedded.update(embedded_data, validate_dependencies, false)
@@ -227,13 +243,11 @@ values ?s {<#{self.graph_id}>}
227
243
  embedded_value = embedded.save(validate_dependencies, false)
228
244
  new_embedded_values << embedded_value
229
245
  end
230
- else
231
- Solis::LOGGER.info("#{embedded.class.name} is embedded not allowed to change. Skipping")
232
- new_embedded_values << embedded
233
246
  end
234
247
  end
235
248
 
236
249
  # Identify orphaned entities (in original but not in new)
250
+ # Note: Readonly entities will be filtered out in delete_orphaned_entities
237
251
  orphaned_ids = original_ids - new_ids
238
252
  unless orphaned_ids.empty?
239
253
  orphaned_entities = original_embedded.select { |e| solis_model?(e) && orphaned_ids.include?(e.id) }
@@ -289,11 +303,11 @@ values ?s {<#{self.graph_id}>}
289
303
 
290
304
  data
291
305
  rescue StandardError => e
292
- original_graph = as_graph(original_klass, false)
306
+ original_graph = as_graph(original_klass, false) if defined?(original_klass) && original_klass
293
307
  Solis::LOGGER.error(e.message)
294
- Solis::LOGGER.error original_graph.dump(:ttl)
308
+ Solis::LOGGER.error original_graph.dump(:ttl) if defined?(original_graph) && original_graph
295
309
  Solis::LOGGER.error delete_insert_query if defined?(delete_insert_query)
296
- sparql.insert_data(original_graph, graph: original_graph.name)
310
+ sparql.insert_data(original_graph, graph: original_graph.name) if defined?(original_graph) && original_graph && defined?(sparql) && sparql
297
311
 
298
312
  raise e
299
313
  end
@@ -467,6 +481,12 @@ values ?s {<#{self.graph_id}>}
467
481
  obj.class.ancestors.include?(Solis::Model)
468
482
  end
469
483
 
484
+ # Helper method to check if an entity is readonly (code table)
485
+ def readonly_entity?(entity, readonly_list = nil)
486
+ readonly_list ||= (Solis::Options.instance.get[:embedded_readonly] || []).map(&:to_s)
487
+ (entity.class.ancestors.map(&:to_s) & readonly_list).any?
488
+ end
489
+
470
490
  # Helper method to get tableized class name
471
491
  def tableized_class_name(obj)
472
492
  obj.class.name.tableize
@@ -486,14 +506,18 @@ values ?s {<#{self.graph_id}>}
486
506
 
487
507
  # Delete orphaned entities that are no longer referenced
488
508
  def delete_orphaned_entities(entities_to_check, sparql)
489
- embedded_readonly_entities = Solis::Options.instance.get[:embedded_readonly].map{|s| s.to_s} || []
509
+ return if entities_to_check.nil? || entities_to_check.empty?
510
+
511
+ readonly_list = (Solis::Options.instance.get[:embedded_readonly] || []).map(&:to_s)
490
512
 
491
513
  entities_to_check.each do |key, orphaned_entities|
514
+ next if orphaned_entities.nil?
515
+
492
516
  orphaned_entities.each do |orphaned_entity|
493
517
  next unless solis_model?(orphaned_entity)
494
518
 
495
519
  # Skip if it's a readonly entity (like code tables)
496
- if (orphaned_entity.class.ancestors.map{|s| s.to_s} & embedded_readonly_entities).any?
520
+ if readonly_entity?(orphaned_entity, readonly_list)
497
521
  Solis::LOGGER.info("#{orphaned_entity.class.name} (id: #{orphaned_entity.id}) is in embedded_readonly list. Skipping deletion.")
498
522
  next
499
523
  end
@@ -289,7 +289,7 @@ hide empty members
289
289
  graph_prefix = data[:ontologies][:base][:prefix]
290
290
  graph_name = data[:ontologies][:base][:uri]
291
291
 
292
- description = metadata[:comment]
292
+ description = metadata[:description]
293
293
  label = metadata[:label]
294
294
  target_class = "#{graph_prefix}:#{entity_name}"
295
295
  node = metadata[:sub_class_of]
@@ -454,9 +454,19 @@ hide empty members
454
454
 
455
455
  datas.each do |data|
456
456
  data[:entities].select { |_k, v| !v[:same_as].empty? }.each do |k, v|
457
- prefix, verb = v[:same_as].split(':')
458
- rdf_vocabulary = RDF::Vocabulary.from_sym(prefix.upcase)
459
- rdf_verb = rdf_vocabulary[verb.to_sym]
457
+ same_as_value = v[:same_as].strip
458
+
459
+ if same_as_value.start_with?('<') && same_as_value.end_with?('>')
460
+ # Full URI format: <http://xmlns.com/foaf/0.1/Person>
461
+ uri_string = same_as_value[1...-1]
462
+ rdf_verb = RDF::URI(uri_string)
463
+ else
464
+ # Prefixed name format: foaf:Person
465
+ prefix, verb = same_as_value.split(':')
466
+ rdf_vocabulary = RDF::Vocabulary.from_sym(prefix.upcase)
467
+ rdf_verb = rdf_vocabulary[verb.to_sym]
468
+ end
469
+
460
470
  graph << RDF::Statement.new(rdf_verb, RDF::RDFV.type, RDF::OWL.Class)
461
471
  graph << RDF::Statement.new(rdf_verb, RDF::Vocab::OWL.sameAs, o[k.to_sym])
462
472
  rescue StandardError => e
data/lib/solis/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Solis
2
- VERSION = "0.99.0"
2
+ VERSION = "0.100.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.99.0
4
+ version: 0.100.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mehmet Celik