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.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +3 -2
  3. data/CHANGELOG.md +8 -3
  4. data/LICENSE.md +2 -3
  5. data/README.md +68 -31
  6. data/docs/Glossary.md +313 -0
  7. data/jsi.gemspec +1 -0
  8. data/lib/jsi/base/mutability.rb +4 -0
  9. data/lib/jsi/base/node.rb +63 -24
  10. data/lib/jsi/base.rb +556 -173
  11. data/lib/jsi/metaschema_node/bootstrap_schema.rb +106 -56
  12. data/lib/jsi/metaschema_node.rb +227 -160
  13. data/lib/jsi/ptr.rb +32 -15
  14. data/lib/jsi/ref.rb +197 -0
  15. data/lib/jsi/registry.rb +311 -0
  16. data/lib/jsi/schema/cxt/child_application.rb +35 -0
  17. data/lib/jsi/schema/cxt/inplace_application.rb +37 -0
  18. data/lib/jsi/schema/cxt.rb +80 -0
  19. data/lib/jsi/schema/dialect.rb +137 -0
  20. data/lib/jsi/schema/draft04.rb +113 -5
  21. data/lib/jsi/schema/draft06.rb +123 -5
  22. data/lib/jsi/schema/draft07.rb +157 -5
  23. data/lib/jsi/schema/draft202012.rb +303 -0
  24. data/lib/jsi/schema/dynamic_anchor_map.rb +63 -0
  25. data/lib/jsi/schema/element.rb +69 -0
  26. data/lib/jsi/schema/elements/anchor.rb +13 -0
  27. data/lib/jsi/schema/elements/array_validation.rb +82 -0
  28. data/lib/jsi/schema/elements/comment.rb +10 -0
  29. data/lib/jsi/schema/{validation → elements}/const.rb +11 -7
  30. data/lib/jsi/schema/elements/contains.rb +59 -0
  31. data/lib/jsi/schema/elements/contains_minmax.rb +91 -0
  32. data/lib/jsi/schema/elements/content_encoding.rb +10 -0
  33. data/lib/jsi/schema/elements/content_media_type.rb +10 -0
  34. data/lib/jsi/schema/elements/content_schema.rb +16 -0
  35. data/lib/jsi/schema/elements/default.rb +11 -0
  36. data/lib/jsi/schema/elements/definitions.rb +19 -0
  37. data/lib/jsi/schema/elements/dependencies.rb +99 -0
  38. data/lib/jsi/schema/elements/dependent_required.rb +49 -0
  39. data/lib/jsi/schema/elements/dependent_schemas.rb +69 -0
  40. data/lib/jsi/schema/elements/dynamic_ref.rb +69 -0
  41. data/lib/jsi/schema/elements/enum.rb +26 -0
  42. data/lib/jsi/schema/elements/examples.rb +10 -0
  43. data/lib/jsi/schema/elements/format.rb +10 -0
  44. data/lib/jsi/schema/elements/id.rb +30 -0
  45. data/lib/jsi/schema/elements/if_then_else.rb +82 -0
  46. data/lib/jsi/schema/elements/info_bool.rb +10 -0
  47. data/lib/jsi/schema/elements/info_string.rb +10 -0
  48. data/lib/jsi/schema/elements/items.rb +93 -0
  49. data/lib/jsi/schema/elements/items_prefixed.rb +96 -0
  50. data/lib/jsi/schema/elements/not.rb +31 -0
  51. data/lib/jsi/schema/elements/numeric.rb +137 -0
  52. data/lib/jsi/schema/elements/numeric_draft04.rb +77 -0
  53. data/lib/jsi/schema/elements/object_validation.rb +55 -0
  54. data/lib/jsi/schema/elements/pattern.rb +35 -0
  55. data/lib/jsi/schema/elements/properties.rb +145 -0
  56. data/lib/jsi/schema/elements/property_names.rb +48 -0
  57. data/lib/jsi/schema/elements/ref.rb +62 -0
  58. data/lib/jsi/schema/elements/required.rb +34 -0
  59. data/lib/jsi/schema/elements/self.rb +24 -0
  60. data/lib/jsi/schema/elements/some_of.rb +180 -0
  61. data/lib/jsi/schema/elements/string_validation.rb +57 -0
  62. data/lib/jsi/schema/elements/type.rb +43 -0
  63. data/lib/jsi/schema/elements/unevaluated_items.rb +54 -0
  64. data/lib/jsi/schema/elements/unevaluated_properties.rb +54 -0
  65. data/lib/jsi/schema/elements/xschema.rb +10 -0
  66. data/lib/jsi/schema/elements/xvocabulary.rb +10 -0
  67. data/lib/jsi/schema/elements.rb +101 -0
  68. data/lib/jsi/schema/issue.rb +3 -4
  69. data/lib/jsi/schema/schema_ancestor_node.rb +103 -50
  70. data/lib/jsi/schema/vocabulary.rb +36 -0
  71. data/lib/jsi/schema.rb +519 -337
  72. data/lib/jsi/schema_classes.rb +168 -124
  73. data/lib/jsi/schema_set.rb +67 -126
  74. data/lib/jsi/set.rb +23 -0
  75. data/lib/jsi/simple_wrap.rb +13 -16
  76. data/lib/jsi/struct.rb +57 -0
  77. data/lib/jsi/uri.rb +40 -0
  78. data/lib/jsi/util/private/memo_map.rb +9 -13
  79. data/lib/jsi/util/private.rb +57 -12
  80. data/lib/jsi/util/typelike.rb +19 -64
  81. data/lib/jsi/util.rb +52 -34
  82. data/lib/jsi/validation/error.rb +41 -2
  83. data/lib/jsi/validation/result.rb +118 -71
  84. data/lib/jsi/validation.rb +1 -6
  85. data/lib/jsi/version.rb +1 -1
  86. data/lib/jsi.rb +158 -41
  87. data/lib/schemas/json-schema.org/draft/2020-12/schema.rb +67 -0
  88. data/lib/schemas/json-schema.org/draft-04/schema.rb +63 -106
  89. data/lib/schemas/json-schema.org/draft-06/schema.rb +56 -105
  90. data/lib/schemas/json-schema.org/draft-07/schema.rb +67 -124
  91. data/readme.rb +3 -3
  92. data/{resources}/schemas/2020-12_strict.json +19 -0
  93. data/{resources}/schemas/json-schema.org/draft/2020-12/meta/applicator.json +48 -0
  94. data/{resources}/schemas/json-schema.org/draft/2020-12/meta/content.json +17 -0
  95. data/{resources}/schemas/json-schema.org/draft/2020-12/meta/core.json +51 -0
  96. data/{resources}/schemas/json-schema.org/draft/2020-12/meta/format-annotation.json +14 -0
  97. data/{resources}/schemas/json-schema.org/draft/2020-12/meta/format-assertion.json +14 -0
  98. data/{resources}/schemas/json-schema.org/draft/2020-12/meta/meta-data.json +37 -0
  99. data/{resources}/schemas/json-schema.org/draft/2020-12/meta/unevaluated.json +15 -0
  100. data/{resources}/schemas/json-schema.org/draft/2020-12/meta/validation.json +98 -0
  101. data/{resources}/schemas/json-schema.org/draft/2020-12/schema.json +58 -0
  102. metadata +69 -47
  103. data/lib/jsi/schema/application/child_application/contains.rb +0 -25
  104. data/lib/jsi/schema/application/child_application/draft04.rb +0 -21
  105. data/lib/jsi/schema/application/child_application/draft06.rb +0 -28
  106. data/lib/jsi/schema/application/child_application/draft07.rb +0 -28
  107. data/lib/jsi/schema/application/child_application/items.rb +0 -18
  108. data/lib/jsi/schema/application/child_application/properties.rb +0 -25
  109. data/lib/jsi/schema/application/child_application.rb +0 -13
  110. data/lib/jsi/schema/application/draft04.rb +0 -8
  111. data/lib/jsi/schema/application/draft06.rb +0 -8
  112. data/lib/jsi/schema/application/draft07.rb +0 -8
  113. data/lib/jsi/schema/application/inplace_application/dependencies.rb +0 -28
  114. data/lib/jsi/schema/application/inplace_application/draft04.rb +0 -25
  115. data/lib/jsi/schema/application/inplace_application/draft06.rb +0 -26
  116. data/lib/jsi/schema/application/inplace_application/draft07.rb +0 -32
  117. data/lib/jsi/schema/application/inplace_application/ifthenelse.rb +0 -20
  118. data/lib/jsi/schema/application/inplace_application/ref.rb +0 -18
  119. data/lib/jsi/schema/application/inplace_application/someof.rb +0 -44
  120. data/lib/jsi/schema/application/inplace_application.rb +0 -14
  121. data/lib/jsi/schema/application.rb +0 -12
  122. data/lib/jsi/schema/ref.rb +0 -186
  123. data/lib/jsi/schema/validation/array.rb +0 -69
  124. data/lib/jsi/schema/validation/contains.rb +0 -25
  125. data/lib/jsi/schema/validation/dependencies.rb +0 -49
  126. data/lib/jsi/schema/validation/draft04/minmax.rb +0 -93
  127. data/lib/jsi/schema/validation/draft04.rb +0 -110
  128. data/lib/jsi/schema/validation/draft06.rb +0 -120
  129. data/lib/jsi/schema/validation/draft07.rb +0 -157
  130. data/lib/jsi/schema/validation/enum.rb +0 -25
  131. data/lib/jsi/schema/validation/ifthenelse.rb +0 -46
  132. data/lib/jsi/schema/validation/items.rb +0 -54
  133. data/lib/jsi/schema/validation/not.rb +0 -20
  134. data/lib/jsi/schema/validation/numeric.rb +0 -121
  135. data/lib/jsi/schema/validation/object.rb +0 -45
  136. data/lib/jsi/schema/validation/pattern.rb +0 -34
  137. data/lib/jsi/schema/validation/properties.rb +0 -101
  138. data/lib/jsi/schema/validation/property_names.rb +0 -32
  139. data/lib/jsi/schema/validation/ref.rb +0 -40
  140. data/lib/jsi/schema/validation/required.rb +0 -27
  141. data/lib/jsi/schema/validation/someof.rb +0 -90
  142. data/lib/jsi/schema/validation/string.rb +0 -47
  143. data/lib/jsi/schema/validation/type.rb +0 -49
  144. data/lib/jsi/schema/validation.rb +0 -49
  145. data/lib/jsi/schema_registry.rb +0 -200
  146. data/lib/jsi/util/private/attr_struct.rb +0 -141
@@ -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 = ValidityResult.new(false).freeze
8
+ INVALID = Result::Invalid.new.freeze
14
9
  end
15
10
  end
data/lib/jsi/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JSI
4
- VERSION = "0.8.2".freeze
4
+ VERSION = "0.9.0".freeze
5
5
  end
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 params `mutable` and `to_immutable` documentation for options.",
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 :SchemaRegistry, 'jsi/schema_registry'
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 :JSONSchemaOrgDraft04, 'schemas/json-schema.org/draft-04/schema'
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, &block).jsi_schema_module
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
- # @private pending dialect/vocabularies
73
- # Instantiates the given document as a JSI Meta-Schema.
121
+ # Instantiates the given metaschema_document as a MetaSchemaNode.
74
122
  #
75
- # @param metaschema_document an object to be instantiated as a JSI Meta-Schema
76
- # @param schema_implementation_modules (see MetaSchemaNode#initialize)
77
- # @param to_immutable (see SchemaSet#new_jsi)
78
- # @return [JSI::MetaSchemaNode + JSI::Schema::MetaSchema + JSI::Schema]
79
- def self.new_metaschema(metaschema_document,
80
- schema_implementation_modules: ,
81
- to_immutable: DEFAULT_CONTENT_TO_IMMUTABLE
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
- metaschema_document = to_immutable.call(metaschema_document) if to_immutable
84
-
85
- MetaSchemaNode.new(metaschema_document,
86
- schema_implementation_modules: schema_implementation_modules,
87
- jsi_content_to_immutable: to_immutable,
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
- # @private pending dialect/vocabularies
92
- # Instantiates the given document as a JSI Meta-Schema, passing all params to
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 [JSI::SchemaModule + JSI::SchemaModule::MetaSchemaModule]
96
- def self.new_metaschema_module(metaschema_document, **kw)
97
- new_metaschema(metaschema_document, **kw).jsi_schema_module
174
+ # @return [Registry]
175
+ def self.registry
176
+ @registry
98
177
  end
99
178
 
100
- # `JSI.schema_registry` is the default {JSI::SchemaRegistry} in which schemas are registered and from
101
- # which they resolve references.
102
- #
103
- # @return [JSI::SchemaRegistry]
179
+ # @deprecated after v0.8
104
180
  def self.schema_registry
105
- @schema_registry
181
+ @registry
106
182
  end
107
183
 
108
- # @param schema_registry [JSI::SchemaRegistry]
109
- def self.schema_registry=(schema_registry)
110
- @schema_registry = schema_registry
184
+ # @param registry [Registry]
185
+ def self.registry=(registry)
186
+ @registry = registry
111
187
  end
112
188
 
113
- DEFAULT_SCHEMA_REGISTRY = SchemaRegistry.new.tap do |schema_registry|
114
- schema_registry.autoload_uri("http://json-schema.org/draft-04/schema") { JSI::JSONSchemaDraft04.schema }
115
- schema_registry.autoload_uri("http://json-schema.org/draft-06/schema") { JSI::JSONSchemaDraft06.schema }
116
- schema_registry.autoload_uri("http://json-schema.org/draft-07/schema") { JSI::JSONSchemaDraft07.schema }
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.schema_registry = DEFAULT_SCHEMA_REGISTRY.dup
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 = ::JSON.parse(SCHEMAS_PATH.join('json-schema.org/draft-04/schema.json').read)
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
- # in draft 4, boolean schemas are not described in the root, but on anyOf schemas on
10
- # properties/additionalProperties and properties/additionalItems.
11
- # these still describe schemas, despite not being described by the meta-schema.
12
- also_describe_schemas =
13
- JSONSchemaDraft04.schema["properties"]["additionalProperties"]["anyOf"] +
14
- JSONSchemaDraft04.schema["properties"]["additionalItems"]["anyOf"]
15
- also_describe_schemas.each do |schema|
16
- schema.describes_schema!([JSI::Schema::Draft04])
17
- end
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 Xschema
68
- end
69
- module Title
70
- end
71
- module Description
72
- end
73
- module Default
74
- end
75
- module MultipleOf
76
- end
77
- module Maximum
78
- end
79
- module ExclusiveMaximum
80
- end
81
- module Minimum
82
- end
83
- module ExclusiveMinimum
84
- end
85
- module MaxLength
86
- end
87
- module MinLength
88
- end
89
- module Pattern
90
- end
91
- module AdditionalItems
92
- end
93
- module Items
94
- end
95
- module MaxItems
96
- end
97
- module MinItems
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 PositiveInteger
135
- end
136
- module PositiveIntegerDefault0
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 AdditionalProperties::Boolean
153
- end
154
- module Dependencies::Dependency
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
- JSONSchemaOrgDraft04 = JSONSchemaDraft04
165
-
166
- # @deprecated after v0.7.0, alias of {JSONSchemaDraft04}
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