json_schema 0.12.5 → 0.13.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d87d815bb6c20fc65a9ad48af9265104bcf9c5c7
4
- data.tar.gz: a149e736977aed85958982fd36a2a6e1274e6e3a
3
+ metadata.gz: 509ee330f57ccc1fc0ad812a0be82cceeeab7461
4
+ data.tar.gz: 7c284cc6d026a7191df85776b0c6913ea6daf23a
5
5
  SHA512:
6
- metadata.gz: 9edabc7c8136900b13aee695380f0577db4f65ac9a12c79706382133f2b8c125f990fd1ebccd2a4d8965979a55816b8ee8ee4abf3e8608c783cef2184703aca9
7
- data.tar.gz: 045903e56013bde3e950f5231cdfd06c3420bd2e99093aef36493eeb260de9c66d316df85e06afb8d8a8d0244ed261cd307cdeee9457d08002b1ba19e2b15ad9
6
+ metadata.gz: 419c0c1045a265e0cea0a32483d14cd15f7d8b7deceba263a4647b7f33450056b599cf87fb886fc24d696dda306c7c873106d92156e45175cff079ddef85bf64
7
+ data.tar.gz: 89df42d2dfdfcd8849dd74470634485b19d4554061bb9a4c119d92bc854d0f887ab6e04c6697f0684236eaabe5bceac97aed7d55cc05997ad95f4403ebb8fb96
@@ -70,6 +70,21 @@ module JsonSchema
70
70
  end
71
71
  end
72
72
 
73
+ def parse_additional_items(schema)
74
+ if schema.additional_items
75
+ # an object indicates a schema that will be used to parse any
76
+ # items not listed in `items`
77
+ if schema.additional_items.is_a?(Hash)
78
+ schema.additional_items = parse_data(
79
+ schema.additional_items,
80
+ schema,
81
+ "additionalItems"
82
+ )
83
+ end
84
+ # otherwise, leave as boolean
85
+ end
86
+ end
87
+
73
88
  def parse_additional_properties(schema)
74
89
  if schema.additional_properties
75
90
  # an object indicates a schema that will be used to parse any
@@ -308,6 +323,7 @@ module JsonSchema
308
323
  schema.path_start = validate_type(schema, [String], "pathStart")
309
324
  schema.read_only = validate_type(schema, BOOLEAN, "readOnly")
310
325
 
326
+ parse_additional_items(schema)
311
327
  parse_additional_properties(schema)
312
328
  parse_all_of(schema)
313
329
  parse_any_of(schema)
@@ -249,6 +249,12 @@ module JsonSchema
249
249
  false
250
250
  else
251
251
  valid = true
252
+ if data.size > schema.items.count && schema.additional_items.is_a?(Schema)
253
+ (schema.items.count..data.count - 1).each do |i|
254
+ valid = strict_and valid,
255
+ validate_data(schema.additional_items, data[i], errors, path + [i])
256
+ end
257
+ end
252
258
  schema.items.each_with_index do |subschema, i|
253
259
  valid = strict_and valid,
254
260
  validate_data(subschema, data[i], errors, path + [i])
@@ -70,6 +70,24 @@ describe JsonSchema::Parser do
70
70
  assert_equal ["http", "https"], schema.items[1].enum
71
71
  end
72
72
 
73
+ it "parses array additionalItems object validation as boolean" do
74
+ pointer("#/definitions/app/definitions/flags").merge!(
75
+ "additionalItems" => false
76
+ )
77
+ schema = parse.definitions["app"].definitions["flags"]
78
+ assert_equal false, schema.additional_items
79
+ end
80
+
81
+ it "parses array additionalItems object validation as schema" do
82
+ pointer("#/definitions/app/definitions/flags").merge!(
83
+ "additionalItems" => {
84
+ "type" => "boolean"
85
+ }
86
+ )
87
+ schema = parse.definitions["app"].definitions["flags"].additional_items
88
+ assert_equal ["boolean"], schema.type
89
+ end
90
+
73
91
  it "parses integer validations" do
74
92
  schema = parse.definitions["app"].definitions["id"]
75
93
  assert_equal 0, schema.min
@@ -110,7 +110,7 @@ describe JsonSchema::Validator do
110
110
  assert validate
111
111
  end
112
112
 
113
- it "validates items with tuple successfully with additionalItems" do
113
+ it "validates items with tuple with additionalItems boolean successfully" do
114
114
  pointer("#/definitions/app/definitions/flags").merge!(
115
115
  "additionalItems" => true,
116
116
  "items" => [
@@ -122,6 +122,89 @@ describe JsonSchema::Validator do
122
122
  assert validate
123
123
  end
124
124
 
125
+ it "validates items with tuple with additionalItems boolean unsuccessfully" do
126
+ pointer("#/definitions/app/definitions/flags").merge!(
127
+ "additionalItems" => false,
128
+ "items" => [
129
+ { "enum" => ["bamboo", "cedar"] },
130
+ { "enum" => ["http", "https"] }
131
+ ]
132
+ )
133
+ data_sample["flags"] = ["cedar", "https", "websockets"]
134
+ refute validate
135
+ assert_includes error_messages, %{No more than 2 items are allowed; 3 were supplied.}
136
+ assert_includes error_types, :max_items_failed
137
+ assert_includes error_data, ["cedar", "https", "websockets"]
138
+ end
139
+
140
+ it "validates items with tuple with additionalItems schema successfully" do
141
+ pointer("#/definitions/app/definitions/flags").merge!(
142
+ "additionalItems" => { "enum" => [ "foo", "websockets" ] },
143
+ "items" => [
144
+ { "enum" => ["bamboo", "cedar"] },
145
+ { "enum" => ["http", "https"] }
146
+ ]
147
+ )
148
+ data_sample["flags"] = ["cedar", "https", "websockets"]
149
+ assert validate
150
+ end
151
+
152
+ it "validates items with tuple with additionalItems schema unsuccessfully for non-conforming additional item" do
153
+ pointer("#/definitions/app/definitions/flags").merge!(
154
+ "additionalItems" => { "enum" => [ "foo", "bar" ] },
155
+ "items" => [
156
+ { "enum" => ["bamboo", "cedar"] },
157
+ { "enum" => ["http", "https"] }
158
+ ]
159
+ )
160
+ data_sample["flags"] = ["cedar", "https", "websockets"]
161
+ refute validate
162
+ assert_includes error_messages,
163
+ %{websockets is not a member of ["foo", "bar"].}
164
+ assert_includes error_types, :invalid_type
165
+ assert_includes error_data, "websockets"
166
+ end
167
+
168
+ it "validates items with tuple with additionalItems schema unsuccessfully with multiple failures" do
169
+ pointer("#/definitions/app/definitions/flags").merge!(
170
+ "additionalItems" => { "enum" => [ "foo", "bar" ] },
171
+ "items" => [
172
+ { "enum" => ["bamboo", "cedar"] },
173
+ { "enum" => ["http", "https"] }
174
+ ]
175
+ )
176
+ data_sample["flags"] = ["cedar", "https", "websockets", "1337"]
177
+ refute validate
178
+ assert_includes error_messages,
179
+ %{websockets is not a member of ["foo", "bar"].}
180
+ assert_includes error_types, :invalid_type
181
+ assert_includes error_data, "websockets"
182
+ assert_includes error_messages,
183
+ %{1337 is not a member of ["foo", "bar"].}
184
+ assert_includes error_types, :invalid_type
185
+ assert_includes error_data, "1337"
186
+ end
187
+
188
+ it "validates items with tuple with additionalItems schema unsuccessfully with non-conforming items and additional items" do
189
+ pointer("#/definitions/app/definitions/flags").merge!(
190
+ "additionalItems" => { "enum" => [ "foo", "bar" ] },
191
+ "items" => [
192
+ { "enum" => ["bamboo", "cedar"] },
193
+ { "enum" => ["http", "https"] }
194
+ ]
195
+ )
196
+ data_sample["flags"] = ["cedar", "1337", "websockets"]
197
+ refute validate
198
+ assert_includes error_messages,
199
+ %{websockets is not a member of ["foo", "bar"].}
200
+ assert_includes error_types, :invalid_type
201
+ assert_includes error_data, "websockets"
202
+ assert_includes error_messages,
203
+ %{1337 is not a member of ["http", "https"].}
204
+ assert_includes error_types, :invalid_type
205
+ assert_includes error_data, "1337"
206
+ end
207
+
125
208
  it "validates items with tuple unsuccessfully for not enough items" do
126
209
  pointer("#/definitions/app/definitions/flags").merge!(
127
210
  "items" => [
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.5
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandur
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-01 00:00:00.000000000 Z
11
+ date: 2016-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ecma-re-validator