223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
|
# File 'lib/json_schemer/schema.rb', line 223
def bundle
return value unless value.is_a?(Hash)
id_keyword = meta_schema.id_keyword
defs_keyword = meta_schema.defs_keyword
compound_document = value.dup
compound_document[id_keyword] = base_uri.to_s
compound_document['$schema'] = meta_schema.base_uri.to_s
embedded_resources = compound_document[defs_keyword] = (compound_document[defs_keyword]&.dup || {})
if compound_document.key?('$ref') && meta_schema.keywords.fetch('$ref').exclusive?
compound_document['allOf'] = (compound_document['allOf']&.dup || [])
compound_document['allOf'] << { '$ref' => compound_document.delete('$ref') }
end
values = [self]
while value = values.shift
case value
when Schema
values << value.parsed
when Keyword
if value.respond_to?(:ref_uri) && value.respond_to?(:ref_schema)
ref_uri = value.ref_uri.dup
ref_uri.fragment = nil
ref_id = ref_uri.to_s
ref_schema = value.ref_schema.root
next if ref_schema == root || embedded_resources.key?(ref_id)
embedded_resource = ref_schema.value.dup
embedded_resource[id_keyword] = ref_id
embedded_resource['$schema'] = ref_schema.meta_schema.base_uri.to_s
embedded_resources[ref_id] = embedded_resource
values << ref_schema
else
values << value.parsed
end
when Hash
values.concat(value.values)
when Array
values.concat(value)
end
end
compound_document
end
|