Skip to content

Commit b6304af

Browse files
committed
Use current draft as default for child schemas
This will keep using the same draft for any remote `$ref` schemas that don't explicitly set `$schema`. It's necessary so that we know which keywords to use for things that have changed between drafts (eg, `id` vs. `$id`). Exposed by: json-schema-org/JSON-Schema-Test-Suite#454
1 parent c5f6ca9 commit b6304af

File tree

2 files changed

+12
-9
lines changed

2 files changed

+12
-9
lines changed

lib/json_schemer.rb

+11-9
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,13 @@ class InvalidRegexpResolution < StandardError; end
3333
class InvalidFileURI < StandardError; end
3434
class InvalidSymbolKey < StandardError; end
3535

36-
DRAFT_CLASS_BY_META_SCHEMA = {
36+
SCHEMA_CLASS_BY_META_SCHEMA = {
3737
'http://json-schema.org/schema#' => Schema::Draft4, # Version-less $schema deprecated after Draft 4
3838
'http://json-schema.org/draft-04/schema#' => Schema::Draft4,
3939
'http://json-schema.org/draft-06/schema#' => Schema::Draft6,
4040
'http://json-schema.org/draft-07/schema#' => Schema::Draft7
4141
}.freeze
4242

43-
DEFAULT_META_SCHEMA = 'http://json-schema.org/draft-07/schema#'
44-
4543
WINDOWS_URI_PATH_REGEX = /\A\/[a-z]:/i
4644

4745
FILE_URI_REF_RESOLVER = proc do |uri|
@@ -53,7 +51,7 @@ class InvalidSymbolKey < StandardError; end
5351
end
5452

5553
class << self
56-
def schema(schema, **options)
54+
def schema(schema, default_schema_class: Schema::Draft7, **options)
5755
case schema
5856
when String
5957
schema = JSON.parse(schema)
@@ -66,16 +64,20 @@ def schema(schema, **options)
6664
schema = ref_resolver.call(uri)
6765
options[:ref_resolver] = ref_resolver
6866
end
69-
schema[draft_class(schema)::ID_KEYWORD] ||= uri.to_s
67+
schema[draft_class(schema, default_schema_class)::ID_KEYWORD] ||= uri.to_s
7068
end
71-
draft_class(schema).new(schema, **options)
69+
draft_class(schema, default_schema_class).new(schema, **options)
7270
end
7371

7472
private
7573

76-
def draft_class(schema)
77-
meta_schema = schema.is_a?(Hash) && schema.key?('$schema') ? schema['$schema'] : DEFAULT_META_SCHEMA
78-
DRAFT_CLASS_BY_META_SCHEMA[meta_schema] || raise(UnsupportedMetaSchema, meta_schema)
74+
def draft_class(schema, default_schema_class)
75+
if schema.is_a?(Hash) && schema.key?('$schema')
76+
meta_schema = schema.fetch('$schema')
77+
SCHEMA_CLASS_BY_META_SCHEMA[meta_schema] || raise(UnsupportedMetaSchema, meta_schema)
78+
else
79+
default_schema_class
80+
end
7981
end
8082
end
8183
end

lib/json_schemer/schema/base.rb

+1
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ def spec_format?(format)
245245
def child(schema)
246246
JSONSchemer.schema(
247247
schema,
248+
default_schema_class: self.class,
248249
format: format?,
249250
formats: formats,
250251
keywords: keywords,

0 commit comments

Comments
 (0)