JSON::SchemaBuilder
Build JSON Schemas with Ruby. Validates JSON using json-schema
Installation
Add this line to your application's Gemfile:
gem 'json-schema_builder'
And then execute:
$ bundle
Or install it yourself as:
$ gem install json-schema_builder
Usage
Building schemas
require 'json/schema_builder'
class YourSchema
include JSON::SchemaBuilder
def schema
object do
string :name, min_length: 1, required: true
array :your_ids do
max_items 10
unique_items true
items type: :integer
end
end
end
end
builder = YourSchema.new
builder.schema.as_json
will return a valid JSON schema:
{
"type": "object",
"required": "name",
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"your_ids": {
"type": "array",
"maxItems": 10,
"uniqueItems": true,
"items": { "type": "integer" }
}
}
}
More examples can be found in the specs.
Validating data against a schema
builder.schema.validate(data)
will validate your object against the schema:
builder.schema.validate({ }) # => false
builder.schema.validate name: 'Your Name' # => true
builder.schema.validate!(data)
validates your object, raising an exception on failure:
builder.schema.validate!({ })
# JSON::Schema::ValidationError: The property '#/' did not contain a required property of 'name'
builder.schema.validate! name: 'Your Name', your_ids: [1, 1, 2]
# JSON::Schema::ValidationError: The property '#/your_ids' contained duplicated array values
builder.schema.fully_validate(data)
validates the object and reports all invalid properties:
builder.schema.fully_validate your_ids: 'fail'
# [
# "The property '#/your_ids' of type String did not match the following type: array ",
# "The property '#/' did not contain a required property of 'name'"
# ]
Fragment validation can be accomplished by specifying the schema fragment:
builder.schema.validate [1], fragment: '#/properties/your_ids' # => true
Configuring
json-schema validation options can be specified in several contexts:
# As a global default
JSON::SchemaBuilder.configure do |opts|
opts.validate_schema = true
end
# As a class-level default
YourSchema.configure do |opts|
opts.insert_defaults = true
end
# Or at validation
builder.schema.validate data, strict: true, validate_schema: false
# Results in
{
validate_schema: false,
insert_defaults: true,
strict: true
}
Contributing
- Fork it ( https://github.com/parrish/json-schema_builder/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request