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 +4 -4
- data/lib/solis/model.rb +39 -15
- data/lib/solis/shape/reader/sheet.rb +14 -4
- data/lib/solis/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 848141bb6e9f81fea57188c0a10cc3cf86b656a137e5f5a2a665a835af2ef6f5
|
|
4
|
+
data.tar.gz: 49505d5ce710f03daa6b14f2488df1c3d0ff8e2e24301b17940aa5d60aed67d1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
|
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
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
|
|
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
|
|
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[:
|
|
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
|
-
|
|
458
|
-
|
|
459
|
-
|
|
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