JSON::SchemaBuilder

Build Status Code Climate Test Coverage Gem Version

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

  1. Fork it ( https://github.com/parrish/json-schema_builder/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request