json-schema 0.1.14 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +14 -4
- data/lib/json-schema.rb +1 -0
- data/lib/json-schema/attributes/ref.rb +1 -1
- data/lib/json-schema/schema.rb +1 -7
- data/lib/json-schema/validator.rb +63 -18
- data/test/test_files.rb +26 -27
- data/test/test_jsonschema_draft3.rb +2 -3
- metadata +7 -20
data/README.textile
CHANGED
@@ -4,7 +4,7 @@ This library is intended to provide Ruby with an interface for validating JSON o
|
|
4
4
|
|
5
5
|
h2. Dependencies
|
6
6
|
|
7
|
-
The JSON::Schema library
|
7
|
+
The JSON::Schema library has no dependencies if the validation methods are called using Ruby objects. However, either the <code>json</code> or the <code>yajl-ruby</code> gem needs to be installed to validate JSON strings or files containing JSON data.
|
8
8
|
|
9
9
|
h2. Installation
|
10
10
|
|
@@ -18,11 +18,11 @@ From the git repo:
|
|
18
18
|
|
19
19
|
<pre>
|
20
20
|
$ gem build json-schema.gemspec
|
21
|
-
$ gem install json-schema-0.
|
21
|
+
$ gem install json-schema-0.2.0.gem
|
22
22
|
</pre>
|
23
23
|
|
24
24
|
|
25
|
-
h2.
|
25
|
+
h2. Usage
|
26
26
|
|
27
27
|
Two base validation methods exist: <code>validate</code> and <code>validate!</code>. The first returns a boolean on whether a validation attempt passes and the latter will throw a <code>JSON::Schema::ValidationError</code> with an appropriate message/trace on where the validation failed.
|
28
28
|
|
@@ -56,7 +56,7 @@ h3. Validate a JSON string against a JSON schema file
|
|
56
56
|
require 'rubygems'
|
57
57
|
require 'json-schema'
|
58
58
|
|
59
|
-
JSON::Validator.validate('schema.json', "
|
59
|
+
JSON::Validator.validate('schema.json', '{"a" : 5}')
|
60
60
|
</pre>
|
61
61
|
|
62
62
|
h3. Validate a list of objects against a schema that represents the individual objects
|
@@ -144,6 +144,16 @@ JSON::Validator.validate(schema,data) # => false
|
|
144
144
|
data = {"a" => 0, "b" => "taco"}
|
145
145
|
JSON::Validator.validate(schema,data) # => false
|
146
146
|
</pre>
|
147
|
+
|
148
|
+
h2. JSON Backends
|
149
|
+
|
150
|
+
The JSON::Schema library currently supports the <code>json</code> and <code>yajl-ruby</code> backend JSON parsers. If either of these libraries are installed, they will be automatically loaded and used to parse any JSON strings supplied by the user.
|
151
|
+
|
152
|
+
If more than one of the supported JSON backends are installed, the <code>yajl-ruby</code> parser is used by default. This can be changed by issuing the following before validation:
|
153
|
+
|
154
|
+
<pre>
|
155
|
+
JSON::Validator.json_backend = :json
|
156
|
+
</pre>
|
147
157
|
|
148
158
|
|
149
159
|
h2. Notes
|
data/lib/json-schema.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module JSON
|
2
2
|
class Schema
|
3
3
|
class RefAttribute < Attribute
|
4
|
-
def self.validate(current_schema, data, fragments, validator, options = {})
|
4
|
+
def self.validate(current_schema, data, fragments, validator, options = {})
|
5
5
|
temp_uri = URI.parse(current_schema.schema['$ref'])
|
6
6
|
if temp_uri.relative?
|
7
7
|
temp_uri = current_schema.uri.clone
|
data/lib/json-schema/schema.rb
CHANGED
@@ -22,6 +22,9 @@ module JSON
|
|
22
22
|
class SchemaError < Exception
|
23
23
|
end
|
24
24
|
|
25
|
+
class JsonParseError < Exception
|
26
|
+
end
|
27
|
+
|
25
28
|
class Attribute
|
26
29
|
def self.validate(current_schema, data, fragments, validator, options = {})
|
27
30
|
end
|
@@ -54,8 +57,8 @@ module JSON
|
|
54
57
|
|
55
58
|
def validate(current_schema, data, fragments)
|
56
59
|
current_schema.schema.each do |attr_name,attribute|
|
57
|
-
if @attributes.has_key?(attr_name)
|
58
|
-
@attributes[attr_name].validate(current_schema, data, fragments, self)
|
60
|
+
if @attributes.has_key?(attr_name.to_s)
|
61
|
+
@attributes[attr_name.to_s].validate(current_schema, data, fragments, self)
|
59
62
|
end
|
60
63
|
end
|
61
64
|
data
|
@@ -73,6 +76,8 @@ module JSON
|
|
73
76
|
}
|
74
77
|
@@validators = {}
|
75
78
|
@@default_validator = nil
|
79
|
+
@@available_json_backends = []
|
80
|
+
@@json_backend = nil
|
76
81
|
|
77
82
|
def initialize(schema_data, data, opts={})
|
78
83
|
@options = @@default_opts.clone.merge(opts)
|
@@ -117,7 +122,7 @@ module JSON
|
|
117
122
|
|
118
123
|
if Validator.schemas[uri.to_s].nil?
|
119
124
|
begin
|
120
|
-
schema = JSON::Schema.new(JSON.parse(open(uri.to_s).read), uri)
|
125
|
+
schema = JSON::Schema.new(JSON::Validator.parse(open(uri.to_s).read), uri)
|
121
126
|
Validator.add_schema(schema)
|
122
127
|
build_schemas(schema)
|
123
128
|
rescue JSON::ParserError
|
@@ -236,8 +241,45 @@ module JSON
|
|
236
241
|
def register_default_validator(v)
|
237
242
|
@@default_validator = v
|
238
243
|
end
|
244
|
+
|
245
|
+
def json_backend
|
246
|
+
@@json_backend
|
247
|
+
end
|
248
|
+
|
249
|
+
def json_backend=(backend)
|
250
|
+
backend = backend.to_s
|
251
|
+
if @@available_json_backend.include?(backend)
|
252
|
+
@@json_backend = backend
|
253
|
+
else
|
254
|
+
raise JSON::Schema::JsonParseError.new("The JSON backend '#{backend}' could not be found.")
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
def parse(s)
|
259
|
+
case @@json_backend.to_s
|
260
|
+
when 'json'
|
261
|
+
JSON.parse(s)
|
262
|
+
when 'yajl'
|
263
|
+
json = StringIO.new(s)
|
264
|
+
parser = Yajl::Parser.new
|
265
|
+
parser.parse(json)
|
266
|
+
else
|
267
|
+
raise JSON::Schema::JsonParseError.new("No supported JSON parsers found. The following parsers are suported:\n * yajl-ruby\n * json")
|
268
|
+
end
|
269
|
+
end
|
239
270
|
end
|
240
271
|
|
272
|
+
if Gem.available?('json')
|
273
|
+
require 'json'
|
274
|
+
@@available_json_backends << 'json'
|
275
|
+
@@json_backend = 'json'
|
276
|
+
end
|
277
|
+
|
278
|
+
if Gem.available?('yajl-ruby')
|
279
|
+
require 'yajl'
|
280
|
+
@@available_json_backends << 'yajl'
|
281
|
+
@@json_backend = 'yajl'
|
282
|
+
end
|
241
283
|
|
242
284
|
|
243
285
|
private
|
@@ -247,7 +289,11 @@ module JSON
|
|
247
289
|
begin
|
248
290
|
# Build a fake URI for this
|
249
291
|
schema_uri = URI.parse("file://#{Dir.pwd}/#{Digest::SHA1.hexdigest(schema)}")
|
250
|
-
schema = JSON::
|
292
|
+
schema = JSON::Validator.parse(schema)
|
293
|
+
if @options[:list]
|
294
|
+
schema = {"type" => "array", "items" => schema}
|
295
|
+
end
|
296
|
+
schema = JSON::Schema.new(schema,schema_uri)
|
251
297
|
Validator.add_schema(schema)
|
252
298
|
rescue
|
253
299
|
# Build a uri for it
|
@@ -261,27 +307,26 @@ module JSON
|
|
261
307
|
end
|
262
308
|
end
|
263
309
|
if Validator.schemas[schema_uri.to_s].nil?
|
264
|
-
schema = JSON::
|
310
|
+
schema = JSON::Validator.parse(open(schema_uri.to_s).read)
|
311
|
+
if @options[:list]
|
312
|
+
schema = {"type" => "array", "items" => schema}
|
313
|
+
end
|
314
|
+
schema = JSON::Schema.new(schema,schema_uri)
|
265
315
|
Validator.add_schema(schema)
|
266
316
|
else
|
267
317
|
schema = Validator.schemas[schema_uri.to_s]
|
268
318
|
end
|
269
319
|
end
|
270
320
|
elsif schema.is_a?(Hash)
|
271
|
-
|
272
|
-
|
273
|
-
|
321
|
+
if @options[:list]
|
322
|
+
schema = {"type" => "array", "items" => schema}
|
323
|
+
end
|
324
|
+
schema_uri = URI.parse("file://#{Dir.pwd}/#{Digest::SHA1.hexdigest(schema.inspect)}")
|
325
|
+
schema = JSON::Schema.new(schema,schema_uri)
|
274
326
|
Validator.add_schema(schema)
|
275
327
|
else
|
276
328
|
raise "Invalid schema - must be either a string or a hash"
|
277
|
-
end
|
278
|
-
|
279
|
-
if @options[:list]
|
280
|
-
inter_json = {:type => "array", :items => { "$ref" => schema.uri.to_s }}.to_json
|
281
|
-
wrapper_schema = JSON::Schema.new(JSON.parse(inter_json),URI.parse("file://#{Dir.pwd}/#{Digest::SHA1.hexdigest(inter_json)}"))
|
282
|
-
build_schemas(schema)
|
283
|
-
schema = wrapper_schema
|
284
|
-
end
|
329
|
+
end
|
285
330
|
|
286
331
|
schema
|
287
332
|
end
|
@@ -291,7 +336,7 @@ module JSON
|
|
291
336
|
# Parse the data, if any
|
292
337
|
if data.is_a?(String)
|
293
338
|
begin
|
294
|
-
data = JSON.parse(data)
|
339
|
+
data = JSON::Validator.parse(data)
|
295
340
|
rescue
|
296
341
|
json_uri = URI.parse(data)
|
297
342
|
if json_uri.relative?
|
@@ -301,7 +346,7 @@ module JSON
|
|
301
346
|
schema_uri = URI.parse("file://#{Dir.pwd}/#{data}")
|
302
347
|
end
|
303
348
|
end
|
304
|
-
data = JSON.parse(open(json_uri.to_s).read)
|
349
|
+
data = JSON::Validator.parse(open(json_uri.to_s).read)
|
305
350
|
end
|
306
351
|
end
|
307
352
|
data
|
data/test/test_files.rb
CHANGED
@@ -2,43 +2,42 @@ require 'test/unit'
|
|
2
2
|
require File.dirname(__FILE__) + '/../lib/json-schema'
|
3
3
|
|
4
4
|
class JSONSchemaTest < Test::Unit::TestCase
|
5
|
-
def test_schema_from_file
|
6
|
-
data = {"a" => 5}
|
7
|
-
assert(JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_1.json"),data))
|
8
|
-
data = {"a" => "bad"}
|
9
|
-
assert(!JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_1.json"),data))
|
10
|
-
end
|
11
5
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
assert(!JSON::Validator.validate(schema,File.join(File.dirname(__FILE__),"data/bad_data_1.json")))
|
16
|
-
end
|
6
|
+
#
|
7
|
+
# These tests are ONLY run if there is an appropriate JSON backend parser available
|
8
|
+
#
|
17
9
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
10
|
+
def test_schema_from_file
|
11
|
+
if JSON::Validator.json_backend != nil
|
12
|
+
data = {"a" => 5}
|
13
|
+
assert(JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_1.json"),data))
|
14
|
+
data = {"a" => "bad"}
|
15
|
+
assert(!JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_1.json"),data))
|
16
|
+
end
|
21
17
|
end
|
22
18
|
|
23
|
-
def
|
24
|
-
|
25
|
-
|
26
|
-
assert(JSON::Validator.validate(File.join(File.dirname(__FILE__),"
|
19
|
+
def test_data_from_file
|
20
|
+
if JSON::Validator.json_backend != nil
|
21
|
+
schema = {"type" => "object", "properties" => {"a" => {"type" => "integer"}}}
|
22
|
+
assert(JSON::Validator.validate(schema,File.join(File.dirname(__FILE__),"data/good_data_1.json")))
|
23
|
+
assert(!JSON::Validator.validate(schema,File.join(File.dirname(__FILE__),"data/bad_data_1.json")))
|
27
24
|
end
|
28
25
|
end
|
29
26
|
|
30
|
-
def
|
31
|
-
|
32
|
-
|
33
|
-
assert(JSON::Validator.validate(
|
27
|
+
def test_both_from_file
|
28
|
+
if JSON::Validator.json_backend != nil
|
29
|
+
assert(JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_1.json"),File.join(File.dirname(__FILE__),"data/good_data_1.json")))
|
30
|
+
assert(!JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_1.json"),File.join(File.dirname(__FILE__),"data/bad_data_1.json")))
|
34
31
|
end
|
35
32
|
end
|
36
|
-
|
33
|
+
|
37
34
|
def test_file_ref
|
38
|
-
|
39
|
-
|
35
|
+
if JSON::Validator.json_backend != nil
|
36
|
+
data = {"b" => {"a" => 5}}
|
37
|
+
assert(JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_2.json"),data))
|
40
38
|
|
41
|
-
|
42
|
-
|
39
|
+
data = {"b" => {"a" => "boo"}}
|
40
|
+
assert(!JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_1.json"),data))
|
41
|
+
end
|
43
42
|
end
|
44
43
|
end
|
@@ -759,12 +759,11 @@ class JSONSchemaDraft3Test < Test::Unit::TestCase
|
|
759
759
|
assert(JSON::Validator.validate(schema,data,:list => true))
|
760
760
|
assert(!JSON::Validator.validate(schema,data))
|
761
761
|
|
762
|
-
data = [{"a" => 1},{"b" => 2},{"a" => 3}]
|
763
|
-
assert(!JSON::Validator.validate(schema,data,:list => true))
|
764
|
-
|
765
762
|
data = {"a" => 1}
|
766
763
|
assert(!JSON::Validator.validate(schema,data,:list => true))
|
767
764
|
|
765
|
+
data = [{"a" => 1},{"b" => 2},{"a" => 3}]
|
766
|
+
assert(!JSON::Validator.validate(schema,data,:list => true))
|
768
767
|
end
|
769
768
|
|
770
769
|
|
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: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kenny Hoxworth
|
@@ -15,23 +15,10 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-03-
|
18
|
+
date: 2011-03-09 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
|
-
dependencies:
|
21
|
-
|
22
|
-
name: json
|
23
|
-
prerelease: false
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
hash: 3
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
version: "0"
|
33
|
-
type: :runtime
|
34
|
-
version_requirements: *id001
|
20
|
+
dependencies: []
|
21
|
+
|
35
22
|
description:
|
36
23
|
email: hoxworth@gmail.com
|
37
24
|
executables: []
|