json-schema 1.0.11 → 1.0.12
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +35 -1
- data/lib/json-schema/attributes/properties.rb +7 -2
- data/lib/json-schema/validator.rb +3 -1
- data/test/test_jsonschema_draft3.rb +68 -0
- metadata +1 -1
data/README.textile
CHANGED
@@ -18,7 +18,7 @@ From the git repo:
|
|
18
18
|
|
19
19
|
<pre>
|
20
20
|
$ gem build json-schema.gemspec
|
21
|
-
$ gem install json-schema-1.0.
|
21
|
+
$ gem install json-schema-1.0.12.gem
|
22
22
|
</pre>
|
23
23
|
|
24
24
|
|
@@ -161,6 +161,40 @@ data = {
|
|
161
161
|
JSON::Validator.validate(schema, data, :validate_schema => true)
|
162
162
|
</pre>
|
163
163
|
|
164
|
+
h3. Validate a JSON object against a JSON schema object, while inserting default values from the schema
|
165
|
+
|
166
|
+
With the :insert_defaults option set to true any missing property that has a
|
167
|
+
default value specified in the schema will be inserted into the validated data. The inserted default value is validated hence catching a schema that specifies an invalid default value.
|
168
|
+
|
169
|
+
<pre>
|
170
|
+
require 'rubygems'
|
171
|
+
require 'json-schema'
|
172
|
+
|
173
|
+
schema = {
|
174
|
+
"type" => "object",
|
175
|
+
"properties" => {
|
176
|
+
"a" => {"type" => "integer", "default" => 42, "required" => "true"},
|
177
|
+
"b" => {"type" => "integer"}
|
178
|
+
}
|
179
|
+
}
|
180
|
+
|
181
|
+
# Would not normally validate because "a" is missing and required by schema,
|
182
|
+
# but "default" option allows insertion of valid default.
|
183
|
+
data = {
|
184
|
+
"b" => 5
|
185
|
+
}
|
186
|
+
|
187
|
+
JSON::Validator.validate(schema, data)
|
188
|
+
# false
|
189
|
+
|
190
|
+
JSON::Validator.validate(schema, data, :insert_defaults => true)
|
191
|
+
# true
|
192
|
+
# data = {
|
193
|
+
# "a" => 42,
|
194
|
+
# "b" => 5
|
195
|
+
# }
|
196
|
+
|
197
|
+
</pre>
|
164
198
|
h3. Validate an object against a JSON Schema Draft 2 schema
|
165
199
|
|
166
200
|
<pre>
|
@@ -4,7 +4,12 @@ module JSON
|
|
4
4
|
def self.validate(current_schema, data, fragments, validator, options = {})
|
5
5
|
if data.is_a?(Hash)
|
6
6
|
current_schema.schema['properties'].each do |property,property_schema|
|
7
|
-
if (property_schema['
|
7
|
+
if !data.has_key?(property) and property_schema['default'] and !property_schema['readonly'] and options[:insert_defaults]
|
8
|
+
default = property_schema['default']
|
9
|
+
data[property] = (default.is_a?(Hash) ? default.clone : default)
|
10
|
+
end
|
11
|
+
|
12
|
+
if property_schema['required'] and !data.has_key?(property)
|
8
13
|
message = "The property '#{build_fragment(fragments)}' did not contain a required property of '#{property}'"
|
9
14
|
validation_error(message, fragments, current_schema, self, options[:record_errors])
|
10
15
|
end
|
@@ -20,4 +25,4 @@ module JSON
|
|
20
25
|
end
|
21
26
|
end
|
22
27
|
end
|
23
|
-
end
|
28
|
+
end
|
@@ -109,7 +109,8 @@ module JSON
|
|
109
109
|
:version => nil,
|
110
110
|
:validate_schema => false,
|
111
111
|
:record_errors => false,
|
112
|
-
:errors_as_objects => false
|
112
|
+
:errors_as_objects => false,
|
113
|
+
:insert_defaults => false
|
113
114
|
}
|
114
115
|
@@validators = {}
|
115
116
|
@@default_validator = nil
|
@@ -150,6 +151,7 @@ module JSON
|
|
150
151
|
end
|
151
152
|
|
152
153
|
@validation_options = @options[:record_errors] ? {:record_errors => true} : {}
|
154
|
+
@validation_options[:insert_defaults] = true if @options[:insert_defaults]
|
153
155
|
|
154
156
|
# validate the schema, if requested
|
155
157
|
if @options[:validate_schema]
|
@@ -1012,6 +1012,74 @@ class JSONSchemaDraft3Test < Test::Unit::TestCase
|
|
1012
1012
|
data = {"a" => 1, "b" => 2, "c" => 3}
|
1013
1013
|
assert(JSON::Validator.validate(schema,data))
|
1014
1014
|
end
|
1015
|
+
|
1016
|
+
def test_default
|
1017
|
+
schema = {
|
1018
|
+
"type" => "object",
|
1019
|
+
"properties" => {
|
1020
|
+
"a" => {"type" => "integer", "default" => 42},
|
1021
|
+
"b" => {"type" => "integer"}
|
1022
|
+
}
|
1023
|
+
}
|
1024
|
+
|
1025
|
+
data = {"b" => 2}
|
1026
|
+
assert(JSON::Validator.validate(schema,data))
|
1027
|
+
assert_nil(data["a"])
|
1028
|
+
assert(JSON::Validator.validate(schema,data, :insert_defaults => true))
|
1029
|
+
assert_equal(42, data["a"])
|
1030
|
+
|
1031
|
+
schema = {
|
1032
|
+
"type" => "object",
|
1033
|
+
"properties" => {
|
1034
|
+
"a" => {"type" => "integer", "default" => 42, "required" => true},
|
1035
|
+
"b" => {"type" => "integer"}
|
1036
|
+
}
|
1037
|
+
}
|
1038
|
+
|
1039
|
+
data = {"b" => 2}
|
1040
|
+
assert(!JSON::Validator.validate(schema,data))
|
1041
|
+
assert_nil(data["a"])
|
1042
|
+
assert(JSON::Validator.validate(schema,data, :insert_defaults => true))
|
1043
|
+
assert_equal(42, data["a"])
|
1044
|
+
|
1045
|
+
schema = {
|
1046
|
+
"type" => "object",
|
1047
|
+
"properties" => {
|
1048
|
+
"a" => {"type" => "integer", "default" => 42, "required" => true},
|
1049
|
+
"b" => {"type" => "integer"}
|
1050
|
+
}
|
1051
|
+
}
|
1052
|
+
|
1053
|
+
|
1054
|
+
schema = {
|
1055
|
+
"type" => "object",
|
1056
|
+
"properties" => {
|
1057
|
+
"a" => {"type" => "integer", "default" => 42, "required" => true, "readonly" => true},
|
1058
|
+
"b" => {"type" => "integer"}
|
1059
|
+
}
|
1060
|
+
}
|
1061
|
+
|
1062
|
+
data = {"b" => 2}
|
1063
|
+
assert(!JSON::Validator.validate(schema,data))
|
1064
|
+
assert_nil(data["a"])
|
1065
|
+
assert(!JSON::Validator.validate(schema,data, :insert_defaults => true))
|
1066
|
+
assert_nil(data["a"])
|
1067
|
+
|
1068
|
+
schema = {
|
1069
|
+
"type" => "object",
|
1070
|
+
"properties" => {
|
1071
|
+
"a" => {"type" => "integer", "default" => "42"},
|
1072
|
+
"b" => {"type" => "integer"}
|
1073
|
+
}
|
1074
|
+
}
|
1075
|
+
|
1076
|
+
data = {"b" => 2}
|
1077
|
+
assert(JSON::Validator.validate(schema,data))
|
1078
|
+
assert_nil(data["a"])
|
1079
|
+
assert(!JSON::Validator.validate(schema,data, :insert_defaults => true))
|
1080
|
+
assert_equal("42",data["a"])
|
1081
|
+
|
1082
|
+
end
|
1015
1083
|
|
1016
1084
|
|
1017
1085
|
end
|