solis 0.78.0 → 0.80.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: 424ee1c91533e6fe3238285da382f034457c338c7bbd4e8f44c9a6cb2bfffd88
4
- data.tar.gz: fbe89a99f3a7c162dba2446769127779f988163051331913cf7be44f7dd51b00
3
+ metadata.gz: 156f64ccc4d0ce04ac67bbb450634697eab5f9c35079fafbc2024afc921aae79
4
+ data.tar.gz: 9ef551b57b0322740837b2ee4feaffe80b5447e6f0d119fdf865dfda43bea24b
5
5
  SHA512:
6
- metadata.gz: 02a9645e8fa481276cfaa6320de404482be850035930d54df7c214a420746710afadd5ced2ec23bc7df3c06a1c08f47759fd641aff20cbd9e2904fc8e1bef4a5
7
- data.tar.gz: 0af8c1358122caff1c2ecd36b2994cec8730d5db6f9cf5d59db367cd76f1eb20edf154629c97788a295df8db37bbec5b8816c3e5119510220c1dae062b3ab513
6
+ metadata.gz: bf8c5a1e3ed1a80ba916aaa9868cc5965cc9cf962ecd3913e9a4a2d41417db8c5e618eb1866e1085dea71573257934a42ed8f29b9a42e3dcf6134f6b3a2d99c2
7
+ data.tar.gz: ac4c0296ffa93d3b10ed183e5fef30a2a75a712e81e07898bb71cb927a0296f6ff5043c2b33d9964a5eac2542031f2d3f5802dad4b4e0ffecdbe9b817693191f
data/lib/solis/model.rb CHANGED
@@ -210,7 +210,13 @@ values ?s {<#{self.graph_id}>}
210
210
  embedded_data = properties_to_hash(embedded)
211
211
  embedded.update(embedded_data, validate_dependencies, false)
212
212
  else
213
- value = embedded.save(validate_dependencies, false)
213
+ embedded_value = embedded.save(validate_dependencies, false)
214
+ value = updated_klass.instance_variable_get("@#{key}").deep_dup
215
+ if value.is_a?(Array)
216
+ value << embedded_value
217
+ else
218
+ value = embedded_value
219
+ end
214
220
  end
215
221
  else
216
222
  Solis::LOGGER.info("#{embedded.class.name} is embedded not allowed to change. Skipping")
@@ -64,6 +64,8 @@ class Solis::Query::Runner
64
64
  value = Date.parse(value)
65
65
  when "http://www.w3.org/2006/time#DateTimeInterval"
66
66
  value = ISO8601::TimeInterval.parse(value)
67
+ when "http://www.w3.org/2001/XMLSchema#boolean"
68
+ value = value == "true"
67
69
  end
68
70
  v = value
69
71
  end
data/lib/solis/query.rb CHANGED
@@ -128,7 +128,10 @@ module Solis
128
128
  private
129
129
 
130
130
  def model_construct?
131
- File.exist?("#{ConfigFile.path}/constructs/#{@model.name.tableize.singularize}.sparql")
131
+ construct_name = @model.name.tableize.singularize rescue @model.class.name.tableize.singularize
132
+ File.exist?("#{ConfigFile.path}/constructs/#{construct_name}.sparql")
133
+ rescue StandardError => e
134
+ false
132
135
  end
133
136
 
134
137
  def target_class
@@ -10,8 +10,16 @@ module Solis
10
10
  class Sheet
11
11
  def self.read(key, spreadsheet_id, options = {})
12
12
  class << self
13
+ def progress(i, data)
14
+ if data.key?(:job_id) && data.key?(:store)
15
+ job_id = data[:job_id]
16
+ progress = data[:store]
17
+ progress[job_id] = i
18
+ end
19
+ end
20
+
13
21
  def validate(sheets)
14
- #raise "Please make sure the sheet contains '_PREFIXES', '_METADATA', '_ENTITIES' tabs" unless (%w[_PREFIXES _METADATA _ENTITIES] - sheets.keys).length == 0
22
+ # raise "Please make sure the sheet contains '_PREFIXES', '_METADATA', '_ENTITIES' tabs" unless (%w[_PREFIXES _METADATA _ENTITIES] - sheets.keys).length == 0
15
23
 
16
24
  prefixes = sheets['_PREFIXES']
17
25
  metadata = sheets['_METADATA']
@@ -61,7 +69,7 @@ module Solis
61
69
  sheets
62
70
  end
63
71
 
64
- def process_sheet(key, sheet_id, sheets, options = {follow: true})
72
+ def process_sheet(key, sheet_id, sheets, options = { follow: true })
65
73
  entities = {}
66
74
  prefixes = {}
67
75
  ontology_metadata = {}
@@ -79,12 +87,16 @@ module Solis
79
87
  sheets['_ENTITIES'].each do |e|
80
88
 
81
89
  top_class = e['name'].to_s
82
- #if prefixes[graph_prefix][:data].nil? || prefixes[graph_prefix][:data].empty?
83
- entity_data = parse_entity_data(e['name'].to_s, graph_prefix, graph_name, sheets[top_class], { key: key, prefixes: prefixes, follow: options[:follow] })
90
+ top_sheet = sheets[top_class] || nil
91
+ # if sheets[top_class].nil? && !(e['subclassof'].nil? || e['subclassof'].empty?)
92
+ # top_sheet = sheets[e['subclassof'].split(':').last.to_s] || nil
93
+ # end
94
+ # if prefixes[graph_prefix][:data].nil? || prefixes[graph_prefix][:data].empty?
95
+ entity_data = parse_entity_data(e['name'].to_s, graph_prefix, graph_name, top_sheet, { key: key, prefixes: prefixes, follow: options[:follow] })
84
96
  # prefixes[graph_prefix][:data] = entity_data
85
- #else
97
+ # else
86
98
  # entity_data = prefixes[graph_prefix][:data]
87
- #end
99
+ # end
88
100
 
89
101
  if entity_data.empty?
90
102
  entity_data[:id] = {
@@ -190,8 +202,8 @@ module Solis
190
202
  end
191
203
 
192
204
  def build_plantuml(datas)
205
+ # !pragma layout elk
193
206
  out = %(@startuml
194
- !pragma layout elk
195
207
  skinparam classFontSize 14
196
208
  !define LIGHTORANGE
197
209
  skinparam groupInheritance 1
@@ -204,32 +216,32 @@ title #{datas.first[:metadata][:title]} - #{datas.first[:metadata][:version]} -
204
216
 
205
217
  out += "\npackage #{datas.first[:ontologies][:base][:prefix]} {\n"
206
218
  datas.each do |data|
207
- data[:entities].each do |entity_name, metadata|
208
- out += "\nclass #{entity_name}"
209
-
210
- properties = metadata[:properties]
211
- relations = []
212
- unless properties.nil? || properties.empty?
213
- out += "{\n"
214
- properties.each do |property, property_metadata|
215
- out += "\t{field} #{property_metadata[:datatype]} : #{property} \n"
216
-
217
- if property_metadata[:datatype].split(':').first.eql?(data[:ontologies][:base][:prefix].to_s)
218
- relations << "#{property_metadata[:datatype].split(':').last} - #{property_metadata[:cardinality].key?(:max) && !property_metadata[:cardinality][:max].empty? ? "\"#{property_metadata[:cardinality][:max]}\"" : ''} #{entity_name} : #{property} >"
219
+ data[:entities].each do |entity_name, metadata|
220
+ out += "\nclass #{entity_name}"
221
+
222
+ properties = metadata[:properties]
223
+ relations = []
224
+ unless properties.nil? || properties.empty?
225
+ out += "{\n"
226
+ properties.each do |property, property_metadata|
227
+ out += "\t{field} #{property_metadata[:datatype]} : #{property} \n"
228
+
229
+ if property_metadata[:datatype].split(':').first.eql?(data[:ontologies][:base][:prefix].to_s)
230
+ relations << "#{property_metadata[:datatype].split(':').last} - #{property_metadata[:cardinality].key?(:max) && !property_metadata[:cardinality][:max].empty? ? "\"#{property_metadata[:cardinality][:max]}\"" : ''} #{entity_name} : #{property} >"
231
+ end
219
232
  end
233
+ out += "}\n"
234
+ out += relations.join("\n")
220
235
  end
221
- out += "}\n"
222
- out += relations.join("\n")
223
- end
224
236
 
225
- out += "\n"
226
- sub_classes = metadata[:sub_class_of]
227
- sub_classes = [sub_classes] unless sub_classes.is_a?(Array)
228
- sub_classes.each do |sub_class|
229
- out += "#{entity_name} --|> #{sub_class.split(':').last}\n" unless sub_class.empty?
237
+ out += "\n"
238
+ sub_classes = metadata[:sub_class_of]
239
+ sub_classes = [sub_classes] unless sub_classes.is_a?(Array)
240
+ sub_classes.each do |sub_class|
241
+ out += "#{entity_name} --|> #{sub_class.split(':').last}\n" unless sub_class.empty?
242
+ end
230
243
  end
231
244
  end
232
- end
233
245
  out += %(
234
246
  hide circle
235
247
  hide methods
@@ -263,61 +275,72 @@ hide empty members
263
275
 
264
276
  datas.each do |data|
265
277
  data[:entities].each do |entity_name, metadata|
266
- graph_prefix = data[:ontologies][:base][:prefix]
267
- graph_name = data[:ontologies][:base][:uri]
268
-
269
- description = metadata[:comment]
270
- label = metadata[:label]
271
- target_class = "#{graph_prefix}:#{entity_name}"
272
- node = metadata[:sub_class_of]
273
-
274
- if node && !node.empty?
275
- node = node.first if node.is_a?(Array)
276
- node = node.strip
277
- node += 'Shape' if node != /Shape$/ # && node =~ /^#{graph_prefix}:/
278
- else
279
- node = target_class
280
- end
278
+ graph_prefix = data[:ontologies][:base][:prefix]
279
+ graph_name = data[:ontologies][:base][:uri]
280
+
281
+ description = metadata[:comment]
282
+ label = metadata[:label]
283
+ target_class = "#{graph_prefix}:#{entity_name}"
284
+ node = metadata[:sub_class_of]
285
+
286
+ if node && !node.empty?
287
+ node = node.first if node.is_a?(Array)
288
+ node = node.strip
289
+ node += 'Shape' if node != /Shape$/ # && node =~ /^#{graph_prefix}:/
290
+ else
291
+ node = target_class
292
+ end
281
293
 
282
- out += %(
283
- #{graph_prefix}:#{entity_name}Shape
294
+ out += %(
295
+ #{graph_prefix}:#{entity_name}Shape
284
296
  a #{shacl_prefix}:NodeShape ;
285
297
  #{shacl_prefix}:description "#{description&.gsub('"', "'")&.gsub(/\n|\r/, '')}" ;
286
298
  #{shacl_prefix}:targetClass #{target_class} ;#{
287
- unless node.nil? || node.empty?
288
- "\n #{shacl_prefix}:node #{node} ;"
289
- end}
299
+ unless node.nil? || node.empty?
300
+ "\n #{shacl_prefix}:node #{node} ;"
301
+ end}
290
302
  #{shacl_prefix}:name "#{label}" ;
291
303
  )
292
- metadata[:properties].each do |property, property_metadata|
293
- attribute = property.to_s.strip
294
- next if attribute.empty?
295
-
296
- description = property_metadata[:description]&.gsub('"', "'")&.gsub(/\n|\r/, '').strip
297
- path = "#{graph_prefix}:#{attribute}"
298
- datatype = property_metadata[:datatype].strip
299
- min_count = property_metadata[:cardinality][:min].strip
300
- max_count = property_metadata[:cardinality][:max].strip
301
-
302
- if datatype =~ /^#{graph_prefix}:/ || datatype =~ /^<#{graph_name}/
303
- out += %( #{shacl_prefix}:property [#{shacl_prefix}:path #{path} ;
304
+ metadata[:properties].each do |property, property_metadata|
305
+ attribute = property.to_s.strip
306
+ next if attribute.empty?
307
+
308
+ description = property_metadata[:description]&.gsub('"', "'")&.gsub(/\n|\r/, '').strip
309
+ path = "#{graph_prefix}:#{attribute}"
310
+ datatype = property_metadata[:datatype].strip
311
+ min_count = property_metadata[:cardinality][:min].strip
312
+ max_count = property_metadata[:cardinality][:max].strip
313
+
314
+ if datatype =~ /^#{graph_prefix}:/ || datatype =~ /^<#{graph_name}/
315
+ out += %( #{shacl_prefix}:property [#{shacl_prefix}:path #{path} ;
304
316
  #{shacl_prefix}:name "#{attribute}" ;
305
317
  #{shacl_prefix}:description "#{description}" ;
306
318
  #{shacl_prefix}:nodeKind #{shacl_prefix}:IRI ;
307
319
  #{shacl_prefix}:class #{datatype} ;#{min_count =~ /\d+/ ? "\n #{shacl_prefix}:minCount #{min_count} ;" : ''}#{max_count =~ /\d+/ ? "\n #{shacl_prefix}:maxCount #{max_count} ;" : ''}
308
320
  ] ;
309
321
  )
310
- else
311
- out += %( #{shacl_prefix}:property [#{shacl_prefix}:path #{path} ;
322
+ else
323
+ if datatype.eql?('rdf:langString')
324
+ out += %( #{shacl_prefix}:property [#{shacl_prefix}:path #{path} ;
325
+ #{shacl_prefix}:name "#{attribute}";
326
+ #{shacl_prefix}:description "#{description}" ;
327
+ #{shacl_prefix}:uniqueLang true ;
328
+ #{shacl_prefix}:datatype #{datatype} ;#{min_count =~ /\d+/ ? "\n #{shacl_prefix}:minCount #{min_count} ;" : ''}
329
+ ] ;
330
+ )
331
+ else
332
+ out += %( #{shacl_prefix}:property [#{shacl_prefix}:path #{path} ;
312
333
  #{shacl_prefix}:name "#{attribute}";
313
334
  #{shacl_prefix}:description "#{description}" ;
314
335
  #{shacl_prefix}:datatype #{datatype} ;#{min_count =~ /\d+/ ? "\n #{shacl_prefix}:minCount #{min_count} ;" : ''}#{max_count =~ /\d+/ ? "\n #{shacl_prefix}:maxCount #{max_count} ;" : ''}
315
336
  ] ;
316
337
  )
338
+ end
339
+
340
+ end
317
341
  end
342
+ out += ".\n"
318
343
  end
319
- out += ".\n"
320
- end
321
344
  end
322
345
  out
323
346
  rescue StandardError => e
@@ -411,15 +434,15 @@ hide empty members
411
434
  graph.graph_name = RDF::URI(graph_name)
412
435
 
413
436
  datas.each do |data|
414
- data[:entities].select { |_k, v| !v[:same_as].empty? }.each do |k, v|
415
- prefix, verb = v[:same_as].split(':')
416
- rdf_vocabulary = RDF::Vocabulary.from_sym(prefix.upcase)
417
- rdf_verb = rdf_vocabulary[verb.to_sym]
418
- graph << RDF::Statement.new(rdf_verb, RDF::RDFV.type, RDF::OWL.Class)
419
- graph << RDF::Statement.new(rdf_verb, RDF::Vocab::OWL.sameAs, o[k.to_sym])
420
- rescue StandardError => e
421
- puts e.message
422
- end
437
+ data[:entities].select { |_k, v| !v[:same_as].empty? }.each do |k, v|
438
+ prefix, verb = v[:same_as].split(':')
439
+ rdf_vocabulary = RDF::Vocabulary.from_sym(prefix.upcase)
440
+ rdf_verb = rdf_vocabulary[verb.to_sym]
441
+ graph << RDF::Statement.new(rdf_verb, RDF::RDFV.type, RDF::OWL.Class)
442
+ graph << RDF::Statement.new(rdf_verb, RDF::Vocab::OWL.sameAs, o[k.to_sym])
443
+ rescue StandardError => e
444
+ puts e.message
445
+ end
423
446
  end
424
447
 
425
448
  graph << o.to_enum
@@ -432,10 +455,10 @@ hide empty members
432
455
  def build_inflections(datas)
433
456
  inflections = {}
434
457
  datas.each do |data|
435
- data[:entities].each do |entity, metadata|
436
- inflections[entity] = metadata[:plural]
437
- inflections[entity.to_s.underscore.to_sym] = metadata[:plural].underscore
438
- end
458
+ data[:entities].each do |entity, metadata|
459
+ inflections[entity] = metadata[:plural]
460
+ inflections[entity.to_s.underscore.to_sym] = metadata[:plural].underscore
461
+ end
439
462
  end
440
463
 
441
464
  inflections.to_json
@@ -591,13 +614,13 @@ hide empty members
591
614
  end
592
615
 
593
616
  sheet_data = read_sheets(key, spreadsheet_id, options)
594
-
617
+ #TODO: cleanup
595
618
  if sheet_data.is_a?(Hash)
596
619
  raise "No _REFERENCES sheet found" unless sheet_data.key?("_REFERENCES")
597
- #read other ontologies
620
+ # read other ontologies
598
621
  Solis::LOGGER.info('Reading referenced ontologies')
599
622
  references = sheet_data['_REFERENCES'].map do |reference|
600
- {sheet_url: reference['sheeturl'], description: reference['description']}
623
+ { sheet_url: reference['sheeturl'], description: reference['description'] }
601
624
  end
602
625
 
603
626
  cache_dir = ConfigFile.include?(:cache) ? ConfigFile[:cache] : '/tmp'
@@ -629,7 +652,8 @@ hide empty members
629
652
  schema = build_schema(datas)
630
653
  Solis::LOGGER.info('Generating INFLECTIONS')
631
654
  inflections = build_inflections(datas)
632
- { inflections: inflections, shacl: shacl, schema: schema, plantuml: plantuml}
655
+
656
+ { inflections: inflections, shacl: shacl, schema: schema, plantuml: plantuml }
633
657
  end
634
658
  end
635
659
  end
data/lib/solis/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Solis
2
- VERSION = "0.78.0"
2
+ VERSION = "0.80.0"
3
3
  end
data/solis.gemspec CHANGED
@@ -35,12 +35,12 @@ Gem::Specification.new do |spec|
35
35
  spec.add_runtime_dependency 'google_drive', '~> 3.0'
36
36
  spec.add_runtime_dependency 'json', '~> 2.7'
37
37
  spec.add_runtime_dependency 'hashdiff', '~> 1.1'
38
- spec.add_runtime_dependency 'iso8601', '~> 0.13.0'
39
- spec.add_runtime_dependency 'connection_pool', '~> 2.4'
40
- spec.add_runtime_dependency 'uuidtools', '~> 2.2.0'
41
- spec.add_runtime_dependency 'dry-struct', '~> 1.6'
42
- spec.add_runtime_dependency 'psych', '~> 5.1'
43
- #spec.add_runtime_dependency 'hashdiff', '~> 1.1'
38
+ spec.add_runtime_dependency 'iso8601', '~> 0.13.0'
39
+ spec.add_runtime_dependency 'connection_pool', '~> 2.4'
40
+ spec.add_runtime_dependency 'uuidtools', '~> 2.2.0'
41
+ spec.add_runtime_dependency 'dry-struct', '~> 1.6'
42
+ spec.add_runtime_dependency 'psych', '~> 5.1'
43
+ # spec.add_runtime_dependency 'rdf-edtf', '~> 1.1.2'
44
44
 
45
45
  spec.add_development_dependency 'rake', '~> 13.0'
46
46
  spec.add_development_dependency 'minitest', '~> 5.19'
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.78.0
4
+ version: 0.80.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-11-13 00:00:00.000000000 Z
11
+ date: 2025-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -295,7 +295,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
295
295
  - !ruby/object:Gem::Version
296
296
  version: '0'
297
297
  requirements: []
298
- rubygems_version: 3.5.10
298
+ rubygems_version: 3.5.14
299
299
  signing_key:
300
300
  specification_version: 4
301
301
  summary: Turn any SHACL file into an API, ORM, documentation, ...