Skip to content

Commit 575a2f4

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 1e8731c commit 575a2f4

File tree

5 files changed

+14
-13
lines changed

5 files changed

+14
-13
lines changed

lib/json_schemer.rb

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

36-
DRAFT_CLASS_BY_META_SCHEMA = {
37-
'http://json-schema.org/schema#' => Schema::Draft4, # Version-less $schema deprecated after Draft 4
38-
'http://json-schema.org/draft-04/schema#' => Schema::Draft4,
39-
'http://json-schema.org/draft-06/schema#' => Schema::Draft6,
40-
'http://json-schema.org/draft-07/schema#' => Schema::Draft7
41-
}.freeze
42-
43-
DEFAULT_META_SCHEMA = 'http://json-schema.org/draft-07/schema#'
36+
DRAFT_CLASS_BY_META_SCHEMA = [Schema::Draft4, Schema::Draft6, Schema::Draft7].each_with_object({}) do |draft_class, out|
37+
out[draft_class::META_SCHEMA] = draft_class
38+
end
39+
DRAFT_CLASS_BY_META_SCHEMA['http://json-schema.org/schema#'] = Schema::Draft4 # Version-less $schema deprecated after Draft 4
40+
DRAFT_CLASS_BY_META_SCHEMA.freeze
4441

4542
WINDOWS_URI_PATH_REGEX = /\A\/[a-z]:/i
4643

@@ -53,7 +50,7 @@ class InvalidSymbolKey < StandardError; end
5350
end
5451

5552
class << self
56-
def schema(schema, **options)
53+
def schema(schema, default_meta_schema: Schema::Draft7::META_SCHEMA, **options)
5754
case schema
5855
when String
5956
schema = JSON.parse(schema)
@@ -66,15 +63,15 @@ def schema(schema, **options)
6663
schema = ref_resolver.call(uri)
6764
options[:ref_resolver] = ref_resolver
6865
end
69-
schema[draft_class(schema)::ID_KEYWORD] ||= uri.to_s
66+
schema[draft_class(schema, default_meta_schema)::ID_KEYWORD] ||= uri.to_s
7067
end
71-
draft_class(schema).new(schema, **options)
68+
draft_class(schema, default_meta_schema).new(schema, **options)
7269
end
7370

7471
private
7572

76-
def draft_class(schema)
77-
meta_schema = schema.is_a?(Hash) && schema.key?('$schema') ? schema['$schema'] : DEFAULT_META_SCHEMA
73+
def draft_class(schema, default_meta_schema)
74+
meta_schema = schema.is_a?(Hash) && schema.key?('$schema') ? schema['$schema'] : default_meta_schema
7875
DRAFT_CLASS_BY_META_SCHEMA[meta_schema] || raise(UnsupportedMetaSchema, meta_schema)
7976
end
8077
end

lib/json_schemer/schema/base.rb

+1
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ def spec_format?(format)
250250
def child(schema)
251251
JSONSchemer.schema(
252252
schema,
253+
default_meta_schema: self.class::META_SCHEMA,
253254
format: format?,
254255
formats: formats,
255256
keywords: keywords,

lib/json_schemer/schema/draft4.rb

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
module JSONSchemer
33
module Schema
44
class Draft4 < Base
5+
META_SCHEMA = 'http://json-schema.org/draft-04/schema#'
56
ID_KEYWORD = 'id'
67
SUPPORTED_FORMATS = Set[
78
'date-time',

lib/json_schemer/schema/draft6.rb

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
module JSONSchemer
33
module Schema
44
class Draft6 < Base
5+
META_SCHEMA = 'http://json-schema.org/draft-06/schema#'
56
SUPPORTED_FORMATS = Set[
67
'date-time',
78
'email',

lib/json_schemer/schema/draft7.rb

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
module JSONSchemer
33
module Schema
44
class Draft7 < Base
5+
META_SCHEMA = 'http://json-schema.org/draft-07/schema#'
56
SUPPORTED_FORMATS = Set[
67
'date-time',
78
'date',

0 commit comments

Comments
 (0)