Skip to content

Commit 4f9d6e4

Browse files
Merge pull request #147 from davishmcclurg/exclusive-ref-id-and-json-pointer
Use default base URI for exclusive refs
2 parents ccffac7 + e73f9fe commit 4f9d6e4

File tree

2 files changed

+34
-19
lines changed

2 files changed

+34
-19
lines changed

lib/json_schemer/schema.rb

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -336,28 +336,27 @@ def parse
336336
VOCABULARY_KEYWORD_CLASS.new(vocabulary, self, '$vocabulary')
337337
end
338338

339-
if root == self && (!value.is_a?(Hash) || !value.key?(meta_schema.id_keyword))
339+
keywords = meta_schema.keywords
340+
exclusive_ref = value.is_a?(Hash) && value.key?('$ref') && keywords.fetch('$ref').exclusive?
341+
342+
if root == self && (!value.is_a?(Hash) || !value.key?(meta_schema.id_keyword) || exclusive_ref)
340343
ID_KEYWORD_CLASS.new(base_uri, self, meta_schema.id_keyword)
341344
end
342345

343-
if value.is_a?(Hash)
344-
keywords = meta_schema.keywords
345-
346-
if value.key?('$ref') && keywords.fetch('$ref').exclusive?
347-
@parsed['$ref'] = keywords.fetch('$ref').new(value.fetch('$ref'), self, '$ref')
348-
defs_keyword = meta_schema.defs_keyword
349-
if value.key?(defs_keyword) && keywords.key?(defs_keyword)
350-
@parsed[defs_keyword] = keywords.fetch(defs_keyword).new(value.fetch(defs_keyword), self, defs_keyword)
351-
end
352-
else
353-
keyword_order = meta_schema.keyword_order
354-
last = keywords.size
355-
356-
value.sort do |(keyword_a, _value_a), (keyword_b, _value_b)|
357-
keyword_order.fetch(keyword_a, last) <=> keyword_order.fetch(keyword_b, last)
358-
end.each do |keyword, value|
359-
@parsed[keyword] ||= keywords.fetch(keyword, UNKNOWN_KEYWORD_CLASS).new(value, self, keyword)
360-
end
346+
if exclusive_ref
347+
@parsed['$ref'] = keywords.fetch('$ref').new(value.fetch('$ref'), self, '$ref')
348+
defs_keyword = meta_schema.defs_keyword
349+
if value.key?(defs_keyword) && keywords.key?(defs_keyword)
350+
@parsed[defs_keyword] = keywords.fetch(defs_keyword).new(value.fetch(defs_keyword), self, defs_keyword)
351+
end
352+
elsif value.is_a?(Hash)
353+
keyword_order = meta_schema.keyword_order
354+
last = keywords.size
355+
356+
value.sort do |(keyword_a, _value_a), (keyword_b, _value_b)|
357+
keyword_order.fetch(keyword_a, last) <=> keyword_order.fetch(keyword_b, last)
358+
end.each do |keyword, value|
359+
@parsed[keyword] ||= keywords.fetch(keyword, UNKNOWN_KEYWORD_CLASS).new(value, self, keyword)
361360
end
362361
end
363362

test/ref_test.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,4 +379,20 @@ def test_exclusive_ref_supports_definitions
379379
assert(schema.valid?(1))
380380
refute(schema.valid?('1'))
381381
end
382+
383+
def test_exclusive_ref_supports_definitions_with_id_and_json_pointer
384+
schema = JSONSchemer.schema({
385+
'$schema' => 'http://json-schema.org/draft-07/schema#',
386+
'$id' => 'https://example.com/schema',
387+
'$ref' => '#/definitions/yah',
388+
'definitions' => {
389+
'yah' => {
390+
'$id' => '#yah',
391+
'type' => 'integer'
392+
}
393+
}
394+
})
395+
assert(schema.valid?(1))
396+
refute(schema.valid?('1'))
397+
end
382398
end

0 commit comments

Comments
 (0)