lib/json-schema/validator.rb in json-schema-1.0.1 vs lib/json-schema/validator.rb in json-schema-1.0.2
- old
+ new
@@ -86,43 +86,49 @@
:validate_schema => false,
:record_errors => false
}
@@validators = {}
@@default_validator = nil
- @@available_json_backends = []
- @@json_backend = nil
@@errors = []
+ def self.version_string_for(version)
+ # I'm not a fan of this, but it's quick and dirty to get it working for now
+ return "draft-03" unless version
+ case version.to_s
+ when "draft3"
+ "draft-03"
+ when "draft2"
+ "draft-02"
+ when "draft1"
+ "draft-01"
+ else
+ raise JSON::Schema::SchemaError.new("The requested JSON schema version is not supported")
+ end
+ end
+
+ def self.metaschema_for(version_string)
+ File.join(Pathname.new(File.dirname(__FILE__)).parent.parent, "resources", "#{version_string}.json").to_s
+ end
+
def initialize(schema_data, data, opts={})
@options = @@default_opts.clone.merge(opts)
# I'm not a fan of this, but it's quick and dirty to get it working for now
version_string = "draft-03"
if @options[:version]
- @options[:version] = case @options[:version].to_s
- when "draft3"
- "draft-03"
- when "draft2"
- "draft-02"
- when "draft1"
- "draft-01"
- else
- raise JSON::Schema::SchemaError.new("The requested JSON schema version is not supported")
- end
- version_string = @options[:version]
+ version_string = @options[:version] = self.class.version_string_for(@options[:version])
u = URI.parse("http://json-schema.org/#{@options[:version]}/schema#")
validator = JSON::Validator.validators["#{u.scheme}://#{u.host}#{u.path}"]
@options[:version] = validator
end
@validation_options = @options[:record_errors] ? {:record_errors => true} : {}
# validate the schema, if requested
if @options[:validate_schema]
begin
- metaschema_file = File.join(Pathname.new(File.dirname(__FILE__)).parent.parent, "resources", "#{version_string}.json").to_s
- meta_validator = JSON::Validator.new(metaschema_file, schema_data)
+ meta_validator = JSON::Validator.new(self.class.metaschema_for(version_string), schema_data)
meta_validator.validate
rescue JSON::Schema::ValidationError, JSON::Schema::SchemaError
raise $!
end
end
@@ -265,11 +271,17 @@
opts[:record_errors] = true
validator = JSON::Validator.new(schema, data, opts)
validator.validate
end
+ def fully_validate_schema(schema, opts={})
+ data = schema
+ schema = metaschema_for(version_string_for(opts[:version]))
+ fully_validate(schema, data, opts)
+ end
+
def clear_cache
@@schemas = {} if @@cache_schemas == false
end
def clear_errors
@@ -307,63 +319,23 @@
def register_default_validator(v)
@@default_validator = v
end
def json_backend
- @@json_backend
+ MultiJson.engine
end
-
+
def json_backend=(backend)
- backend = backend.to_s
- if @@available_json_backends.include?(backend)
- @@json_backend = backend
- else
- raise JSON::Schema::JsonParseError.new("The JSON backend '#{backend}' could not be found.")
- end
+ backend = 'json_gem' if backend.to_s == 'json'
+ MultiJson.engine = backend
end
def parse(s)
- case @@json_backend.to_s
- when 'json'
- JSON.parse(s)
- when 'yajl'
- json = StringIO.new(s)
- parser = Yajl::Parser.new
- parser.parse(json)
- else
- raise JSON::Schema::JsonParseError.new("No supported JSON parsers found. The following parsers are suported:\n * yajl-ruby\n * json")
- end
+ MultiJson.decode(s)
end
end
-
- if begin
- Gem::Specification::find_by_name('json')
- rescue Gem::LoadError
- false
- rescue
- Gem.available?('json')
- end
- require 'json'
- @@available_json_backends << 'json'
- @@json_backend = 'json'
- end
-
-
- if begin
- Gem::Specification::find_by_name('yajl-ruby')
- rescue Gem::LoadError
- false
- rescue
- Gem.available?('yajl-ruby')
- end
- require 'yajl'
- @@available_json_backends << 'yajl'
- @@json_backend = 'yajl'
- end
-
-
private
if begin
Gem::Specification::find_by_name('uuidtools')
rescue Gem::LoadError
@@ -376,19 +348,12 @@
else
require 'uri/uuid'
@@fake_uri_generator = lambda{|s| JSON::Util::UUID.create_v5(s,JSON::Util::UUID::Nil).to_s }
end
- if @@json_backend == 'yajl'
- @@serializer = lambda{|o| Yajl::Encoder.encode(o) }
- else
- @@serializer = lambda{|o| Marshal.dump(o) }
- end
-
def serialize schema
- @@serializer.call(schema)
+ MultiJson.encode(schema)
end
-
def fake_uri schema
@@fake_uri_generator.call(schema)
end