json-schema 0.9.5 → 0.9.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +1 -1
- data/lib/json-schema/validator.rb +72 -58
- metadata +4 -4
data/README.textile
CHANGED
@@ -6,7 +6,7 @@ require 'digest/sha1'
|
|
6
6
|
require 'date'
|
7
7
|
|
8
8
|
module JSON
|
9
|
-
|
9
|
+
|
10
10
|
class Schema
|
11
11
|
class ValidationError < Exception
|
12
12
|
attr_reader :fragments, :schema
|
@@ -18,30 +18,30 @@ module JSON
|
|
18
18
|
super(message)
|
19
19
|
end
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
class SchemaError < Exception
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
class JsonParseError < Exception
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
class Attribute
|
29
29
|
def self.validate(current_schema, data, fragments, validator, options = {})
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
def self.build_fragment(fragments)
|
33
33
|
"#/#{fragments.join('/')}"
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
class Validator
|
38
38
|
attr_accessor :attributes, :uri
|
39
|
-
|
39
|
+
|
40
40
|
def initialize()
|
41
41
|
@attributes = {}
|
42
42
|
@uri = nil
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
def extend_schema_definition(schema_uri)
|
46
46
|
u = URI.parse(schema_uri)
|
47
47
|
validator = JSON::Validator.validators["#{u.scheme}://#{u.host}#{u.path}"]
|
@@ -50,11 +50,11 @@ module JSON
|
|
50
50
|
end
|
51
51
|
@attributes.merge!(validator.attributes)
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
def to_s
|
55
55
|
"#{@uri.scheme}://#{uri.host}#{uri.path}"
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
def validate(current_schema, data, fragments)
|
59
59
|
current_schema.schema.each do |attr_name,attribute|
|
60
60
|
|
@@ -66,7 +66,7 @@ module JSON
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
|
71
71
|
class Validator
|
72
72
|
|
@@ -80,7 +80,7 @@ module JSON
|
|
80
80
|
@@default_validator = nil
|
81
81
|
@@available_json_backends = []
|
82
82
|
@@json_backend = nil
|
83
|
-
|
83
|
+
|
84
84
|
def initialize(schema_data, data, opts={})
|
85
85
|
@options = @@default_opts.clone.merge(opts)
|
86
86
|
|
@@ -101,11 +101,11 @@ module JSON
|
|
101
101
|
@options[:version] = validator
|
102
102
|
end
|
103
103
|
@base_schema = initialize_schema(schema_data)
|
104
|
-
@data = initialize_data(data)
|
104
|
+
@data = initialize_data(data)
|
105
105
|
build_schemas(@base_schema)
|
106
|
-
end
|
107
|
-
|
108
|
-
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
109
|
# Run a simple true/false validation of data against a schema
|
110
110
|
def validate()
|
111
111
|
begin
|
@@ -117,20 +117,20 @@ module JSON
|
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
|
-
|
120
|
+
|
121
121
|
def load_ref_schema(parent_schema,ref)
|
122
122
|
uri = URI.parse(ref)
|
123
123
|
if uri.relative?
|
124
124
|
uri = parent_schema.uri.clone
|
125
|
-
|
125
|
+
|
126
126
|
# Check for absolute path
|
127
127
|
path = ref.split("#")[0]
|
128
|
-
|
128
|
+
|
129
129
|
# This is a self reference and thus the schema does not need to be re-loaded
|
130
130
|
if path.nil? || path == ''
|
131
131
|
return
|
132
132
|
end
|
133
|
-
|
133
|
+
|
134
134
|
if path && path[0,1] == '/'
|
135
135
|
uri.path = Pathname.new(path).cleanpath.to_s
|
136
136
|
else
|
@@ -138,7 +138,7 @@ module JSON
|
|
138
138
|
end
|
139
139
|
uri.fragment = ''
|
140
140
|
end
|
141
|
-
|
141
|
+
|
142
142
|
if Validator.schemas[uri.to_s].nil?
|
143
143
|
begin
|
144
144
|
schema = JSON::Schema.new(JSON::Validator.parse(open(uri.to_s).read), uri, @options[:version])
|
@@ -153,33 +153,33 @@ module JSON
|
|
153
153
|
end
|
154
154
|
end
|
155
155
|
end
|
156
|
-
|
157
|
-
|
156
|
+
|
157
|
+
|
158
158
|
# Build all schemas with IDs, mapping out the namespace
|
159
|
-
def build_schemas(parent_schema)
|
159
|
+
def build_schemas(parent_schema)
|
160
160
|
# Build ref schemas if they exist
|
161
161
|
if parent_schema.schema["$ref"]
|
162
162
|
load_ref_schema(parent_schema, parent_schema.schema["$ref"])
|
163
163
|
end
|
164
|
-
|
164
|
+
|
165
165
|
# Check for schemas in union types
|
166
166
|
["type", "disallow"].each do |key|
|
167
167
|
if parent_schema.schema[key] && parent_schema.schema[key].is_a?(Array)
|
168
168
|
parent_schema.schema[key].each_with_index do |type,i|
|
169
|
-
if type.is_a?(Hash)
|
169
|
+
if type.is_a?(Hash)
|
170
170
|
handle_schema(parent_schema, type)
|
171
171
|
end
|
172
172
|
end
|
173
173
|
end
|
174
174
|
end
|
175
|
-
|
175
|
+
|
176
176
|
# All properties are schemas
|
177
177
|
if parent_schema.schema["properties"]
|
178
178
|
parent_schema.schema["properties"].each do |k,v|
|
179
179
|
handle_schema(parent_schema, v)
|
180
180
|
end
|
181
181
|
end
|
182
|
-
|
182
|
+
|
183
183
|
# Items are always schemas
|
184
184
|
if parent_schema.schema["items"]
|
185
185
|
items = parent_schema.schema["items"].clone
|
@@ -192,16 +192,16 @@ module JSON
|
|
192
192
|
handle_schema(parent_schema, item)
|
193
193
|
end
|
194
194
|
end
|
195
|
-
|
195
|
+
|
196
196
|
# Each of these might be schemas
|
197
197
|
["additionalProperties", "additionalItems", "dependencies", "extends"].each do |key|
|
198
|
-
if parent_schema.schema[key].is_a?(Hash)
|
198
|
+
if parent_schema.schema[key].is_a?(Hash)
|
199
199
|
handle_schema(parent_schema, parent_schema.schema[key])
|
200
200
|
end
|
201
201
|
end
|
202
|
-
|
202
|
+
|
203
203
|
end
|
204
|
-
|
204
|
+
|
205
205
|
# Either load a reference schema or create a new schema
|
206
206
|
def handle_schema(parent_schema, obj)
|
207
207
|
schema_uri = parent_schema.uri.clone
|
@@ -211,8 +211,8 @@ module JSON
|
|
211
211
|
end
|
212
212
|
build_schemas(schema)
|
213
213
|
end
|
214
|
-
|
215
|
-
|
214
|
+
|
215
|
+
|
216
216
|
class << self
|
217
217
|
def validate(schema, data,opts={})
|
218
218
|
begin
|
@@ -223,50 +223,50 @@ module JSON
|
|
223
223
|
return false
|
224
224
|
end
|
225
225
|
end
|
226
|
-
|
226
|
+
|
227
227
|
def validate!(schema, data,opts={})
|
228
228
|
validator = JSON::Validator.new(schema, data, opts)
|
229
229
|
validator.validate
|
230
230
|
return true
|
231
231
|
end
|
232
232
|
alias_method 'validate2', 'validate!'
|
233
|
-
|
233
|
+
|
234
234
|
def clear_cache
|
235
235
|
@@schemas = {} if @@cache_schemas == false
|
236
236
|
end
|
237
|
-
|
237
|
+
|
238
238
|
def schemas
|
239
239
|
@@schemas
|
240
240
|
end
|
241
|
-
|
241
|
+
|
242
242
|
def add_schema(schema)
|
243
243
|
@@schemas[schema.uri.to_s] = schema if @@schemas[schema.uri.to_s].nil?
|
244
244
|
end
|
245
|
-
|
245
|
+
|
246
246
|
def cache_schemas=(val)
|
247
247
|
@@cache_schemas = val == true ? true : false
|
248
248
|
end
|
249
|
-
|
249
|
+
|
250
250
|
def validators
|
251
251
|
@@validators
|
252
252
|
end
|
253
|
-
|
253
|
+
|
254
254
|
def default_validator
|
255
255
|
@@default_validator
|
256
256
|
end
|
257
|
-
|
257
|
+
|
258
258
|
def register_validator(v)
|
259
259
|
@@validators[v.to_s] = v
|
260
260
|
end
|
261
|
-
|
261
|
+
|
262
262
|
def register_default_validator(v)
|
263
263
|
@@default_validator = v
|
264
264
|
end
|
265
|
-
|
265
|
+
|
266
266
|
def json_backend
|
267
267
|
@@json_backend
|
268
268
|
end
|
269
|
-
|
269
|
+
|
270
270
|
def json_backend=(backend)
|
271
271
|
backend = backend.to_s
|
272
272
|
if @@available_json_backends.include?(backend)
|
@@ -275,7 +275,7 @@ module JSON
|
|
275
275
|
raise JSON::Schema::JsonParseError.new("The JSON backend '#{backend}' could not be found.")
|
276
276
|
end
|
277
277
|
end
|
278
|
-
|
278
|
+
|
279
279
|
def parse(s)
|
280
280
|
case @@json_backend.to_s
|
281
281
|
when 'json'
|
@@ -289,23 +289,37 @@ module JSON
|
|
289
289
|
end
|
290
290
|
end
|
291
291
|
end
|
292
|
-
|
293
|
-
|
292
|
+
|
293
|
+
|
294
|
+
if begin
|
295
|
+
Gem::Specification::find_by_name('json')
|
296
|
+
rescue
|
297
|
+
Gem.available?('json')
|
298
|
+
end
|
294
299
|
require 'json'
|
295
300
|
@@available_json_backends << 'json'
|
296
301
|
@@json_backend = 'json'
|
297
302
|
end
|
298
|
-
|
299
|
-
|
303
|
+
|
304
|
+
|
305
|
+
if begin
|
306
|
+
Gem::Specification::find_by_name('yajl-ruby')
|
307
|
+
rescue
|
308
|
+
Gem.available?('yajl-ruby')
|
309
|
+
end
|
300
310
|
require 'yajl'
|
301
311
|
@@available_json_backends << 'yajl'
|
302
312
|
@@json_backend = 'yajl'
|
303
313
|
end
|
304
|
-
|
305
|
-
|
314
|
+
|
315
|
+
|
306
316
|
private
|
307
317
|
|
308
|
-
if
|
318
|
+
if begin
|
319
|
+
Gem::Specification::find_by_name('uuidtools')
|
320
|
+
rescue
|
321
|
+
Gem.available?('uuidtools')
|
322
|
+
end
|
309
323
|
require 'uuidtools'
|
310
324
|
@@fake_uri_generator = lambda{|s| UUIDTools::UUID.sha1_create(UUIDTools::UUID_URL_NAMESPACE, s).to_s }
|
311
325
|
else
|
@@ -359,12 +373,12 @@ module JSON
|
|
359
373
|
Validator.add_schema(schema)
|
360
374
|
else
|
361
375
|
raise "Invalid schema - must be either a string or a hash"
|
362
|
-
end
|
363
|
-
|
376
|
+
end
|
377
|
+
|
364
378
|
schema
|
365
379
|
end
|
366
|
-
|
367
|
-
|
380
|
+
|
381
|
+
|
368
382
|
def initialize_data(data)
|
369
383
|
# Parse the data, if any
|
370
384
|
if data.is_a?(String)
|
@@ -384,6 +398,6 @@ module JSON
|
|
384
398
|
end
|
385
399
|
data
|
386
400
|
end
|
387
|
-
|
401
|
+
|
388
402
|
end
|
389
403
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: json-schema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 55
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 9
|
9
|
-
-
|
10
|
-
version: 0.9.
|
9
|
+
- 6
|
10
|
+
version: 0.9.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kenny Hoxworth
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-06-24 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|