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 +4 -4
- data/lib/solis/model.rb +7 -1
- data/lib/solis/query/run.rb +2 -0
- data/lib/solis/query.rb +4 -1
- data/lib/solis/shape/reader/sheet.rb +105 -81
- data/lib/solis/version.rb +1 -1
- data/solis.gemspec +6 -6
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 156f64ccc4d0ce04ac67bbb450634697eab5f9c35079fafbc2024afc921aae79
|
4
|
+
data.tar.gz: 9ef551b57b0322740837b2ee4feaffe80b5447e6f0d119fdf865dfda43bea24b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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")
|
data/lib/solis/query/run.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
83
|
-
|
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
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
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
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
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
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
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
|
-
|
283
|
-
|
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
|
-
|
288
|
-
|
289
|
-
|
299
|
+
unless node.nil? || node.empty?
|
300
|
+
"\n #{shacl_prefix}:node #{node} ;"
|
301
|
+
end}
|
290
302
|
#{shacl_prefix}:name "#{label}" ;
|
291
303
|
)
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
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
|
-
|
311
|
-
|
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
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
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
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
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
|
-
|
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
|
-
|
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
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
|
39
|
-
spec.add_runtime_dependency
|
40
|
-
spec.add_runtime_dependency
|
41
|
-
spec.add_runtime_dependency
|
42
|
-
spec.add_runtime_dependency
|
43
|
-
#spec.add_runtime_dependency
|
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.
|
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:
|
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.
|
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, ...
|