finitio 0.8.0 → 0.9.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/CHANGELOG.md +6 -0
- data/Gemfile.lock +2 -2
- data/lib/finitio/json_schema.rb +16 -0
- data/lib/finitio/json_schema/ad_type.rb +11 -0
- data/lib/finitio/json_schema/alias_type.rb +9 -0
- data/lib/finitio/json_schema/any_type.rb +9 -0
- data/lib/finitio/json_schema/builtin_type.rb +27 -0
- data/lib/finitio/json_schema/hash_based_type.rb +25 -0
- data/lib/finitio/json_schema/rel_based_type.rb +13 -0
- data/lib/finitio/json_schema/seq_type.rb +12 -0
- data/lib/finitio/json_schema/set_type.rb +13 -0
- data/lib/finitio/json_schema/struct_type.rb +12 -0
- data/lib/finitio/json_schema/sub_type.rb +10 -0
- data/lib/finitio/json_schema/union_type.rb +11 -0
- data/lib/finitio/version.rb +1 -1
- data/spec/inference/test_inference.rb +8 -8
- data/spec/json_schema/test_ad_type.rb +20 -0
- data/spec/json_schema/test_alias_type.rb +15 -0
- data/spec/json_schema/test_any_type.rb +11 -0
- data/spec/json_schema/test_builtin_type.rb +51 -0
- data/spec/json_schema/test_multi_relation_type.rb +58 -0
- data/spec/json_schema/test_multi_tuple_type.rb +50 -0
- data/spec/json_schema/test_relation_type.rb +30 -0
- data/spec/json_schema/test_seq_type.rb +18 -0
- data/spec/json_schema/test_set_type.rb +19 -0
- data/spec/json_schema/test_struct_type.rb +18 -0
- data/spec/json_schema/test_sub_type.rb +17 -0
- data/spec/json_schema/test_tuple_type.rb +26 -0
- data/spec/json_schema/test_union_type.rb +17 -0
- data/spec/spec_helper.rb +2 -1
- metadata +41 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb6a6dde74e450b0569a6f568d2f6e847a6f646b23cd815a3442e1a85dbdaedf
|
4
|
+
data.tar.gz: 26fd2339057cc212d2594d2d52ab66b5ae1ad6dc7db0294faa941f148406ac4a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2e4bc1270b3169f3a9692473525693c90e5771c42fc01e3fdce89da676b1e6867d977fb9f29cc2603adcbdc15920dec9dde6133ccd96f50638e12614cf22eed
|
7
|
+
data.tar.gz: acd957a3ea361e715a17d27bb25baef4687f2ed6252a1289a8e4c660e8151c4ad2813488d9a8fbccda189903b95be5da99983b0f0a922e3590f316dd656c7371
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
# 0.9.0 - 2020/12/16
|
2
|
+
|
3
|
+
* Add Type#to_json_schema that converts Finitio types to JSON schema
|
4
|
+
representations. This first implementation skips all constraints on sub types,
|
5
|
+
though. You need to explicitly require 'finitio/json_schema' to use it.
|
6
|
+
|
1
7
|
# 0.8.0 - 2019/10/21
|
2
8
|
|
3
9
|
* Add `Type#unconstrained` that returns a super type with all user specific
|
data/Gemfile.lock
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
module Finitio
|
2
|
+
module JsonSchema
|
3
|
+
class Error < Finitio::Error; end
|
4
|
+
end # module JsonSchema
|
5
|
+
end # module Finitio
|
6
|
+
require_relative 'json_schema/ad_type'
|
7
|
+
require_relative 'json_schema/any_type'
|
8
|
+
require_relative 'json_schema/alias_type'
|
9
|
+
require_relative 'json_schema/builtin_type'
|
10
|
+
require_relative 'json_schema/hash_based_type'
|
11
|
+
require_relative 'json_schema/rel_based_type'
|
12
|
+
require_relative 'json_schema/seq_type'
|
13
|
+
require_relative 'json_schema/set_type'
|
14
|
+
require_relative 'json_schema/struct_type'
|
15
|
+
require_relative 'json_schema/sub_type'
|
16
|
+
require_relative 'json_schema/union_type'
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Finitio
|
2
|
+
module JsonSchema
|
3
|
+
|
4
|
+
BUILTIN_MAPPING = {
|
5
|
+
NilClass => "null",
|
6
|
+
String => "string",
|
7
|
+
Integer => "integer",
|
8
|
+
Fixnum => "integer",
|
9
|
+
Bignum => "integer",
|
10
|
+
Float => "number",
|
11
|
+
Numeric => "number"
|
12
|
+
}
|
13
|
+
|
14
|
+
end
|
15
|
+
class BuiltinType
|
16
|
+
|
17
|
+
def to_json_schema(*args, &bl)
|
18
|
+
mapped = JsonSchema::BUILTIN_MAPPING[ruby_type]
|
19
|
+
if mapped
|
20
|
+
{ type: mapped }
|
21
|
+
else
|
22
|
+
raise JsonSchema::Error, "Unable to map #{ruby_type} to json-schema"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end # class BuiltinType
|
27
|
+
end # module Finitio
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Finitio
|
2
|
+
module HashBasedType
|
3
|
+
|
4
|
+
def to_json_schema(*args, &bl)
|
5
|
+
base = {
|
6
|
+
type: "object"
|
7
|
+
}
|
8
|
+
unless heading.empty?
|
9
|
+
base[:properties] = heading.inject({}){|ps,a|
|
10
|
+
ps.merge(a.name => a.type.to_json_schema(*args, &bl))
|
11
|
+
}
|
12
|
+
end
|
13
|
+
unless (reqs = heading.select{|a| a.required? }).empty?
|
14
|
+
base[:required] = reqs.map{|a| a.name }
|
15
|
+
end
|
16
|
+
base[:additionalProperties] = if heading.allow_extra?
|
17
|
+
heading.allow_extra.to_json_schema(*args, &bl)
|
18
|
+
else
|
19
|
+
false
|
20
|
+
end
|
21
|
+
base
|
22
|
+
end
|
23
|
+
|
24
|
+
end # module HashBasedType
|
25
|
+
end # module UnionType
|
data/lib/finitio/version.rb
CHANGED
@@ -4,15 +4,15 @@ module Finitio
|
|
4
4
|
describe Inference do
|
5
5
|
|
6
6
|
let(:system) {
|
7
|
-
Finitio.system
|
8
|
-
@import finitio/data
|
7
|
+
Finitio.system <<~FIO
|
8
|
+
@import finitio/data
|
9
9
|
|
10
|
-
Nil = .NilClass
|
11
|
-
Boolean = .TrueClass|.FalseClass
|
12
|
-
Integer = .Integer
|
13
|
-
Date = .Date <iso8601> .String \\( s | Date.iso8601(s) )
|
14
|
-
|
15
|
-
String = .String
|
10
|
+
Nil = .NilClass
|
11
|
+
Boolean = .TrueClass|.FalseClass
|
12
|
+
Integer = .Integer
|
13
|
+
Date = .Date <iso8601> .String \\( s | Date.iso8601(s) )
|
14
|
+
\\( d | d.iso8601 )
|
15
|
+
String = .String
|
16
16
|
FIO
|
17
17
|
}
|
18
18
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Finitio
|
2
|
+
module JsonSchema
|
3
|
+
describe "AdType" do
|
4
|
+
|
5
|
+
let(:type) {
|
6
|
+
type = AdType.new(Color, [rgb_contract, hex_contract])
|
7
|
+
}
|
8
|
+
|
9
|
+
it 'works as expected' do
|
10
|
+
expect(type.to_json_schema).to eql({
|
11
|
+
anyOf: [
|
12
|
+
{ type: "integer" },
|
13
|
+
{ type: "string" }
|
14
|
+
]
|
15
|
+
})
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Finitio
|
2
|
+
module JsonSchema
|
3
|
+
describe "BuiltinType" do
|
4
|
+
|
5
|
+
let(:builtin_type) {
|
6
|
+
BuiltinType.new(ruby_type)
|
7
|
+
}
|
8
|
+
|
9
|
+
subject {
|
10
|
+
builtin_type.to_json_schema
|
11
|
+
}
|
12
|
+
|
13
|
+
context 'with NilClass' do
|
14
|
+
let(:ruby_type){ NilClass }
|
15
|
+
|
16
|
+
it 'works' do
|
17
|
+
expect(subject).to eql({ type: "null" })
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'with String' do
|
22
|
+
let(:ruby_type){ String }
|
23
|
+
|
24
|
+
it 'works' do
|
25
|
+
expect(subject).to eql({ type: "string" })
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
[Fixnum, Bignum, Integer].each do |rt|
|
30
|
+
context "with #{rt}" do
|
31
|
+
let(:ruby_type){ rt }
|
32
|
+
|
33
|
+
it 'works' do
|
34
|
+
expect(subject).to eql({ type: "integer" })
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
[Float, Numeric].each do |rt|
|
40
|
+
context "with #{rt}" do
|
41
|
+
let(:ruby_type){ rt }
|
42
|
+
|
43
|
+
it 'works' do
|
44
|
+
expect(subject).to eql({ type: "number" })
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Finitio
|
2
|
+
module JsonSchema
|
3
|
+
describe "MultiRelationType" do
|
4
|
+
|
5
|
+
context 'with a true allow extra and some optional attribute' do
|
6
|
+
let(:heading){
|
7
|
+
Heading.new([
|
8
|
+
Attribute.new(:a, anyType),
|
9
|
+
Attribute.new(:b, anyType, false),
|
10
|
+
], allow_extra: true)
|
11
|
+
}
|
12
|
+
|
13
|
+
let(:multi_relation_type) {
|
14
|
+
MultiRelationType.new(heading)
|
15
|
+
}
|
16
|
+
|
17
|
+
it 'works as expected' do
|
18
|
+
expect(multi_relation_type.to_json_schema).to eql({
|
19
|
+
type: "array",
|
20
|
+
items: {
|
21
|
+
type: "object",
|
22
|
+
properties: {
|
23
|
+
a: {},
|
24
|
+
b: {}
|
25
|
+
},
|
26
|
+
required: [:a],
|
27
|
+
additionalProperties: {}
|
28
|
+
},
|
29
|
+
uniqueItems: true
|
30
|
+
})
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'with a allow extra requiring Strings' do
|
35
|
+
let(:heading){
|
36
|
+
Heading.new([
|
37
|
+
], allow_extra: BuiltinType.new(String))
|
38
|
+
}
|
39
|
+
|
40
|
+
let(:multi_relation_type) {
|
41
|
+
MultiRelationType.new(heading)
|
42
|
+
}
|
43
|
+
|
44
|
+
it 'works as expected' do
|
45
|
+
expect(multi_relation_type.to_json_schema).to eql({
|
46
|
+
type: "array",
|
47
|
+
items: {
|
48
|
+
type: "object",
|
49
|
+
additionalProperties: { type: "string" }
|
50
|
+
},
|
51
|
+
uniqueItems: true
|
52
|
+
})
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Finitio
|
2
|
+
module JsonSchema
|
3
|
+
describe "MultiTupleType" do
|
4
|
+
|
5
|
+
context 'with a true allow extra and some optional attribute' do
|
6
|
+
let(:heading){
|
7
|
+
Heading.new([
|
8
|
+
Attribute.new(:a, anyType),
|
9
|
+
Attribute.new(:b, anyType, false),
|
10
|
+
], allow_extra: true)
|
11
|
+
}
|
12
|
+
|
13
|
+
let(:multi_tuple_type) {
|
14
|
+
MultiTupleType.new(heading)
|
15
|
+
}
|
16
|
+
|
17
|
+
it 'works as expected' do
|
18
|
+
expect(multi_tuple_type.to_json_schema).to eql({
|
19
|
+
type: "object",
|
20
|
+
properties: {
|
21
|
+
a: {},
|
22
|
+
b: {}
|
23
|
+
},
|
24
|
+
required: [:a],
|
25
|
+
additionalProperties: {}
|
26
|
+
})
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'with a allow extra requiring Strings' do
|
31
|
+
let(:heading){
|
32
|
+
Heading.new([
|
33
|
+
], allow_extra: BuiltinType.new(String))
|
34
|
+
}
|
35
|
+
|
36
|
+
let(:multi_tuple_type) {
|
37
|
+
MultiTupleType.new(heading)
|
38
|
+
}
|
39
|
+
|
40
|
+
it 'works as expected' do
|
41
|
+
expect(multi_tuple_type.to_json_schema).to eql({
|
42
|
+
type: "object",
|
43
|
+
additionalProperties: { type: "string" }
|
44
|
+
})
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Finitio
|
2
|
+
module JsonSchema
|
3
|
+
describe "RelationType" do
|
4
|
+
|
5
|
+
let(:heading){
|
6
|
+
Heading.new([Attribute.new(:a, anyType)])
|
7
|
+
}
|
8
|
+
|
9
|
+
let(:tuple_type) {
|
10
|
+
RelationType.new(heading)
|
11
|
+
}
|
12
|
+
|
13
|
+
it 'works as expected' do
|
14
|
+
expect(tuple_type.to_json_schema).to eql({
|
15
|
+
type: "array",
|
16
|
+
items: {
|
17
|
+
type: "object",
|
18
|
+
properties: {
|
19
|
+
a: {}
|
20
|
+
},
|
21
|
+
required: [:a],
|
22
|
+
additionalProperties: false
|
23
|
+
},
|
24
|
+
uniqueItems: true
|
25
|
+
})
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Finitio
|
2
|
+
module JsonSchema
|
3
|
+
describe "SetType" do
|
4
|
+
|
5
|
+
let(:type) {
|
6
|
+
SetType.new(anyType)
|
7
|
+
}
|
8
|
+
|
9
|
+
it 'works as expected' do
|
10
|
+
expect(type.to_json_schema).to eql({
|
11
|
+
type: "array",
|
12
|
+
items: {},
|
13
|
+
uniqueItems: true
|
14
|
+
})
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Finitio
|
2
|
+
module JsonSchema
|
3
|
+
describe "StructType" do
|
4
|
+
|
5
|
+
let(:type) {
|
6
|
+
StructType.new([anyType,anyType])
|
7
|
+
}
|
8
|
+
|
9
|
+
it 'works as expected' do
|
10
|
+
expect(type.to_json_schema).to eql({
|
11
|
+
type: "array",
|
12
|
+
items: [{},{}]
|
13
|
+
})
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Finitio
|
2
|
+
module JsonSchema
|
3
|
+
describe "TupleType" do
|
4
|
+
|
5
|
+
let(:heading){
|
6
|
+
Heading.new([Attribute.new(:a, anyType)])
|
7
|
+
}
|
8
|
+
|
9
|
+
let(:tuple_type) {
|
10
|
+
TupleType.new(heading)
|
11
|
+
}
|
12
|
+
|
13
|
+
it 'works as expected' do
|
14
|
+
expect(tuple_type.to_json_schema).to eql({
|
15
|
+
type: "object",
|
16
|
+
properties: {
|
17
|
+
a: {}
|
18
|
+
},
|
19
|
+
required: [:a],
|
20
|
+
additionalProperties: false
|
21
|
+
})
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -3,6 +3,7 @@ require 'path'
|
|
3
3
|
require 'finitio'
|
4
4
|
require 'finitio/syntax'
|
5
5
|
require 'finitio/generation'
|
6
|
+
require 'finitio/json_schema'
|
6
7
|
|
7
8
|
require 'coveralls'
|
8
9
|
Coveralls.wear!
|
@@ -126,7 +127,7 @@ module SpecHelpers
|
|
126
127
|
end
|
127
128
|
|
128
129
|
def hex_contract
|
129
|
-
@hex_contract ||= Finitio::Contract.new(
|
130
|
+
@hex_contract ||= Finitio::Contract.new(stringType, Color.method(:hex), Finitio::IDENTITY, :hex)
|
130
131
|
end
|
131
132
|
|
132
133
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: finitio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bernard Lambeau
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-12-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: citrus
|
@@ -65,6 +65,18 @@ files:
|
|
65
65
|
- lib/finitio/generation/sub_type.rb
|
66
66
|
- lib/finitio/generation/union_type.rb
|
67
67
|
- lib/finitio/inference.rb
|
68
|
+
- lib/finitio/json_schema.rb
|
69
|
+
- lib/finitio/json_schema/ad_type.rb
|
70
|
+
- lib/finitio/json_schema/alias_type.rb
|
71
|
+
- lib/finitio/json_schema/any_type.rb
|
72
|
+
- lib/finitio/json_schema/builtin_type.rb
|
73
|
+
- lib/finitio/json_schema/hash_based_type.rb
|
74
|
+
- lib/finitio/json_schema/rel_based_type.rb
|
75
|
+
- lib/finitio/json_schema/seq_type.rb
|
76
|
+
- lib/finitio/json_schema/set_type.rb
|
77
|
+
- lib/finitio/json_schema/struct_type.rb
|
78
|
+
- lib/finitio/json_schema/sub_type.rb
|
79
|
+
- lib/finitio/json_schema/union_type.rb
|
68
80
|
- lib/finitio/stdlib/finitio/data.fio
|
69
81
|
- lib/finitio/support.rb
|
70
82
|
- lib/finitio/support/attribute.rb
|
@@ -186,6 +198,19 @@ files:
|
|
186
198
|
- spec/heading/test_suppremum.rb
|
187
199
|
- spec/heading/test_to_name.rb
|
188
200
|
- spec/inference/test_inference.rb
|
201
|
+
- spec/json_schema/test_ad_type.rb
|
202
|
+
- spec/json_schema/test_alias_type.rb
|
203
|
+
- spec/json_schema/test_any_type.rb
|
204
|
+
- spec/json_schema/test_builtin_type.rb
|
205
|
+
- spec/json_schema/test_multi_relation_type.rb
|
206
|
+
- spec/json_schema/test_multi_tuple_type.rb
|
207
|
+
- spec/json_schema/test_relation_type.rb
|
208
|
+
- spec/json_schema/test_seq_type.rb
|
209
|
+
- spec/json_schema/test_set_type.rb
|
210
|
+
- spec/json_schema/test_struct_type.rb
|
211
|
+
- spec/json_schema/test_sub_type.rb
|
212
|
+
- spec/json_schema/test_tuple_type.rb
|
213
|
+
- spec/json_schema/test_union_type.rb
|
189
214
|
- spec/spec_helper.rb
|
190
215
|
- spec/support/test_compare_attrs.rb
|
191
216
|
- spec/support/test_proc_with_code.rb
|
@@ -350,13 +375,25 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
350
375
|
- !ruby/object:Gem::Version
|
351
376
|
version: '0'
|
352
377
|
requirements: []
|
353
|
-
|
354
|
-
rubygems_version: 2.7.6
|
378
|
+
rubygems_version: 3.1.2
|
355
379
|
signing_key:
|
356
380
|
specification_version: 4
|
357
381
|
summary: Finitio - in Ruby
|
358
382
|
test_files:
|
359
383
|
- spec/inference/test_inference.rb
|
384
|
+
- spec/json_schema/test_union_type.rb
|
385
|
+
- spec/json_schema/test_alias_type.rb
|
386
|
+
- spec/json_schema/test_builtin_type.rb
|
387
|
+
- spec/json_schema/test_set_type.rb
|
388
|
+
- spec/json_schema/test_multi_tuple_type.rb
|
389
|
+
- spec/json_schema/test_sub_type.rb
|
390
|
+
- spec/json_schema/test_relation_type.rb
|
391
|
+
- spec/json_schema/test_multi_relation_type.rb
|
392
|
+
- spec/json_schema/test_any_type.rb
|
393
|
+
- spec/json_schema/test_ad_type.rb
|
394
|
+
- spec/json_schema/test_seq_type.rb
|
395
|
+
- spec/json_schema/test_tuple_type.rb
|
396
|
+
- spec/json_schema/test_struct_type.rb
|
360
397
|
- spec/syntax/nodes/test_system.rb
|
361
398
|
- spec/syntax/nodes/test_union_type.rb
|
362
399
|
- spec/syntax/nodes/test_constraints.rb
|