jsi 0.8.2 → 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/.yardopts +3 -2
- data/CHANGELOG.md +8 -3
- data/LICENSE.md +2 -3
- data/README.md +68 -31
- data/docs/Glossary.md +313 -0
- data/jsi.gemspec +1 -0
- data/lib/jsi/base/mutability.rb +4 -0
- data/lib/jsi/base/node.rb +63 -24
- data/lib/jsi/base.rb +556 -173
- data/lib/jsi/metaschema_node/bootstrap_schema.rb +106 -56
- data/lib/jsi/metaschema_node.rb +227 -160
- data/lib/jsi/ptr.rb +32 -15
- data/lib/jsi/ref.rb +197 -0
- data/lib/jsi/registry.rb +311 -0
- data/lib/jsi/schema/cxt/child_application.rb +35 -0
- data/lib/jsi/schema/cxt/inplace_application.rb +37 -0
- data/lib/jsi/schema/cxt.rb +80 -0
- data/lib/jsi/schema/dialect.rb +137 -0
- data/lib/jsi/schema/draft04.rb +113 -5
- data/lib/jsi/schema/draft06.rb +123 -5
- data/lib/jsi/schema/draft07.rb +157 -5
- data/lib/jsi/schema/draft202012.rb +303 -0
- data/lib/jsi/schema/dynamic_anchor_map.rb +63 -0
- data/lib/jsi/schema/element.rb +69 -0
- data/lib/jsi/schema/elements/anchor.rb +13 -0
- data/lib/jsi/schema/elements/array_validation.rb +82 -0
- data/lib/jsi/schema/elements/comment.rb +10 -0
- data/lib/jsi/schema/{validation → elements}/const.rb +11 -7
- data/lib/jsi/schema/elements/contains.rb +59 -0
- data/lib/jsi/schema/elements/contains_minmax.rb +91 -0
- data/lib/jsi/schema/elements/content_encoding.rb +10 -0
- data/lib/jsi/schema/elements/content_media_type.rb +10 -0
- data/lib/jsi/schema/elements/content_schema.rb +16 -0
- data/lib/jsi/schema/elements/default.rb +11 -0
- data/lib/jsi/schema/elements/definitions.rb +19 -0
- data/lib/jsi/schema/elements/dependencies.rb +99 -0
- data/lib/jsi/schema/elements/dependent_required.rb +49 -0
- data/lib/jsi/schema/elements/dependent_schemas.rb +69 -0
- data/lib/jsi/schema/elements/dynamic_ref.rb +69 -0
- data/lib/jsi/schema/elements/enum.rb +26 -0
- data/lib/jsi/schema/elements/examples.rb +10 -0
- data/lib/jsi/schema/elements/format.rb +10 -0
- data/lib/jsi/schema/elements/id.rb +30 -0
- data/lib/jsi/schema/elements/if_then_else.rb +82 -0
- data/lib/jsi/schema/elements/info_bool.rb +10 -0
- data/lib/jsi/schema/elements/info_string.rb +10 -0
- data/lib/jsi/schema/elements/items.rb +93 -0
- data/lib/jsi/schema/elements/items_prefixed.rb +96 -0
- data/lib/jsi/schema/elements/not.rb +31 -0
- data/lib/jsi/schema/elements/numeric.rb +137 -0
- data/lib/jsi/schema/elements/numeric_draft04.rb +77 -0
- data/lib/jsi/schema/elements/object_validation.rb +55 -0
- data/lib/jsi/schema/elements/pattern.rb +35 -0
- data/lib/jsi/schema/elements/properties.rb +145 -0
- data/lib/jsi/schema/elements/property_names.rb +48 -0
- data/lib/jsi/schema/elements/ref.rb +62 -0
- data/lib/jsi/schema/elements/required.rb +34 -0
- data/lib/jsi/schema/elements/self.rb +24 -0
- data/lib/jsi/schema/elements/some_of.rb +180 -0
- data/lib/jsi/schema/elements/string_validation.rb +57 -0
- data/lib/jsi/schema/elements/type.rb +43 -0
- data/lib/jsi/schema/elements/unevaluated_items.rb +54 -0
- data/lib/jsi/schema/elements/unevaluated_properties.rb +54 -0
- data/lib/jsi/schema/elements/xschema.rb +10 -0
- data/lib/jsi/schema/elements/xvocabulary.rb +10 -0
- data/lib/jsi/schema/elements.rb +101 -0
- data/lib/jsi/schema/issue.rb +3 -4
- data/lib/jsi/schema/schema_ancestor_node.rb +103 -50
- data/lib/jsi/schema/vocabulary.rb +36 -0
- data/lib/jsi/schema.rb +519 -337
- data/lib/jsi/schema_classes.rb +168 -124
- data/lib/jsi/schema_set.rb +67 -126
- data/lib/jsi/set.rb +23 -0
- data/lib/jsi/simple_wrap.rb +13 -16
- data/lib/jsi/struct.rb +57 -0
- data/lib/jsi/uri.rb +40 -0
- data/lib/jsi/util/private/memo_map.rb +9 -13
- data/lib/jsi/util/private.rb +57 -12
- data/lib/jsi/util/typelike.rb +19 -64
- data/lib/jsi/util.rb +52 -34
- data/lib/jsi/validation/error.rb +41 -2
- data/lib/jsi/validation/result.rb +118 -71
- data/lib/jsi/validation.rb +1 -6
- data/lib/jsi/version.rb +1 -1
- data/lib/jsi.rb +158 -41
- data/lib/schemas/json-schema.org/draft/2020-12/schema.rb +67 -0
- data/lib/schemas/json-schema.org/draft-04/schema.rb +63 -106
- data/lib/schemas/json-schema.org/draft-06/schema.rb +56 -105
- data/lib/schemas/json-schema.org/draft-07/schema.rb +67 -124
- data/readme.rb +3 -3
- data/{resources}/schemas/2020-12_strict.json +19 -0
- data/{resources}/schemas/json-schema.org/draft/2020-12/meta/applicator.json +48 -0
- data/{resources}/schemas/json-schema.org/draft/2020-12/meta/content.json +17 -0
- data/{resources}/schemas/json-schema.org/draft/2020-12/meta/core.json +51 -0
- data/{resources}/schemas/json-schema.org/draft/2020-12/meta/format-annotation.json +14 -0
- data/{resources}/schemas/json-schema.org/draft/2020-12/meta/format-assertion.json +14 -0
- data/{resources}/schemas/json-schema.org/draft/2020-12/meta/meta-data.json +37 -0
- data/{resources}/schemas/json-schema.org/draft/2020-12/meta/unevaluated.json +15 -0
- data/{resources}/schemas/json-schema.org/draft/2020-12/meta/validation.json +98 -0
- data/{resources}/schemas/json-schema.org/draft/2020-12/schema.json +58 -0
- metadata +69 -47
- data/lib/jsi/schema/application/child_application/contains.rb +0 -25
- data/lib/jsi/schema/application/child_application/draft04.rb +0 -21
- data/lib/jsi/schema/application/child_application/draft06.rb +0 -28
- data/lib/jsi/schema/application/child_application/draft07.rb +0 -28
- data/lib/jsi/schema/application/child_application/items.rb +0 -18
- data/lib/jsi/schema/application/child_application/properties.rb +0 -25
- data/lib/jsi/schema/application/child_application.rb +0 -13
- data/lib/jsi/schema/application/draft04.rb +0 -8
- data/lib/jsi/schema/application/draft06.rb +0 -8
- data/lib/jsi/schema/application/draft07.rb +0 -8
- data/lib/jsi/schema/application/inplace_application/dependencies.rb +0 -28
- data/lib/jsi/schema/application/inplace_application/draft04.rb +0 -25
- data/lib/jsi/schema/application/inplace_application/draft06.rb +0 -26
- data/lib/jsi/schema/application/inplace_application/draft07.rb +0 -32
- data/lib/jsi/schema/application/inplace_application/ifthenelse.rb +0 -20
- data/lib/jsi/schema/application/inplace_application/ref.rb +0 -18
- data/lib/jsi/schema/application/inplace_application/someof.rb +0 -44
- data/lib/jsi/schema/application/inplace_application.rb +0 -14
- data/lib/jsi/schema/application.rb +0 -12
- data/lib/jsi/schema/ref.rb +0 -186
- data/lib/jsi/schema/validation/array.rb +0 -69
- data/lib/jsi/schema/validation/contains.rb +0 -25
- data/lib/jsi/schema/validation/dependencies.rb +0 -49
- data/lib/jsi/schema/validation/draft04/minmax.rb +0 -93
- data/lib/jsi/schema/validation/draft04.rb +0 -110
- data/lib/jsi/schema/validation/draft06.rb +0 -120
- data/lib/jsi/schema/validation/draft07.rb +0 -157
- data/lib/jsi/schema/validation/enum.rb +0 -25
- data/lib/jsi/schema/validation/ifthenelse.rb +0 -46
- data/lib/jsi/schema/validation/items.rb +0 -54
- data/lib/jsi/schema/validation/not.rb +0 -20
- data/lib/jsi/schema/validation/numeric.rb +0 -121
- data/lib/jsi/schema/validation/object.rb +0 -45
- data/lib/jsi/schema/validation/pattern.rb +0 -34
- data/lib/jsi/schema/validation/properties.rb +0 -101
- data/lib/jsi/schema/validation/property_names.rb +0 -32
- data/lib/jsi/schema/validation/ref.rb +0 -40
- data/lib/jsi/schema/validation/required.rb +0 -27
- data/lib/jsi/schema/validation/someof.rb +0 -90
- data/lib/jsi/schema/validation/string.rb +0 -47
- data/lib/jsi/schema/validation/type.rb +0 -49
- data/lib/jsi/schema/validation.rb +0 -49
- data/lib/jsi/schema_registry.rb +0 -200
- data/lib/jsi/util/private/attr_struct.rb +0 -141
data/lib/jsi/validation.rb
CHANGED
|
@@ -3,13 +3,8 @@
|
|
|
3
3
|
module JSI
|
|
4
4
|
module Validation
|
|
5
5
|
autoload :Error, 'jsi/validation/error'
|
|
6
|
-
|
|
7
6
|
autoload :Result, 'jsi/validation/result'
|
|
8
|
-
autoload :FullResult, 'jsi/validation/result'
|
|
9
|
-
autoload :ValidityResult, 'jsi/validation/result'
|
|
10
|
-
|
|
11
|
-
VALID = ValidityResult.new(true).freeze
|
|
12
7
|
|
|
13
|
-
INVALID =
|
|
8
|
+
INVALID = Result::Invalid.new.freeze
|
|
14
9
|
end
|
|
15
10
|
end
|
data/lib/jsi/version.rb
CHANGED
data/lib/jsi.rb
CHANGED
|
@@ -8,18 +8,61 @@ require "pathname"
|
|
|
8
8
|
require "bigdecimal"
|
|
9
9
|
require "addressable/uri"
|
|
10
10
|
|
|
11
|
-
module JSI
|
|
11
|
+
module JSI::Error
|
|
12
12
|
# generally put in code paths that are not expected to be valid control flow paths.
|
|
13
13
|
# rather a NotImplementedCorrectlyError. but that's too long.
|
|
14
14
|
#
|
|
15
15
|
# if you've found this class because JSI has raised this error, please open an issue with the backtrace
|
|
16
16
|
# and any context you can provide at https://github.com/notEthan/jsi/issues
|
|
17
17
|
class Bug < NotImplementedError
|
|
18
|
+
# implementation note: use `fail` with Bug instead of `raise` to avoid
|
|
19
|
+
# YARD's ExceptionHandler adding an inferred `@raise` tag for it.
|
|
18
20
|
end
|
|
19
21
|
|
|
20
22
|
# @private TODO remove, any ruby without this is already long EOL
|
|
21
23
|
FrozenError = Object.const_defined?(:FrozenError) ? ::FrozenError : Class.new(StandardError)
|
|
22
24
|
|
|
25
|
+
class BlockGivenError < ArgumentError
|
|
26
|
+
def initialize(msg = "Block given to a method that does not yield", *)
|
|
27
|
+
super
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# A reference or pointer cannot be resolved
|
|
32
|
+
class ResolutionError < StandardError
|
|
33
|
+
# @param msg [String, Array]
|
|
34
|
+
# @param uri [URI, nil]
|
|
35
|
+
def initialize(msg = nil, *a, uri: nil)
|
|
36
|
+
super([*msg].compact.join("\n"), *a)
|
|
37
|
+
@uri = JSI::Util.uri(uri, nnil: false)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# @return [URI, nil]
|
|
41
|
+
attr_accessor(:uri)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# A URI does not meet some requirement where it is used - absent
|
|
45
|
+
# when it's required, relative when it must be absolute, etc.
|
|
46
|
+
class URIError < Addressable::URI::InvalidURIError
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# A schema instance is not valid against schemas that describe it
|
|
50
|
+
class Invalid < StandardError
|
|
51
|
+
# @param result [Validation::Result]
|
|
52
|
+
def initialize(result, *a, &b)
|
|
53
|
+
@result = result
|
|
54
|
+
super(result.pretty_inspect.chomp, *a, &b)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
attr_reader(:result)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
module JSI
|
|
62
|
+
include(Error)
|
|
63
|
+
# include(Error) doesn't make its constants available in nested namespaces; fix
|
|
64
|
+
Error.constants.each { |n| const_set(n, const_get(n)) }
|
|
65
|
+
|
|
23
66
|
# @private
|
|
24
67
|
ROOT_PATH = Pathname.new(__FILE__).dirname.parent.expand_path
|
|
25
68
|
|
|
@@ -33,14 +76,17 @@ module JSI
|
|
|
33
76
|
Util.deep_to_frozen(content, not_implemented: proc do |instance|
|
|
34
77
|
raise(ArgumentError, [
|
|
35
78
|
"JSI does not know how to make the given instance immutable.",
|
|
36
|
-
"See new_jsi / new_schema
|
|
79
|
+
"See new_jsi / new_schema `mutable` param and `to_immutable` configuration documentation for options.",
|
|
37
80
|
"https://www.rubydoc.info/gems/jsi/#{VERSION}/JSI/SchemaSet#new_jsi-instance_method",
|
|
38
81
|
"Given instance: #{instance.pretty_inspect.chomp}",
|
|
39
82
|
].join("\n"))
|
|
40
83
|
end)
|
|
41
84
|
end
|
|
42
85
|
|
|
86
|
+
autoload(:URI, 'jsi/uri')
|
|
43
87
|
autoload :Util, 'jsi/util'
|
|
88
|
+
autoload(:Set, 'jsi/set')
|
|
89
|
+
autoload(:Struct, 'jsi/struct')
|
|
44
90
|
autoload :Ptr, 'jsi/ptr'
|
|
45
91
|
autoload :Schema, 'jsi/schema'
|
|
46
92
|
autoload :SchemaSet, 'jsi/schema_set'
|
|
@@ -48,75 +94,146 @@ module JSI
|
|
|
48
94
|
autoload(:MetaSchemaNode, 'jsi/metaschema_node')
|
|
49
95
|
autoload :SchemaModule, 'jsi/schema_classes'
|
|
50
96
|
autoload :SchemaClasses, 'jsi/schema_classes'
|
|
51
|
-
autoload
|
|
97
|
+
autoload(:Registry, 'jsi/registry')
|
|
98
|
+
autoload(:SchemaRegistry, 'jsi/registry')
|
|
99
|
+
autoload(:Ref, 'jsi/ref')
|
|
52
100
|
autoload :Validation, 'jsi/validation'
|
|
53
101
|
autoload :JSICoder, 'jsi/jsi_coder'
|
|
54
102
|
|
|
55
103
|
autoload :JSONSchemaDraft04, 'schemas/json-schema.org/draft-04/schema'
|
|
56
104
|
autoload :JSONSchemaDraft06, 'schemas/json-schema.org/draft-06/schema'
|
|
57
105
|
autoload :JSONSchemaDraft07, 'schemas/json-schema.org/draft-07/schema'
|
|
58
|
-
autoload
|
|
59
|
-
autoload :JSONSchemaOrgDraft06, 'schemas/json-schema.org/draft-06/schema'
|
|
60
|
-
autoload :JSONSchemaOrgDraft07, 'schemas/json-schema.org/draft-07/schema'
|
|
106
|
+
autoload(:JSONSchemaDraft202012, 'schemas/json-schema.org/draft/2020-12/schema')
|
|
61
107
|
|
|
62
108
|
autoload :SimpleWrap, 'jsi/simple_wrap'
|
|
63
109
|
|
|
64
110
|
# Instantiates the given schema content as a JSI Schema, passing all params to
|
|
65
111
|
# {JSI.new_schema}, and returns its {Schema#jsi_schema_module JSI Schema Module}.
|
|
66
112
|
#
|
|
113
|
+
# @yield (see Schema::MetaSchema#new_schema_module)
|
|
67
114
|
# @return (see JSI::Schema::MetaSchema#new_schema_module)
|
|
68
115
|
def self.new_schema_module(schema_content, **kw, &block)
|
|
69
|
-
new_schema(schema_content, **kw
|
|
116
|
+
schema_jsi = new_schema(schema_content, **kw)
|
|
117
|
+
schema_jsi.jsi_schema_module_exec(&block) if block
|
|
118
|
+
schema_jsi.jsi_schema_module
|
|
70
119
|
end
|
|
71
120
|
|
|
72
|
-
#
|
|
73
|
-
# Instantiates the given document as a JSI Meta-Schema.
|
|
121
|
+
# Instantiates the given metaschema_document as a MetaSchemaNode.
|
|
74
122
|
#
|
|
75
|
-
# @
|
|
76
|
-
# @param
|
|
77
|
-
# @param
|
|
78
|
-
# @return [
|
|
79
|
-
def self.
|
|
80
|
-
|
|
81
|
-
|
|
123
|
+
# @api private
|
|
124
|
+
# @param metaschema_document
|
|
125
|
+
# @param conf_kw Passed to initialize a {MetaSchemaNode::Conf} for {Base#jsi_conf}.
|
|
126
|
+
# @return [MetaSchemaNode]
|
|
127
|
+
def self.new_metaschema_node(metaschema_document,
|
|
128
|
+
schema_documents: nil,
|
|
129
|
+
**conf_kw
|
|
82
130
|
)
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
MetaSchemaNode.new(
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
131
|
+
raise(BlockGivenError) if block_given?
|
|
132
|
+
|
|
133
|
+
conf = MetaSchemaNode::Conf.new(**conf_kw)
|
|
134
|
+
|
|
135
|
+
# need the metaschema_document root to be registered in the bootstrap_registry if...
|
|
136
|
+
register_bootstrap_metaschema =
|
|
137
|
+
# the root is a schema
|
|
138
|
+
conf.root_schema_ref == conf.metaschema_root_ref &&
|
|
139
|
+
# and the metaschema ref is not fragment-only
|
|
140
|
+
!conf.metaschema_root_ref.merge(fragment: nil).empty? &&
|
|
141
|
+
# and it's not already registered (I don't know that an externally supplied bootstrap_registry
|
|
142
|
+
# would ever need to register the meta-schema differently than this does, but allow for it)
|
|
143
|
+
(!conf.bootstrap_registry || !conf.bootstrap_registry.registered?(conf.metaschema_root_ref.merge(fragment: nil)))
|
|
144
|
+
|
|
145
|
+
if !conf.bootstrap_registry && (register_bootstrap_metaschema || schema_documents)
|
|
146
|
+
conf = conf.merge(bootstrap_registry: Registry.new)
|
|
147
|
+
end
|
|
148
|
+
if !conf.registry && (register_bootstrap_metaschema || schema_documents)
|
|
149
|
+
conf = conf.merge(registry: Registry.new)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
metaschema_document = conf.to_immutable.call(metaschema_document) if conf.to_immutable
|
|
153
|
+
schema_documents = schema_documents.map(&conf.to_immutable) if schema_documents && conf.to_immutable
|
|
154
|
+
|
|
155
|
+
to_register = []
|
|
156
|
+
to_register.concat(schema_documents) if schema_documents
|
|
157
|
+
to_register.push(metaschema_document) if register_bootstrap_metaschema
|
|
158
|
+
to_register.each do |document|
|
|
159
|
+
conf.bootstrap_registry.register_immediate(conf.dialect.bootstrap_schema(
|
|
160
|
+
jsi_document: document,
|
|
161
|
+
jsi_registry: conf.bootstrap_registry,
|
|
162
|
+
))
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
MetaSchemaNode.new(
|
|
166
|
+
jsi_document: metaschema_document,
|
|
167
|
+
jsi_conf: conf,
|
|
168
|
+
).jsi_initialize_finish
|
|
89
169
|
end
|
|
90
170
|
|
|
91
|
-
#
|
|
92
|
-
#
|
|
93
|
-
# {new_metaschema}, and returns its {Schema#jsi_schema_module JSI Schema Module}.
|
|
171
|
+
# `JSI.registry` is the default {JSI::Registry} in which schemas are registered and from
|
|
172
|
+
# which they resolve references.
|
|
94
173
|
#
|
|
95
|
-
# @return [
|
|
96
|
-
def self.
|
|
97
|
-
|
|
174
|
+
# @return [Registry]
|
|
175
|
+
def self.registry
|
|
176
|
+
@registry
|
|
98
177
|
end
|
|
99
178
|
|
|
100
|
-
#
|
|
101
|
-
# which they resolve references.
|
|
102
|
-
#
|
|
103
|
-
# @return [JSI::SchemaRegistry]
|
|
179
|
+
# @deprecated after v0.8
|
|
104
180
|
def self.schema_registry
|
|
105
|
-
@
|
|
181
|
+
@registry
|
|
106
182
|
end
|
|
107
183
|
|
|
108
|
-
# @param
|
|
109
|
-
def self.
|
|
110
|
-
@
|
|
184
|
+
# @param registry [Registry]
|
|
185
|
+
def self.registry=(registry)
|
|
186
|
+
@registry = registry
|
|
111
187
|
end
|
|
112
188
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
189
|
+
DEFAULT_REGISTRY = Registry.new.tap do |registry|
|
|
190
|
+
registry.autoload_uri("http://json-schema.org/draft-04/schema") { JSI::JSONSchemaDraft04.schema }
|
|
191
|
+
registry.autoload_uri("http://json-schema.org/draft-06/schema") { JSI::JSONSchemaDraft06.schema }
|
|
192
|
+
registry.autoload_uri("http://json-schema.org/draft-07/schema") { JSI::JSONSchemaDraft07.schema }
|
|
193
|
+
registry.autoload_uri("https://json-schema.org/draft/2020-12/schema") { JSI::JSONSchemaDraft202012.schema }
|
|
194
|
+
registry.autoload_uri("https://json-schema.org/draft/2020-12/meta/core") { JSI::JSONSchemaDraft202012::Core.schema }
|
|
195
|
+
registry.autoload_uri("https://json-schema.org/draft/2020-12/meta/applicator") { JSI::JSONSchemaDraft202012::Applicator.schema }
|
|
196
|
+
registry.autoload_uri("https://json-schema.org/draft/2020-12/meta/unevaluated") { JSI::JSONSchemaDraft202012::Unevaluated.schema }
|
|
197
|
+
registry.autoload_uri("https://json-schema.org/draft/2020-12/meta/validation") { JSI::JSONSchemaDraft202012::Validation.schema }
|
|
198
|
+
registry.autoload_uri("https://json-schema.org/draft/2020-12/meta/meta-data") { JSI::JSONSchemaDraft202012::MetaData.schema }
|
|
199
|
+
registry.autoload_uri("https://json-schema.org/draft/2020-12/meta/format-annotation") { JSI::JSONSchemaDraft202012::FormatAnnotation.schema }
|
|
200
|
+
registry.autoload_uri("https://json-schema.org/draft/2020-12/meta/content") { JSI::JSONSchemaDraft202012::Content.schema }
|
|
201
|
+
registry.autoload_vocabulary_uri("https://json-schema.org/draft/2020-12/vocab/core") { JSI::Schema::Draft202012::Vocab::CORE }
|
|
202
|
+
registry.autoload_vocabulary_uri("https://json-schema.org/draft/2020-12/vocab/unevaluated") { JSI::Schema::Draft202012::Vocab::UNEVALUATED }
|
|
203
|
+
registry.autoload_vocabulary_uri("https://json-schema.org/draft/2020-12/vocab/format-annotation") { JSI::Schema::Draft202012::Vocab::FORMAT_ANNOTATION }
|
|
204
|
+
registry.autoload_vocabulary_uri("https://json-schema.org/draft/2020-12/vocab/validation") { JSI::Schema::Draft202012::Vocab::VALIDATION }
|
|
205
|
+
registry.autoload_vocabulary_uri("https://json-schema.org/draft/2020-12/vocab/content") { JSI::Schema::Draft202012::Vocab::CONTENT }
|
|
206
|
+
registry.autoload_vocabulary_uri("https://json-schema.org/draft/2020-12/vocab/applicator") { JSI::Schema::Draft202012::Vocab::APPLICATOR }
|
|
207
|
+
registry.autoload_vocabulary_uri("https://json-schema.org/draft/2020-12/vocab/meta-data") { JSI::Schema::Draft202012::Vocab::METADATA }
|
|
208
|
+
registry.autoload_dialect_uri("http://json-schema.org/draft-04/schema") { Schema::Draft04::DIALECT }
|
|
209
|
+
registry.autoload_dialect_uri("http://json-schema.org/draft-06/schema") { Schema::Draft06::DIALECT }
|
|
210
|
+
registry.autoload_dialect_uri("http://json-schema.org/draft-07/schema") { Schema::Draft07::DIALECT }
|
|
211
|
+
registry.autoload_dialect_uri("https://json-schema.org/draft/2020-12/schema") { Schema::Draft202012::DIALECT }
|
|
117
212
|
end.freeze
|
|
118
213
|
|
|
119
|
-
self.
|
|
214
|
+
self.registry = DEFAULT_REGISTRY.dup
|
|
215
|
+
|
|
216
|
+
# translation
|
|
217
|
+
# @param key [String]
|
|
218
|
+
# @param default [String]
|
|
219
|
+
# @return [String]
|
|
220
|
+
def self.t(key, default: , **options)
|
|
221
|
+
translator.call(key, default: default, **options)
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
# @return [#call]
|
|
225
|
+
def self.translator
|
|
226
|
+
@translator
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
# e.g. `JSI.translator = I18n.method(:translate)`
|
|
230
|
+
# @param translator [#call]
|
|
231
|
+
def self.translator=(translator)
|
|
232
|
+
@translator = translator
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
DEFAULT_TRANSLATOR = proc { |_key, default: , **_| default }
|
|
236
|
+
self.translator = DEFAULT_TRANSLATOR
|
|
120
237
|
|
|
121
238
|
Schema # trigger autoload, ensure JSI methods (new_schema etc) defined in schema.rb load
|
|
122
239
|
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module JSI
|
|
4
|
+
path = SCHEMAS_PATH.join('json-schema.org/draft/2020-12')
|
|
5
|
+
metaschema_document = Util.json_parse_freeze(path.join('schema.json').read)
|
|
6
|
+
vocabulary_schema_documents = metaschema_document['allOf'].map do |schema|
|
|
7
|
+
Util.json_parse_freeze(path.join(schema['$ref'] + '.json').read)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
JSONSchemaDraft202012 = JSI.new_metaschema_node(metaschema_document,
|
|
11
|
+
dialect: Schema::Draft202012::DIALECT,
|
|
12
|
+
metaschema_root_ref: 'https://json-schema.org/draft/2020-12/schema',
|
|
13
|
+
schema_documents: vocabulary_schema_documents,
|
|
14
|
+
).jsi_schema_module
|
|
15
|
+
|
|
16
|
+
module JSONSchemaDraft202012
|
|
17
|
+
# @!parse extend JSI::SchemaModule::MetaSchemaModule
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def self.name_vocab_schemas(metaschema_module, namespace: metaschema_module)
|
|
21
|
+
find_module = proc { |uri| metaschema_module.schema.jsi_registry.find(uri).with_dynamic_scope_from(metaschema_module).jsi_schema_module }
|
|
22
|
+
namespace.const_set(:Core, find_module["https://json-schema.org/draft/2020-12/meta/core"])
|
|
23
|
+
namespace.const_set(:Applicator, find_module["https://json-schema.org/draft/2020-12/meta/applicator"])
|
|
24
|
+
namespace.const_set(:Unevaluated, find_module["https://json-schema.org/draft/2020-12/meta/unevaluated"])
|
|
25
|
+
namespace.const_set(:Validation, find_module["https://json-schema.org/draft/2020-12/meta/validation"])
|
|
26
|
+
namespace.const_set(:MetaData, find_module["https://json-schema.org/draft/2020-12/meta/meta-data"])
|
|
27
|
+
namespace.const_set(:FormatAnnotation, find_module["https://json-schema.org/draft/2020-12/meta/format-annotation"])
|
|
28
|
+
namespace.const_set(:Content, find_module["https://json-schema.org/draft/2020-12/meta/content"])
|
|
29
|
+
metaschema_module
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
name_vocab_schemas(self)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
module JSONSchemaDraft202012::Core
|
|
36
|
+
end
|
|
37
|
+
module JSONSchemaDraft202012::Applicator
|
|
38
|
+
end
|
|
39
|
+
module JSONSchemaDraft202012::Unevaluated
|
|
40
|
+
end
|
|
41
|
+
module JSONSchemaDraft202012::Validation
|
|
42
|
+
end
|
|
43
|
+
module JSONSchemaDraft202012::MetaData
|
|
44
|
+
end
|
|
45
|
+
module JSONSchemaDraft202012::FormatAnnotation
|
|
46
|
+
end
|
|
47
|
+
module JSONSchemaDraft202012::Content
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
module JSONSchemaDraft202012
|
|
51
|
+
def jsi_schema_module_connection_created(mod)
|
|
52
|
+
mod.define_singleton_method(:defs) { |**kw| self['$defs', **kw] }
|
|
53
|
+
super
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
module JSONSchemaDraft202012::PropertyReaders
|
|
58
|
+
def ref(**kw) self['$ref', **kw] end
|
|
59
|
+
def anchor(**kw) self['$anchor', **kw] end
|
|
60
|
+
def dynamicRef(**kw) self['$dynamicRef', **kw] end
|
|
61
|
+
def dynamicAnchor(**kw) self['$dynamicAnchor', **kw] end
|
|
62
|
+
def comment(**kw) self['$comment', **kw] end
|
|
63
|
+
def defs(**kw) self['$defs', **kw] end
|
|
64
|
+
def format(**kw) self['format', **kw] end
|
|
65
|
+
end
|
|
66
|
+
JSONSchemaDraft202012.include(JSONSchemaDraft202012::PropertyReaders)
|
|
67
|
+
end
|
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module JSI
|
|
4
|
-
metaschema_document =
|
|
5
|
-
JSONSchemaDraft04 = JSI.new_metaschema_module(metaschema_document,
|
|
6
|
-
schema_implementation_modules: [JSI::Schema::Draft04],
|
|
7
|
-
)
|
|
4
|
+
metaschema_document = Util.json_parse_freeze(SCHEMAS_PATH.join('json-schema.org/draft-04/schema.json').read)
|
|
8
5
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
6
|
+
describe_schema_ptrs = Set[
|
|
7
|
+
Ptr[],
|
|
8
|
+
# in draft 4, boolean schemas are not described by the main meta-schema (which specifies type: object),
|
|
9
|
+
# but by anyOf schemas in /properties/additionalProperties and /properties/additionalItems.
|
|
10
|
+
Ptr['properties', 'additionalProperties', 'anyOf', 0],
|
|
11
|
+
Ptr['properties', 'additionalItems', 'anyOf', 0]
|
|
12
|
+
].freeze
|
|
13
|
+
|
|
14
|
+
JSONSchemaDraft04 = JSI.new_metaschema_node(metaschema_document,
|
|
15
|
+
dialect: JSI::Schema::Draft04::DIALECT,
|
|
16
|
+
is_metaschema: proc do |node|
|
|
17
|
+
describe_schema_ptrs.include?(node.jsi_ptr)
|
|
18
|
+
end,
|
|
19
|
+
).jsi_schema_module
|
|
18
20
|
|
|
19
21
|
# the JSI schema module for `http://json-schema.org/draft-04/schema`
|
|
20
22
|
module JSONSchemaDraft04
|
|
21
23
|
# @!parse extend JSI::SchemaModule::MetaSchemaModule
|
|
22
|
-
# @!parse include JSI::Schema::Draft04
|
|
23
24
|
|
|
24
25
|
|
|
25
26
|
Id = properties['id']
|
|
@@ -62,83 +63,45 @@ module JSI
|
|
|
62
63
|
SimpleType = definitions['simpleTypes']
|
|
63
64
|
StringArray = definitions['stringArray']
|
|
64
65
|
|
|
65
|
-
module Id
|
|
66
|
-
end
|
|
67
|
-
module
|
|
68
|
-
end
|
|
69
|
-
module
|
|
70
|
-
end
|
|
71
|
-
module
|
|
72
|
-
end
|
|
73
|
-
module
|
|
74
|
-
end
|
|
75
|
-
module
|
|
76
|
-
end
|
|
77
|
-
module
|
|
78
|
-
end
|
|
79
|
-
module
|
|
80
|
-
end
|
|
81
|
-
module
|
|
82
|
-
end
|
|
83
|
-
module
|
|
84
|
-
end
|
|
85
|
-
module
|
|
86
|
-
end
|
|
87
|
-
module
|
|
88
|
-
end
|
|
89
|
-
module
|
|
90
|
-
end
|
|
91
|
-
module
|
|
92
|
-
end
|
|
93
|
-
module
|
|
94
|
-
end
|
|
95
|
-
module
|
|
96
|
-
end
|
|
97
|
-
module
|
|
98
|
-
end
|
|
99
|
-
module UniqueItems
|
|
100
|
-
end
|
|
101
|
-
module MaxProperties
|
|
102
|
-
end
|
|
103
|
-
module MinProperties
|
|
104
|
-
end
|
|
105
|
-
module Required
|
|
106
|
-
end
|
|
107
|
-
module AdditionalProperties
|
|
108
|
-
end
|
|
109
|
-
module Definitions
|
|
110
|
-
end
|
|
111
|
-
module Properties
|
|
112
|
-
end
|
|
113
|
-
module PatternProperties
|
|
114
|
-
end
|
|
115
|
-
module Dependencies
|
|
116
|
-
end
|
|
117
|
-
module Enum
|
|
118
|
-
end
|
|
119
|
-
module Type
|
|
120
|
-
end
|
|
121
|
-
module Format
|
|
122
|
-
end
|
|
123
|
-
module AllOf
|
|
124
|
-
end
|
|
125
|
-
module AnyOf
|
|
126
|
-
end
|
|
127
|
-
module OneOf
|
|
128
|
-
end
|
|
129
|
-
module Not
|
|
130
|
-
end
|
|
66
|
+
module Id end
|
|
67
|
+
module Xschema end
|
|
68
|
+
module Title end
|
|
69
|
+
module Description end
|
|
70
|
+
module Default end
|
|
71
|
+
module MultipleOf end
|
|
72
|
+
module Maximum end
|
|
73
|
+
module ExclusiveMaximum end
|
|
74
|
+
module Minimum end
|
|
75
|
+
module ExclusiveMinimum end
|
|
76
|
+
module MaxLength end
|
|
77
|
+
module MinLength end
|
|
78
|
+
module Pattern end
|
|
79
|
+
module AdditionalItems end
|
|
80
|
+
module Items end
|
|
81
|
+
module MaxItems end
|
|
82
|
+
module MinItems end
|
|
83
|
+
module UniqueItems end
|
|
84
|
+
module MaxProperties end
|
|
85
|
+
module MinProperties end
|
|
86
|
+
module Required end
|
|
87
|
+
module AdditionalProperties end
|
|
88
|
+
module Definitions end
|
|
89
|
+
module Properties end
|
|
90
|
+
module PatternProperties end
|
|
91
|
+
module Dependencies end
|
|
92
|
+
module Enum end
|
|
93
|
+
module Type end
|
|
94
|
+
module Format end
|
|
95
|
+
module AllOf end
|
|
96
|
+
module AnyOf end
|
|
97
|
+
module OneOf end
|
|
98
|
+
module Not end
|
|
131
99
|
|
|
132
|
-
module SchemaArray
|
|
133
|
-
end
|
|
134
|
-
module
|
|
135
|
-
end
|
|
136
|
-
module
|
|
137
|
-
end
|
|
138
|
-
module SimpleType
|
|
139
|
-
end
|
|
140
|
-
module StringArray
|
|
141
|
-
end
|
|
100
|
+
module SchemaArray end
|
|
101
|
+
module PositiveInteger end
|
|
102
|
+
module PositiveIntegerDefault0 end
|
|
103
|
+
module SimpleType end
|
|
104
|
+
module StringArray end
|
|
142
105
|
|
|
143
106
|
AdditionalItems::Boolean = AdditionalItems.anyOf[0]
|
|
144
107
|
AdditionalProperties::Boolean = AdditionalProperties.anyOf[0]
|
|
@@ -147,23 +110,17 @@ module JSI
|
|
|
147
110
|
PositiveIntegerDefault0::Default0 = PositiveIntegerDefault0.allOf[1]
|
|
148
111
|
StringItem = StringArray.items
|
|
149
112
|
|
|
150
|
-
module AdditionalItems::Boolean
|
|
151
|
-
end
|
|
152
|
-
module
|
|
153
|
-
end
|
|
154
|
-
module
|
|
155
|
-
end
|
|
156
|
-
module Type::Array
|
|
157
|
-
end
|
|
158
|
-
module PositiveIntegerDefault0::Default0
|
|
159
|
-
end
|
|
160
|
-
module StringItem
|
|
161
|
-
end
|
|
113
|
+
module AdditionalItems::Boolean end
|
|
114
|
+
module AdditionalProperties::Boolean end
|
|
115
|
+
module Dependencies::Dependency end
|
|
116
|
+
module Type::Array end
|
|
117
|
+
module PositiveIntegerDefault0::Default0 end
|
|
118
|
+
module StringItem end
|
|
162
119
|
end
|
|
163
120
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
module JSONSchemaOrgDraft04
|
|
121
|
+
module JSONSchemaDraft04::PropertyReaders
|
|
122
|
+
def ref(**kw) self['$ref', **kw] end
|
|
123
|
+
def format(**kw) self['format', **kw] end
|
|
168
124
|
end
|
|
125
|
+
JSONSchemaDraft04.include(JSONSchemaDraft04::PropertyReaders)
|
|
169
126
|
end
|