shacl 0.3.0 → 0.4.1
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/README.md +4 -4
- data/VERSION +1 -1
- data/lib/shacl/algebra/constraint_component.rb +58 -0
- data/lib/shacl/algebra/node_shape.rb +1 -1
- data/lib/shacl/algebra/operator.rb +57 -21
- data/lib/shacl/algebra/qualified_value.rb +5 -13
- data/lib/shacl/algebra.rb +10 -1
- data/lib/shacl/shapes.rb +59 -3
- metadata +20 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d790df44442d54fd3787914c630d9ba5f4879988ce47616dbcc2ff62c8521876
|
4
|
+
data.tar.gz: bda5f350ad0393933cfe14391341de28e7cf30e6088717d555ccef43192ec28f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2cd4e4e2bc3686207c430be9cc582c80cc8012fc9719e902f4d72151833b3bd3a5f25d6c2b08005d3e79409378862d3d9b01c230ed794c534e92a05e18a96d3
|
7
|
+
data.tar.gz: 5c5a6d45bccecaa5cfdbb63a65b95934d42072f1bcce8f4060312ee0fb0c968f6f902bdfd7eba1263b6b67ef98471f272f6ef250db1aa0bd86e0cf3639877474
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
This is a pure-Ruby library for working with the [Shape Constraint Language][SHACL Spec] to validate the shape of [RDF][] graphs.
|
4
4
|
|
5
|
-
[](https://badge.fury.io/rb/shacl)
|
6
6
|
[](https://github.com/ruby-rdf/shacl/actions?query=workflow%3ACI)
|
7
7
|
[](https://coveralls.io/github/ruby-rdf/shacl?branch=develop)
|
8
8
|
[](https://gitter.im/ruby-rdf/rdf)
|
@@ -87,10 +87,10 @@ This implementation is certainly not performant. Some things that can be be cons
|
|
87
87
|
|
88
88
|
## Dependencies
|
89
89
|
|
90
|
-
* [Ruby](https://ruby-lang.org/) (>=
|
91
|
-
* [RDF.rb](https://rubygems.org/gems/rdf) (~> 3.
|
90
|
+
* [Ruby](https://ruby-lang.org/) (>= 3.0)
|
91
|
+
* [RDF.rb](https://rubygems.org/gems/rdf) (~> 3.3)
|
92
92
|
* [SPARQL](https://rubygems.org/gems/sparql) (~> 3.2)
|
93
|
-
* [json-ld](https://rubygems.org/gems/json-ld) (~> 3.
|
93
|
+
* [json-ld](https://rubygems.org/gems/json-ld) (~> 3.3)
|
94
94
|
* [sxp](https://rubygems.org/gems/sxp) (~> 1.2)
|
95
95
|
|
96
96
|
## Installation
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.1
|
@@ -5,5 +5,63 @@ module SHACL::Algebra
|
|
5
5
|
# Constraint Components define basic constraint behaivor through _mandatory_ and _optional_ parameters. Constraints are accessed through their parameters.
|
6
6
|
#
|
7
7
|
class ConstraintComponent < Operator
|
8
|
+
|
9
|
+
# Class Methods
|
10
|
+
class << self
|
11
|
+
##
|
12
|
+
# Creates an operator instance from a parsed SHACL representation.
|
13
|
+
#
|
14
|
+
# Special case for SPARQL ConstraintComponents.
|
15
|
+
#
|
16
|
+
# @param [Hash] operator
|
17
|
+
# @param [Hash] options ({})
|
18
|
+
# @option options [Hash{String => RDF::URI}] :prefixes
|
19
|
+
# @return [Operator]
|
20
|
+
def from_json(operator, **options)
|
21
|
+
operands = []
|
22
|
+
|
23
|
+
# Component is known by its subject IRI
|
24
|
+
id = operator.fetch('id')
|
25
|
+
|
26
|
+
# Component class (for instantiation) is based on the _local name_ of the component IRI
|
27
|
+
class_name = ncname(id)
|
28
|
+
|
29
|
+
parameters = operator.fetch('parameter', []).inject({}) do |memo, param|
|
30
|
+
# Symbolize keys
|
31
|
+
param = param.inject({}) {|memo, (k,v)| memo.merge(k.to_sym => v)}
|
32
|
+
|
33
|
+
plc = ncname(param[:path])
|
34
|
+
|
35
|
+
# Add class and local name
|
36
|
+
param = param.merge(class: class_name, local_name: plc)
|
37
|
+
memo.merge(param[:path] => param)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Add parameters to operator lookup
|
41
|
+
add_component(class_name, parameters)
|
42
|
+
|
43
|
+
# Add parameter identifiers to operands
|
44
|
+
operands << [:parameters, parameters.keys]
|
45
|
+
|
46
|
+
# FIXME: labelTemplate
|
47
|
+
|
48
|
+
validator = %w(validator nodeValidator propertyValidator).inject(nil) do |memo, p|
|
49
|
+
memo || (SPARQLConstraintComponent.from_json(operator[p]) if operator.key?(p))
|
50
|
+
end
|
51
|
+
raise SHACL::Error, "Constraint Component has no validator" unless validator
|
52
|
+
|
53
|
+
operands << [:validator, validator]
|
54
|
+
|
55
|
+
new(*operands, **options)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Extract the NCName tail of an IRI as a symbol.
|
59
|
+
#
|
60
|
+
# @param [RDF::URI] uri
|
61
|
+
# @return [Symbol]
|
62
|
+
def ncname(uri)
|
63
|
+
uri.to_s.match(/(\w+)$/).to_s.to_sym
|
64
|
+
end
|
65
|
+
end
|
8
66
|
end
|
9
67
|
end
|
@@ -44,7 +44,7 @@ module SHACL::Algebra
|
|
44
44
|
resultSeverity: options[:severity],
|
45
45
|
component: RDF::Vocab::SHACL.ClosedConstraintComponent,
|
46
46
|
**options)
|
47
|
-
end.compact
|
47
|
+
end.flatten.compact
|
48
48
|
elsif @options[:ignoredProperties]
|
49
49
|
raise SHACL::Error, "shape has ignoredProperties without being closed"
|
50
50
|
end
|
@@ -40,6 +40,7 @@ module SHACL::Algebra
|
|
40
40
|
# Graph from which original shapes were loaded.
|
41
41
|
# @return [RDF::Graph]
|
42
42
|
attr_accessor :shapes_graph
|
43
|
+
|
43
44
|
# Parameters to components.
|
44
45
|
PARAMETERS = {
|
45
46
|
and: {class: :AndConstraintComponent},
|
@@ -151,19 +152,19 @@ module SHACL::Algebra
|
|
151
152
|
},
|
152
153
|
property: {class: :PropertyConstraintComponent},
|
153
154
|
qualifiedMaxCount: {
|
154
|
-
class: :
|
155
|
+
class: :QualifiedValueConstraintComponent,
|
155
156
|
datatype: RDF::XSD.integer,
|
156
157
|
},
|
157
158
|
qualifiedValueShape: {
|
158
|
-
class:
|
159
|
+
class: :QualifiedValueConstraintComponent,
|
159
160
|
},
|
160
161
|
qualifiedValueShapesDisjoint: {
|
161
|
-
class:
|
162
|
+
class: :QualifiedValueConstraintComponent,
|
162
163
|
datatype: RDF::XSD.boolean,
|
163
164
|
optional: true,
|
164
165
|
},
|
165
166
|
qualifiedMinCount: {
|
166
|
-
class: :
|
167
|
+
class: :QualifiedValueConstraintComponent,
|
167
168
|
datatype: RDF::XSD.integer
|
168
169
|
},
|
169
170
|
sparql: {class: :SPARQLConstraintComponent},
|
@@ -175,21 +176,43 @@ module SHACL::Algebra
|
|
175
176
|
xone: {class: :XoneConstraintComponent},
|
176
177
|
}
|
177
178
|
|
178
|
-
# Constraint Component classes indexed to their mandatory and optional parameters.
|
179
|
-
#
|
180
|
-
# @note for builtins, corresponding Ruby classes may not exist.
|
181
|
-
COMPONENT_PARAMS = PARAMETERS.inject({}) do |memo, (param, properties)|
|
182
|
-
memo.merge(Array(properties[:class]).inject(memo) do |mem, cls|
|
183
|
-
entry = mem.fetch(cls, {})
|
184
|
-
param_type = properties[:optional] ? :optional : :mandatory
|
185
|
-
entry[param_type] ||= []
|
186
|
-
entry[param_type] << param
|
187
|
-
mem.merge(cls => entry)
|
188
|
-
end)
|
189
|
-
end
|
190
|
-
|
191
179
|
## Class methods
|
192
180
|
class << self
|
181
|
+
# Add parameters and class def from a SPARQL-based Constraint Component
|
182
|
+
#
|
183
|
+
# @param [RDF::URI] cls The URI of the constraint component.
|
184
|
+
# @param [Hash{Symbol => Hash}] parameters Definitions of mandatory and optional parameters for this component.
|
185
|
+
def add_component(cls, parameters)
|
186
|
+
# Remember added paraemters.
|
187
|
+
# FIXME: should merge parameters
|
188
|
+
@added_parameters = (@added_parameters || {}).merge(parameters)
|
189
|
+
# Rebuild
|
190
|
+
@params = @component_params = nil
|
191
|
+
end
|
192
|
+
|
193
|
+
# Defined parameters for components, which may be supplemented by SPARQL-based Constraint Components. A parameter may be mapped to more than one component class.
|
194
|
+
#
|
195
|
+
# @return [Hash{Symbol => Hash}] Returns each parameter referencing the component classes it is used in, and the property validators for values of that parameter.
|
196
|
+
def params
|
197
|
+
@params ||= PARAMETERS.merge(@added_parameters || {})
|
198
|
+
end
|
199
|
+
|
200
|
+
# Constraint Component classes indexed to their mandatory and optional parameters, which may be supplemented by SPARQL-based Constraint Components.
|
201
|
+
#
|
202
|
+
# @return [Hash{Symbol => Hash}]
|
203
|
+
# Returns a hash relating each component URI to its optional and mandatory parameters.
|
204
|
+
def component_params
|
205
|
+
@component_params ||= params.inject({}) do |memo, (param, properties)|
|
206
|
+
memo.merge(Array(properties[:class]).inject(memo) do |mem, cls|
|
207
|
+
entry = mem.fetch(cls, {})
|
208
|
+
param_type = properties[:optional] ? :optional : :mandatory
|
209
|
+
entry[param_type] ||= []
|
210
|
+
entry[param_type] << param
|
211
|
+
mem.merge(cls => entry)
|
212
|
+
end)
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
193
216
|
##
|
194
217
|
# Creates an operator instance from a parsed SHACL representation
|
195
218
|
# @param [Hash] operator
|
@@ -205,7 +228,7 @@ module SHACL::Algebra
|
|
205
228
|
# Node Options and operands on shape or node, which are not Constraint Component Parameters
|
206
229
|
operator.each do |k, v|
|
207
230
|
k = k.to_sym
|
208
|
-
next if v.nil? ||
|
231
|
+
next if v.nil? || params.include?(k)
|
209
232
|
case k
|
210
233
|
# List properties
|
211
234
|
when :id then node_opts[:id] = iri(v, vocab: false, **options)
|
@@ -234,8 +257,8 @@ module SHACL::Algebra
|
|
234
257
|
used_components = {}
|
235
258
|
operator.each do |k, v|
|
236
259
|
k = k.to_sym
|
237
|
-
next if v.nil? || !
|
238
|
-
param_props =
|
260
|
+
next if v.nil? || !params.include?(k)
|
261
|
+
param_props = params[k]
|
239
262
|
param_classes = Array(param_props[:class])
|
240
263
|
|
241
264
|
# Keep track of components which have been used.
|
@@ -293,10 +316,21 @@ module SHACL::Algebra
|
|
293
316
|
name = klass.const_get(:NAME)
|
294
317
|
# If the key `k` is the same as the NAME of the class, create the instance with the defined element values.
|
295
318
|
if name == k
|
319
|
+
param_classes.each do |cls|
|
320
|
+
# Add `k` as a mandatory parameter fulfilled
|
321
|
+
(used_components[cls][:mandatory_parameters] ||= []) << k
|
322
|
+
end
|
323
|
+
|
324
|
+
# Instantiate the compoent
|
296
325
|
elements.map {|e| klass.new(*e, **options.dup)}
|
297
326
|
else
|
298
327
|
# Add non-primary parameters for subsequent insertion
|
299
328
|
param_classes.each do |cls|
|
329
|
+
# Add `k` as a mandatory parameter fulfilled if it is so defined
|
330
|
+
(used_components[cls][:mandatory_parameters] ||= []) << k unless
|
331
|
+
params[k][:optional]
|
332
|
+
|
333
|
+
# Add parameter as S-Expression operand
|
300
334
|
(used_components[cls][:parameters] ||= []) << elements.unshift(k)
|
301
335
|
end
|
302
336
|
[] # No instances created
|
@@ -304,10 +338,12 @@ module SHACL::Algebra
|
|
304
338
|
end
|
305
339
|
end
|
306
340
|
|
307
|
-
# Record the instances created by class and
|
341
|
+
# Record the instances created by class and its operands
|
308
342
|
param_classes.each do |cls|
|
309
343
|
used_components[cls][:instances] = instances
|
310
344
|
end
|
345
|
+
|
346
|
+
# FIXME: Only add instances when all mandatory parameters are present.
|
311
347
|
operands.push(*instances)
|
312
348
|
end
|
313
349
|
|
@@ -17,8 +17,8 @@ module SHACL::Algebra
|
|
17
17
|
params, ops = operands.partition {|o| o.is_a?(Array) && o.first.is_a?(Symbol)}
|
18
18
|
params = params.inject({}) {|memo, a| memo.merge(a.first => a.last)}
|
19
19
|
|
20
|
-
max_count = params[:qualifiedMinCount]
|
21
|
-
min_count = params[:qualifiedMinCount]
|
20
|
+
max_count = params[:qualifiedMinCount]
|
21
|
+
min_count = params[:qualifiedMinCount]
|
22
22
|
# FIXME: figure this out
|
23
23
|
disjoint = !!params[:qualifiedValueShapesDisjoint]
|
24
24
|
|
@@ -29,13 +29,13 @@ module SHACL::Algebra
|
|
29
29
|
|
30
30
|
count = results.select(&:conform?).length
|
31
31
|
log_debug(NAME, depth: depth) {"#{count}/#{results} conforming shapes"}
|
32
|
-
if count < min_count
|
32
|
+
if min_count && count < min_count.to_i
|
33
33
|
not_satisfied(focus: node, path: path,
|
34
34
|
message: "only #{count} conforming values, requires at least #{min_count}",
|
35
35
|
resultSeverity: options.fetch(:severity),
|
36
36
|
component: RDF::Vocab::SHACL.QualifiedMinCountConstraintComponent,
|
37
37
|
depth: depth, **options)
|
38
|
-
elsif count > max_count
|
38
|
+
elsif max_count && count > max_count.to_i
|
39
39
|
not_satisfied(focus: node, path: path,
|
40
40
|
message: "#{count} conforming values, requires at most #{max_count}",
|
41
41
|
resultSeverity: options.fetch(:severity),
|
@@ -43,19 +43,11 @@ module SHACL::Algebra
|
|
43
43
|
depth: depth, **options)
|
44
44
|
else
|
45
45
|
satisfy(focus: node, path: path,
|
46
|
-
message: "#{min_count} <= #{count} <= #{max_count} values conform",
|
46
|
+
message: "#{min_count.to_i} <= #{count} <= #{max_count || 'inf'} values conform",
|
47
47
|
component: RDF::Vocab::SHACL.QualifiedMinCountConstraintComponent,
|
48
48
|
depth: depth, **options)
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
53
|
-
|
54
|
-
# Version on QualifiedConstraintComponent with required `qualifiedMaxCount` parameter
|
55
|
-
class QualifiedMaxCountConstraintComponent < QualifiedValueConstraintComponent
|
56
|
-
end
|
57
|
-
|
58
|
-
# Version on QualifiedConstraintComponent with required `qualifiedMinCount` parameter
|
59
|
-
class QualifiedMinCountConstraintComponent < QualifiedValueConstraintComponent
|
60
|
-
end
|
61
53
|
end
|
data/lib/shacl/algebra.rb
CHANGED
@@ -27,10 +27,19 @@ module SHACL
|
|
27
27
|
return operator['@list'].map {|e| from_json(e, **options)} if operator.key?('@list')
|
28
28
|
|
29
29
|
type = operator.fetch('type', [])
|
30
|
-
|
30
|
+
if type.empty?
|
31
|
+
type << if operator["path"]
|
32
|
+
'PropertyShape'
|
33
|
+
elsif operator['nodeValidator'] || operator['propertyValidator'] || operator['validator']
|
34
|
+
'ConstraintComponent'
|
35
|
+
else
|
36
|
+
'NodeShape'
|
37
|
+
end
|
38
|
+
end
|
31
39
|
klass = case
|
32
40
|
when type.include?('NodeShape') then NodeShape
|
33
41
|
when type.include?('PropertyShape') then PropertyShape
|
42
|
+
when type.include?('ConstraintComponent') then ConstraintComponent
|
34
43
|
else raise SHACL::Error, "from_json: unknown type #{type.inspect}"
|
35
44
|
end
|
36
45
|
|
data/lib/shacl/shapes.rb
CHANGED
@@ -61,9 +61,22 @@ module SHACL
|
|
61
61
|
end
|
62
62
|
|
63
63
|
# Serialize the graph as framed JSON-LD and initialize patterns, recursively.
|
64
|
-
|
65
|
-
|
66
|
-
|
64
|
+
expanded = JSON::LD::API.fromRdf(graph, useNativeTypes: true)
|
65
|
+
|
66
|
+
# Node and Property constraints
|
67
|
+
shape_json = JSON::LD::API.frame(expanded, SHAPES_FRAME,
|
68
|
+
omitGraph: false,
|
69
|
+
embed: '@always',
|
70
|
+
expanded: true)['@graph']
|
71
|
+
|
72
|
+
# Any defined Constraint Components
|
73
|
+
components = JSON::LD::API.frame(expanded, COMPONENTS_FRAME,
|
74
|
+
omitGraph: false,
|
75
|
+
embed: '@always',
|
76
|
+
expanded: true)['@graph']
|
77
|
+
|
78
|
+
# Extract any constraint components and merge to top-level
|
79
|
+
shape_json = components + shape_json
|
67
80
|
|
68
81
|
# Create an array of the framed shapes
|
69
82
|
shapes = self.new(shape_json.map {|o| Algebra.from_json(o, **options)})
|
@@ -189,5 +202,48 @@ module SHACL
|
|
189
202
|
"xone": {},
|
190
203
|
"targetSubjectsOf": {}
|
191
204
|
})).freeze
|
205
|
+
|
206
|
+
COMPONENTS_FRAME = JSON.parse(%({
|
207
|
+
"@context": {
|
208
|
+
"id": "@id",
|
209
|
+
"type": {"@id": "@type", "@container": "@set"},
|
210
|
+
"@vocab": "http://www.w3.org/ns/shacl#",
|
211
|
+
"owl": "http://www.w3.org/2002/07/owl#",
|
212
|
+
"rdfs": "http://www.w3.org/2000/01/rdf-schema#",
|
213
|
+
"shacl": "http://www.w3.org/ns/shacl#",
|
214
|
+
"sh": "http://www.w3.org/ns/shacl#",
|
215
|
+
"xsd": "http://www.w3.org/2001/XMLSchema#",
|
216
|
+
"and": {"@type": "@id"},
|
217
|
+
"annotationProperty": {"@type": "@id"},
|
218
|
+
"class": {"@type": "@id"},
|
219
|
+
"comment": "http://www.w3.org/2000/01/rdf-schema#comment",
|
220
|
+
"condition": {"@type": "@id"},
|
221
|
+
"datatype": {"@type": "@vocab"},
|
222
|
+
"declare": {"@type": "@id"},
|
223
|
+
"disjoint": {"@type": "@id"},
|
224
|
+
"entailment": {"@type": "@id"},
|
225
|
+
"equals": {"@type": "@id"},
|
226
|
+
"ignoredProperties": {"@type": "@id", "@container": "@list"},
|
227
|
+
"imports": {"@id": "owl:imports", "@type": "@id"},
|
228
|
+
"in": {"@type": "@none", "@container": "@list"},
|
229
|
+
"inversePath": {"@type": "@id"},
|
230
|
+
"label": "http://www.w3.org/2000/01/rdf-schema#label",
|
231
|
+
"languageIn": {"@container": "@list"},
|
232
|
+
"lessThan": {"@type": "@id"},
|
233
|
+
"lessThanOrEquals": {"@type": "@id"},
|
234
|
+
"namespace": {"@type": "xsd:anyURI"},
|
235
|
+
"nodeKind": {"@type": "@vocab"},
|
236
|
+
"or": {"@type": "@id"},
|
237
|
+
"path": {"@type": "@id"},
|
238
|
+
"prefixes": {"@type": "@id"},
|
239
|
+
"property": {"@type": "@id"},
|
240
|
+
"severity": {"@type": "@vocab"},
|
241
|
+
"sparql": {"@type": "@id"},
|
242
|
+
"targetClass": {"@type": "@id"},
|
243
|
+
"targetNode": {"@type": "@none"},
|
244
|
+
"xone": {"@type": "@id"}
|
245
|
+
},
|
246
|
+
"@type": "ConstraintComponent"
|
247
|
+
})).freeze
|
192
248
|
end
|
193
249
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shacl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gregg Kellogg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-11-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rdf
|
@@ -16,34 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '3.
|
20
|
-
- - ">="
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: 3.2.8
|
19
|
+
version: '3.3'
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
24
|
- - "~>"
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version: '3.
|
30
|
-
- - ">="
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: 3.2.8
|
26
|
+
version: '3.3'
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: json-ld
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
36
30
|
requirements:
|
37
31
|
- - "~>"
|
38
32
|
- !ruby/object:Gem::Version
|
39
|
-
version: '3.
|
33
|
+
version: '3.3'
|
40
34
|
type: :runtime
|
41
35
|
prerelease: false
|
42
36
|
version_requirements: !ruby/object:Gem::Requirement
|
43
37
|
requirements:
|
44
38
|
- - "~>"
|
45
39
|
- !ruby/object:Gem::Version
|
46
|
-
version: '3.
|
40
|
+
version: '3.3'
|
47
41
|
- !ruby/object:Gem::Dependency
|
48
42
|
name: sxp
|
49
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -64,90 +58,84 @@ dependencies:
|
|
64
58
|
requirements:
|
65
59
|
- - "~>"
|
66
60
|
- !ruby/object:Gem::Version
|
67
|
-
version: '3.
|
68
|
-
- - ">="
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
version: 3.2.4
|
61
|
+
version: '3.3'
|
71
62
|
type: :runtime
|
72
63
|
prerelease: false
|
73
64
|
version_requirements: !ruby/object:Gem::Requirement
|
74
65
|
requirements:
|
75
66
|
- - "~>"
|
76
67
|
- !ruby/object:Gem::Version
|
77
|
-
version: '3.
|
78
|
-
- - ">="
|
79
|
-
- !ruby/object:Gem::Version
|
80
|
-
version: 3.2.4
|
68
|
+
version: '3.3'
|
81
69
|
- !ruby/object:Gem::Dependency
|
82
70
|
name: rdf-spec
|
83
71
|
requirement: !ruby/object:Gem::Requirement
|
84
72
|
requirements:
|
85
73
|
- - "~>"
|
86
74
|
- !ruby/object:Gem::Version
|
87
|
-
version: '3.
|
75
|
+
version: '3.3'
|
88
76
|
type: :development
|
89
77
|
prerelease: false
|
90
78
|
version_requirements: !ruby/object:Gem::Requirement
|
91
79
|
requirements:
|
92
80
|
- - "~>"
|
93
81
|
- !ruby/object:Gem::Version
|
94
|
-
version: '3.
|
82
|
+
version: '3.3'
|
95
83
|
- !ruby/object:Gem::Dependency
|
96
84
|
name: rdf-turtle
|
97
85
|
requirement: !ruby/object:Gem::Requirement
|
98
86
|
requirements:
|
99
87
|
- - "~>"
|
100
88
|
- !ruby/object:Gem::Version
|
101
|
-
version: '3.
|
89
|
+
version: '3.3'
|
102
90
|
type: :development
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
93
|
requirements:
|
106
94
|
- - "~>"
|
107
95
|
- !ruby/object:Gem::Version
|
108
|
-
version: '3.
|
96
|
+
version: '3.3'
|
109
97
|
- !ruby/object:Gem::Dependency
|
110
98
|
name: rdf-vocab
|
111
99
|
requirement: !ruby/object:Gem::Requirement
|
112
100
|
requirements:
|
113
101
|
- - "~>"
|
114
102
|
- !ruby/object:Gem::Version
|
115
|
-
version: '3.
|
103
|
+
version: '3.3'
|
116
104
|
type: :development
|
117
105
|
prerelease: false
|
118
106
|
version_requirements: !ruby/object:Gem::Requirement
|
119
107
|
requirements:
|
120
108
|
- - "~>"
|
121
109
|
- !ruby/object:Gem::Version
|
122
|
-
version: '3.
|
110
|
+
version: '3.3'
|
123
111
|
- !ruby/object:Gem::Dependency
|
124
112
|
name: rdf-xsd
|
125
113
|
requirement: !ruby/object:Gem::Requirement
|
126
114
|
requirements:
|
127
115
|
- - "~>"
|
128
116
|
- !ruby/object:Gem::Version
|
129
|
-
version: '3.
|
117
|
+
version: '3.3'
|
130
118
|
type: :development
|
131
119
|
prerelease: false
|
132
120
|
version_requirements: !ruby/object:Gem::Requirement
|
133
121
|
requirements:
|
134
122
|
- - "~>"
|
135
123
|
- !ruby/object:Gem::Version
|
136
|
-
version: '3.
|
124
|
+
version: '3.3'
|
137
125
|
- !ruby/object:Gem::Dependency
|
138
126
|
name: rspec
|
139
127
|
requirement: !ruby/object:Gem::Requirement
|
140
128
|
requirements:
|
141
129
|
- - "~>"
|
142
130
|
- !ruby/object:Gem::Version
|
143
|
-
version: '3.
|
131
|
+
version: '3.12'
|
144
132
|
type: :development
|
145
133
|
prerelease: false
|
146
134
|
version_requirements: !ruby/object:Gem::Requirement
|
147
135
|
requirements:
|
148
136
|
- - "~>"
|
149
137
|
- !ruby/object:Gem::Version
|
150
|
-
version: '3.
|
138
|
+
version: '3.12'
|
151
139
|
- !ruby/object:Gem::Dependency
|
152
140
|
name: rspec-its
|
153
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -225,14 +213,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
225
213
|
requirements:
|
226
214
|
- - ">="
|
227
215
|
- !ruby/object:Gem::Version
|
228
|
-
version: '
|
216
|
+
version: '3.0'
|
229
217
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
230
218
|
requirements:
|
231
219
|
- - ">="
|
232
220
|
- !ruby/object:Gem::Version
|
233
221
|
version: '0'
|
234
222
|
requirements: []
|
235
|
-
rubygems_version: 3.
|
223
|
+
rubygems_version: 3.4.19
|
236
224
|
signing_key:
|
237
225
|
specification_version: 4
|
238
226
|
summary: Implementation of Shapes Constraint Language (SHACL) for RDF.rb
|