json-schema 2.4.0 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +8 -8
- data/README.textile +1 -1
- data/lib/json-schema.rb +0 -1
- data/lib/json-schema/attributes/dependencies.rb +3 -3
- data/lib/json-schema/attributes/dependencies_v4.rb +2 -2
- data/lib/json-schema/attributes/properties.rb +4 -6
- data/lib/json-schema/attributes/properties_optional.rb +2 -2
- data/lib/json-schema/attributes/properties_v4.rb +4 -5
- data/lib/json-schema/attributes/required.rb +1 -1
- data/lib/json-schema/schema.rb +12 -22
- data/lib/json-schema/validator.rb +33 -17
- data/test/test_jsonschema_draft3.rb +8 -14
- data/test/test_jsonschema_draft4.rb +8 -16
- data/test/test_merge_misisng_values.rb +46 -0
- data/test/test_schema_validation.rb +90 -0
- data/test/test_stringify.rb +49 -0
- metadata +5 -2
- data/lib/json-schema/util/hash.rb +0 -8
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZTc1NDAxODkxMmNiYTQ4YzdiMzNkMWEyYjlhYTQ5MTU5MWExMTFhZQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZmQxNjIyOTU5ZGQyZGQ5ZDIxYmYxMGQwMGIzYjliMDMyYjQ5Y2EwMA==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YjVlZjkzNWE5YTA3MjhlNTY0ZmMyMGRiNGE0YzYwODE1N2I3ZTFhMTAzYjQ1
|
10
|
+
NTJjZGU2ZTE1OTg3NDJjNThhYzAwMGRiYzZiMzIzZWJiODRmNzA5NjVjMzAw
|
11
|
+
ZTE4MjdjYzE3NGQ0ZjlhYmQ3NWViZjVmOWNhYzc2YjY2NWNlYTU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ODA4M2U2YTkyMmM1NjhlMTUyN2M3NjJiODI3ZmUzMzNhYTFkNTE1YmRkYWM4
|
14
|
+
MWNiODZlYmQ3YjdkY2M4ZDk3ZDVkNTZlYmJkNmNjNWVjODhjOWQxNzA5MmU2
|
15
|
+
YjQwMDBmMjZmODdkOTI5YjBjMzUxMGJiOWNjY2JmNzZlZWZhYjY=
|
data/README.textile
CHANGED
data/lib/json-schema.rb
CHANGED
@@ -8,7 +8,6 @@ if Gem::Specification::find_all_by_name('multi_json').any?
|
|
8
8
|
MultiJson.respond_to?(:adapter) ? MultiJson.adapter : MultiJson.engine
|
9
9
|
end
|
10
10
|
|
11
|
-
require 'json-schema/util/hash'
|
12
11
|
require 'json-schema/util/array_set'
|
13
12
|
require 'json-schema/schema'
|
14
13
|
require 'json-schema/validator'
|
@@ -6,15 +6,15 @@ module JSON
|
|
6
6
|
def self.validate(current_schema, data, fragments, processor, validator, options = {})
|
7
7
|
if data.is_a?(Hash)
|
8
8
|
current_schema.schema['dependencies'].each do |property,dependency_value|
|
9
|
-
if data.has_key?(property.to_s)
|
9
|
+
if data.has_key?(property.to_s)
|
10
10
|
if dependency_value.is_a?(String)
|
11
|
-
if !data.has_key?(dependency_value.to_s)
|
11
|
+
if !data.has_key?(dependency_value.to_s)
|
12
12
|
message = "The property '#{build_fragment(fragments)}' has a property '#{property}' that depends on a missing property '#{dependency_value}'"
|
13
13
|
validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
|
14
14
|
end
|
15
15
|
elsif dependency_value.is_a?(Array)
|
16
16
|
dependency_value.each do |value|
|
17
|
-
if !data.has_key?(value.to_s)
|
17
|
+
if !data.has_key?(value.to_s)
|
18
18
|
message = "The property '#{build_fragment(fragments)}' has a property '#{property}' that depends on a missing property '#{value}'"
|
19
19
|
validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
|
20
20
|
end
|
@@ -6,10 +6,10 @@ module JSON
|
|
6
6
|
def self.validate(current_schema, data, fragments, processor, validator, options = {})
|
7
7
|
if data.is_a?(Hash)
|
8
8
|
current_schema.schema['dependencies'].each do |property,dependency_value|
|
9
|
-
if
|
9
|
+
if data.has_key?(property.to_s)
|
10
10
|
if dependency_value.is_a?(Array)
|
11
11
|
dependency_value.each do |value|
|
12
|
-
if !data.has_key?(value.to_s)
|
12
|
+
if !data.has_key?(value.to_s)
|
13
13
|
message = "The property '#{build_fragment(fragments)}' has a property '#{property}' that depends on a missing property '#{value}'"
|
14
14
|
validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
|
15
15
|
end
|
@@ -7,7 +7,6 @@ module JSON
|
|
7
7
|
if data.is_a?(Hash)
|
8
8
|
current_schema.schema['properties'].each do |property,property_schema|
|
9
9
|
if !data.has_key?(property.to_s) &&
|
10
|
-
!data.has_key?(property.to_sym) &&
|
11
10
|
property_schema['default'] &&
|
12
11
|
!property_schema['readonly'] &&
|
13
12
|
options[:insert_defaults]
|
@@ -15,13 +14,12 @@ module JSON
|
|
15
14
|
data[property.to_s] = (default.is_a?(Hash) ? default.clone : default)
|
16
15
|
end
|
17
16
|
|
18
|
-
if property_schema.fetch('required') { options[:strict] } &&
|
19
|
-
!data.has_key?(property.to_s) && !data.has_key?(property.to_sym)
|
17
|
+
if property_schema.fetch('required') { options[:strict] } && !data.has_key?(property.to_s)
|
20
18
|
message = "The property '#{build_fragment(fragments)}' did not contain a required property of '#{property}'"
|
21
19
|
validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
|
22
20
|
end
|
23
21
|
|
24
|
-
if data.has_key?(property.to_s)
|
22
|
+
if data.has_key?(property.to_s)
|
25
23
|
schema = JSON::Schema.new(property_schema,current_schema.uri,validator)
|
26
24
|
fragments << property.to_s
|
27
25
|
schema.validate(data[property.to_s],fragments,processor,options)
|
@@ -42,9 +40,9 @@ module JSON
|
|
42
40
|
end
|
43
41
|
end
|
44
42
|
|
45
|
-
!current_schema.schema['properties'].has_key?(k.to_s) && !
|
43
|
+
!current_schema.schema['properties'].has_key?(k.to_s) && !match
|
46
44
|
else
|
47
|
-
!current_schema.schema['properties'].has_key?(k.to_s)
|
45
|
+
!current_schema.schema['properties'].has_key?(k.to_s)
|
48
46
|
end
|
49
47
|
end
|
50
48
|
|
@@ -6,12 +6,12 @@ module JSON
|
|
6
6
|
def self.validate(current_schema, data, fragments, processor, validator, options = {})
|
7
7
|
if data.is_a?(Hash)
|
8
8
|
current_schema.schema['properties'].each do |property,property_schema|
|
9
|
-
if (
|
9
|
+
if (property_schema['optional'].nil? || property_schema['optional'] == false) && !data.has_key?(property.to_s)
|
10
10
|
message = "The property '#{build_fragment(fragments)}' did not contain a required property of '#{property}'"
|
11
11
|
validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
|
12
12
|
end
|
13
13
|
|
14
|
-
if data.has_key?(property.to_s)
|
14
|
+
if data.has_key?(property.to_s)
|
15
15
|
schema = JSON::Schema.new(property_schema,current_schema.uri,validator)
|
16
16
|
fragments << property
|
17
17
|
schema.validate(data[property],fragments,processor,options)
|
@@ -7,7 +7,6 @@ module JSON
|
|
7
7
|
if data.is_a?(Hash)
|
8
8
|
current_schema.schema['properties'].each do |property,property_schema|
|
9
9
|
if !data.has_key?(property.to_s) &&
|
10
|
-
!data.has_key?(property.to_sym) &&
|
11
10
|
property_schema['default'] &&
|
12
11
|
!property_schema['readonly'] &&
|
13
12
|
options[:insert_defaults]
|
@@ -15,12 +14,12 @@ module JSON
|
|
15
14
|
data[property.to_s] = (default.is_a?(Hash) ? default.clone : default)
|
16
15
|
end
|
17
16
|
|
18
|
-
if
|
17
|
+
if options[:strict] == true && !data.has_key?(property.to_s)
|
19
18
|
message = "The property '#{build_fragment(fragments)}' did not contain a required property of '#{property}'"
|
20
19
|
validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
|
21
20
|
end
|
22
21
|
|
23
|
-
if data.has_key?(property.to_s)
|
22
|
+
if data.has_key?(property.to_s)
|
24
23
|
schema = JSON::Schema.new(property_schema,current_schema.uri,validator)
|
25
24
|
fragments << property.to_s
|
26
25
|
schema.validate(data[property.to_s],fragments,processor,options)
|
@@ -42,9 +41,9 @@ module JSON
|
|
42
41
|
end
|
43
42
|
end
|
44
43
|
|
45
|
-
!current_schema.schema['properties'].has_key?(k.to_s) && !
|
44
|
+
!current_schema.schema['properties'].has_key?(k.to_s) && !match
|
46
45
|
else
|
47
|
-
!current_schema.schema['properties'].has_key?(k.to_s)
|
46
|
+
!current_schema.schema['properties'].has_key?(k.to_s)
|
48
47
|
end
|
49
48
|
end
|
50
49
|
|
@@ -6,7 +6,7 @@ module JSON
|
|
6
6
|
def self.validate(current_schema, data, fragments, processor, validator, options = {})
|
7
7
|
if data.is_a?(Hash)
|
8
8
|
current_schema.schema['required'].each do |property,property_schema|
|
9
|
-
if !data.has_key?(property.to_s)
|
9
|
+
if !data.has_key?(property.to_s)
|
10
10
|
prop_defaults = options[:insert_defaults] &&
|
11
11
|
current_schema.schema['properties'] &&
|
12
12
|
current_schema.schema['properties'][property] &&
|
data/lib/json-schema/schema.rb
CHANGED
@@ -6,11 +6,9 @@ module JSON
|
|
6
6
|
attr_accessor :schema, :uri, :validator
|
7
7
|
|
8
8
|
def initialize(schema,uri,parent_validator=nil)
|
9
|
-
@schema = schema
|
9
|
+
@schema = self.class.stringify(schema)
|
10
10
|
@uri = uri
|
11
11
|
|
12
|
-
self.class.add_indifferent_access(@schema)
|
13
|
-
|
14
12
|
# If there is an ID on this schema, use it to generate the URI
|
15
13
|
if @schema['id'] && @schema['id'].kind_of?(String)
|
16
14
|
temp_uri = URI.parse(@schema['id'])
|
@@ -36,26 +34,18 @@ module JSON
|
|
36
34
|
@validator.validate(self, data, fragments, processor, options)
|
37
35
|
end
|
38
36
|
|
39
|
-
def self.
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
when Symbol then key.to_s
|
47
|
-
when String then key.to_sym
|
48
|
-
end
|
49
|
-
hash.has_key?(key) ? hash[key] : nil
|
50
|
-
end
|
51
|
-
end
|
52
|
-
schema.keys.each do |key|
|
53
|
-
add_indifferent_access(schema[key])
|
54
|
-
end
|
55
|
-
elsif schema.is_a?(Array)
|
56
|
-
schema.each do |schema_item|
|
57
|
-
add_indifferent_access(schema_item)
|
37
|
+
def self.stringify(schema)
|
38
|
+
case schema
|
39
|
+
when Hash then
|
40
|
+
Hash[schema.map { |key, value| [key.to_s, stringify(schema[key])] }]
|
41
|
+
when Array then
|
42
|
+
schema.map do |schema_item|
|
43
|
+
stringify(schema_item)
|
58
44
|
end
|
45
|
+
when Symbol then
|
46
|
+
schema.to_s
|
47
|
+
else
|
48
|
+
schema
|
59
49
|
end
|
60
50
|
end
|
61
51
|
|
@@ -45,6 +45,7 @@ module JSON
|
|
45
45
|
@validation_options[:strict] = true if @options[:strict] == true
|
46
46
|
|
47
47
|
@@mutex.synchronize { @base_schema = initialize_schema(schema_data) }
|
48
|
+
@original_data = data
|
48
49
|
@data = initialize_data(data)
|
49
50
|
@@mutex.synchronize { build_schemas(@base_schema) }
|
50
51
|
|
@@ -106,21 +107,18 @@ module JSON
|
|
106
107
|
|
107
108
|
# Run a simple true/false validation of data against a schema
|
108
109
|
def validate()
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
Validator.clear_cache
|
122
|
-
end
|
123
|
-
raise $!
|
110
|
+
@base_schema.validate(@data,[],self,@validation_options)
|
111
|
+
if @options[:errors_as_objects]
|
112
|
+
return @errors.map{|e| e.to_hash}
|
113
|
+
else
|
114
|
+
return @errors.map{|e| e.to_string}
|
115
|
+
end
|
116
|
+
ensure
|
117
|
+
if @validation_options[:clear_cache] == true
|
118
|
+
Validator.clear_cache
|
119
|
+
end
|
120
|
+
if @validation_options[:insert_defaults]
|
121
|
+
JSON::Validator.merge_missing_values(@data, @original_data)
|
124
122
|
end
|
125
123
|
end
|
126
124
|
|
@@ -425,6 +423,25 @@ module JSON
|
|
425
423
|
end
|
426
424
|
end
|
427
425
|
|
426
|
+
def merge_missing_values(source, destination)
|
427
|
+
case destination
|
428
|
+
when Hash
|
429
|
+
source.each do |key, source_value|
|
430
|
+
destination_value = destination[key] || destination[key.to_sym]
|
431
|
+
if destination_value.nil?
|
432
|
+
destination[key] = source_value
|
433
|
+
else
|
434
|
+
merge_missing_values(source_value, destination_value)
|
435
|
+
end
|
436
|
+
end
|
437
|
+
when Array
|
438
|
+
source.each_with_index do |source_value, i|
|
439
|
+
destination_value = destination[i]
|
440
|
+
merge_missing_values(source_value, destination_value)
|
441
|
+
end
|
442
|
+
end
|
443
|
+
end
|
444
|
+
|
428
445
|
if !defined?(MultiJson)
|
429
446
|
if Gem::Specification::find_all_by_name('json').any?
|
430
447
|
require 'json'
|
@@ -560,8 +577,7 @@ module JSON
|
|
560
577
|
end
|
561
578
|
end
|
562
579
|
end
|
563
|
-
JSON::Schema.
|
564
|
-
data
|
580
|
+
JSON::Schema.stringify(data)
|
565
581
|
end
|
566
582
|
|
567
583
|
def normalized_uri(data)
|
@@ -1210,11 +1210,12 @@ class JSONSchemaDraft3Test < Test::Unit::TestCase
|
|
1210
1210
|
}
|
1211
1211
|
}
|
1212
1212
|
|
1213
|
-
data = {
|
1213
|
+
data = {:b => 2}
|
1214
1214
|
assert(JSON::Validator.validate(schema,data))
|
1215
1215
|
assert_nil(data["a"])
|
1216
1216
|
assert(JSON::Validator.validate(schema,data, :insert_defaults => true))
|
1217
1217
|
assert_equal(42, data["a"])
|
1218
|
+
assert_equal(2, data[:b])
|
1218
1219
|
|
1219
1220
|
schema = {
|
1220
1221
|
"$schema" => "http://json-schema.org/draft-03/schema#",
|
@@ -1225,21 +1226,12 @@ class JSONSchemaDraft3Test < Test::Unit::TestCase
|
|
1225
1226
|
}
|
1226
1227
|
}
|
1227
1228
|
|
1228
|
-
data = {
|
1229
|
+
data = {:b => 2}
|
1229
1230
|
assert(!JSON::Validator.validate(schema,data))
|
1230
1231
|
assert_nil(data["a"])
|
1231
1232
|
assert(JSON::Validator.validate(schema,data, :insert_defaults => true))
|
1232
1233
|
assert_equal(42, data["a"])
|
1233
|
-
|
1234
|
-
schema = {
|
1235
|
-
"$schema" => "http://json-schema.org/draft-03/schema#",
|
1236
|
-
"type" => "object",
|
1237
|
-
"properties" => {
|
1238
|
-
"a" => {"type" => "integer", "default" => 42, "required" => true},
|
1239
|
-
"b" => {"type" => "integer"}
|
1240
|
-
}
|
1241
|
-
}
|
1242
|
-
|
1234
|
+
assert_equal(2, data[:b])
|
1243
1235
|
|
1244
1236
|
schema = {
|
1245
1237
|
"$schema" => "http://json-schema.org/draft-03/schema#",
|
@@ -1250,11 +1242,12 @@ class JSONSchemaDraft3Test < Test::Unit::TestCase
|
|
1250
1242
|
}
|
1251
1243
|
}
|
1252
1244
|
|
1253
|
-
data = {
|
1245
|
+
data = {:b => 2}
|
1254
1246
|
assert(!JSON::Validator.validate(schema,data))
|
1255
1247
|
assert_nil(data["a"])
|
1256
1248
|
assert(!JSON::Validator.validate(schema,data, :insert_defaults => true))
|
1257
1249
|
assert_nil(data["a"])
|
1250
|
+
assert_equal(2, data[:b])
|
1258
1251
|
|
1259
1252
|
schema = {
|
1260
1253
|
"$schema" => "http://json-schema.org/draft-03/schema#",
|
@@ -1265,11 +1258,12 @@ class JSONSchemaDraft3Test < Test::Unit::TestCase
|
|
1265
1258
|
}
|
1266
1259
|
}
|
1267
1260
|
|
1268
|
-
data = {
|
1261
|
+
data = {:b => 2}
|
1269
1262
|
assert(JSON::Validator.validate(schema,data))
|
1270
1263
|
assert_nil(data["a"])
|
1271
1264
|
assert(!JSON::Validator.validate(schema,data, :insert_defaults => true))
|
1272
1265
|
assert_equal("42",data["a"])
|
1266
|
+
assert_equal(2, data[:b])
|
1273
1267
|
|
1274
1268
|
end
|
1275
1269
|
|
@@ -1096,11 +1096,12 @@ class JSONSchemaDraft4Test < Test::Unit::TestCase
|
|
1096
1096
|
}
|
1097
1097
|
}
|
1098
1098
|
|
1099
|
-
data = {
|
1099
|
+
data = {:b => 2}
|
1100
1100
|
assert(JSON::Validator.validate(schema,data))
|
1101
1101
|
assert_nil(data["a"])
|
1102
1102
|
assert(JSON::Validator.validate(schema,data, :insert_defaults => true))
|
1103
1103
|
assert_equal(42, data["a"])
|
1104
|
+
assert_equal(2, data[:b])
|
1104
1105
|
|
1105
1106
|
schema = {
|
1106
1107
|
"$schema" => "http://json-schema.org/draft-04/schema#",
|
@@ -1112,22 +1113,12 @@ class JSONSchemaDraft4Test < Test::Unit::TestCase
|
|
1112
1113
|
}
|
1113
1114
|
}
|
1114
1115
|
|
1115
|
-
data = {
|
1116
|
+
data = {:b => 2}
|
1116
1117
|
assert(!JSON::Validator.validate(schema,data))
|
1117
1118
|
assert_nil(data["a"])
|
1118
1119
|
assert(JSON::Validator.validate(schema,data, :insert_defaults => true))
|
1119
1120
|
assert_equal(42, data["a"])
|
1120
|
-
|
1121
|
-
schema = {
|
1122
|
-
"$schema" => "http://json-schema.org/draft-04/schema#",
|
1123
|
-
"type" => "object",
|
1124
|
-
"required" => ["a"],
|
1125
|
-
"properties" => {
|
1126
|
-
"a" => {"type" => "integer", "default" => 42},
|
1127
|
-
"b" => {"type" => "integer"}
|
1128
|
-
}
|
1129
|
-
}
|
1130
|
-
|
1121
|
+
assert_equal(2, data[:b])
|
1131
1122
|
|
1132
1123
|
schema = {
|
1133
1124
|
"$schema" => "http://json-schema.org/draft-04/schema#",
|
@@ -1139,11 +1130,12 @@ class JSONSchemaDraft4Test < Test::Unit::TestCase
|
|
1139
1130
|
}
|
1140
1131
|
}
|
1141
1132
|
|
1142
|
-
data = {
|
1133
|
+
data = {:b => 2}
|
1143
1134
|
assert(!JSON::Validator.validate(schema,data))
|
1144
1135
|
assert_nil(data["a"])
|
1145
1136
|
assert(!JSON::Validator.validate(schema,data, :insert_defaults => true))
|
1146
1137
|
assert_nil(data["a"])
|
1138
|
+
assert_equal(2, data[:b])
|
1147
1139
|
|
1148
1140
|
schema = {
|
1149
1141
|
"$schema" => "http://json-schema.org/draft-04/schema#",
|
@@ -1154,11 +1146,12 @@ class JSONSchemaDraft4Test < Test::Unit::TestCase
|
|
1154
1146
|
}
|
1155
1147
|
}
|
1156
1148
|
|
1157
|
-
data = {
|
1149
|
+
data = {:b => 2}
|
1158
1150
|
assert(JSON::Validator.validate(schema,data))
|
1159
1151
|
assert_nil(data["a"])
|
1160
1152
|
assert(!JSON::Validator.validate(schema,data, :insert_defaults => true))
|
1161
1153
|
assert_equal("42",data["a"])
|
1154
|
+
assert_equal(2, data[:b])
|
1162
1155
|
|
1163
1156
|
end
|
1164
1157
|
|
@@ -1318,7 +1311,6 @@ class JSONSchemaDraft4Test < Test::Unit::TestCase
|
|
1318
1311
|
|
1319
1312
|
data = {"a" => 1}
|
1320
1313
|
errors = JSON::Validator.fully_validate(schema,data)
|
1321
|
-
puts errors
|
1322
1314
|
assert_equal(0, errors.length)
|
1323
1315
|
|
1324
1316
|
data = {"a" => "taco"}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/json-schema'
|
3
|
+
|
4
|
+
class MergeMissingValuesTest < Test::Unit::TestCase
|
5
|
+
def test_merge_missing_values_for_string
|
6
|
+
original = 'foo'
|
7
|
+
updated = 'foo'
|
8
|
+
JSON::Validator.merge_missing_values(updated, original)
|
9
|
+
assert_equal('foo', original)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_merge_missing_values_for_empty_array
|
13
|
+
original = []
|
14
|
+
updated = []
|
15
|
+
JSON::Validator.merge_missing_values(updated, original)
|
16
|
+
assert_equal([], original)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_merge_missing_values_for_empty_hash
|
20
|
+
original = {}
|
21
|
+
updated = {}
|
22
|
+
JSON::Validator.merge_missing_values(updated, original)
|
23
|
+
assert_equal({}, original)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_merge_missing_values_for_new_values
|
27
|
+
original = {:hello => 'world'}
|
28
|
+
updated = {'hello' => 'world', 'foo' => 'bar'}
|
29
|
+
JSON::Validator.merge_missing_values(updated, original)
|
30
|
+
assert_equal({:hello => 'world', 'foo' => 'bar'}, original)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_merge_missing_values_for_nested_array
|
34
|
+
original = [:hello, 'world', 1, 2, 3, {:foo => :bar, 'baz' => 'qux'}]
|
35
|
+
updated = ['hello', 'world', 1, 2, 3, {'foo' => 'bar', 'baz' => 'qux', 'this_is' => 'new'}]
|
36
|
+
JSON::Validator.merge_missing_values(updated, original)
|
37
|
+
assert_equal([:hello, 'world', 1, 2, 3, {:foo => :bar, 'baz' => 'qux', 'this_is' => 'new'}], original)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_merge_missing_values_for_nested_hash
|
41
|
+
original = {:hello => 'world', :foo => ['bar', :baz, {:uno => {:due => 3}}]}
|
42
|
+
updated = {'hello' => 'world', 'foo' => ['bar', 'baz', {'uno' => {'due' => 3, 'this_is' => 'new'}}], 'ack' => 'sed'}
|
43
|
+
JSON::Validator.merge_missing_values(updated, original)
|
44
|
+
assert_equal({:hello => 'world', :foo => ['bar', :baz, {:uno => {:due => 3, 'this_is' => 'new'}}], 'ack' => 'sed'}, original)
|
45
|
+
end
|
46
|
+
end
|
@@ -47,6 +47,82 @@ class JSONSchemaValidation < Test::Unit::TestCase
|
|
47
47
|
}
|
48
48
|
end
|
49
49
|
|
50
|
+
def symbolized_schema
|
51
|
+
{
|
52
|
+
:type => :object,
|
53
|
+
:required => [
|
54
|
+
:id,
|
55
|
+
:name,
|
56
|
+
:real_name,
|
57
|
+
:role,
|
58
|
+
:website,
|
59
|
+
:biography,
|
60
|
+
:created_at,
|
61
|
+
:demographic
|
62
|
+
],
|
63
|
+
:properties => {
|
64
|
+
:id => {
|
65
|
+
:type => [
|
66
|
+
:integer
|
67
|
+
]
|
68
|
+
},
|
69
|
+
:name => {
|
70
|
+
:type => [
|
71
|
+
:string
|
72
|
+
]
|
73
|
+
},
|
74
|
+
:real_name => {
|
75
|
+
:type => [
|
76
|
+
:string
|
77
|
+
]
|
78
|
+
},
|
79
|
+
:role => {
|
80
|
+
:type => [
|
81
|
+
:string
|
82
|
+
]
|
83
|
+
},
|
84
|
+
:website => {
|
85
|
+
:type => [
|
86
|
+
:string,
|
87
|
+
:null
|
88
|
+
]
|
89
|
+
},
|
90
|
+
:created_at => {
|
91
|
+
:type => [
|
92
|
+
:string
|
93
|
+
]
|
94
|
+
},
|
95
|
+
:biography => {
|
96
|
+
:type => [
|
97
|
+
:string,
|
98
|
+
:null
|
99
|
+
]
|
100
|
+
}
|
101
|
+
},
|
102
|
+
:relationships => {
|
103
|
+
:demographic => {
|
104
|
+
:type => :object,
|
105
|
+
:required => [
|
106
|
+
:id,
|
107
|
+
:gender
|
108
|
+
],
|
109
|
+
:properties => {
|
110
|
+
:id => {
|
111
|
+
:type => [
|
112
|
+
:integer
|
113
|
+
]
|
114
|
+
},
|
115
|
+
:gender => {
|
116
|
+
:type => [
|
117
|
+
:string
|
118
|
+
]
|
119
|
+
}
|
120
|
+
}
|
121
|
+
}
|
122
|
+
}
|
123
|
+
}
|
124
|
+
end
|
125
|
+
|
50
126
|
def test_draft03_validation
|
51
127
|
data = {"b" => {"a" => 5}}
|
52
128
|
assert(JSON::Validator.validate(valid_schema_v3,data,:validate_schema => true, :version => :draft3))
|
@@ -93,4 +169,18 @@ class JSONSchemaValidation < Test::Unit::TestCase
|
|
93
169
|
end
|
94
170
|
end
|
95
171
|
end
|
172
|
+
|
173
|
+
def test_validate_schema_with_symbol_keys
|
174
|
+
data = {
|
175
|
+
"created_at" => "2014-01-25T00:58:33-08:00",
|
176
|
+
"id" => 8517194300913402149003,
|
177
|
+
"name" => "chelsey",
|
178
|
+
"real_name" => "Mekhi Hegmann",
|
179
|
+
"website" => nil,
|
180
|
+
"role" => "user",
|
181
|
+
"biography" => nil,
|
182
|
+
"demographic" => nil
|
183
|
+
}
|
184
|
+
assert(JSON::Validator.validate!(symbolized_schema, data, :validate_schema => true))
|
185
|
+
end
|
96
186
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/json-schema'
|
3
|
+
|
4
|
+
class StringifyTest < Test::Unit::TestCase
|
5
|
+
def test_stringify_on_hash
|
6
|
+
hash = {
|
7
|
+
:a => 'foo',
|
8
|
+
'b' => :bar
|
9
|
+
}
|
10
|
+
assert_equal({'a' => 'foo', 'b' => 'bar'}, JSON::Schema.stringify(hash), 'symbol keys should be converted to strings')
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_stringify_on_array
|
14
|
+
array = [
|
15
|
+
:a,
|
16
|
+
'b'
|
17
|
+
]
|
18
|
+
assert_equal(['a', 'b'], JSON::Schema.stringify(array), 'symbols in an array should be converted to strings')
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_stringify_on_hash_of_arrays
|
22
|
+
hash = {
|
23
|
+
:a => [:foo],
|
24
|
+
'b' => :bar
|
25
|
+
}
|
26
|
+
assert_equal({'a' => ['foo'], 'b' => 'bar'}, JSON::Schema.stringify(hash), 'symbols in a nested array should be converted to strings')
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_stringify_on_array_of_hashes
|
30
|
+
array = [
|
31
|
+
:a,
|
32
|
+
{
|
33
|
+
:b => :bar
|
34
|
+
}
|
35
|
+
]
|
36
|
+
assert_equal(['a', {'b' => 'bar'}], JSON::Schema.stringify(array), 'symbols keys in a nested hash should be converted to strings')
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_stringify_on_hash_of_hashes
|
40
|
+
hash = {
|
41
|
+
:a => {
|
42
|
+
:b => {
|
43
|
+
:foo => :bar
|
44
|
+
}
|
45
|
+
}
|
46
|
+
}
|
47
|
+
assert_equal({'a' => {'b' => {'foo' => 'bar'} } }, JSON::Schema.stringify(hash), 'symbols in a nested hash of hashes should be converted to strings')
|
48
|
+
end
|
49
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json-schema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.4.
|
4
|
+
version: 2.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kenny Hoxworth
|
@@ -71,7 +71,6 @@ files:
|
|
71
71
|
- lib/json-schema/schema.rb
|
72
72
|
- lib/json-schema/uri/file.rb
|
73
73
|
- lib/json-schema/util/array_set.rb
|
74
|
-
- lib/json-schema/util/hash.rb
|
75
74
|
- lib/json-schema/util/uuid.rb
|
76
75
|
- lib/json-schema/validator.rb
|
77
76
|
- lib/json-schema/validators/draft1.rb
|
@@ -103,11 +102,13 @@ files:
|
|
103
102
|
- test/test_jsonschema_draft3.rb
|
104
103
|
- test/test_jsonschema_draft4.rb
|
105
104
|
- test/test_list_option.rb
|
105
|
+
- test/test_merge_misisng_values.rb
|
106
106
|
- test/test_minitems.rb
|
107
107
|
- test/test_one_of.rb
|
108
108
|
- test/test_ruby_schema.rb
|
109
109
|
- test/test_schema_type_attribute.rb
|
110
110
|
- test/test_schema_validation.rb
|
111
|
+
- test/test_stringify.rb
|
111
112
|
- test/data/all_of_ref_data.json
|
112
113
|
- test/data/any_of_ref_data.json
|
113
114
|
- test/data/bad_data_1.json
|
@@ -173,11 +174,13 @@ test_files:
|
|
173
174
|
- test/test_jsonschema_draft3.rb
|
174
175
|
- test/test_jsonschema_draft4.rb
|
175
176
|
- test/test_list_option.rb
|
177
|
+
- test/test_merge_misisng_values.rb
|
176
178
|
- test/test_minitems.rb
|
177
179
|
- test/test_one_of.rb
|
178
180
|
- test/test_ruby_schema.rb
|
179
181
|
- test/test_schema_type_attribute.rb
|
180
182
|
- test/test_schema_validation.rb
|
183
|
+
- test/test_stringify.rb
|
181
184
|
- test/data/all_of_ref_data.json
|
182
185
|
- test/data/any_of_ref_data.json
|
183
186
|
- test/data/bad_data_1.json
|