finitio 0.8.0 → 0.11.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.
Files changed (40) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +28 -0
  3. data/Gemfile +0 -10
  4. data/Gemfile.lock +84 -37
  5. data/README.md +1 -2
  6. data/finitio.gemspec +9 -157
  7. data/lib/finitio/json_schema/ad_type.rb +11 -0
  8. data/lib/finitio/json_schema/alias_type.rb +9 -0
  9. data/lib/finitio/json_schema/any_type.rb +9 -0
  10. data/lib/finitio/json_schema/builtin_type.rb +30 -0
  11. data/lib/finitio/json_schema/hash_based_type.rb +25 -0
  12. data/lib/finitio/json_schema/proxy_type.rb +9 -0
  13. data/lib/finitio/json_schema/rel_based_type.rb +13 -0
  14. data/lib/finitio/json_schema/seq_type.rb +12 -0
  15. data/lib/finitio/json_schema/set_type.rb +13 -0
  16. data/lib/finitio/json_schema/struct_type.rb +12 -0
  17. data/lib/finitio/json_schema/sub_type.rb +10 -0
  18. data/lib/finitio/json_schema/union_type.rb +23 -0
  19. data/lib/finitio/json_schema.rb +17 -0
  20. data/lib/finitio/support/heading.rb +8 -2
  21. data/lib/finitio/syntax/lexer.citrus +1 -1
  22. data/lib/finitio/version.rb +2 -2
  23. data/spec/inference/test_inference.rb +8 -8
  24. data/spec/json_schema/test_ad_type.rb +20 -0
  25. data/spec/json_schema/test_alias_type.rb +15 -0
  26. data/spec/json_schema/test_any_type.rb +11 -0
  27. data/spec/json_schema/test_builtin_type.rb +51 -0
  28. data/spec/json_schema/test_multi_relation_type.rb +58 -0
  29. data/spec/json_schema/test_multi_tuple_type.rb +50 -0
  30. data/spec/json_schema/test_relation_type.rb +30 -0
  31. data/spec/json_schema/test_seq_type.rb +18 -0
  32. data/spec/json_schema/test_set_type.rb +19 -0
  33. data/spec/json_schema/test_struct_type.rb +18 -0
  34. data/spec/json_schema/test_sub_type.rb +17 -0
  35. data/spec/json_schema/test_tuple_type.rb +26 -0
  36. data/spec/json_schema/test_union_type.rb +75 -0
  37. data/spec/regression/test_heading_extra_are_proxy_resolved.rb +41 -0
  38. data/spec/spec_helper.rb +2 -1
  39. data/spec/syntax/nodes/test_attribute.rb +13 -1
  40. metadata +301 -156
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: 467a7c5d8dd70fe9b5de2154217a5594182150d6e9c9996ec85c861980c02ecc
4
- data.tar.gz: cadb1b56c039b7a88456f803733d9c0da9f7d879393674de0fc067c2fb71679b
2
+ SHA1:
3
+ metadata.gz: 67c8e3434a57c9b94e5175d34f6a20078c3ea3cd
4
+ data.tar.gz: 18e6c0cfc68d0ce75ec91c9e000a1a80db551a2f
5
5
  SHA512:
6
- metadata.gz: 4606b1f8de1df5a7712f8c6546252683928066a18e5e2ed91a96af2e68be552f66e3ccea26d8b6760e9ac5c073fffa416f06ae0ca8001bbac5ca4f2532469f1e
7
- data.tar.gz: 1d9436c52479abab152422d471b559724e72ea7d933ec8538cf2877e1fa14bebccfc6219dcf662c76758d167653cf47fe10b0332ee2cc118b6e18229826d5eed
6
+ metadata.gz: baa24a0c65ebe967e44dd30b6b0e381a7e9abcb2f43b3a27d1b3f573aa4f14aa718295f2efdd36846edcd87ca0920bf0f065add879d6058723ff13f93cad8ac6
7
+ data.tar.gz: dcb03256d1892b6c6f42321d53b7fedbf7a43219228c235f91643ab94fe22aee5d6d728c5e159817f3105dfa3aed2c20338ae6f6ba8c8a73ab186397b4674da4
data/CHANGELOG.md CHANGED
@@ -1,3 +1,31 @@
1
+ # 0.11.1 - 2021/12/09
2
+
3
+ * Fix github actions and extend test grid.
4
+
5
+ # 0.11.0 - 2021/12/09
6
+
7
+ * Fix json schema generation of Boolean and union types with a |Nil
8
+ * Add support for dashses in attribute names (tuple & relation types).
9
+
10
+ # 0.10.0 - 2021/01/11
11
+
12
+ * Upgrade all dependencies.
13
+
14
+ * Ruby < 2.3 is no longer supported.
15
+
16
+ * Fix code and build under Ruby 3.0.
17
+
18
+ # 0.9.1 - 2020/12/24
19
+
20
+ * Fixes a bug where proxy types are not properly resolved when used
21
+ in a heading extra, e.g. `{ ...: Proxy }`
22
+
23
+ # 0.9.0 - 2020/12/16
24
+
25
+ * Add Type#to_json_schema that converts Finitio types to JSON schema
26
+ representations. This first implementation skips all constraints on sub types,
27
+ though. You need to explicitly require 'finitio/json_schema' to use it.
28
+
1
29
  # 0.8.0 - 2019/10/21
2
30
 
3
31
  * Add `Type#unconstrained` that returns a super type with all user specific
data/Gemfile CHANGED
@@ -1,12 +1,2 @@
1
1
  source 'https://rubygems.org'
2
-
3
2
  gemspec
4
-
5
- group :development do
6
- gem "rake", "~> 10.0"
7
- gem "rspec", "~> 3.0"
8
- gem "cucumber", "~> 1.3"
9
- gem "path", "~> 1.3"
10
- gem "awesome_print", "~> 1.2"
11
- gem 'coveralls', require: false
12
- end
data/Gemfile.lock CHANGED
@@ -1,70 +1,117 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- finitio (0.8.0)
5
- citrus (>= 2.4, < 4.0)
4
+ finitio (0.11.1)
5
+ citrus (>= 3.0, < 4.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- awesome_print (1.8.0)
11
- builder (3.2.3)
10
+ activesupport (5.2.6)
11
+ concurrent-ruby (~> 1.0, >= 1.0.2)
12
+ i18n (>= 0.7, < 2)
13
+ minitest (~> 5.1)
14
+ tzinfo (~> 1.1)
15
+ awesome_print (1.9.2)
16
+ builder (3.2.4)
12
17
  citrus (3.0.2)
18
+ concurrent-ruby (1.1.9)
13
19
  coveralls (0.8.23)
14
20
  json (>= 1.8, < 3)
15
21
  simplecov (~> 0.16.1)
16
22
  term-ansicolor (~> 1.3)
17
23
  thor (>= 0.19.4, < 2.0)
18
24
  tins (~> 1.6)
19
- cucumber (1.3.20)
20
- builder (>= 2.1.2)
21
- diff-lcs (>= 1.1.3)
22
- gherkin (~> 2.12)
23
- multi_json (>= 1.7.5, < 2.0)
24
- multi_test (>= 0.1.2)
25
+ cucumber (4.1.0)
26
+ builder (~> 3.2, >= 3.2.3)
27
+ cucumber-core (~> 7.1, >= 7.1.0)
28
+ cucumber-create-meta (~> 1.0.0, >= 1.0.0)
29
+ cucumber-cucumber-expressions (~> 10.1, >= 10.1.0)
30
+ cucumber-gherkin (~> 14.0, >= 14.0.1)
31
+ cucumber-html-formatter (~> 7.0, >= 7.0.0)
32
+ cucumber-messages (~> 12.2, >= 12.2.0)
33
+ cucumber-wire (~> 3.1, >= 3.1.0)
34
+ diff-lcs (~> 1.3, >= 1.3, < 1.4)
35
+ multi_test (~> 0.1, >= 0.1.2)
36
+ sys-uname (~> 1.0, >= 1.0.2)
37
+ cucumber-core (7.1.0)
38
+ cucumber-gherkin (~> 14.0, >= 14.0.1)
39
+ cucumber-messages (~> 12.2, >= 12.2.0)
40
+ cucumber-tag-expressions (~> 2.0, >= 2.0.4)
41
+ cucumber-create-meta (1.0.0)
42
+ cucumber-messages (~> 12.2, >= 12.2.0)
43
+ sys-uname (~> 1.2, >= 1.2.1)
44
+ cucumber-cucumber-expressions (10.3.0)
45
+ cucumber-gherkin (14.2.0)
46
+ cucumber-messages (~> 12.4, >= 12.4.0)
47
+ cucumber-html-formatter (7.2.0)
48
+ cucumber-messages (~> 12.4, >= 12.4.0)
49
+ cucumber-messages (12.4.0)
50
+ protobuf-cucumber (~> 3.10, >= 3.10.8)
51
+ cucumber-tag-expressions (2.0.4)
52
+ cucumber-wire (3.1.0)
53
+ cucumber-core (~> 7.1, >= 7.1.0)
54
+ cucumber-cucumber-expressions (~> 10.1, >= 10.1.0)
55
+ cucumber-messages (~> 12.2, >= 12.2.0)
25
56
  diff-lcs (1.3)
26
- docile (1.3.1)
27
- gherkin (2.12.2)
28
- multi_json (~> 1.3)
29
- json (2.2.0)
30
- multi_json (1.13.1)
57
+ docile (1.3.5)
58
+ ffi (1.15.4)
59
+ i18n (1.8.11)
60
+ concurrent-ruby (~> 1.0)
61
+ json (2.6.1)
62
+ middleware (0.1.0)
63
+ minitest (5.14.4)
64
+ multi_json (1.15.0)
31
65
  multi_test (0.1.2)
32
- path (1.3.3)
33
- rake (10.5.0)
34
- rspec (3.8.0)
35
- rspec-core (~> 3.8.0)
36
- rspec-expectations (~> 3.8.0)
37
- rspec-mocks (~> 3.8.0)
38
- rspec-core (3.8.0)
39
- rspec-support (~> 3.8.0)
40
- rspec-expectations (3.8.3)
66
+ path (2.0.1)
67
+ protobuf-cucumber (3.10.8)
68
+ activesupport (>= 3.2)
69
+ middleware
70
+ thor
71
+ thread_safe
72
+ rake (13.0.6)
73
+ rspec (3.10.0)
74
+ rspec-core (~> 3.10.0)
75
+ rspec-expectations (~> 3.10.0)
76
+ rspec-mocks (~> 3.10.0)
77
+ rspec-core (3.10.1)
78
+ rspec-support (~> 3.10.0)
79
+ rspec-expectations (3.10.1)
41
80
  diff-lcs (>= 1.2.0, < 2.0)
42
- rspec-support (~> 3.8.0)
43
- rspec-mocks (3.8.0)
81
+ rspec-support (~> 3.10.0)
82
+ rspec-mocks (3.10.2)
44
83
  diff-lcs (>= 1.2.0, < 2.0)
45
- rspec-support (~> 3.8.0)
46
- rspec-support (3.8.0)
84
+ rspec-support (~> 3.10.0)
85
+ rspec-support (3.10.3)
47
86
  simplecov (0.16.1)
48
87
  docile (~> 1.1)
49
88
  json (>= 1.8, < 3)
50
89
  simplecov-html (~> 0.10.0)
51
90
  simplecov-html (0.10.2)
91
+ sync (0.5.0)
92
+ sys-uname (1.2.2)
93
+ ffi (~> 1.1)
52
94
  term-ansicolor (1.7.1)
53
95
  tins (~> 1.0)
54
- thor (0.20.3)
55
- tins (1.20.2)
96
+ thor (1.1.0)
97
+ thread_safe (0.3.6)
98
+ tins (1.29.1)
99
+ sync
100
+ tzinfo (1.2.9)
101
+ thread_safe (~> 0.1)
56
102
 
57
103
  PLATFORMS
58
- ruby
104
+ x86_64-linux
59
105
 
60
106
  DEPENDENCIES
61
- awesome_print (~> 1.2)
62
- coveralls
63
- cucumber (~> 1.3)
107
+ awesome_print (~> 1.8)
108
+ coveralls (~> 0.8)
109
+ cucumber (~> 4.1)
64
110
  finitio!
65
- path (~> 1.3)
66
- rake (~> 10.0)
111
+ multi_json (~> 1.15)
112
+ path (>= 2.0, < 3.0)
113
+ rake (~> 13.0)
67
114
  rspec (~> 3.0)
68
115
 
69
116
  BUNDLED WITH
70
- 2.0.1
117
+ 2.2.33
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
- [![Build Status](https://travis-ci.org/blambeau/finitio-rb.png)](https://travis-ci.org/blambeau/finitio-rb)
2
- [![Dependency Status](https://gemnasium.com/blambeau/finitio-rb.png)](https://gemnasium.com/blambeau/finitio-rb)
1
+ [![Build Status](https://travis-ci.org/blambeau/finitio-rb.svg?branch=master)](https://travis-ci.org/blambeau/finitio-rb)
3
2
  [![Code Climate](https://codeclimate.com/github/blambeau/finitio-rb.png)](https://codeclimate.com/github/blambeau/finitio-rb)
4
3
  [![Coverage Status](https://coveralls.io/repos/blambeau/finitio-rb/badge.png?branch=master)](https://coveralls.io/r/blambeau/finitio-rb)
5
4
 
data/finitio.gemspec CHANGED
@@ -1,186 +1,38 @@
1
- # We require your library, mainly to have access to the VERSION number.
2
- # Feel free to set $version manually.
3
1
  $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
4
2
  require "finitio/version"
5
3
  $version = Finitio::Version.to_s
6
4
 
7
- #
8
- # This is your Gem specification. Default values are provided so that your library
9
- # should be correctly packaged given what you have described in the .noespec file.
10
- #
11
5
  Gem::Specification.new do |s|
12
-
13
- ################################################################### ABOUT YOUR GEM
14
-
15
- # Gem name (required)
16
6
  s.name = "finitio"
17
-
18
- # Gem version (required)
19
7
  s.version = $version
20
-
21
- # A short summary of this gem
22
- #
23
- # This is displayed in `gem list -d`.
24
8
  s.summary = "Finitio - in Ruby"
25
-
26
- # A long description of this gem (required)
27
- #
28
- # The description should be more detailed than the summary. For example,
29
- # you might wish to copy the entire README into the description.
30
9
  s.description = "Implements the Finitio information language in Ruby."
31
-
32
- # The URL of this gem home page (optional)
33
10
  s.homepage = "https://github.com/blambeau/finitio"
34
-
35
- # Gem publication date (required but auto)
36
- #
37
- # Today is automatically used by default, uncomment only if
38
- # you know what you do!
39
- #
40
- # s.date = Time.now.strftime('%Y-%m-%d')
41
-
42
- # The license(s) for the library. Each license must be a short name, no
43
- # more than 64 characters.
44
- #
45
- # s.licences = %w{}
46
-
47
- # The rubyforge project this gem lives under (optional)
48
- #
49
- # s.rubyforge_project = nil
50
-
51
- ################################################################### ABOUT THE AUTHORS
52
-
53
- # The list of author names who wrote this gem.
54
- #
55
- # If you are providing multiple authors and multiple emails they should be
56
- # in the same order.
57
- #
58
11
  s.authors = ["Bernard Lambeau"]
59
-
60
- # Contact emails for this gem
61
- #
62
- # If you are providing multiple authors and multiple emails they should be
63
- # in the same order.
64
- #
65
- # NOTE: Somewhat strangly this attribute is always singular!
66
- # Don't replace by s.emails = ...
67
12
  s.email = ["blambeau@gmail.com"]
68
-
69
- ################################################################### PATHS, FILES, BINARIES
70
-
71
- # Paths in the gem to add to $LOAD_PATH when this gem is
72
- # activated (required).
73
- #
74
- # The default 'lib' is typically sufficient.
75
13
  s.require_paths = ["lib"]
76
-
77
- # Files included in this gem.
78
- #
79
- # By default, we take all files included in the Manifest.txt file on root
80
- # of the project. Entries of the manifest are interpreted as Dir[...]
81
- # patterns so that lazy people may use wilcards like lib/**/*
82
- #
83
14
  here = File.expand_path(File.dirname(__FILE__))
84
15
  s.files = File.readlines(File.join(here, 'Manifest.txt')).
85
16
  inject([]){|files, pattern| files + Dir[File.join(here, pattern.strip)]}.
86
17
  collect{|x| x[(1+here.size)..-1]}
87
18
 
88
- # Test files included in this gem.
89
- #
90
19
  s.test_files = Dir["test/**/*"] + Dir["spec/**/*"]
91
-
92
- # The path in the gem for executable scripts (optional)
93
- #
94
20
  s.bindir = "bin"
95
-
96
- # Executables included in the gem.
97
- #
98
21
  s.executables = (Dir["bin/*"]).collect{|f| File.basename(f)}
99
-
100
- ################################################################### REQUIREMENTS & INSTALL
101
- # Remember the gem version requirements operators and schemes:
102
- # = Equals version
103
- # != Not equal to version
104
- # > Greater than version
105
- # < Less than version
106
- # >= Greater than or equal to
107
- # <= Less than or equal to
108
- # ~> Approximately greater than
109
- #
110
- # Don't forget to have a look at http://lmgtfy.com/?q=Ruby+Versioning+Policies
111
- # for setting your gem version.
112
- #
113
- # For your requirements to other gems, remember that
114
- # ">= 2.2.0" (optimistic: specify minimal version)
115
- # ">= 2.2.0", "< 3.0" (pessimistic: not greater than the next major)
116
- # "~> 2.2" (shortcut for ">= 2.2.0", "< 3.0")
117
- # "~> 2.2.0" (shortcut for ">= 2.2.0", "< 2.3.0")
118
- #
119
- s.add_dependency("citrus", ">= 2.4", "< 4.0")
120
-
121
- #
122
- # One call to add_dependency('gem_name', 'gem version requirement') for each
123
- # runtime dependency. These gems will be installed with your gem.
124
- # One call to add_development_dependency('gem_name', 'gem version requirement')
125
- # for each development dependency. These gems are required for developers
126
- #
127
- # We use Gemfile for development dependencies.
128
22
 
23
+ s.add_dependency("citrus", ">= 3.0", "< 4.0")
24
+
25
+ s.add_development_dependency("rake", "~> 13.0")
26
+ s.add_development_dependency("rspec", "~> 3.0")
27
+ s.add_development_dependency("cucumber", "~> 4.1")
28
+ s.add_development_dependency("path", ">= 2.0", "< 3.0")
29
+ s.add_development_dependency("awesome_print", "~> 1.8")
30
+ s.add_development_dependency("coveralls", "~> 0.8")
31
+ s.add_development_dependency("multi_json", "~> 1.15")
129
32
 
130
- # The version of ruby required by this gem
131
- #
132
- # Uncomment and set this if your gem requires specific ruby versions.
133
- #
134
- # s.required_ruby_version = ">= 0"
135
-
136
- # The RubyGems version required by this gem
137
- #
138
- # s.required_rubygems_version = ">= 0"
139
-
140
- # The platform this gem runs on. See Gem::Platform for details.
141
- #
142
- # s.platform = nil
143
-
144
- # Extensions to build when installing the gem.
145
- #
146
- # Valid types of extensions are extconf.rb files, configure scripts
147
- # and rakefiles or mkrf_conf files.
148
- #
149
33
  s.extensions = []
150
-
151
- # External (to RubyGems) requirements that must be met for this gem to work.
152
- # It’s simply information for the user.
153
- #
154
34
  s.requirements = nil
155
-
156
- # A message that gets displayed after the gem is installed
157
- #
158
- # Uncomment and set this if you want to say something to the user
159
- # after gem installation
160
- #
161
35
  s.post_install_message = nil
162
-
163
- ################################################################### SECURITY
164
-
165
- # The key used to sign this gem. See Gem::Security for details.
166
- #
167
- # s.signing_key = nil
168
-
169
- # The certificate chain used to sign this gem. See Gem::Security for
170
- # details.
171
- #
172
- # s.cert_chain = []
173
-
174
- ################################################################### RDOC
175
-
176
- # An ARGV style array of options to RDoc
177
- #
178
- # See 'rdoc --help' about this
179
- #
180
36
  s.rdoc_options = []
181
-
182
- # Extra files to add to RDoc such as README
183
- #
184
37
  s.extra_rdoc_files = Dir["README.md"] + Dir["CHANGELOG.md"] + Dir["LICENCE.md"]
185
-
186
38
  end
@@ -0,0 +1,11 @@
1
+ module Finitio
2
+ class AdType
3
+
4
+ def to_json_schema(*args, &bl)
5
+ {
6
+ anyOf: contracts.map{|c| c.infotype.to_json_schema(*args, &bl) }
7
+ }
8
+ end
9
+
10
+ end # class AdType
11
+ end # module Finitio
@@ -0,0 +1,9 @@
1
+ module Finitio
2
+ class AliasType
3
+
4
+ def to_json_schema(*args, &bl)
5
+ target.to_json_schema(*args, &bl)
6
+ end
7
+
8
+ end # class AliasType
9
+ end # module Finitio
@@ -0,0 +1,9 @@
1
+ module Finitio
2
+ class AnyType
3
+
4
+ def to_json_schema(*args, &bl)
5
+ {}
6
+ end
7
+
8
+ end # class AnyType
9
+ end # module Finitio
@@ -0,0 +1,30 @@
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
+ TrueClass => "boolean",
13
+ FalseClass => "boolean",
14
+ Object => "object"
15
+ }
16
+
17
+ end
18
+ class BuiltinType
19
+
20
+ def to_json_schema(*args, &bl)
21
+ mapped = JsonSchema::BUILTIN_MAPPING[ruby_type]
22
+ if mapped
23
+ { type: mapped }
24
+ else
25
+ raise JsonSchema::Error, "Unable to map #{ruby_type} to json-schema"
26
+ end
27
+ end
28
+
29
+ end # class BuiltinType
30
+ 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
@@ -0,0 +1,9 @@
1
+ module Finitio
2
+ class ProxyType
3
+
4
+ def to_json_schema(*args, &bl)
5
+ @target.to_json_schema(*args, &bl) if @target
6
+ end
7
+
8
+ end # module ProxyType
9
+ end # module UnionType
@@ -0,0 +1,13 @@
1
+ module Finitio
2
+ module RelBasedType
3
+
4
+ def to_json_schema(*args, &bl)
5
+ {
6
+ type: "array",
7
+ items: tuple_type.to_json_schema(*args, &bl),
8
+ uniqueItems: true
9
+ }
10
+ end
11
+
12
+ end # module RelBasedType
13
+ end # module Finitio
@@ -0,0 +1,12 @@
1
+ module Finitio
2
+ class SeqType
3
+
4
+ def to_json_schema(*args, &bl)
5
+ {
6
+ type: "array",
7
+ items: elm_type.to_json_schema(*args, &bl)
8
+ }
9
+ end
10
+
11
+ end # class SeqType
12
+ end # module Finitio
@@ -0,0 +1,13 @@
1
+ module Finitio
2
+ class SetType
3
+
4
+ def to_json_schema(*args, &bl)
5
+ {
6
+ type: "array",
7
+ items: elm_type.to_json_schema(*args, &bl),
8
+ uniqueItems: true
9
+ }
10
+ end
11
+
12
+ end # class SetType
13
+ end # module Finitio
@@ -0,0 +1,12 @@
1
+ module Finitio
2
+ class StructType
3
+
4
+ def to_json_schema(*args, &bl)
5
+ {
6
+ type: "array",
7
+ items: component_types.map{|c| c.to_json_schema(*args, &bl) }
8
+ }
9
+ end
10
+
11
+ end # class StructType
12
+ end # module Finitio
@@ -0,0 +1,10 @@
1
+ module Finitio
2
+ class SubType
3
+
4
+ def to_json_schema(*args, &bl)
5
+ # TODO: add support for constraints here...
6
+ super_type.to_json_schema(*args, &bl)
7
+ end
8
+
9
+ end # class SubType
10
+ end # module Finitio
@@ -0,0 +1,23 @@
1
+ module Finitio
2
+ class UnionType
3
+
4
+ NIL_TYPE = BuiltinType.new(NilClass)
5
+
6
+ FALSE_TYPE = BuiltinType.new(TrueClass)
7
+
8
+ TRUE_TYPE = BuiltinType.new(FalseClass)
9
+
10
+ BOOLEAN_TYPE = UnionType.new([TRUE_TYPE, FALSE_TYPE])
11
+
12
+ def to_json_schema(*args, &bl)
13
+ cs = candidates.reject{|c| c == NIL_TYPE }
14
+ return { type: 'boolean'} if self == BOOLEAN_TYPE
15
+ return cs.first.to_json_schema(*args, &bl) if cs.size == 1
16
+
17
+ {
18
+ anyOf: cs.map{|c| c.to_json_schema(*args, &bl) }
19
+ }
20
+ end
21
+
22
+ end # class UnionType
23
+ end # module Finitio
@@ -0,0 +1,17 @@
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'
17
+ require_relative 'json_schema/proxy_type'
@@ -100,8 +100,14 @@ module Finitio
100
100
  protected :attributes, :options
101
101
 
102
102
  def resolve_proxies(system)
103
- as = attributes.map{|k,a| a.resolve_proxies(system) }
104
- Heading.new(as, options)
103
+ as = attributes.map{|k,a|
104
+ a.resolve_proxies(system)
105
+ }
106
+ opts = options.dup
107
+ if options[:allow_extra] && options[:allow_extra].is_a?(Type)
108
+ opts[:allow_extra] = opts[:allow_extra].resolve_proxies(system)
109
+ end
110
+ Heading.new(as, opts)
105
111
  end
106
112
 
107
113
  def unconstrained
@@ -21,7 +21,7 @@ grammar Finitio::Syntax::Lexer
21
21
  end
22
22
 
23
23
  rule attribute_name
24
- /[a-z_][a-zA-Z0-9_]*/
24
+ /[a-z_][a-zA-Z0-9_\-]*/
25
25
  end
26
26
 
27
27
  rule type_name
@@ -2,8 +2,8 @@ module Finitio
2
2
  module Version
3
3
 
4
4
  MAJOR = 0
5
- MINOR = 8
6
- TINY = 0
5
+ MINOR = 11
6
+ TINY = 1
7
7
 
8
8
  def self.to_s
9
9
  [ MAJOR, MINOR, TINY ].join('.')